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 dc6f37109b8..d8d6e984f93 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 @@ -190,6 +190,15 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC val charClassSymbol = getInternalClassWithoutPackage("kotlin.Char") val charConstructor = charClassSymbol.constructors.single().owner + val stringClassSymbol = getInternalClassWithoutPackage("kotlin.String") + val stringConstructorSymbol = stringClassSymbol.constructors.single() + + val anyClassSymbol = getInternalClassWithoutPackage("kotlin.Any") + val anyConstructorSymbol = anyClassSymbol.constructors.single() + + val jsObjectClassSymbol = getInternalClassWithoutPackage("kotlin.js.JsObject") + val jsObjectConstructorSymbol by lazy { jsObjectClassSymbol.constructors.single() } + val uByteClassSymbol by lazy { getInternalClassWithoutPackage("kotlin.UByte") } val uShortClassSymbol by lazy { getInternalClassWithoutPackage("kotlin.UShort") } val uIntClassSymbol by lazy { getInternalClassWithoutPackage("kotlin.UInt") } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/BuiltInConstructorCalls.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/BuiltInConstructorCalls.kt new file mode 100644 index 00000000000..92a2f63bcca --- /dev/null +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/BuiltInConstructorCalls.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.ir.backend.js.lower.calls + +import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext +import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder +import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression +import org.jetbrains.kotlin.ir.util.irCall +import org.jetbrains.kotlin.ir.util.irConstructorCall + + +class BuiltInConstructorCalls(val context: JsIrBackendContext) : CallsTransformer { + val intrinsics = context.intrinsics + + override fun transformFunctionAccess(call: IrFunctionAccessExpression): IrExpression = + when (call.symbol) { + intrinsics.stringConstructorSymbol -> JsIrBuilder.buildString(context.irBuiltIns.stringType, "") + intrinsics.anyConstructorSymbol -> irConstructorCall(call, intrinsics.jsObjectConstructorSymbol) + else -> call + } +} diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLowering.kt index ff454c0fb9c..1978dba7abd 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/CallsLowering.kt @@ -26,6 +26,7 @@ class CallsLowering(val context: JsIrBackendContext) : FileLoweringPass { ReflectionCallsTransformer(context), EnumIntrinsicsTransformer(context), ExceptionHelperCallsTransformer(context), + BuiltInConstructorCalls(context), JsonIntrinsics(context) ) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt index cad4305a16e..583598ef4de 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt @@ -33,13 +33,6 @@ class IrModuleToJsTransformer( JsStringLiteral("use strict").makeStmt() ) - // TODO: fix it up with new name generator - val anyName = context.getNameForClass(backendContext.irBuiltIns.anyClass.owner) - val stringName = context.getNameForClass(backendContext.irBuiltIns.stringClass.owner) - - statements += JsVars(JsVars.JsVar(anyName, Namer.JS_OBJECT)) - statements += JsVars(JsVars.JsVar(stringName, JsNameRef("String"))) - val preDeclarationBlock = JsBlock() val postDeclarationBlock = JsBlock() diff --git a/libraries/stdlib/js-ir/runtime/coreRuntime.kt b/libraries/stdlib/js-ir/runtime/coreRuntime.kt index 45163037654..3c99ecbaea9 100644 --- a/libraries/stdlib/js-ir/runtime/coreRuntime.kt +++ b/libraries/stdlib/js-ir/runtime/coreRuntime.kt @@ -100,5 +100,8 @@ internal fun extendThrowable(this_: dynamic, message: String?, cause: Throwable? captureStack(this_) } +@JsName("Object") +internal external class JsObject + internal fun boxIntrinsic(x: T): R = error("Should be lowered") internal fun unboxIntrinsic(x: T): R = error("Should be lowered")