RFR: 8142334: Improve lazy initialization of java.lang.invoke

Peter Levart peter.levart at gmail.com
Wed Nov 11 16:13:49 UTC 2015


Hi Claes,

On 11/11/2015 03:32 PM, Claes Redestad wrote:
> Paul,
>
> On 2015-11-10 11:55, Paul Sandoz wrote:
>> DirectMethodHandle
>>>>   682     private static @Stable NamedFunction[] FUNCTIONS = new 
>> NamedFunction[NF_LIMIT];
>>
>> Invokers
>>>>   442     private static @Stable NamedFunction[] FUNCTIONS = new 
>> NamedFunction[NF_LIMIT];
>>
>> MethodHandleImpl
>>>> 1627     private static @Stable NamedFunction[] FUNCTIONS = new 
>> NamedFunction[NF_LIMIT];
>>
>>
>> To be complete you could add “final”, thus it makes it clear that 
>> @Stable refers specifically to the array element.
>>
>> Paul.
>
> Thanks for having a look and catching this:
>
> http://cr.openjdk.java.net/~redestad/8142334/webrev.03
>
> - added final keyword to FUNCTIONS and HANDLES
> - added @Stable to ARRAYS, FILL_ARRAYS, and FILL_ARRAY_TO_RIGHT
>
> /Claes
>

Would constructing NamedFunction(s) using MemberName(s) directly, 
bypassing reflection, make any sense (for example in DMH):

     private static NamedFunction makeConstantFunction(int idx) {
         try {
             switch (idx) {
                 case NF_internalMemberName:
                     return makeConstantFunction(Object.class, 
"internalMemberName", Object.class);
                 case NF_internalMemberNameEnsureInit:
                     return makeConstantFunction(Object.class, 
"internalMemberNameEnsureInit", Object.class);
                 case NF_ensureInitialized:
                     return makeConstantFunction(void.class, 
"ensureInitialized", Object.class);
                 case NF_fieldOffset:
                     return makeConstantFunction(long.class, 
"fieldOffset", Object.class);
                 case NF_checkBase:
                     return makeConstantFunction(Object.class, 
"checkBase", Object.class);
                 case NF_staticBase:
                     return makeConstantFunction(Object.class, 
"staticBase", Object.class);
                 case NF_staticOffset:
                     return makeConstantFunction(long.class, 
"staticOffset", Object.class);
                 case NF_checkCast:
                     return makeConstantFunction(Object.class, 
"checkCast", Object.class, Object.class);
                 case NF_allocateInstance:
                     return makeConstantFunction(Object.class, 
"allocateInstance", Object.class);
                 case NF_constructorMethod:
                     return makeConstantFunction(Object.class, 
"constructorMethod", Object.class);
             }
         } catch (ReflectiveOperationException ex) {
             throw newInternalError(ex);
         }
         throw newInternalError("Unknown function index: " + idx);
     }

     private static NamedFunction makeConstantFunction(
         Class<?> rtype, String name, Class<?> ... ptypes) throws 
NoSuchMethodException {
         return new NamedFunction(
             new MemberName(
                 DirectMethodHandle.class, name, 
MethodType.methodType(rtype, ptypes), REF_invokeStatic));
     }


...if reflection is not used, there might be some space savings. Or not?

Regards, Peter




More information about the core-libs-dev mailing list