From 2ed82f136cbdb101b59435c96c75435df519fb6b Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Thu, 12 Apr 2018 02:25:37 +0300 Subject: [PATCH] [JS IR BE] move intrinsic for Object.create calls to JsIntrinsics --- .../kotlin/ir/backend/js/JsIntrinsics.kt | 78 +++++++++++++++---- .../ir/backend/js/JsIrBackendContext.kt | 44 +---------- .../backend/js/lower/SecondaryCtorLowering.kt | 2 +- .../IrElementToJsExpressionTransformer.kt | 8 -- .../irToJs/JsIntrinsicTransformers.kt | 12 +++ 5 files changed, 79 insertions(+), 65 deletions(-) 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 edfb344e8c1..21eeb32d8f0 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 @@ -5,27 +5,73 @@ package org.jetbrains.kotlin.ir.backend.js +import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl +import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl +import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns +import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator +import org.jetbrains.kotlin.ir.util.SymbolTable +import org.jetbrains.kotlin.js.resolve.JsPlatform.builtIns +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.types.KotlinTypeFactory +import org.jetbrains.kotlin.types.Variance + +class JsIntrinsics(private val module: ModuleDescriptor, private val irBuiltIns: IrBuiltIns, symbolTable: SymbolTable) { + + private val stubBuilder = DeclarationStubGenerator(symbolTable, JsLoweredDeclarationOrigin.JS_INTRINSICS_STUB) -class JsIntrinsics(irBuiltIns: IrBuiltIns) { // Equality - val jsEqeq = irBuiltIns.binOpBool("jsEqeq") - val jsNotEq = irBuiltIns.binOpBool("jsNotEq") - val jsEqeqeq = irBuiltIns.binOpBool("jsEqeqeq") - val jsNotEqeq = irBuiltIns.binOpBool("jsNotEqeq") + val jsEqeq = binOpBool("jsEqeq") + val jsNotEq = binOpBool("jsNotEq") + val jsEqeqeq = binOpBool("jsEqeqeq") + val jsNotEqeq = binOpBool("jsNotEqeq") // Unary operations - val jsNot = irBuiltIns.unOpBool("jsNot") + val jsNot = unOpBool("jsNot") // Binary operations - val jsPlus = irBuiltIns.binOp("jsPlus") - val jsMinus = irBuiltIns.binOp("jsMinus") - val jsMult = irBuiltIns.binOp("jsMult") - val jsDiv = irBuiltIns.binOp("jsDiv") - val jsMod = irBuiltIns.binOp("jsMod") -} + val jsPlus = binOp("jsPlus") + val jsMinus = binOp("jsMinus") + val jsMult = binOp("jsMult") + val jsDiv = binOp("jsDiv") + val jsMod = binOp("jsMod") -private fun IrBuiltIns.unOpBool(name: String) = defineOperator(name, bool, listOf(anyN, anyN)) -private fun IrBuiltIns.binOpBool(name: String) = defineOperator(name, bool, listOf(anyN, anyN)) -private fun IrBuiltIns.unOp(name: String) = defineOperator(name, anyN, listOf(anyN, anyN)) -private fun IrBuiltIns.binOp(name: String) = defineOperator(name, anyN, listOf(anyN, anyN)) + val jsObjectCreate: IrSimpleFunction = defineObjectCreateIntrinsic() + + // Helpers: + + // TODO: unify how we create intrinsic symbols + private fun defineObjectCreateIntrinsic(): IrSimpleFunction { + + val typeParam = TypeParameterDescriptorImpl.createWithDefaultBound( + builtIns.any, + Annotations.EMPTY, + true, + Variance.INVARIANT, + Name.identifier("T"), + 0 + ) + + val returnType = KotlinTypeFactory.simpleType(Annotations.EMPTY, typeParam.typeConstructor, emptyList(), false) + + val desc = SimpleFunctionDescriptorImpl.create( + module, + Annotations.EMPTY, + Name.identifier("Object\$create"), + CallableMemberDescriptor.Kind.SYNTHESIZED, + SourceElement.NO_SOURCE + ).apply { + initialize(null, null, listOf(typeParam), emptyList(), returnType, Modality.FINAL, Visibilities.PUBLIC) + isInline = true + } + + return stubBuilder.generateFunctionStub(desc) + } + + private fun unOpBool(name: String) = irBuiltIns.run { defineOperator(name, bool, listOf(anyN, anyN)) } + private fun binOpBool(name: String) = irBuiltIns.run { defineOperator(name, bool, listOf(anyN, anyN)) } + private fun unOp(name: String) = irBuiltIns.run { defineOperator(name, anyN, listOf(anyN, anyN)) } + private fun binOp(name: String) = irBuiltIns.run { defineOperator(name, anyN, listOf(anyN, anyN)) } +} diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt index 23ab367eb59..fc728f6eccf 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt @@ -9,27 +9,22 @@ import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.ReflectionTypes import org.jetbrains.kotlin.backend.common.ir.Ir import org.jetbrains.kotlin.backend.common.ir.Symbols -import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl -import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment -import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol -import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.MemberScope -import org.jetbrains.kotlin.types.KotlinTypeFactory -import org.jetbrains.kotlin.types.Variance class JsIrBackendContext( val module: ModuleDescriptor, @@ -38,7 +33,7 @@ class JsIrBackendContext( symbolTable: SymbolTable ) : CommonBackendContext { - val intrinsics = JsIntrinsics(irBuiltIns) + val intrinsics = JsIntrinsics(module, irBuiltIns, symbolTable) override val builtIns = module.builtIns override val sharedVariablesManager = JsSharedVariablesManager(builtIns) @@ -97,37 +92,6 @@ class JsIrBackendContext( val secondaryConstructorsMap = mutableMapOf() - private val stubBuilder = DeclarationStubGenerator(symbolTable, JsLoweredDeclarationOrigin.JS_INTRINSICS_STUB) - - val objectCreate: IrSimpleFunction = defineObjectCreateIntrinsic() - - private fun defineObjectCreateIntrinsic(): IrSimpleFunction { - - val typeParam = TypeParameterDescriptorImpl.createWithDefaultBound( - builtIns.any, - Annotations.EMPTY, - true, - Variance.INVARIANT, - Name.identifier("T"), - 0 - ) - - val returnType = KotlinTypeFactory.simpleType(Annotations.EMPTY, typeParam.typeConstructor, emptyList(), false) - - val desc = SimpleFunctionDescriptorImpl.create( - module, - Annotations.EMPTY, - Name.identifier("Object\$create"), - CallableMemberDescriptor.Kind.SYNTHESIZED, - SourceElement.NO_SOURCE - ).apply { - initialize(null, null, listOf(typeParam), emptyList(), returnType, Modality.FINAL, Visibilities.PUBLIC) - isInline = true - } - - return stubBuilder.generateFunctionStub(desc) - } - private fun find(memberScope: MemberScope, className: String): ClassDescriptor { return find(memberScope, Name.identifier(className)) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt index 4b7ae116b4b..bf3eafb0c0d 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/SecondaryCtorLowering.kt @@ -232,7 +232,7 @@ class SecondaryCtorLowering(val context: JsIrBackendContext) : IrElementTransfor ctorOrig.origin, functionSymbol ) - val createFunctionIntrinsic = context.objectCreate + val createFunctionIntrinsic = context.intrinsics.jsObjectCreate val irBuilder = context.createIrBuilder(functionSymbol, ctorOrig.startOffset, ctorOrig.endOffset).irBlockBody { val thisVar = irTemporaryVar( IrCallImpl( diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt index 7a57070e9b6..e89b1c52d60 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt @@ -83,14 +83,6 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer + val classToCreate = call.getTypeArgument(0)!! + val prototype = prototypeOf(classToCreate.constructor.declarationDescriptor!!.name.toJsName().makeRef()) + JsInvocation(Namer.JS_OBJECT_CREATE_FUNCTION, prototype) + + } } } operator fun get(symbol: IrSymbol): IrCallTransformer? = transformers[symbol] } +private fun MutableMap.add(function: IrFunction, t: IrCallTransformer) { + put(function.symbol, t) +} + private fun MutableMap.binOp(function: IrFunction, op: JsBinaryOperator) { put(function.symbol, { _, args -> JsBinaryOperation(op, args[0], args[1]) }) }