diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt index eb25690bac9..7b2f791e11e 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.ir.backend.js import org.jetbrains.kotlin.builtins.PrimitiveType -import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.backend.js.utils.Namer import org.jetbrains.kotlin.ir.builders.declarations.addFunction import org.jetbrains.kotlin.ir.builders.declarations.addTypeParameter @@ -21,6 +20,7 @@ import org.jetbrains.kotlin.ir.types.defaultType import org.jetbrains.kotlin.ir.types.isLong import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.findDeclaration +import org.jetbrains.kotlin.ir.util.kotlinPackageFqn import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi2ir.findSingleFunction @@ -201,6 +201,8 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC val returnIfSuspended = getInternalFunction("returnIfSuspended") val getContinuation = getInternalFunction("getContinuation") + val jsEnsureNonNull = getFunctionInKotlinPackage("ensureNotNull") + // Arrays: val array = context.symbolTable.referenceClass(irBuiltIns.builtIns.array) @@ -282,6 +284,9 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC private fun getInternalWithoutPackage(name: String) = context.symbolTable.referenceSimpleFunction(context.getFunctions(FqName(name)).single()) + private fun getFunctionInKotlinPackage(name: String) = + context.symbolTable.referenceSimpleFunction(context.getFunctions(kotlinPackageFqn.child(Name.identifier(name))).single()) + private fun getInternalClassWithoutPackage(fqName: String) = context.symbolTable.referenceClass(context.getClass(FqName(fqName))) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt index e8866b11b87..4c5a7a93f75 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/ExceptionHelperCallsTransformer.kt @@ -14,17 +14,18 @@ import org.jetbrains.kotlin.name.Name class ExceptionHelperCallsTransformer(private val context: JsIrBackendContext) : CallsTransformer { - private fun referenceFunction(fqn: FqName) = context.getFunctions(fqn).singleOrNull()?.let { - context.symbolTable.referenceSimpleFunction(it) - } + private fun referenceFunction(fqn: FqName) = + context.getFunctions(fqn).singleOrNull()?.let { + context.symbolTable.referenceSimpleFunction(it) + } ?: throw AssertionError("Function not found: $fqn") private val helperMapping = mapOf( - // context.irBuiltIns.throwNpeSymbol to referenceFunction(kotlinPackageFqn.child(Name.identifier("THROW_NPE"))), -- TODO checkNotNullSymbol + context.irBuiltIns.checkNotNullSymbol to referenceFunction(kotlinPackageFqn.child(Name.identifier("ensureNotNull"))), context.irBuiltIns.throwCceSymbol to referenceFunction(kotlinPackageFqn.child(Name.identifier("THROW_CCE"))), context.irBuiltIns.throwIseSymbol to referenceFunction(kotlinPackageFqn.child(Name.identifier("THROW_ISE"))), context.irBuiltIns.noWhenBranchMatchedExceptionSymbol to referenceFunction(kotlinPackageFqn.child(Name.identifier("noWhenBranchMatchedException"))) ) - - override fun transformFunctionAccess(call: IrFunctionAccessExpression) = helperMapping[call.symbol]?.let { irCall(call, it) } ?: call + override fun transformFunctionAccess(call: IrFunctionAccessExpression) = + helperMapping[call.symbol]?.let { irCall(call, it) } ?: call } diff --git a/libraries/stdlib/js-ir/runtime/hacks.kt b/libraries/stdlib/js-ir/runtime/hacks.kt index 7ccef88974d..0a399dede67 100644 --- a/libraries/stdlib/js-ir/runtime/hacks.kt +++ b/libraries/stdlib/js-ir/runtime/hacks.kt @@ -20,4 +20,6 @@ fun THROW_CCE(): Nothing { } fun THROW_NPE(): Nothing { throw NullPointerException() -} \ No newline at end of file +} + +fun ensureNotNull(v: T?): T = if (v == null) THROW_NPE() else v \ No newline at end of file