aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java
diff options
context:
space:
mode:
authorGravatar Francois-Rene Rideau <tunes@google.com>2015-09-04 19:13:47 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-09-08 09:02:28 +0000
commit5a94e59f02833f9142bad9203acd72626b089535 (patch)
treeddfe00a54a701eff0f74af6e84e5b8cefcef1c93 /src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java
parentab1711b026f8a4915ee2ef2556b2a7dbff18fa63 (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.java18
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());
}
}