[IR] Support const optimizations for JS backend

This commit is contained in:
Ivan Kylchik
2023-05-29 00:19:47 +02:00
committed by Space Team
parent abbafc0b2a
commit d3d28783c5
22 changed files with 292 additions and 32 deletions
@@ -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
@@ -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)