# HG changeset patch # User Jaroslav Tulach # Date 1365341085 -7200 # Node ID 0eec1b51c13c828a8976c9f84966db321498ea97 # Parent d9e692ece65348a2100c925f59971a67f21d97f4 Wrap invoke exceptions into InvocationTargetException diff -r d9e692ece653 -r 0eec1b51c13c rt/emul/mini/src/main/java/java/lang/reflect/Method.java --- a/rt/emul/mini/src/main/java/java/lang/reflect/Method.java Sun Apr 07 11:38:56 2013 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/reflect/Method.java Sun Apr 07 15:24:45 2013 +0200 @@ -501,8 +501,8 @@ throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { - final boolean isStatic = (getModifiers() & Modifier.STATIC) == 0; - if (isStatic && obj == null) { + final boolean nonStatic = (getModifiers() & Modifier.STATIC) == 0; + if (nonStatic && obj == null) { throw new NullPointerException(); } Class[] types = getParameterTypes(); @@ -517,7 +517,7 @@ } } } - Object res = invoke0(isStatic, this, obj, args); + Object res = invokeTry(nonStatic, this, obj, args); if (getReturnType().isPrimitive()) { res = fromPrimitive(getReturnType(), res); } @@ -536,6 +536,15 @@ + "return method._data().apply(self, p);\n" ) private static native Object invoke0(boolean isStatic, Method m, Object self, Object[] args); + + private static Object invokeTry(boolean isStatic, Method m, Object self, Object[] args) + throws InvocationTargetException { + try { + return invoke0(isStatic, m, self, args); + } catch (Throwable ex) { + throw new InvocationTargetException(ex, ex.getMessage()); + } + } static Object fromPrimitive(Class type, Object o) { if (type == Integer.TYPE) { diff -r d9e692ece653 -r 0eec1b51c13c rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java --- a/rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java Sun Apr 07 11:38:56 2013 +0200 +++ b/rt/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java Sun Apr 07 15:24:45 2013 +0200 @@ -250,6 +250,9 @@ res = found.invoke(c.newInstance()); } } catch (Throwable ex) { + if (ex instanceof InvocationTargetException) { + ex = ((InvocationTargetException)ex).getTargetException(); + } res = ex.getClass().getName() + ":" + ex.getMessage(); } } else { diff -r d9e692ece653 -r 0eec1b51c13c rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java --- a/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java Sun Apr 07 11:38:56 2013 +0200 +++ b/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/ReflectionTest.java Sun Apr 07 15:24:45 2013 +0200 @@ -104,6 +104,11 @@ return "should not happen"; } + @Compare public String methodThatThrowsException() throws Exception { + StaticUse.class.getMethod("instanceMethod").invoke(new StaticUse()); + return "should not happen"; + } + @Compare public Object voidReturnType() throws Exception { return StaticUse.class.getMethod("instanceMethod").getReturnType(); } diff -r d9e692ece653 -r 0eec1b51c13c rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUse.java --- a/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUse.java Sun Apr 07 11:38:56 2013 +0200 +++ b/rt/vmtest/src/test/java/org/apidesign/bck2brwsr/tck/StaticUse.java Sun Apr 07 15:24:45 2013 +0200 @@ -30,6 +30,7 @@ } public void instanceMethod() { + throw new IllegalStateException(); } public static int plus(int a, int b) {