RFR: 8164044: Generate corresponding simple DelegatingMethodHandles when generating a DirectMethodHandle

Claes Redestad claes.redestad at oracle.com
Thu Aug 18 14:32:15 UTC 2016



On 2016-08-18 16:06, Aleksey Shipilev wrote:
> On 08/18/2016 12:33 AM, Claes Redestad wrote:
>> Hi,
>>
>> please review this change which adds pre-generation of simple
>> DelegatingMethodHandles corresponding to the DirectMethodHandles we
>> already pre-generate during linking.
>>
>> webrev: http://cr.openjdk.java.net/~redestad/8164044/webrev.02/
> *) This block:
>
>    if (!dedupSet.contains(methodTypes[i])) {
>       // do stuff
>       dedupSet.add(methodTypes[i]);
>    }
>
> Is replaceable by:
>
>    if (dedupSet.add(methodTypes[i])) {
>       // do stuff
>    }

Sure!

>
> *) Can save instantiation here, by moving ptypes into else branch:
>
>   333         Class<?>[] ptypes = new Class<?>[parameters.length()];
>   334         if (ptypes.length == 0) {
>   335             return MethodType.methodType(rtype);
>   336         } else {
>   337             for (int i = 0; i < ptypes.length; i++) {
>   338                 ptypes[i] = simpleType(parameters.charAt(i));
>   339             }
>   340             return MethodType.methodType(rtype, ptypes);
>   341         }
>   342     }

Efficiency of code only called at link time isn't too important,
but it also looks cleaner: fixed.

>
> *) Many whitespaces from this switch:
>
> 195         switch (which) {
>   196         case LF_INVVIRTUAL:    linkerName = "linkToVirtual";   kind
> = DIRECT_INVOKE_VIRTUAL;     break;
>   197         case LF_INVSTATIC:     linkerName = "linkToStatic";    kind
> = DIRECT_INVOKE_STATIC;      break;
>   198         case LF_INVSTATIC_INIT:linkerName = "linkToStatic";    kind
> = DIRECT_INVOKE_STATIC_INIT; break;
>   199         case LF_INVSPECIAL:    linkerName = "linkToSpecial";   kind
> = DIRECT_INVOKE_SPECIAL;     break;
>   200         case LF_INVINTERFACE:  linkerName = "linkToInterface"; kind
> = DIRECT_INVOKE_INTERFACE;   break;
>   201         case LF_NEWINVSPECIAL: linkerName = "linkToSpecial";   kind
> = DIRECT_NEW_INVOKE_SPECIAL; break;
>   202         default:  throw new InternalError("which="+which);
>
> ...ran away to this one:
>
>   154     private static Kind whichKind(int whichCache) {
>   155         switch(whichCache) {
>   156             case MethodTypeForm.LF_REBIND:            return
> BOUND_REINVOKER;
>   157             case MethodTypeForm.LF_DELEGATE:          return DELEGATE;
>   158             default:                                  return REINVOKER;
>   159         }
>   160     }

I assume you want less whitespace?

http://cr.openjdk.java.net/~redestad/8164044/webrev.03/

Thanks!

/Claes

>
> Thanks,
> -Aleksey
>
>



More information about the core-libs-dev mailing list