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 41bc87e6e14..8a97d1e94f1 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 @@ -16,9 +16,10 @@ import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol -import org.jetbrains.kotlin.ir.symbols.impl.IrExternalPackageFragmentSymbolImpl import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.defaultType +import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeBuilder +import org.jetbrains.kotlin.ir.types.impl.buildSimpleType import org.jetbrains.kotlin.ir.types.isLong import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.findDeclaration @@ -300,6 +301,10 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC val jsBoxIntrinsic = getInternalFunction("boxIntrinsic") val jsUnboxIntrinsic = getInternalFunction("unboxIntrinsic") + val createSharedBox = defineCreateSharedBox() + val readSharedBox = defineReadSharedBox() + val writeSharedBox = defineWriteSharedBox() + // Helpers: private fun getInternalFunction(name: String) = @@ -329,6 +334,68 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC } } + private fun defineCreateSharedBox(): IrSimpleFunction { + return externalPackageFragment.addFunction { + name = Name.identifier("\$sharedBox\$create") + origin = JsLoweredDeclarationOrigin.JS_INTRINSICS_STUB + returnType = context.dynamicType + }.apply { + val tp = addTypeParameter("T", irBuiltIns.anyNType) + addValueParameter { + index = 0 + name = Name.identifier("v") + type = IrSimpleTypeBuilder().run { + classifier = tp.symbol + hasQuestionMark = true + buildSimpleType() + } + } + } + } + + private fun defineReadSharedBox(): IrSimpleFunction { + return externalPackageFragment.addFunction { + name = Name.identifier("\$sharedBox\$read") + origin = JsLoweredDeclarationOrigin.JS_INTRINSICS_STUB + }.apply { + val tp = addTypeParameter("T", irBuiltIns.anyNType) + returnType = IrSimpleTypeBuilder().run { + classifier = tp.symbol + hasQuestionMark = true + buildSimpleType() + } + addValueParameter { + index = 0 + name = Name.identifier("box") + type = context.dynamicType + } + } + } + + private fun defineWriteSharedBox(): IrSimpleFunction { + return externalPackageFragment.addFunction { + name = Name.identifier("\$sharedBox\$write") + origin = JsLoweredDeclarationOrigin.JS_INTRINSICS_STUB + returnType = irBuiltIns.unitType + }.apply { + val tp = addTypeParameter("T", irBuiltIns.anyNType) + addValueParameter { + index = 0 + name = Name.identifier("box") + type = context.dynamicType + } + addValueParameter { + index = 1 + name = Name.identifier("nv") + type = IrSimpleTypeBuilder().run { + classifier = tp.symbol + hasQuestionMark = true + buildSimpleType() + } + } + } + } + private fun defineEs6DefaultTypeIntrinsic(): IrSimpleFunction { return externalPackageFragment.addFunction { name = Name.identifier("DefaultType")