RFR (S): 7196277: JSR 292: Two jck/runtime tests crash on java.lang.invoke.MethodHandle.invokeExact

Christian Thalinger christian.thalinger at oracle.com
Mon May 6 13:27:46 PDT 2013

Thank you, Vladimir.  -- Chris

On May 3, 2013, at 5:25 PM, Vladimir Kozlov <vladimir.kozlov at oracle.com> wrote:

> Looks good.
> Thanks,
> Vladimir
> On 5/3/13 4:45 PM, Christian Thalinger wrote:
>> On May 2, 2013, at 8:01 PM, John Rose <john.r.rose at oracle.com
>> <mailto:john.r.rose at oracle.com>> wrote:
>>> On May 2, 2013, at 7:32 PM, Vladimir Kozlov
>>> <vladimir.kozlov at oracle.com <mailto:vladimir.kozlov at oracle.com>> wrote:
>>>> The exception is then caught and forwarded on the return from
>>>> lookup() call and before the call to a native function.
>>> Here are some interesting points of JVM trivia which relates to the
>>> unusual control flow in this code:
>>> JVMS 5.4.3 says, "If an attempt by the Java virtual machine to resolve
>>> a symbolic reference fails because an error is thrown that is an
>>> instance of LinkageError (or a subclass), then subsequent attempts
>>> to resolve the reference always fail with the same error that was
>>> thrown as a result of the initial resolution attempt."
>>> In other words, for each symbolic reference you get just one chance to
>>> resolve it successfully.  If it fails to resolve, you throw the same
>>> error every time in the future.  (This means you need a failure record
>>> somewhere in the JVM.)
>>> Since UnsatisfiedLinkError is a subclass of LinkageError, you might
>>> think this rule applies.  But it doesn't.  When you resolve a native
>>> call site, you succeed if you get access to the Java side of the
>>> native method.  A subsequent operation, at runtime not link time,
>>> determines whether the call into native code succeeds.
>>> The JVMS says this for the invoke instructions, under Runtime
>>> Exceptions (not Linking Exceptions):  "Otherwise, if the selected
>>> method is native and the code that implements the method cannot be
>>> bound, invokespecial throws an UnsatisfiedLinkError."  The placement
>>> of this language implies that the UnsatisfiedLinkError can be
>>> repeated.  It can even go away, if somebody does a System.loadLibrary
>>> call that happens to supply the right native entry point (or so I
>>> think).  JNI supplies a way to unload native methods also, so a bound
>>> native method can apparently change state between ULE-throwing and
>>> normal function any number of times.
>>> In any case, this is why there is a funny extra degree of freedom, and
>>> an extra binding pass, in the JVM for the native function binding of a
>>> Java native method.
>> True but we should let throw_unsatisfied_link_error do the throwing and
>> not NativeLookup::lookup().  This seems odd and confusing.
>> I will file a bug and we can fix that later.
>> Here are some comment changes:
>> http://cr.openjdk.java.net/~twisti/7196277/
>> -- Chris
>>> — John

More information about the hotspot-compiler-dev mailing list