aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Jon Brandvein <brandjon@google.com>2016-07-25 16:57:54 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-07-26 09:30:08 +0000
commit79aa7796b957c864e8ee7f5ce4c361bc1c4347e7 (patch)
treef97fb72d9767097b7a4c3a6dcc071a5ad37de2d1
parent7cf2460a0c2908938f75b5284c0d8e2a0a48e1dc (diff)
Fix crash when updating collections while iterating over them in comprehensions
This makes For clauses have the same semantics as For loops. -- MOS_MIGRATED_REVID=128368124
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/AbstractComprehension.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java9
2 files changed, 10 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/AbstractComprehension.java b/src/main/java/com/google/devtools/build/lib/syntax/AbstractComprehension.java
index b5680bf576..ea727ea8fa 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/AbstractComprehension.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/AbstractComprehension.java
@@ -121,7 +121,7 @@ public abstract class AbstractComprehension extends Expression {
Object listValueObject = list.eval(env);
Location loc = getLocation();
Iterable<?> listValue = EvalUtils.toIterable(listValueObject, loc);
- for (Object listElement : listValue) {
+ for (Object listElement : ImmutableList.copyOf(listValue)) {
variables.assign(env, loc, listElement);
evalStep(env, collector, step);
}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index 4396608f66..78f9962d74 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -575,6 +575,15 @@ public class EvaluationTest extends EvaluationTestCase {
}
@Test
+ public void testListComprehensionUpdate() throws Exception {
+ new BuildTest()
+ .setUp("xs = [1, 2, 3]")
+ .testStatement("[xs.append(4) for x in xs]",
+ MutableList.of(env, Runtime.NONE, Runtime.NONE, Runtime.NONE))
+ .testLookup("xs", MutableList.of(env, 1, 2, 3));
+ }
+
+ @Test
public void testInOperator() throws Exception {
newTest()
.testStatement("'b' in ['a', 'b']", Boolean.TRUE)