diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt index 845c9fc2831..eb553af07d9 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/dce/Dce.kt @@ -17,15 +17,17 @@ import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.RuntimeDiagnostic +import org.jetbrains.kotlin.serialization.js.ModuleKind import org.jetbrains.kotlin.utils.addIfNotNull fun eliminateDeadDeclarations( modules: Iterable, context: JsIrBackendContext, + moduleKind: ModuleKind, removeUnusedAssociatedObjects: Boolean = true, dceDumpNameCache: DceDumpNameCache, ) { - val allRoots = buildRoots(modules, context) + val allRoots = buildRoots(modules, context, moduleKind) val printReachabilityInfo = context.configuration.getBoolean(JSConfigurationKeys.PRINT_REACHABILITY_INFO) || @@ -91,7 +93,11 @@ private fun IrDeclaration.addRootsTo( } } -private fun buildRoots(modules: Iterable, context: JsIrBackendContext): List = buildList { +private fun buildRoots( + modules: Iterable, + context: JsIrBackendContext, + moduleKind: ModuleKind +): List = buildList { val declarationsCollector = object : IrElementVisitorVoid { override fun visitElement(element: IrElement): Unit = element.acceptChildrenVoid(this) override fun visitBody(body: IrBody): Unit = Unit // Skip @@ -119,6 +125,11 @@ private fun buildRoots(modules: Iterable, context: JsIrBackend ?.let { add(it) } addIfNotNull(context.intrinsics.void.owner.backingField) + + if (moduleKind == ModuleKind.UMD) { + add(context.intrinsics.globalThis.owner) + } + addAll(context.testFunsPerFile.values) addAll(context.additionalExportedDeclarations) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt index 7d57c228ac5..25f318baf47 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/optimizations.kt @@ -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.inline.clean.ClassPostProcessor import org.jetbrains.kotlin.js.inline.clean.FunctionPostProcessor +import org.jetbrains.kotlin.serialization.js.ModuleKind fun optimizeProgramByIr( modules: Iterable, context: JsIrBackendContext, + moduleKind: ModuleKind, removeUnusedAssociatedObjects: Boolean ) { 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 phaserState = PhaserState() diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt index 8b9f5aa1a06..2d472ec8b80 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt @@ -210,7 +210,7 @@ class IrModuleToJsTransformer( } if (modes.any { it.production }) { - optimizeProgramByIr(modules, backendContext, removeUnusedAssociatedObjects) + optimizeProgramByIr(modules, backendContext, moduleKind, removeUnusedAssociatedObjects) } modes.filter { it.production }.forEach { @@ -225,7 +225,7 @@ class IrModuleToJsTransformer( doStaticMembersLowering(modules) if (mode.production) { - optimizeProgramByIr(modules, backendContext, removeUnusedAssociatedObjects) + optimizeProgramByIr(modules, backendContext, moduleKind, removeUnusedAssociatedObjects) } return makeJsCodeGeneratorFromIr(exportData, mode) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/ModuleWrapperTranslation.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/ModuleWrapperTranslation.kt index cd74e8af485..6e5ba4071e9 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/ModuleWrapperTranslation.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/ModuleWrapperTranslation.kt @@ -96,7 +96,7 @@ object ModuleWrapperTranslation { val selector = JsAstUtils.newJsIf(amdTest, amdBody, JsAstUtils.newJsIf(commonJsTest, commonJsBody, plainBlock)) adapterBody.statements += selector - return listOf(JsInvocation(adapter, JsThisRef(), function).makeStmt()) + return listOf(JsInvocation(adapter, JsName("globalThis", false).makeRef(), function).makeStmt()) } private fun wrapAmd(