diff options
author | 2015-09-04 19:13:47 +0000 | |
---|---|---|
committer | 2015-09-08 09:02:28 +0000 | |
commit | 5a94e59f02833f9142bad9203acd72626b089535 (patch) | |
tree | ddfe00a54a701eff0f74af6e84e5b8cefcef1c93 /src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java | |
parent | ab1711b026f8a4915ee2ef2556b2a7dbff18fa63 (diff) |
Refactor Skylark Environment-s
Make Environment-s freezable: Introduce a class Mutability
as a revokable capability to mutate objects in an Environment.
For now, only Environment-s carry this capability.
Make sure that every Mutability is revoked in the same function that creates it,
so no Environment is left open for modification after being created and exported;
exceptions for tests, the shell and initialization contexts.
Unify Environment, SkylarkEnvironment and EvaluationContext into Environment.
Have a notion of Frame for the bindings + parent + mutability.
Replace the updateAndPropagate mechanism by a dynamicFrame.
Simplify ValidationEnvironment, that is now always deduced from the Environment.
--
MOS_MIGRATED_REVID=102363438
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java index 94b1917ab6..6140acb0b0 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java @@ -22,21 +22,25 @@ public class SkylarkCallbackFunction { private final BaseFunction callback; private final FuncallExpression ast; - private final SkylarkEnvironment funcallEnv; + private final Environment funcallEnv; - public SkylarkCallbackFunction(BaseFunction callback, FuncallExpression ast, - SkylarkEnvironment funcallEnv) { + public SkylarkCallbackFunction( + BaseFunction callback, FuncallExpression ast, Environment funcallEnv) { this.callback = callback; this.ast = ast; this.funcallEnv = funcallEnv; } public Object call(ClassObject ctx, Object... arguments) throws EvalException { - try { + try (Mutability mutability = Mutability.create("callback %s", callback)) { + Environment env = Environment.builder(mutability) + .setSkylark() + .setEventHandler(funcallEnv.getEventHandler()) + .setGlobals(funcallEnv.getGlobals()) + .build(); return callback.call( - ImmutableList.<Object>builder().add(ctx).add(arguments).build(), null, ast, funcallEnv); - } catch (InterruptedException | ClassCastException - | IllegalArgumentException e) { + ImmutableList.<Object>builder().add(ctx).add(arguments).build(), null, ast, env); + } catch (InterruptedException | ClassCastException | IllegalArgumentException e) { throw new EvalException(ast.getLocation(), e.getMessage()); } } |