689 i++; // skip MH.invokeBasic of the selectAlternative result
690 continue;
691 case GUARD_WITH_CATCH:
692 assert isGuardWithCatch(i);
693 onStack = emitGuardWithCatch(i);
694 i = i+2; // Jump to the end of GWC idiom
695 continue;
696 case NEW_ARRAY:
697 Class<?> rtype = name.function.methodType().returnType();
698 if (isStaticallyNameable(rtype)) {
699 emitNewArray(name);
700 continue;
701 }
702 break;
703 case ARRAY_LOAD:
704 emitArrayLoad(name);
705 continue;
706 case ARRAY_STORE:
707 emitArrayStore(name);
708 continue;
709 case IDENTITY:
710 assert(name.arguments.length == 1);
711 emitPushArguments(name);
712 continue;
713 case ZERO:
714 assert(name.arguments.length == 0);
715 emitConst(name.type.basicTypeWrapper().zero());
716 continue;
717 case NONE:
718 // no intrinsic associated
719 break;
720 default:
721 throw newInternalError("Unknown intrinsic: "+intr);
722 }
723
724 MemberName member = name.function.member();
725 if (isStaticallyInvocable(member)) {
726 emitStaticInvoke(member, name);
727 } else {
728 emitInvoke(name);
729 }
730 }
731
732 // return statement
733 emitReturn(onStack);
734
735 classFileEpilogue();
736 bogusMethod(lambdaForm);
737
738 final byte[] classFile = cw.toByteArray();
739 maybeDump(className, classFile);
740 return classFile;
741 }
742
743 void emitArrayLoad(Name name) { emitArrayOp(name, Opcodes.AALOAD); }
744 void emitArrayStore(Name name) { emitArrayOp(name, Opcodes.AASTORE); }
745
746 void emitArrayOp(Name name, int arrayOpcode) {
747 assert arrayOpcode == Opcodes.AALOAD || arrayOpcode == Opcodes.AASTORE;
748 Class<?> elementType = name.function.methodType().parameterType(0).getComponentType();
749 assert elementType != null;
750 emitPushArguments(name);
751 if (elementType.isPrimitive()) {
752 Wrapper w = Wrapper.forPrimitiveType(elementType);
753 arrayOpcode = arrayInsnOpcode(arrayTypeCode(w), arrayOpcode);
754 }
755 mv.visitInsn(arrayOpcode);
756 }
757
758 /**
759 * Emit an invoke for the given name.
760 */
761 void emitInvoke(Name name) {
762 assert(!isLinkerMethodInvoke(name)); // should use the static path for these
763 if (true) {
764 // push receiver
765 MethodHandle target = name.function.resolvedHandle();
766 assert(target != null) : name.exprString();
767 mv.visitLdcInsn(constantPlaceholder(target));
768 emitReferenceCast(MethodHandle.class, target);
769 } else {
770 // load receiver
771 emitAloadInsn(0);
|
689 i++; // skip MH.invokeBasic of the selectAlternative result
690 continue;
691 case GUARD_WITH_CATCH:
692 assert isGuardWithCatch(i);
693 onStack = emitGuardWithCatch(i);
694 i = i+2; // Jump to the end of GWC idiom
695 continue;
696 case NEW_ARRAY:
697 Class<?> rtype = name.function.methodType().returnType();
698 if (isStaticallyNameable(rtype)) {
699 emitNewArray(name);
700 continue;
701 }
702 break;
703 case ARRAY_LOAD:
704 emitArrayLoad(name);
705 continue;
706 case ARRAY_STORE:
707 emitArrayStore(name);
708 continue;
709 case ARRAY_LENGTH:
710 emitArrayLength(name);
711 continue;
712 case IDENTITY:
713 assert(name.arguments.length == 1);
714 emitPushArguments(name);
715 continue;
716 case ZERO:
717 assert(name.arguments.length == 0);
718 emitConst(name.type.basicTypeWrapper().zero());
719 continue;
720 case NONE:
721 // no intrinsic associated
722 break;
723 default:
724 throw newInternalError("Unknown intrinsic: "+intr);
725 }
726
727 MemberName member = name.function.member();
728 if (isStaticallyInvocable(member)) {
729 emitStaticInvoke(member, name);
730 } else {
731 emitInvoke(name);
732 }
733 }
734
735 // return statement
736 emitReturn(onStack);
737
738 classFileEpilogue();
739 bogusMethod(lambdaForm);
740
741 final byte[] classFile = cw.toByteArray();
742 maybeDump(className, classFile);
743 return classFile;
744 }
745
746 void emitArrayLoad(Name name) { emitArrayOp(name, Opcodes.AALOAD); }
747 void emitArrayStore(Name name) { emitArrayOp(name, Opcodes.AASTORE); }
748 void emitArrayLength(Name name) { emitArrayOp(name, Opcodes.ARRAYLENGTH); }
749
750 void emitArrayOp(Name name, int arrayOpcode) {
751 assert arrayOpcode == Opcodes.AALOAD || arrayOpcode == Opcodes.AASTORE || arrayOpcode == Opcodes.ARRAYLENGTH;
752 Class<?> elementType = name.function.methodType().parameterType(0).getComponentType();
753 assert elementType != null;
754 emitPushArguments(name);
755 if (arrayOpcode != Opcodes.ARRAYLENGTH && elementType.isPrimitive()) {
756 Wrapper w = Wrapper.forPrimitiveType(elementType);
757 arrayOpcode = arrayInsnOpcode(arrayTypeCode(w), arrayOpcode);
758 }
759 mv.visitInsn(arrayOpcode);
760 }
761
762 /**
763 * Emit an invoke for the given name.
764 */
765 void emitInvoke(Name name) {
766 assert(!isLinkerMethodInvoke(name)); // should use the static path for these
767 if (true) {
768 // push receiver
769 MethodHandle target = name.function.resolvedHandle();
770 assert(target != null) : name.exprString();
771 mv.visitLdcInsn(constantPlaceholder(target));
772 emitReferenceCast(MethodHandle.class, target);
773 } else {
774 // load receiver
775 emitAloadInsn(0);
|