Using aliases in load() may no longer lead to false positives in SkylarkEnvironment's recursion detection.
--
MOS_MIGRATED_REVID=101374341
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BaseFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/BaseFunction.java
index 3516bd2..8161100 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BaseFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BaseFunction.java
@@ -27,6 +27,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import javax.annotation.Nullable;
@@ -552,4 +553,20 @@
builder.append(")");
return builder.toString();
}
+
+ @Override
+ public boolean equals(@Nullable Object other) {
+ if (other instanceof BaseFunction) {
+ BaseFunction that = (BaseFunction) other;
+ // In theory, the location alone unambiguously identifies a given function. However, in
+ // some test cases the location might not have a valid value, thus we also check the name.
+ return Objects.equals(this.name, that.name) && Objects.equals(this.location, that.location);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, location);
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Environment.java b/src/main/java/com/google/devtools/build/lib/syntax/Environment.java
index 1c599a8..5722e7d 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Environment.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Environment.java
@@ -356,9 +356,9 @@
}
/**
- * Return the current stack trace (list of function names).
+ * Return the current stack trace (list of functions).
*/
- public ImmutableList<String> getStackTrace() {
+ public ImmutableList<BaseFunction> getStackTrace() {
// Empty list, since this environment does not allow function definition
// (see SkylarkEnvironment)
return ImmutableList.of();
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkEnvironment.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkEnvironment.java
index 99362b6..f9e1e30 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkEnvironment.java
@@ -44,7 +44,7 @@
*/
private final Set<String> readGlobalVariables = new HashSet<>();
- private ImmutableList<String> stackTrace;
+ private ImmutableList<BaseFunction> stackTrace;
@Nullable private String fileContentHashCode;
@@ -55,13 +55,15 @@
public static SkylarkEnvironment createEnvironmentForFunctionCalling(
Environment callerEnv, SkylarkEnvironment definitionEnv,
UserDefinedFunction function) throws EvalException {
- if (callerEnv.getStackTrace().contains(function.getName())) {
- throw new EvalException(function.getLocation(), "Recursion was detected when calling '"
- + function.getName() + "' from '" + Iterables.getLast(callerEnv.getStackTrace()) + "'");
+ if (callerEnv.getStackTrace().contains(function)) {
+ throw new EvalException(
+ function.getLocation(),
+ "Recursion was detected when calling '" + function.getName() + "' from '"
+ + Iterables.getLast(callerEnv.getStackTrace()).getName() + "'");
}
- ImmutableList<String> stackTrace = new ImmutableList.Builder<String>()
+ ImmutableList<BaseFunction> stackTrace = new ImmutableList.Builder<BaseFunction>()
.addAll(callerEnv.getStackTrace())
- .add(function.getName())
+ .add(function)
.build();
SkylarkEnvironment childEnv =
// Always use the caller Environment's EventHandler. We cannot assume that the
@@ -79,8 +81,8 @@
return childEnv;
}
- private SkylarkEnvironment(SkylarkEnvironment definitionEnv, ImmutableList<String> stackTrace,
- EventHandler eventHandler) {
+ private SkylarkEnvironment(SkylarkEnvironment definitionEnv,
+ ImmutableList<BaseFunction> stackTrace, EventHandler eventHandler) {
super(definitionEnv.getGlobalEnvironment());
this.stackTrace = stackTrace;
this.eventHandler = Preconditions.checkNotNull(eventHandler,
@@ -109,7 +111,7 @@
}
@Override
- public ImmutableList<String> getStackTrace() {
+ public ImmutableList<BaseFunction> getStackTrace() {
return stackTrace;
}