On Wed, 18 Nov 2020 16:51:47 GMT, Paul Sandoz <psan...@openjdk.org> wrote:

>> Mandy Chung has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   Fix the name passed to condy calling classData
>
> src/java.base/share/classes/java/lang/invoke/MethodHandles.java line 342:
> 
>> 340:          } catch (ClassCastException e) {
>> 341:              throw e;
>> 342:          } catch (Throwable e) {
> 
> The following might be more appropriate so, in general, errors and runtime 
> exceptions are not explicitly wrapped:
> 
>         try {
>             return BootstrapMethodInvoker.widenAndCast(classdata, type);
>         }
>         catch (RuntimeException | Error e) {
>             throw e;
>         }
>         catch (Throwable e) {
>             throw new InternalError("Unexpected exception", e);
>         }
> 
> same applies to `classDataAt` and `ConstantBootstraps.explicitCast`. 
> Refinement of the runtime exceptions is also possible, but i think the key 
> thing here is to let errors pass through and any possibly expected runtime 
> exceptions will get wrapped in `BootstrapMethodError`.

Yes a good refinement.

diff --git 
a/src/java.base/share/classes/java/lang/invoke/ConstantBootstraps.java 
b/src/java.base/share/classes/java/lang/invoke/ConstantBootstraps.java
index 71cae83e160..27d74284dc6 100644
--- a/src/java.base/share/classes/java/lang/invoke/ConstantBootstraps.java
+++ b/src/java.base/share/classes/java/lang/invoke/ConstantBootstraps.java
@@ -413,8 +413,8 @@ public final class ConstantBootstraps {
         MethodHandle conv = MethodHandles.explicitCastArguments(id, mt);
         try {
             return conv.invoke(value);
-        } catch (ClassCastException e) {
-            throw e; // specified, let CCE through
+        } catch (RuntimeException|Error e) {
+            throw e; // let specified CCE and other runtime exceptions/errors 
through
         } catch (Throwable throwable) {
             throw new InternalError(throwable); // Not specified, throw 
InternalError
         }
diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java 
b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
index cd9bdbaf5a3..368948ab5a8 100644
--- a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
+++ b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
@@ -337,8 +342,8 @@ public class MethodHandles {
 
          try {
              return BootstrapMethodInvoker.widenAndCast(classdata, type);
-         } catch (ClassCastException e) {
-             throw e;
+         } catch (RuntimeException|Error e) {
+             throw e; // let CCE and other runtime exceptions through
          } catch (Throwable e) {
              throw new InternalError(e);
          }
@@ -409,8 +414,8 @@ public class MethodHandles {
         try {
             Object element = classdata.get(index);
             return BootstrapMethodInvoker.widenAndCast(element, type);
-        } catch 
(ClassCastException|NullPointerException|IndexOutOfBoundsException e) {
-            throw e;
+        } catch (RuntimeException|Error e) {
+            throw e; // let specified exceptions and other runtime 
exceptions/errors through
         } catch (Throwable e) {
             throw new InternalError(e);
         }

> test/jdk/java/lang/invoke/MethodHandles/classData/ClassDataTest.java line 77:
> 
>> 75:      */
>> 76:     @Test
>> 77:     public void noClassData() throws Throwable {
> 
> `throws Throwable` needed on this and other method declarations?

`noClassData` only needs `IllegalACcessException`.   `assertClassData` throws 
Throwable because it unwraps from `InvocationTargetException`.  I can take a 
pass to clean this up further.

-------------

PR: https://git.openjdk.java.net/jdk/pull/1171

Reply via email to