Re-implement variables in the blaze query language. Instead of using a mutable global context of variable bindings, pass around immutable local contexts.
The motivation is so we can safely evaluate all blaze query expressions concurrently under the hood. A global context is hostile to this goal.
--
MOS_MIGRATED_REVID=127324600
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index 1546b4e..586c493 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -65,6 +65,7 @@
import com.google.devtools.build.lib.query2.engine.StreamableQueryEnvironment;
import com.google.devtools.build.lib.query2.engine.TargetLiteral;
import com.google.devtools.build.lib.query2.engine.Uniquifier;
+import com.google.devtools.build.lib.query2.engine.VariableContext;
import com.google.devtools.build.lib.skyframe.BlacklistedPackagePrefixesValue;
import com.google.devtools.build.lib.skyframe.ContainingPackageLookupFunction;
import com.google.devtools.build.lib.skyframe.FileValue;
@@ -320,9 +321,10 @@
try (final AutoProfiler p = AutoProfiler.logged("evaluating query", LOG)) {
try {
if (expr.canEvalConcurrently()) {
- expr.evalConcurrently(this, callbackWithEmptyCheck, threadPool);
+ expr.evalConcurrently(
+ this, VariableContext.<Target>empty(), callbackWithEmptyCheck, threadPool);
} else {
- expr.eval(this, callbackWithEmptyCheck);
+ expr.eval(this, VariableContext.<Target>empty(), callbackWithEmptyCheck);
}
} catch (QueryException e) {
throw new QueryException(e, expr);
@@ -487,9 +489,9 @@
}
@Override
- public void eval(QueryExpression expr, Callback<Target> callback)
+ public void eval(QueryExpression expr, VariableContext<Target> context, Callback<Target> callback)
throws QueryException, InterruptedException {
- expr.eval(this, callback);
+ expr.eval(this, context, callback);
}
@Override
@@ -979,10 +981,11 @@
public void getAllRdeps(
QueryExpression expression,
Predicate<Target> universe,
- final Callback<Target> callback,
- final int depth)
+ VariableContext<Target> context,
+ Callback<Target> callback,
+ int depth)
throws QueryException, InterruptedException {
- getAllRdeps(expression, universe, callback, depth, BATCH_CALLBACK_SIZE);
+ getAllRdeps(expression, universe, context, callback, depth, BATCH_CALLBACK_SIZE);
}
/**
@@ -994,13 +997,17 @@
@VisibleForTesting
protected void getAllRdeps(
QueryExpression expression,
- final Predicate<Target> universe,
- final Callback<Target> callback,
- final int depth,
- final int batchSize)
+ Predicate<Target> universe,
+ VariableContext<Target> context,
+ Callback<Target> callback,
+ int depth,
+ int batchSize)
throws QueryException, InterruptedException {
Uniquifier<Target> uniquifier = createUniquifier();
- eval(expression, new BatchAllRdepsCallback(uniquifier, universe, callback, depth, batchSize));
+ eval(
+ expression,
+ context,
+ new BatchAllRdepsCallback(uniquifier, universe, callback, depth, batchSize));
}
private class BatchAllRdepsCallback implements Callback<Target> {