From 0a9c536c01ad76474c4a462ce8da90d4642ca1f5 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 29 Dec 2016 17:28:22 +0300 Subject: [PATCH] JS: make defensive copy of argument list in JsInvocation and JsNew constructor --- .../kotlin/js/backend/ast/JsInvocation.java | 4 ++-- .../org/jetbrains/kotlin/js/backend/ast/JsNew.java | 4 ++-- .../translate/callTranslator/FunctionCallCases.kt | 14 +++++++++----- .../declaration/JsDataClassGenerator.java | 4 ++-- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsInvocation.java b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsInvocation.java index e2bc5723760..2c045ab48a2 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsInvocation.java +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsInvocation.java @@ -14,8 +14,8 @@ public final class JsInvocation extends JsExpression.JsExpressionHasArguments { @NotNull private JsExpression qualifier; - public JsInvocation(@NotNull JsExpression qualifier, @NotNull List arguments) { - super(arguments); + public JsInvocation(@NotNull JsExpression qualifier, @NotNull List arguments) { + super(new SmartList(arguments)); this.qualifier = qualifier; } diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsNew.java b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsNew.java index a3a8e8e32be..88909709c6c 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsNew.java +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsNew.java @@ -17,8 +17,8 @@ public final class JsNew extends JsExpression.JsExpressionHasArguments { this(constructorExpression, new SmartList()); } - public JsNew(JsExpression constructorExpression, List arguments) { - super(arguments); + public JsNew(JsExpression constructorExpression, List arguments) { + super(new SmartList(arguments)); this.constructorExpression = constructorExpression; } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt index d1818c57169..3f6e29aff9c 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/FunctionCallCases.kt @@ -200,21 +200,25 @@ object ConstructorCallCase : FunctionCallCase() { val invocationArguments = mutableListOf() val constructorDescriptor = callableDescriptor as ClassConstructorDescriptor - if (context.shouldBeDeferred(constructorDescriptor)) { - context.deferConstructorCall(constructorDescriptor, invocationArguments) - } - else { + + if (!context.shouldBeDeferred(constructorDescriptor)) { val closure = context.getClassOrConstructorClosure(constructorDescriptor) invocationArguments += closure?.map { context.getArgumentForClosureConstructor(it) }.orEmpty() } invocationArguments += argumentsInfo.getArguments() - return if (constructorDescriptor.isPrimary || AnnotationsUtils.isNativeObject(constructorDescriptor)) { + val result = if (constructorDescriptor.isPrimary || AnnotationsUtils.isNativeObject(constructorDescriptor)) { JsNew(functionRef, invocationArguments) } else { JsInvocation(functionRef, invocationArguments) } + + if (context.shouldBeDeferred(constructorDescriptor)) { + context.deferConstructorCall(constructorDescriptor, result.arguments) + } + + return result } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java index 0b38a8c9042..61af75ce887 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java @@ -95,9 +95,9 @@ class JsDataClassGenerator extends DataClassMethodGenerator { JsExpression constructorRef = context.getInnerReference(constructor); - JsExpression returnExpression = new JsNew(constructorRef, constructorArguments); + JsNew returnExpression = new JsNew(constructorRef, constructorArguments); if (context.shouldBeDeferred(constructor)) { - context.deferConstructorCall(constructor, constructorArguments); + context.deferConstructorCall(constructor, returnExpression.getArguments()); } functionObj.getBody().getStatements().add(new JsReturn(returnExpression)); }