aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
diff options
context:
space:
mode:
authorGravatar Janak Ramakrishnan <janakr@google.com>2015-09-06 21:05:23 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-09-08 09:02:31 +0000
commitb6e33bca1db50b3c6e8019351bc61e0e576cc912 (patch)
treeb4cbdd4148af101cee5be0f874afb1266c84a537 /src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
parent5a94e59f02833f9142bad9203acd72626b089535 (diff)
*** Reason for rollback *** Breaks serialization of SkyValues. -- MOS_MIGRATED_REVID=102457225
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java50
1 files changed, 22 insertions, 28 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
index b3eb957019..0bd16ae90a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
@@ -27,7 +27,7 @@ import com.google.devtools.build.lib.skyframe.ASTFileLookupValue.ASTLookupInputE
import com.google.devtools.build.lib.syntax.BuildFileAST;
import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.lib.syntax.Label.SyntaxException;
-import com.google.devtools.build.lib.syntax.Mutability;
+import com.google.devtools.build.lib.syntax.SkylarkEnvironment;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -76,7 +76,7 @@ public class SkylarkImportLookupFunction implements SkyFunction {
throw new SkylarkImportLookupFunctionException(SkylarkImportFailedException.noFile(file));
}
- Map<PathFragment, com.google.devtools.build.lib.syntax.Environment> importMap = new HashMap<>();
+ Map<PathFragment, SkylarkEnvironment> importMap = new HashMap<>();
ImmutableList.Builder<SkylarkFileDependency> fileDependencies = ImmutableList.builder();
BuildFileAST ast = astLookupValue.getAST();
// TODO(bazel-team): Refactor this code and PackageFunction to reduce code duplications.
@@ -114,11 +114,10 @@ public class SkylarkImportLookupFunction implements SkyFunction {
file));
}
- // Skylark UserDefinedFunction-s in that file will share this function definition Environment,
- // which will be frozen by the time it is returned by createEnv.
- com.google.devtools.build.lib.syntax.Environment extensionEnv =
- createEnv(ast, file, importMap, env);
-
+ SkylarkEnvironment extensionEnv = createEnv(ast, file, importMap, env);
+ // Skylark UserDefinedFunctions are sharing function definition Environments, so it's extremely
+ // important not to modify them from this point. Ideally they should be only used to import
+ // symbols and serve as global Environments of UserDefinedFunctions.
return new SkylarkImportLookupValue(
extensionEnv, new SkylarkFileDependency(label, fileDependencies.build()));
}
@@ -165,34 +164,29 @@ public class SkylarkImportLookupFunction implements SkyFunction {
}
/**
- * Creates the Environment to be imported.
- * After it's returned, the Environment must not be modified.
+ * Creates the SkylarkEnvironment to be imported. After it's returned, the Environment
+ * must not be modified.
*/
- private com.google.devtools.build.lib.syntax.Environment createEnv(
- BuildFileAST ast,
- PathFragment file,
- Map<PathFragment, com.google.devtools.build.lib.syntax.Environment> importMap,
- Environment env)
+ private SkylarkEnvironment createEnv(BuildFileAST ast, PathFragment file,
+ Map<PathFragment, SkylarkEnvironment> importMap, Environment env)
throws InterruptedException, SkylarkImportLookupFunctionException {
StoredEventHandler eventHandler = new StoredEventHandler();
// TODO(bazel-team): this method overestimates the changes which can affect the
// Skylark RuleClass. For example changes to comments or unused functions can modify the hash.
// A more accurate - however much more complicated - way would be to calculate a hash based on
// the transitive closure of the accessible AST nodes.
- try (Mutability mutability = Mutability.create("importing %s", file)) {
- com.google.devtools.build.lib.syntax.Environment extensionEnv =
- ruleClassProvider.createSkylarkRuleClassEnvironment(
- mutability, eventHandler, ast.getContentHashCode(), importMap)
- .setupOverride("native", packageFactory.getNativeModule());
- ast.exec(extensionEnv, eventHandler);
- SkylarkRuleClassFunctions.exportRuleFunctions(extensionEnv, file);
-
- Event.replayEventsOn(env.getListener(), eventHandler.getEvents());
- if (eventHandler.hasErrors()) {
- throw new SkylarkImportLookupFunctionException(SkylarkImportFailedException.errors(file));
- }
- return extensionEnv;
- }
+ SkylarkEnvironment extensionEnv = ruleClassProvider
+ .createSkylarkRuleClassEnvironment(eventHandler, ast.getContentHashCode());
+ extensionEnv.update("native", packageFactory.getNativeModule());
+ extensionEnv.setImportedExtensions(importMap);
+ ast.exec(extensionEnv, eventHandler);
+ SkylarkRuleClassFunctions.exportRuleFunctions(extensionEnv, file);
+
+ Event.replayEventsOn(env.getListener(), eventHandler.getEvents());
+ if (eventHandler.hasErrors()) {
+ throw new SkylarkImportLookupFunctionException(SkylarkImportFailedException.errors(file));
+ }
+ return extensionEnv;
}
@Override