You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/02/25 18:35:43 UTC
[groovy] branch GROOVY_2_5_X updated: GROOVY-3421: evaluate spread-map value only once
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_2_5_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push:
new 9ae0234 GROOVY-3421: evaluate spread-map value only once
9ae0234 is described below
commit 9ae02347e306ea532ce20936402fd0c93dfb40d3
Author: Eric Milles <er...@thomsonreuters.com>
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 9a93ea2..a9e1291 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -118,6 +118,7 @@ import java.io.PrintWriter;
import java.io.Writer;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
@@ -783,15 +784,9 @@ public class AsmClassGenerator extends ClassGenerator {
}
public void visitSpreadMapExpression(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 3241161..4d9c506 100644
--- a/src/test/groovy/operator/SpreadMapOperatorTest.groovy
+++ b/src/test/groovy/operator/SpreadMapOperatorTest.groovy
@@ -98,18 +98,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]
'''
}
@@ -129,4 +138,3 @@ class SpreadMapOperatorTest extends GroovyTestCase {
// Call with one usual argument, one named argument, one spread list argument, and one spread map argument
}
}
-