diff options
author | 2016-09-27 19:57:40 +0000 | |
---|---|---|
committer | 2016-09-28 08:27:39 +0000 | |
commit | 65e3ae6228bd179ef9ed80ebc817f829e180496e (patch) | |
tree | c9f382153bcc9e4919c11c0bee2bb7537a3e5d16 /src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java | |
parent | 8a0d45ff940eea72a2887dc747d961c42f0e79c7 (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.java | 12 |
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()) { |