RFR 8224068: [lworld] JCK api/java_lang/invoke/MethodHandles/Lookup/ExceptionsTests crashes

Harold Seigel harold.seigel at oracle.com
Fri May 17 18:34:34 UTC 2019


Hi Roger,

Those are good questions...

This change to MemberName.java for 8222787 implies that the static 
<init> methods are not constructors:

    @@ -825,11 +831,11 @@
           *  The declaring class may be supplied as null if this is to be a bare name and type.
           *  The last argument is optional, a boolean which requests REF_invokeSpecial.
           *  The resulting name will in an unresolved state.
           */
          public MemberName(Class<?> defClass, String name, MethodType type, byte refKind) {
    - int initFlags = (name != null && name.equals(CONSTRUCTOR_NAME) ?
    IS_CONSTRUCTOR : IS_METHOD);
    + int initFlags = (name != null && name.equals(CONSTRUCTOR_NAME) &&
    type.returnType() == void.class ? IS_CONSTRUCTOR : IS_METHOD);
              init(defClass, name, type, flagsMods(initFlags, 0, refKind));
              initResolved(false);
          }

Maybe this can be a topic for the next Wednesday meeting.

Harold

On 5/17/2019 2:26 PM, Roger Riggs wrote:
> Hi Harold,
>
> How does this fix fit with 8223349 [lworld] Reflection support on 
> static <init> factory methods for inline types. 
> <https://bugs.openjdk.java.net/browse/JDK-8223349>
>
> Are we not headed toward identifing the static <init> methods for 
> inline types as 'constructors'?
>
> Roger
>
>
> On 05/17/2019 02:12 PM, Harold Seigel wrote:
>> Hi,
>>
>> Please review the following small fix:
>>
>> Open Webrev: 
>> http://cr.openjdk.java.net/~hseigel/lworld_8224068/webrev/index.html
>>
>> JBS Bug: https://bugs.openjdk.java.net/browse/JDK-8224068
>>
>> The failing test calls MethodHandles.findConstructor(), looking for a 
>> constructor with a non-null return type.  The test expects this to 
>> fail with a NoSuchMethodError exception because no such constructors 
>> exist.
>>
>> Method findConstructor() calls MethodHandles.resolveOrFail() to find 
>> the method handle with ref_kind REF_newInvokeSpecial.  This creates a 
>> MemberName object.  But new code added for JDK-8222787 
>> <https://bugs.openjdk.java.net/browse/JDK-8222787>detects that the 
>> method is named <init> and has a return type. So, it sets the 
>> MemberName flags to be IS_METHOD | REF_newInvokeSpecial. When this 
>> MemberName object is eventually passed to the JVM 
>> MethodHandles::resolve_MemberName() function, it asserts because it 
>> expects only constructors, not methods, to have ref_kind 
>> REF_newInvokeSpecial.
>>
>> The simplest fix for this seemed to be to just throw 
>> NoSuchMethodError in findConstructor() if the constructor has a 
>> non-void return type.
>>
>> The change was tested by running JCK lang, vm, and api/java_lang 
>> tests on Linux-x64, by running tiers 1-2 on Windows, Mac, and 
>> Linux-x64, and tiers 3-5 on Linux-x64.
>>
>> Thanks, Harold
>>
>


More information about the valhalla-dev mailing list