Recommended changes made:

http://cr.openjdk.java.net/~drchase/8022701/webrev.04/

Test with jtreg (for pass and for induced failure) on MacOS,
not sure what additional other testing is desired since it is entirely in the 
libraries.

I included code to handle the case of a broken field-referencing methodhandle,
but did not test it because there's no syntax for these in Java, nor is their 
creation
well-documented.

David


On 2013-09-13, at 12:02 AM, John Rose <john.r.r...@oracle.com> wrote:

> On Sep 12, 2013, at 5:44 PM, David Chase <david.r.ch...@oracle.com> wrote:
> 
>> Do these sibling bugs have numbers?
> 
> Yes, 8022701.  I just updated the bug to explain their common genesis.
> 
>> And I take it you would like to see
>> 
>> 1) a test enhanced with ASM to do all 3 variants of this
> 
> Yes, please.  The case of "no such field" does not have a direct cause from 
> lambda expressions AFAIK, but it can occur with "raw" CONSTANT_MethodHandles. 
>  (It would be reasonable for javac to emit CONSTANT_MH's for fields in some 
> very limited circumstances, but I'll bet it doesn't.)
> 
>> 2) DO attach the underlying cause
> 
> Yes.  Read the javadoc for ExceptionInInitializerError for an example of why 
> users want the underlying cause for linkage errors.
> 
> (Golly, I wonder what happens if resolution of a CONSTANT_MethodHandle tries 
> to touch a class with a booby-trapped <clinit>.  I hope it's the case that 
> the ExceptionInInitializerError just passes straight up the stack.  But if it 
> were to get wrapped in a ROE of some sort, it would probably bubble up as an 
> IAE.  Could be a charming exploration.  Actually, no, I don't want to go in 
> there.  Getting all possible linkage errors correct is fine, but we have more 
> important things to do.)
> 
> — John
> 
>> David
>> 
>> On 2013-09-12, at 5:35 PM, John Rose <john.r.r...@oracle.com> wrote:
>> 
>>> 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