This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY_3_0_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit d7a3dc8f72fef552df16bb50fbb1ececaa885645 Author: Eric Milles <[email protected]> AuthorDate: Sun Jun 6 17:09:36 2021 -0500 GROOVY-3421: evaluate spread-map value only once Conflicts: src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java --- .../groovy/classgen/AsmClassGenerator.java | 13 ++++------- .../groovy/operator/SpreadMapOperatorTest.groovy | 26 ++++++++++++++-------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java index e0530be..22a677e 100644 --- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java +++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java @@ -116,6 +116,7 @@ import java.io.PrintWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; @@ -764,15 +765,9 @@ public class AsmClassGenerator extends ClassGenerator { @Override public void visitSpreadMapExpression(final SpreadMapExpression expression) { - Expression subExpression = expression.getExpression(); - // to not record the underlying MapExpression twice, - // we disable the assertion tracker - // see https://issues.apache.org/jira/browse/GROOVY-3421 - controller.getAssertionWriter().disableTracker(); - subExpression.visit(this); - controller.getOperandStack().box(); - spreadMap.call(controller.getMethodVisitor()); - controller.getAssertionWriter().reenableTracker(); + // GROOVY-3421: SpreadMapExpression is key expression and contains value + callX(ClassHelper.make(Collections.class), "emptyMap").visit(this); + spreadMap.call(controller.getMethodVisitor()); // dummy SpreadMap controller.getOperandStack().replace(ClassHelper.OBJECT_TYPE); } diff --git a/src/test/groovy/operator/SpreadMapOperatorTest.groovy b/src/test/groovy/operator/SpreadMapOperatorTest.groovy index 855f71d..47f1632 100644 --- a/src/test/groovy/operator/SpreadMapOperatorTest.groovy +++ b/src/test/groovy/operator/SpreadMapOperatorTest.groovy @@ -100,18 +100,27 @@ class SpreadMapOperatorTest extends GroovyTestCase { void testSpecialSpreadMapIndexNotation() { assertScript ''' - @groovy.transform.ToString - class Person { String name; int age } + @groovy.transform.ToString + class Person { String name; int age } - assert Person[ name:'Dave', age:32 ].toString() == 'Person(Dave, 32)' + assert Person[ name:'Dave', age:32 ].toString() == 'Person(Dave, 32)' - def timMap = [ name:'Tim', age:49 ] - assert Person[ *:timMap ].toString() == 'Person(Tim, 49)' + def timMap = [ name:'Tim', age:49 ] + assert Person[ *:timMap ].toString() == 'Person(Tim, 49)' - assert Person[ *:[ name:'John', age:29 ] ].toString() == 'Person(John, 29)' + assert Person[ *:[ name:'John', age:29 ] ].toString() == 'Person(John, 29)' - def ppl = [ [ name:'Tim', age:49 ], [ name:'Dave', age:32 ], [ name:'Steve', age:18 ] ] - assert ppl.collect { Person [ *:it ] }*.age == [49, 32, 18] + def ppl = [ [ name:'Tim', age:49 ], [ name:'Dave', age:32 ], [ name:'Steve', age:18 ] ] + assert ppl.collect { Person [ *:it ] }*.age == [49, 32, 18] + ''' + } + + // GROOVY-3421 + void testSpreadMapSingleEval() { + assertScript ''' + int i = 1 + Map map = [a:i, *:[b:++i]] + assert map == [a: 1, b: 2] ''' } @@ -131,4 +140,3 @@ class SpreadMapOperatorTest extends GroovyTestCase { // Call with one usual argument, one named argument, one spread list argument, and one spread map argument } } -
