backend: Use symbols for assertions processing

This commit is contained in:
Ilya Matveev
2017-07-24 15:15:42 +07:00
committed by ilmat192
parent de5bc71ffc
commit a2e9fa324b
2 changed files with 9 additions and 4 deletions
@@ -67,6 +67,10 @@ open class Symbols<out T: CommonBackendContext>(val context: T, private val symb
Name.identifier("Iterator"), NoLookupLocation.FROM_BACKEND
) as ClassDescriptor)
val asserts = builtInsPackage("kotlin")
.getContributedFunctions(Name.identifier("assert"), NoLookupLocation.FROM_BACKEND)
.map { symbolTable.referenceFunction(it) }
private fun progression(name: String) = symbolTable.referenceClass(
builtInsPackage("kotlin", "ranges").getContributedClassifier(
Name.identifier(name), NoLookupLocation.FROM_BACKEND
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.backend.common.BodyLoweringPass
import org.jetbrains.kotlin.backend.common.atMostOne
import org.jetbrains.kotlin.backend.konan.Context
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.ir.descriptors.IrBuiltinOperatorDescriptor
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.transformChildrenVoid
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.isSubtypeOf
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 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 {
expression.transformChildrenVoid(this)
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.
if (descriptor.fqNameSafe.asString() == assertFqName &&
!context.config.configuration.getBoolean(ENABLE_ASSERTIONS)) {
if (!enableAssertions && expression.symbol in assertSymbols) {
assert(expression.type.isUnit())
return IrCompositeImpl(expression.startOffset, expression.endOffset, expression.type)
}