From 9ede8445e7f0ba8a322eeae91e71d1674546e07f Mon Sep 17 00:00:00 2001 From: Vitaly Date: Sat, 9 May 2020 13:53:13 +0300 Subject: [PATCH] [JS BE] add runtime-function and intrinsics for es6-classes --- .../kotlin/ir/backend/js/JsIntrinsics.kt | 13 ++++++++ .../irToJs/JsIntrinsicTransformers.kt | 30 +++++++++++++++++++ .../stdlib/js-ir/runtime/constructFunction.kt | 13 ++++++++ libraries/stdlib/js-ir/runtime/coreRuntime.kt | 4 +++ 4 files changed, 60 insertions(+) create mode 100644 libraries/stdlib/js-ir/runtime/constructFunction.kt 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 976a907e2e4..41bc87e6e14 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 @@ -151,6 +151,11 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC val jsAnyToString = getInternalFunction("anyToString") val jsCompareTo = getInternalFunction("compareTo") val jsEquals = getInternalFunction("equals") + val jsConstruct = getInternalFunction("construct") + val jsNewTarget = unOp("jsNewTarget") + val jsEmptyObject = unOp("emptyObject") + val jsOpenInitializerBox = binOp("openInitializerBox") + val es6DefaultType = defineEs6DefaultTypeIntrinsic().symbol val jsImul = getInternalFunction("imul") @@ -324,6 +329,14 @@ class JsIntrinsics(private val irBuiltIns: IrBuiltIns, val context: JsIrBackendC } } + private fun defineEs6DefaultTypeIntrinsic(): IrSimpleFunction { + return externalPackageFragment.addFunction { + name = Name.identifier("DefaultType") + }.apply { + returnType = addTypeParameter("T", irBuiltIns.anyType).defaultType + } + } + private fun defineJsBindIntrinsic(): IrSimpleFunction { return externalPackageFragment.addFunction { name = Name.identifier("\$jsBind\$") diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt index 8b9ba2586b3..87accd6cb8e 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIntrinsicTransformers.kt @@ -101,6 +101,36 @@ class JsIntrinsicTransformers(backendContext: JsIrBackendContext) { } } + add(intrinsics.jsNewTarget) { _, _ -> + JsNameRef(JsName("target"), JsNameRef(JsName("new"))) + } + + add(intrinsics.jsOpenInitializerBox) { call, context -> + val arguments = translateCallArguments(call, context) + + JsInvocation( + JsNameRef("Object.assign"), + arguments + ) + } + + add(intrinsics.jsEmptyObject) { _, _ -> + JsObjectLiteral() + } + + add(intrinsics.es6DefaultType) { call, context -> + val classifier: IrClassifierSymbol = call.getTypeArgument(0)!!.classifierOrFail + val owner = classifier.owner + + when { + owner is IrClass && owner.isEffectivelyExternal() -> + context.getRefForExternalClass(owner) + + else -> + context.getNameForStaticDeclaration(owner as IrDeclarationWithName).makeRef() + } + } + addIfNotNull(intrinsics.jsCode) { _, _ -> error("Should not be called") } add(intrinsics.jsGetContinuation) { _, context: JsGenerationContext -> diff --git a/libraries/stdlib/js-ir/runtime/constructFunction.kt b/libraries/stdlib/js-ir/runtime/constructFunction.kt new file mode 100644 index 00000000000..0169ba428a2 --- /dev/null +++ b/libraries/stdlib/js-ir/runtime/constructFunction.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2020 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 kotlin.js + +/** + * @param CT is return type of calling constructor (uses in DCE) + */ +fun construct(constructorType: dynamic, resultType: dynamic, vararg args: Any?): Any { + return js("Reflect").construct(constructorType, args, resultType) +} diff --git a/libraries/stdlib/js-ir/runtime/coreRuntime.kt b/libraries/stdlib/js-ir/runtime/coreRuntime.kt index 7c5e88e9f4c..0909b9ae8e9 100644 --- a/libraries/stdlib/js-ir/runtime/coreRuntime.kt +++ b/libraries/stdlib/js-ir/runtime/coreRuntime.kt @@ -99,6 +99,10 @@ internal fun newThrowable(message: String?, cause: Throwable?): Throwable { internal fun extendThrowable(this_: dynamic, message: String?, cause: Throwable?) { js("Error").call(this_) + setPropertiesToThrowableInstance(this_, message, cause) +} + +internal fun setPropertiesToThrowableInstance(this_: dynamic, message: String?, cause: Throwable?) { if (!hasOwnPrototypeProperty(this_, "message")) { this_.message = message ?: cause?.toString() ?: undefined }