[K/JS] Use globalThis isntead of this for UMD modules ^KT-45604 Fixed

This commit is contained in:
Artem Kobzar
2024-03-13 13:36:55 +00:00
committed by Space Team
parent 43a08068fc
commit a38d317824
4 changed files with 19 additions and 6 deletions
@@ -17,15 +17,17 @@ import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.config.RuntimeDiagnostic import org.jetbrains.kotlin.js.config.RuntimeDiagnostic
import org.jetbrains.kotlin.serialization.js.ModuleKind
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
fun eliminateDeadDeclarations( fun eliminateDeadDeclarations(
modules: Iterable<IrModuleFragment>, modules: Iterable<IrModuleFragment>,
context: JsIrBackendContext, context: JsIrBackendContext,
moduleKind: ModuleKind,
removeUnusedAssociatedObjects: Boolean = true, removeUnusedAssociatedObjects: Boolean = true,
dceDumpNameCache: DceDumpNameCache, dceDumpNameCache: DceDumpNameCache,
) { ) {
val allRoots = buildRoots(modules, context) val allRoots = buildRoots(modules, context, moduleKind)
val printReachabilityInfo = val printReachabilityInfo =
context.configuration.getBoolean(JSConfigurationKeys.PRINT_REACHABILITY_INFO) || context.configuration.getBoolean(JSConfigurationKeys.PRINT_REACHABILITY_INFO) ||
@@ -91,7 +93,11 @@ private fun IrDeclaration.addRootsTo(
} }
} }
private fun buildRoots(modules: Iterable<IrModuleFragment>, context: JsIrBackendContext): List<IrDeclaration> = buildList { private fun buildRoots(
modules: Iterable<IrModuleFragment>,
context: JsIrBackendContext,
moduleKind: ModuleKind
): List<IrDeclaration> = buildList {
val declarationsCollector = object : IrElementVisitorVoid { val declarationsCollector = object : IrElementVisitorVoid {
override fun visitElement(element: IrElement): Unit = element.acceptChildrenVoid(this) override fun visitElement(element: IrElement): Unit = element.acceptChildrenVoid(this)
override fun visitBody(body: IrBody): Unit = Unit // Skip override fun visitBody(body: IrBody): Unit = Unit // Skip
@@ -119,6 +125,11 @@ private fun buildRoots(modules: Iterable<IrModuleFragment>, context: JsIrBackend
?.let { add(it) } ?.let { add(it) }
addIfNotNull(context.intrinsics.void.owner.backingField) addIfNotNull(context.intrinsics.void.owner.backingField)
if (moduleKind == ModuleKind.UMD) {
add(context.intrinsics.globalThis.owner)
}
addAll(context.testFunsPerFile.values) addAll(context.testFunsPerFile.values)
addAll(context.additionalExportedDeclarations) addAll(context.additionalExportedDeclarations)
} }
@@ -19,14 +19,16 @@ import org.jetbrains.kotlin.js.backend.ast.JsFunction
import org.jetbrains.kotlin.js.backend.ast.RecursiveJsVisitor import org.jetbrains.kotlin.js.backend.ast.RecursiveJsVisitor
import org.jetbrains.kotlin.js.inline.clean.ClassPostProcessor import org.jetbrains.kotlin.js.inline.clean.ClassPostProcessor
import org.jetbrains.kotlin.js.inline.clean.FunctionPostProcessor import org.jetbrains.kotlin.js.inline.clean.FunctionPostProcessor
import org.jetbrains.kotlin.serialization.js.ModuleKind
fun optimizeProgramByIr( fun optimizeProgramByIr(
modules: Iterable<IrModuleFragment>, modules: Iterable<IrModuleFragment>,
context: JsIrBackendContext, context: JsIrBackendContext,
moduleKind: ModuleKind,
removeUnusedAssociatedObjects: Boolean removeUnusedAssociatedObjects: Boolean
) { ) {
val dceDumpNameCache = DceDumpNameCache() // in JS mode only DCE Graph could be dumped val dceDumpNameCache = DceDumpNameCache() // in JS mode only DCE Graph could be dumped
eliminateDeadDeclarations(modules, context, removeUnusedAssociatedObjects, dceDumpNameCache) eliminateDeadDeclarations(modules, context, moduleKind, removeUnusedAssociatedObjects, dceDumpNameCache)
val phaseConfig = PhaseConfig(jsOptimizationPhases) val phaseConfig = PhaseConfig(jsOptimizationPhases)
val phaserState = PhaserState<IrModuleFragment>() val phaserState = PhaserState<IrModuleFragment>()
@@ -210,7 +210,7 @@ class IrModuleToJsTransformer(
} }
if (modes.any { it.production }) { if (modes.any { it.production }) {
optimizeProgramByIr(modules, backendContext, removeUnusedAssociatedObjects) optimizeProgramByIr(modules, backendContext, moduleKind, removeUnusedAssociatedObjects)
} }
modes.filter { it.production }.forEach { modes.filter { it.production }.forEach {
@@ -225,7 +225,7 @@ class IrModuleToJsTransformer(
doStaticMembersLowering(modules) doStaticMembersLowering(modules)
if (mode.production) { if (mode.production) {
optimizeProgramByIr(modules, backendContext, removeUnusedAssociatedObjects) optimizeProgramByIr(modules, backendContext, moduleKind, removeUnusedAssociatedObjects)
} }
return makeJsCodeGeneratorFromIr(exportData, mode) return makeJsCodeGeneratorFromIr(exportData, mode)
@@ -96,7 +96,7 @@ object ModuleWrapperTranslation {
val selector = JsAstUtils.newJsIf(amdTest, amdBody, JsAstUtils.newJsIf(commonJsTest, commonJsBody, plainBlock)) val selector = JsAstUtils.newJsIf(amdTest, amdBody, JsAstUtils.newJsIf(commonJsTest, commonJsBody, plainBlock))
adapterBody.statements += selector adapterBody.statements += selector
return listOf(JsInvocation(adapter, JsThisRef(), function).makeStmt()) return listOf(JsInvocation(adapter, JsName("globalThis", false).makeRef(), function).makeStmt())
} }
private fun wrapAmd( private fun wrapAmd(