< prev index next >

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

Print this page
rev 14495 : 8156915: introduce MethodHandle factory for array length

 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);


< prev index next >