From c747d0e742c1e940c1ee85b72a226a38cf12e478 Mon Sep 17 00:00:00 2001 From: Alexander Korepanov Date: Thu, 25 Aug 2022 17:12:15 +0200 Subject: [PATCH] [JS IR] Optimize JS AST blocks memory consumption --- .../org/jetbrains/kotlin/ir/backend/js/codegen/IrToJs.kt | 2 +- .../backend/js/transformers/irToJs/JsCallTransformer.kt | 2 +- .../src/org/jetbrains/kotlin/js/backend/ast/JsBlock.java | 3 +-- .../jetbrains/kotlin/js/backend/ast/JsCompositeBlock.kt | 8 ++++++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/codegen/IrToJs.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/codegen/IrToJs.kt index 3723a86c868..63695556ea3 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/codegen/IrToJs.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/codegen/IrToJs.kt @@ -423,7 +423,7 @@ private val IrModuleFragment.jsModuleName: String get() = name.asString().dropWhile { it == '<' }.dropLastWhile { it == '>' } private fun List.toJsCodeString(): String = - JsCompositeBlock().also { it.statements += this }.toString() + JsCompositeBlock(this).toString() enum class JsGenerationGranularity { WHOLE_PROGRAM, diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsCallTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsCallTransformer.kt index f5fdce1e704..4677033cfb7 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsCallTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsCallTransformer.kt @@ -31,7 +31,7 @@ class JsCallTransformer(private val jsOrJsFuncCall: IrCall, private val context: 0 -> JsEmpty 1 -> newStatements.single().withSource(jsOrJsFuncCall, context) // TODO: use transparent block (e.g. JsCompositeBlock) - else -> JsCompositeBlock().apply { statements += newStatements } + else -> JsCompositeBlock(newStatements) } } diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsBlock.java b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsBlock.java index 84fdefe0d94..3e662fb6bf5 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsBlock.java +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsBlock.java @@ -8,7 +8,6 @@ import org.jetbrains.kotlin.js.util.AstUtil; import org.jetbrains.annotations.NotNull; import com.intellij.util.SmartList; -import java.util.ArrayList; import java.util.List; /** @@ -19,7 +18,7 @@ public class JsBlock extends SourceInfoAwareJsNode implements JsStatement { private final List statements; public JsBlock() { - this(new ArrayList()); + this(new SmartList()); } public JsBlock(JsStatement statement) { diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsCompositeBlock.kt b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsCompositeBlock.kt index 2e31f09e073..c271cbea86f 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsCompositeBlock.kt +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsCompositeBlock.kt @@ -9,7 +9,11 @@ import org.jetbrains.kotlin.js.util.AstUtil; /** * Represents a JavaScript block which could not be rendered into a material one. */ -class JsCompositeBlock(statements: List = mutableListOf()) : JsBlock(statements) { +class JsCompositeBlock : JsBlock { + constructor() : super() + constructor(statement: JsStatement) : super(statement) + constructor(statements: List) : super(statements) + override fun isTransparent(): Boolean { return true } @@ -20,4 +24,4 @@ class JsCompositeBlock(statements: List = mutableListOf()) : JsBloc globalBlockCopy.statements.addAll(statementscopy); return globalBlockCopy.withMetadataFrom(this); } -} \ No newline at end of file +}