It looks good.  I have three requests.

Regarding this comment:
+     * See MethodSupplier.java to see how to produce these bytes.
+     * They encode that class, except that method m is private, not public.

The recipe is incomplete, since it does not say which bits to tweak to make m 
private.  Please add that step to the comments more explicitly, or if possible 
to the code (so bogusMethodSupplier is a clean copy of the od output).  I 
suppose you could ask sed to change the byte for you.  That will make this test 
a better example for future tests, and make it easier to maintain if javac 
output changes.  The high road to use would be asm, although for a single byte 
tweak od works OK.

Also, this bug has two twins.  The same thing will happen with NoSuchMethodE* 
and NoSuchFieldE*.  Can you please make fixes for those guys also?

FTR, see MemberName.makeAccessException() for logic which maps the other way, 
from *Error to *Exception.  I don't see a direct way to avoid the double 
mapping (Error=>Exception=>Error) when it occurs.

For the initCause bit we should do this:

        } catch (IllegalAccessException ex) {
            Error err = new IllegalAccessError(ex.getMessage());
            err.initCause(ex.getCause());  // reuse underlying cause of ex
            throw err;
        } ... and for NSME and NSFE...

That way users can avoid the duplicate exception but can see any underlying 
causes that the JVM may include.

Thanks for untangling this!

— John

On Sep 12, 2013, at 12:17 PM, David Chase <david.r.ch...@oracle.com> wrote:

> The test is adapted from the test in the bug report.
> The headline on the bug report is wrong -- because it uses reflection in the 
> test to do the invocation,
> the thrown exception is wrapped with InvocationTargetException, which is 
> completely correct.
> HOWEVER, the exception inside the wrapper is the wrong one.
> 
> The new test checks the exception in both the reflective-invocation and 
> plain-invocation cases,
> and also checks both a method handle call (which threw the wrong exception) 
> and a plain
> call (which threw, and throws, the right exception).
> 
> The test also uses a tweaked classloader to substitute the borked bytecodes 
> necessary to get
> the error, so it is not only shell-free, it can also be run outside jtreg.
> 
> On 2013-09-12, at 2:34 PM, Christian Thalinger 
> <christian.thalin...@oracle.com> wrote:
> 
>> 
>> On Sep 12, 2013, at 11:28 AM, David Chase <david.r.ch...@oracle.com> wrote:
>> 
>>> New webrev, commented line removed:
>>> http://cr.openjdk.java.net/~drchase/8022701/webrev.03/
>> 
>> I think the change is good given that the tests work now.  Is your test 
>> derived from the test in the bug report?
>> 
>> And it would be good if John could also have a quick look (just be to be 
>> sure).
>> 
>> -- Chris
>> 
>>> 
>>> On 2013-09-12, at 1:53 PM, David Chase <david.r.ch...@oracle.com> wrote:
>>> 
>>>> I believe it produced extraneous output -- it was not clear to me that it 
>>>> was either necessary or useful to fully describe all the converted 
>>>> exceptions that lead to the defined exception being thrown.  The commented 
>>>> line should have just been removed (I think).
>>>> 
>>>> On 2013-09-12, at 1:24 PM, Christian Thalinger 
>>>> <christian.thalin...@oracle.com> wrote:
>>>> 
>>>>> +             // err.initCause(ex);
>>>>> 
>>>>> Why is this commented?
>>>>> 
>>>>> -- Chris
>>> 
>> 
> 
> _______________________________________________
> mlvm-dev mailing list
> mlvm-...@openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to