aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
diff options
context:
space:
mode:
authorGravatar Jon Brandvein <brandjon@google.com>2016-09-27 19:57:40 +0000
committerGravatar Yun Peng <pcloudy@google.com>2016-09-28 08:27:39 +0000
commit65e3ae6228bd179ef9ed80ebc817f829e180496e (patch)
treec9f382153bcc9e4919c11c0bee2bb7537a3e5d16 /src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
parent8a0d45ff940eea72a2887dc747d961c42f0e79c7 (diff)
Disallow mutation of values being iterated by a for loop or comprehension
This entails adding a read-locking mechanism to Mutability contexts. RELNOTES[INC]: Updating list/dicts while they are being looped over is not allowed. Use an explicit copy if needed ("for x in list(mylist):"). -- MOS_MIGRATED_REVID=134442701
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
index 386a9aefeb..5b1834d868 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
@@ -369,6 +369,18 @@ public final class EvalUtils {
}
}
+ public static void lock(Object object, Location loc) {
+ if (object instanceof SkylarkMutable) {
+ ((SkylarkMutable) object).lock(loc);
+ }
+ }
+
+ public static void unlock(Object object, Location loc) {
+ if (object instanceof SkylarkMutable) {
+ ((SkylarkMutable) object).unlock(loc);
+ }
+ }
+
private static ImmutableList<String> split(String value) {
ImmutableList.Builder<String> builder = new ImmutableList.Builder<>();
for (char c : value.toCharArray()) {