[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.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<IrModuleFragment>,
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<IrModuleFragment>, context: JsIrBackendContext): List<IrDeclaration> = buildList {
private fun buildRoots(
modules: Iterable<IrModuleFragment>,
context: JsIrBackendContext,
moduleKind: ModuleKind
): List<IrDeclaration> = 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<IrModuleFragment>, 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)
}
@@ -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<IrModuleFragment>,
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<IrModuleFragment>()
@@ -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)
@@ -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(