[JS BE] add runtime-function and intrinsics for es6-classes

This commit is contained in:
Vitaly
2020-05-09 13:53:13 +03:00
committed by romanart
parent 18bd80eb29
commit 9ede8445e7
4 changed files with 60 additions and 0 deletions
@@ -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\$")
@@ -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 ->
@@ -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 <CT> construct(constructorType: dynamic, resultType: dynamic, vararg args: Any?): Any {
return js("Reflect").construct(constructorType, args, resultType)
}
@@ -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
}