backend: Use symbols for assertions processing
This commit is contained in:
+4
@@ -67,6 +67,10 @@ open class Symbols<out T: CommonBackendContext>(val context: T, private val symb
|
|||||||
Name.identifier("Iterator"), NoLookupLocation.FROM_BACKEND
|
Name.identifier("Iterator"), NoLookupLocation.FROM_BACKEND
|
||||||
) as ClassDescriptor)
|
) as ClassDescriptor)
|
||||||
|
|
||||||
|
val asserts = builtInsPackage("kotlin")
|
||||||
|
.getContributedFunctions(Name.identifier("assert"), NoLookupLocation.FROM_BACKEND)
|
||||||
|
.map { symbolTable.referenceFunction(it) }
|
||||||
|
|
||||||
private fun progression(name: String) = symbolTable.referenceClass(
|
private fun progression(name: String) = symbolTable.referenceClass(
|
||||||
builtInsPackage("kotlin", "ranges").getContributedClassifier(
|
builtInsPackage("kotlin", "ranges").getContributedClassifier(
|
||||||
Name.identifier(name), NoLookupLocation.FROM_BACKEND
|
Name.identifier(name), NoLookupLocation.FROM_BACKEND
|
||||||
|
|||||||
+5
-4
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.backend.common.BodyLoweringPass
|
|||||||
import org.jetbrains.kotlin.backend.common.atMostOne
|
import org.jetbrains.kotlin.backend.common.atMostOne
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
import org.jetbrains.kotlin.backend.konan.Context
|
||||||
import org.jetbrains.kotlin.backend.konan.KonanConfigKeys.Companion.ENABLE_ASSERTIONS
|
import org.jetbrains.kotlin.backend.konan.KonanConfigKeys.Companion.ENABLE_ASSERTIONS
|
||||||
|
import org.jetbrains.kotlin.backend.konan.isStdlib
|
||||||
import org.jetbrains.kotlin.backend.konan.isValueType
|
import org.jetbrains.kotlin.backend.konan.isValueType
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltinOperatorDescriptor
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltinOperatorDescriptor
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
@@ -31,6 +32,7 @@ import org.jetbrains.kotlin.ir.util.type
|
|||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isNothing
|
import org.jetbrains.kotlin.types.typeUtil.isNothing
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||||
import org.jetbrains.kotlin.types.typeUtil.isUnit
|
import org.jetbrains.kotlin.types.typeUtil.isUnit
|
||||||
@@ -52,17 +54,16 @@ private class BuiltinOperatorTransformer(val context: Context) : IrElementTransf
|
|||||||
|
|
||||||
private val builtIns = context.builtIns
|
private val builtIns = context.builtIns
|
||||||
private val irBuiltins = context.irModule!!.irBuiltins
|
private val irBuiltins = context.irModule!!.irBuiltins
|
||||||
|
private val enableAssertions = context.config.configuration.getBoolean(ENABLE_ASSERTIONS)
|
||||||
|
|
||||||
private val assertFqName = "kotlin.assert"
|
private val assertSymbols = context.ir.symbols.asserts
|
||||||
|
|
||||||
override fun visitCall(expression: IrCall): IrExpression {
|
override fun visitCall(expression: IrCall): IrExpression {
|
||||||
expression.transformChildrenVoid(this)
|
expression.transformChildrenVoid(this)
|
||||||
val descriptor = expression.descriptor
|
val descriptor = expression.descriptor
|
||||||
|
|
||||||
// TODO: use stdlib assert's descriptors instead of fqName
|
|
||||||
// Replace assert() call with an empty composite if assertions are not enabled.
|
// Replace assert() call with an empty composite if assertions are not enabled.
|
||||||
if (descriptor.fqNameSafe.asString() == assertFqName &&
|
if (!enableAssertions && expression.symbol in assertSymbols) {
|
||||||
!context.config.configuration.getBoolean(ENABLE_ASSERTIONS)) {
|
|
||||||
assert(expression.type.isUnit())
|
assert(expression.type.isUnit())
|
||||||
return IrCompositeImpl(expression.startOffset, expression.endOffset, expression.type)
|
return IrCompositeImpl(expression.startOffset, expression.endOffset, expression.type)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user