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
|