Claes,

Discussed with Lois. We think that it would make more sense to pass the new 
argument into MethodHandles::resolve_MemberName and at all three places that we 
currently CHECK_PENDING_EXCEPTION/return null there
   - if speculative flag is set - CLEAR_PENDING_EXCEPTION before you return null
   - and yes - do this for all three cases, not just the METHOD case

Couple of questions though:
1) do you actually reach the new code in MHN_resolve_Mem? Could you possibly 
add an assertion there that
there is no exception pending and/or print the exception if there is one 
pending? 
With the CHECK_NULL in the call to resolve_MemberName I do not expect you to 
get here with a pending exception,
so the question arises as to when you would have a null resolved, but no 
pending exception?

2) with the change you just sent out - do you really get a performance 
improvement?
I’m confused about where that comes from

My apologies - I was incorrect - we are not converting Error -> Exception in 
MHN_resolve_Mem - so I
do not know why we are burying existing exceptions here - longer-term I think 
we need to clean this up
and as David points out - at least for the ResolveOrFail case - store the 
original exception as a cause.

thanks,
Karen

> On Mar 26, 2018, at 8:08 AM, Claes Redestad <claes.redes...@oracle.com> wrote:
> 
> Hi,
> 
> MethodHandleNatives::resolve are used by both 
> MemberName$Factory::resolveOrFail and ::resolveOrNull, the latter allowing 
> speculative lookup of methods.
> 
> While the linkResolver code this calls into in the VM will create and throw 
> exceptions for all cases where a method or field is missing, these are caught 
> by MethodHandles::resolve_MemberName and an empty handle is returned instead. 
> However, the outer method, MHN_resolve_Mem will always create a new exception 
> and throw it.
> 
> In case of resolveOrNull, we'll then ignore whatever exception is thrown in 
> the java code, so in effect we're creating and ignoring two exceptions on a 
> failed lookup.
> 
> We can cut this in half by passing a boolean to MethodHandleNatives::resolve 
> to indicate whether we're doing a speculative lookup (resolveOrNull) or not 
> (resolveOrFail):
> 
> Bug: https://bugs.openjdk.java.net/browse/JDK-8200238
> 
> Webrev: http://cr.openjdk.java.net/~redestad/8200238/open.00/
> 
> This is a small startup optimization for applications that have a high miss 
> rate (looks up a lot of methods that doesn't exist in the pre-generated 
> Holders).
> 
> Thanks!
> 
> /Claes
> 

Reply via email to