< prev index next >

src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java

Print this page
rev 15427 : 8164483: Generate field lambda forms at link time
Reviewed-by: TBD


 612     }
 613 
 614     private static MemberName lookupPregenerated(LambdaForm form) {
 615         if (form.customized != null) {
 616             // No pre-generated version for customized LF
 617             return null;
 618         }
 619         MethodType invokerType = form.methodType();
 620         String name = form.kind.methodName;
 621         switch (form.kind) {
 622             case BOUND_REINVOKER: {
 623                 name = name + "_" + BoundMethodHandle.speciesData(form).fieldSignature();
 624                 return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class);
 625             }
 626             case DELEGATE:                  return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class);
 627             case ZERO:                      // fall-through
 628             case IDENTITY: {
 629                 name = name + "_" + form.returnType().basicTypeChar();
 630                 return resolveFrom(name, invokerType, LambdaForm.Holder.class);
 631             }


















 632             case DIRECT_INVOKE_INTERFACE:   // fall-through
 633             case DIRECT_INVOKE_SPECIAL:     // fall-through
 634             case DIRECT_INVOKE_STATIC:      // fall-through
 635             case DIRECT_INVOKE_STATIC_INIT: // fall-through
 636             case DIRECT_INVOKE_VIRTUAL:     return resolveFrom(name, invokerType, DirectMethodHandle.Holder.class);
 637         }
 638         return null;
 639     }
 640 
 641     /**
 642      * Generate customized bytecode for a given LambdaForm.
 643      */
 644     static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType) {
 645         MemberName pregenerated = lookupPregenerated(form);
 646         if (pregenerated != null)  return pregenerated; // pre-generated bytecode
 647 
 648         InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("MH", form, invokerType);
 649         return g.loadMethod(g.generateCustomizedCodeBytes());
 650     }
 651 




 612     }
 613 
 614     private static MemberName lookupPregenerated(LambdaForm form) {
 615         if (form.customized != null) {
 616             // No pre-generated version for customized LF
 617             return null;
 618         }
 619         MethodType invokerType = form.methodType();
 620         String name = form.kind.methodName;
 621         switch (form.kind) {
 622             case BOUND_REINVOKER: {
 623                 name = name + "_" + BoundMethodHandle.speciesData(form).fieldSignature();
 624                 return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class);
 625             }
 626             case DELEGATE:                  return resolveFrom(name, invokerType, DelegatingMethodHandle.Holder.class);
 627             case ZERO:                      // fall-through
 628             case IDENTITY: {
 629                 name = name + "_" + form.returnType().basicTypeChar();
 630                 return resolveFrom(name, invokerType, LambdaForm.Holder.class);
 631             }
 632             case GET_OBJECT:                // fall-through
 633             case GET_BOOLEAN:               // fall-through
 634             case GET_INT:                   // fall-through
 635             case GET_BYTE:                  // fall-through
 636             case GET_CHAR:                  // fall-through
 637             case GET_SHORT:                 // fall-through
 638             case GET_LONG:                  // fall-through
 639             case GET_FLOAT:                 // fall-through
 640             case GET_DOUBLE:                // fall-through
 641             case PUT_OBJECT:                // fall-through
 642             case PUT_INT:                   // fall-through
 643             case PUT_BOOLEAN:               // fall-through
 644             case PUT_BYTE:                  // fall-through
 645             case PUT_CHAR:                  // fall-through
 646             case PUT_SHORT:                 // fall-through
 647             case PUT_LONG:                  // fall-through
 648             case PUT_FLOAT:                 // fall-through
 649             case PUT_DOUBLE:                // fall-through
 650             case DIRECT_INVOKE_INTERFACE:   // fall-through
 651             case DIRECT_INVOKE_SPECIAL:     // fall-through
 652             case DIRECT_INVOKE_STATIC:      // fall-through
 653             case DIRECT_INVOKE_STATIC_INIT: // fall-through
 654             case DIRECT_INVOKE_VIRTUAL:     return resolveFrom(name, invokerType, DirectMethodHandle.Holder.class);
 655         }
 656         return null;
 657     }
 658 
 659     /**
 660      * Generate customized bytecode for a given LambdaForm.
 661      */
 662     static MemberName generateCustomizedCode(LambdaForm form, MethodType invokerType) {
 663         MemberName pregenerated = lookupPregenerated(form);
 664         if (pregenerated != null)  return pregenerated; // pre-generated bytecode
 665 
 666         InvokerBytecodeGenerator g = new InvokerBytecodeGenerator("MH", form, invokerType);
 667         return g.loadMethod(g.generateCustomizedCodeBytes());
 668     }
 669 


< prev index next >