Don't convert InterruptException to EvalException in struct field call expressions.

This is probably only a theoretical problem, since a blocking struct field is probably a very bad idea.

Closes #5132.

Change-Id: Ie84a78ab4d9ce215f2806ac49bf8911de6959930
PiperOrigin-RevId: 207902766
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index ecbe65c..6991363 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 import static java.util.stream.Collectors.joining;
 
 import com.google.common.collect.ImmutableCollection;
@@ -73,6 +74,17 @@
     }
   };
 
+  @SkylarkSignature(
+      name = "interrupted_function",
+      returnType = Runtime.NoneType.class,
+      documented = false)
+  static BuiltinFunction interruptedFunction =
+      new BuiltinFunction("interrupted_function") {
+        public Runtime.NoneType invoke() throws InterruptedException {
+          throw new InterruptedException();
+        }
+      };
+
   @SkylarkModule(name = "Mock", doc = "")
   static class NativeInfoMock extends NativeInfo {
 
@@ -154,6 +166,12 @@
     public BuiltinFunction structFieldCallable() {
       return foobar;
     }
+
+    @SkylarkCallable(name = "interrupted_struct_field", documented = false, structField = true)
+    public BuiltinFunction structFieldInterruptedCallable() throws InterruptedException {
+      throw new InterruptedException();
+    }
+
     @SkylarkCallable(name = "function", documented = false, structField = false)
     public String function() {
       return "a";
@@ -1261,6 +1279,20 @@
   }
 
   @Test
+  public void testCallingInterruptedStructField() throws Exception {
+    update("mock", new Mock());
+    assertThrows(InterruptedException.class, () -> eval("mock.interrupted_struct_field()"));
+  }
+
+  @Test
+  public void testCallingInterruptedFunction() throws Exception {
+    interruptedFunction.configure(
+        getClass().getDeclaredField("interruptedFunction").getAnnotation(SkylarkSignature.class));
+    update("interrupted_function", interruptedFunction);
+    assertThrows(InterruptedException.class, () -> eval("interrupted_function()"));
+  }
+
+  @Test
   public void testJavaFunctionWithExtraInterpreterParams() throws Exception {
     new SkylarkTest()
         .update("mock", new Mock())
@@ -1868,6 +1900,7 @@
         .testExactOrder(
             "dir(mock)",
             "function",
+            "interrupted_struct_field",
             "is_empty",
             "legacy_method",
             "nullfunc_failing",