[IR] Support const optimizations for JS backend
This commit is contained in:
+10
-4
@@ -172,10 +172,16 @@ internal class DefaultCallInterceptor(override val interpreter: IrInterpreter) :
|
||||
if (environment.configuration.platform.isJs()) {
|
||||
if (signature.name == "toString") return signature.args[0].value.specialToStringForJs()
|
||||
if (signature.name == "toFloat") signature.name = "toDouble"
|
||||
signature.args.filter { it.type == "kotlin.Float" }.forEach {
|
||||
it.type = "kotlin.Double"
|
||||
it.value = it.value.toString().toDouble()
|
||||
}
|
||||
signature.args
|
||||
.filter { it.value is Float || it.type == "kotlin.Float" || it.type == "kotlin.Float?" }
|
||||
.forEach {
|
||||
it.type = when (it.type) {
|
||||
"kotlin.Float" -> "kotlin.Double"
|
||||
"kotlin.Float?" -> "kotlin.Double?"
|
||||
else -> it.type
|
||||
}
|
||||
it.value = it.value.toString().toDouble()
|
||||
}
|
||||
}
|
||||
|
||||
val name = signature.name
|
||||
|
||||
+9
@@ -234,6 +234,15 @@ private fun unfoldBody(body: IrBody, callStack: CallStack) {
|
||||
}
|
||||
|
||||
private fun unfoldBlock(block: IrBlock, callStack: CallStack) {
|
||||
if (block is IrReturnableBlock) {
|
||||
val inlinedDeclaration = block.inlineFunction?.originalFunction?.let { it.property ?: it }
|
||||
if (inlinedDeclaration != null && inlinedDeclaration.hasAnnotation(intrinsicConstEvaluationAnnotation)) {
|
||||
val inlinedBlock = block.statements.single() as IrInlinedFunctionBlock
|
||||
callStack.pushCompoundInstruction(inlinedBlock.inlineCall)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
callStack.newSubFrame(block)
|
||||
callStack.pushSimpleInstruction(block)
|
||||
unfoldStatements(block.statements, callStack)
|
||||
|
||||
Reference in New Issue
Block a user