[K/JS] Add VOID optimization on object properties + align with the optimization the JS Plain Object plugin

This commit is contained in:
Artem Kobzar
2024-01-19 13:03:06 +00:00
committed by Space Team
parent b2c30921e4
commit 7568ee5a79
14 changed files with 153 additions and 46 deletions
@@ -11,6 +11,8 @@ import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel
import org.jetbrains.kotlin.ir.backend.js.dce.DceDumpNameCache
import org.jetbrains.kotlin.ir.backend.js.dce.eliminateDeadDeclarations
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrProgramFragment
import org.jetbrains.kotlin.ir.backend.js.utils.JsStaticContext
import org.jetbrains.kotlin.ir.backend.js.utils.getVoid
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.js.backend.ast.JsClass
import org.jetbrains.kotlin.js.backend.ast.JsFunction
@@ -35,11 +37,13 @@ fun optimizeProgramByIr(
}
}
fun optimizeFragmentByJsAst(fragment: JsIrProgramFragment) {
fun optimizeFragmentByJsAst(fragment: JsIrProgramFragment, context: JsStaticContext) {
val voidName = context.backendContext.intrinsics.void.owner.backingField?.let(context::getNameForField)
val optimizer = object : RecursiveJsVisitor() {
override fun visitFunction(x: JsFunction) {
super.visitFunction(x)
FunctionPostProcessor(x).apply()
FunctionPostProcessor(x, voidName).apply()
}
override fun visitClass(x: JsClass) {
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.ir.backend.js.utils.JsGenerationContext
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.util.hasAnnotation
import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.js.backend.ast.metadata.constant
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
class IrDeclarationToJsTransformer : BaseIrElementToJsNodeTransformer<JsStatement, JsGenerationContext> {
@@ -471,7 +471,7 @@ class IrModuleToJsTransformer(
result.computeAndSaveDefinitions(definitionSet, fileExports)
if (optimizeGeneratedJs) {
optimizeFragmentByJsAst(result)
optimizeFragmentByJsAst(result, staticContext)
}
return JsIrProgramFragments(result, exportFragment)
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.js.backend.ast.metadata.constant
import org.jetbrains.kotlin.utils.DFS
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -50,7 +51,11 @@ class JsNameLinkingNamer(
}
}
return declaration.getName()
return declaration.getName().also {
if (declaration == context.intrinsics.void.owner.backingField) {
it.constant = true
}
}
}
override fun getNameForMemberFunction(function: IrSimpleFunction): JsName {
@@ -459,6 +459,7 @@ private class JsIrAstDeserializer(private val source: ByteArray) {
} ?: JsDynamicScope.declareName(identifier)
ifTrue { name.localAlias = readLocalAlias() }
ifTrue { name.imported = true }
ifTrue { name.constant = true }
ifTrue { name.specialFunction = specialFunctionValues[readInt()] }
return name
}
@@ -605,6 +605,7 @@ private class JsIrAstSerializer {
writeBoolean(name.isTemporary)
ifNotNull(name.localAlias) { writeLocalAlias(it) }
writeBoolean(name.imported && name !in importedNames)
writeBoolean(name.constant)
ifNotNull(name.specialFunction) { writeByte(it.ordinal) }
}
nameMap.size