[JS IR] Introduce intrinsics to create shared boxes
This commit is contained in:
@@ -16,9 +16,10 @@ import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
|||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
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.IrType
|
||||||
import org.jetbrains.kotlin.ir.types.defaultType
|
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.types.isLong
|
||||||
import org.jetbrains.kotlin.ir.util.constructors
|
import org.jetbrains.kotlin.ir.util.constructors
|
||||||
import org.jetbrains.kotlin.ir.util.findDeclaration
|
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 jsBoxIntrinsic = getInternalFunction("boxIntrinsic")
|
||||||
val jsUnboxIntrinsic = getInternalFunction("unboxIntrinsic")
|
val jsUnboxIntrinsic = getInternalFunction("unboxIntrinsic")
|
||||||
|
|
||||||
|
val createSharedBox = defineCreateSharedBox()
|
||||||
|
val readSharedBox = defineReadSharedBox()
|
||||||
|
val writeSharedBox = defineWriteSharedBox()
|
||||||
|
|
||||||
// Helpers:
|
// Helpers:
|
||||||
|
|
||||||
private fun getInternalFunction(name: String) =
|
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 {
|
private fun defineEs6DefaultTypeIntrinsic(): IrSimpleFunction {
|
||||||
return externalPackageFragment.addFunction {
|
return externalPackageFragment.addFunction {
|
||||||
name = Name.identifier("DefaultType")
|
name = Name.identifier("DefaultType")
|
||||||
|
|||||||
Reference in New Issue
Block a user