Prevented catching/wrapping of InterruptedExceptions, especially in BaseFunction.

--
MOS_MIGRATED_REVID=102988766
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index c181a7e..1f30820 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -865,7 +865,7 @@
      * configuration. Note that configurations transitions are applied after the late-bound
      * attribute was evaluated.
      */
-    Object getDefault(Rule rule, T o) throws EvalException;
+    Object getDefault(Rule rule, T o) throws EvalException, InterruptedException;
   }
 
   /**
@@ -982,7 +982,7 @@
     }
 
     @Override
-    public Object getDefault(Rule rule, Object o) throws EvalException {
+    public Object getDefault(Rule rule, Object o) throws EvalException, InterruptedException {
       Map<String, Object> attrValues = new HashMap<>();
       // TODO(bazel-team): support configurable attributes here. RawAttributeMapper will throw
       // an exception on any instance of configurable attributes.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
index 49852ee..cfb8143 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
@@ -111,7 +111,7 @@
 
     public void addBindRule(
         RuleClass bindRuleClass, Label virtual, Label actual, Location location)
-        throws InvalidRuleException, NameConflictException {
+        throws InvalidRuleException, NameConflictException, InterruptedException {
 
       Map<String, Object> attributes = Maps.newHashMap();
       // Bound rules don't have a name field, but this works because we don't want more than one
@@ -133,7 +133,7 @@
      */
     public Builder createAndAddRepositoryRule(RuleClass ruleClass, RuleClass bindRuleClass,
         Map<String, Object> kwargs, FuncallExpression ast, Environment env)
-        throws InvalidRuleException, NameConflictException, SyntaxException {
+        throws InvalidRuleException, NameConflictException, SyntaxException, InterruptedException {
       StoredEventHandler eventHandler = new StoredEventHandler();
       Rule tempRule = RuleFactory.createRule(
           this, ruleClass, kwargs, eventHandler, ast, ast.getLocation(), env);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
index 12d02c6..eb3badd 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
@@ -59,10 +59,11 @@
   public abstract static class SkylarkImplicitOutputsFunction extends ImplicitOutputsFunction {
 
     public abstract ImmutableMap<String, String> calculateOutputs(AttributeMap map)
-        throws EvalException;
+        throws EvalException, InterruptedException;
 
     @Override
-    public Iterable<String> getImplicitOutputs(AttributeMap map) throws EvalException {
+    public Iterable<String> getImplicitOutputs(AttributeMap map)
+        throws EvalException, InterruptedException {
       return calculateOutputs(map).values();
     }
   }
@@ -83,7 +84,8 @@
     }
 
     @Override
-    public ImmutableMap<String, String> calculateOutputs(AttributeMap map) throws EvalException {
+    public ImmutableMap<String, String> calculateOutputs(AttributeMap map)
+        throws EvalException, InterruptedException {
       Map<String, Object> attrValues = new HashMap<>();
       for (String attrName : map.getAttributeNames()) {
         Type<?> attrType = map.getAttributeType(attrName);
@@ -175,7 +177,8 @@
    * Given a newly-constructed Rule instance (with attributes populated),
    * returns the list of output files that this rule produces implicitly.
    */
-  public abstract Iterable<String> getImplicitOutputs(AttributeMap rule) throws EvalException;
+  public abstract Iterable<String> getImplicitOutputs(AttributeMap rule)
+      throws EvalException, InterruptedException;
 
   /**
    * The implicit output function that returns no files.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index 2a6945c..256aab0 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -240,7 +240,7 @@
     }
   }
 
-  private void readObject(ObjectInputStream in) throws IOException {
+  private void readObject(ObjectInputStream in) throws IOException, InterruptedException {
     try {
       deserializedPkg = new PackageDeserializer().deserialize(in);
     } catch (PackageDeserializationException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
index 2537693..2f0715c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
@@ -166,7 +166,7 @@
   }
 
   private void deserializeRule(DeserializationContext context, Build.Rule rulePb)
-      throws PackageDeserializationException {
+      throws PackageDeserializationException, InterruptedException {
     Location ruleLocation = EmptyLocation.INSTANCE;
     RuleClass ruleClass = packageDeserializationEnvironment.getRuleClass(rulePb, ruleLocation);
     Map<String, ParsedAttributeValue> attributeValues = new HashMap<>();
@@ -326,9 +326,11 @@
    * Deserialize a package from its representation as a protocol message. The inverse of
    * {@link PackageSerializer#serialize}.
    * @throws IOException
+   * @throws InterruptedException 
    */
   private void deserializeInternal(Build.Package packagePb, StoredEventHandler eventHandler,
-      Package.Builder builder, InputStream in) throws PackageDeserializationException, IOException {
+      Package.Builder builder, InputStream in)
+      throws PackageDeserializationException, IOException, InterruptedException {
     Path buildFile = packageDeserializationEnvironment.getPath(packagePb.getBuildFilePath());
     Preconditions.checkNotNull(buildFile);
     DeserializationContext context = new DeserializationContext(builder);
@@ -394,7 +396,7 @@
   }
 
   private void deserializeTargets(InputStream in, DeserializationContext context)
-      throws IOException, PackageDeserializationException {
+      throws IOException, PackageDeserializationException, InterruptedException {
     Build.TargetOrTerminator tot;
     while (!(tot = Build.TargetOrTerminator.parseDelimitedFrom(in)).getIsTerminator()) {
       Build.Target target = tot.getTarget();
@@ -428,8 +430,10 @@
    * @return a new {@link Package} as read from {@code in}
    * @throws PackageDeserializationException on failures deserializing the input
    * @throws IOException on failures reading from {@code in}
+   * @throws InterruptedException 
    */
-  public Package deserialize(InputStream in) throws PackageDeserializationException, IOException {
+  public Package deserialize(InputStream in)
+      throws PackageDeserializationException, IOException, InterruptedException {
     try {
       return deserializeInternal(in);
     } catch (PackageDeserializationException | RuntimeException e) {
@@ -439,7 +443,7 @@
   }
 
   private Package deserializeInternal(InputStream in)
-      throws PackageDeserializationException, IOException {
+      throws PackageDeserializationException, IOException, InterruptedException {
     // Read the initial Package message so we have the data to initialize the builder. We will read
     // the Targets in individually later.
     Build.Package packagePb = Build.Package.parseDelimitedFrom(in);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index 6cb807f..4fd5428 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -900,7 +900,7 @@
                               Map<String, Object> kwargs,
                               FuncallExpression ast,
                               Environment env)
-      throws RuleFactory.InvalidRuleException, Package.NameConflictException {
+      throws RuleFactory.InvalidRuleException, Package.NameConflictException, InterruptedException {
     RuleClass ruleClass = getBuiltInRuleClass(ruleClassName, ruleFactory);
     RuleFactory.createAndAddRule(context, ruleClass, kwargs, ast, env);
   }
@@ -938,7 +938,7 @@
       @SuppressWarnings({"unchecked", "unused"})
       public Runtime.NoneType invoke(Map<String, Object> kwargs,
           FuncallExpression ast, Environment env)
-          throws EvalException {
+          throws EvalException, InterruptedException {
         env.checkLoadingPhase(ruleClass, ast.getLocation());
         try {
           addRule(ruleFactory, ruleClass, getContext(env, ast), kwargs, ast, env);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Rule.java b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
index a4a46bc..da1c804 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Rule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
@@ -483,8 +483,8 @@
    * first, followed by any explicit files. Additionally both implicit and explicit output files
    * will retain the relative order in which they were declared.
    */
-  void populateOutputFiles(EventHandler eventHandler,
-      Package.Builder pkgBuilder) throws SyntaxException {
+  void populateOutputFiles(EventHandler eventHandler, Package.Builder pkgBuilder)
+      throws SyntaxException, InterruptedException {
     Preconditions.checkState(outputFiles == null);
     // Order is important here: implicit before explicit
     outputFiles = Lists.newArrayList();
@@ -519,8 +519,8 @@
    * Implicit output files come from rule-specific patterns, and are a function
    * of the rule's "name", "srcs", and other attributes.
    */
-  private void populateImplicitOutputFiles(EventHandler eventHandler,
-      Package.Builder pkgBuilder) {
+  private void populateImplicitOutputFiles(EventHandler eventHandler, Package.Builder pkgBuilder)
+      throws InterruptedException {
     try {
       for (String out : ruleClass.getImplicitOutputsFunction().getImplicitOutputs(attributeMap)) {
         try {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index 91723d0..1e7dd2a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -1315,7 +1315,7 @@
    */
   Rule createRuleWithLabel(Package.Builder pkgBuilder, Label ruleLabel,
       Map<String, Object> attributeValues, EventHandler eventHandler, FuncallExpression ast,
-      Location location) throws SyntaxException {
+      Location location) throws SyntaxException, InterruptedException {
     Rule rule = pkgBuilder.newRuleWithLabel(ruleLabel, this, null, location);
     createRuleCommon(rule, pkgBuilder, attributeValues, eventHandler, ast);
     return rule;
@@ -1323,7 +1323,7 @@
 
   private void createRuleCommon(Rule rule, Package.Builder pkgBuilder,
       Map<String, Object> attributeValues, EventHandler eventHandler, FuncallExpression ast)
-          throws SyntaxException {
+      throws SyntaxException, InterruptedException {
     populateRuleAttributeValues(
         rule, pkgBuilder, attributeValues, eventHandler, ast);
     rule.populateOutputFiles(eventHandler, pkgBuilder);
@@ -1365,7 +1365,7 @@
   Rule createRuleWithParsedAttributeValues(Label label,
       Package.Builder pkgBuilder, Location ruleLocation,
       Map<String, ParsedAttributeValue> attributeValues, EventHandler eventHandler)
-          throws SyntaxException{
+          throws SyntaxException, InterruptedException {
     Rule rule = pkgBuilder.newRuleWithLabel(label, this, null, ruleLocation);
     rule.checkValidityPredicate(eventHandler);
 
@@ -1404,7 +1404,8 @@
                                            Package.Builder pkgBuilder,
                                            Map<String, Object> attributeValues,
                                            EventHandler eventHandler,
-                                           FuncallExpression ast) {
+                                           FuncallExpression ast)
+                                               throws InterruptedException {
     BitSet definedAttrs = new BitSet(); //  set of attr indices
 
     for (Map.Entry<String, Object> entry : attributeValues.entrySet()) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
index 8c073d2..9c3516e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
@@ -83,7 +83,7 @@
       FuncallExpression ast,
       Location location,
       @Nullable Environment env)
-      throws InvalidRuleException {
+      throws InvalidRuleException, InterruptedException {
     Preconditions.checkNotNull(ruleClass);
     String ruleClassName = ruleClass.getName();
     Object nameObject = attributeValues.get("name");
@@ -149,7 +149,7 @@
       FuncallExpression ast,
       Location location,
       Environment env)
-      throws InvalidRuleException, NameConflictException {
+      throws InvalidRuleException, NameConflictException, InterruptedException {
     Rule rule = createRule(
         pkgBuilder, ruleClass, attributeValues, eventHandler, ast, location, env);
     pkgBuilder.addRule(rule);
@@ -162,7 +162,7 @@
       Map<String, Object> attributeValues,
       FuncallExpression ast,
       Environment env)
-      throws InvalidRuleException, NameConflictException {
+      throws InvalidRuleException, NameConflictException, InterruptedException {
     return createAndAddRule(
         context.pkgBuilder,
         ruleClass,
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
index abbbdf8..74def59 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
@@ -140,7 +140,7 @@
     return new BuiltinFunction(ruleClassName,
         FunctionSignature.KWARGS, BuiltinFunction.USE_AST_ENV) {
       public Object invoke(Map<String, Object> kwargs, FuncallExpression ast, Environment env)
-          throws EvalException {
+          throws EvalException, InterruptedException {
         try {
           RuleClass ruleClass = ruleFactory.getRuleClass(ruleClassName);
           RuleClass bindRuleClass = ruleFactory.getRuleClass("bind");