< prev index next >

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

Print this page
rev 13050 : 8142334: Improve lazy initialization of java.lang.invoke
Reviewed-by: psandoz, vlivanov, mhaupt


 524         int elementTypeKey = bt.ordinal();
 525         if (bt.basicTypeClass() != elementType) {
 526             if (elementType.isPrimitive()) {
 527                 elementTypeKey = TYPE_LIMIT + Wrapper.forPrimitiveType(elementType).ordinal();
 528             }
 529         }
 530         Transform key = Transform.of(Transform.Kind.SPREAD_ARGS, pos, elementTypeKey, arrayLength);
 531         LambdaForm form = getInCache(key);
 532         if (form != null) {
 533             assert(form.arity == lambdaForm.arity - arrayLength + 1);
 534             return form;
 535         }
 536         LambdaFormBuffer buf = buffer();
 537         buf.startEdit();
 538 
 539         assert(pos <= MethodType.MAX_JVM_ARITY);
 540         assert(pos + arrayLength <= lambdaForm.arity);
 541         assert(pos > 0);  // cannot spread the MH arg itself
 542 
 543         Name spreadParam = new Name(L_TYPE);
 544         Name checkSpread = new Name(MethodHandleImpl.Lazy.NF_checkSpreadArgument, spreadParam, arrayLength);
 545 
 546         // insert the new expressions
 547         int exprPos = lambdaForm.arity();
 548         buf.insertExpression(exprPos++, checkSpread);
 549         // adjust the arguments
 550         MethodHandle aload = MethodHandles.arrayElementGetter(erasedArrayType);
 551         for (int i = 0; i < arrayLength; i++) {
 552             Name loadArgument = new Name(aload, spreadParam, i);
 553             buf.insertExpression(exprPos + i, loadArgument);
 554             buf.replaceParameterByCopy(pos + i, exprPos + i);
 555         }
 556         buf.insertParameter(pos, spreadParam);
 557 
 558         form = buf.endEdit();
 559         return putInCache(key, form);
 560     }
 561 
 562     LambdaForm collectArgumentsForm(int pos, MethodType collectorType) {
 563         int collectorArity = collectorType.parameterCount();
 564         boolean dropResult = (collectorType.returnType() == void.class);




 524         int elementTypeKey = bt.ordinal();
 525         if (bt.basicTypeClass() != elementType) {
 526             if (elementType.isPrimitive()) {
 527                 elementTypeKey = TYPE_LIMIT + Wrapper.forPrimitiveType(elementType).ordinal();
 528             }
 529         }
 530         Transform key = Transform.of(Transform.Kind.SPREAD_ARGS, pos, elementTypeKey, arrayLength);
 531         LambdaForm form = getInCache(key);
 532         if (form != null) {
 533             assert(form.arity == lambdaForm.arity - arrayLength + 1);
 534             return form;
 535         }
 536         LambdaFormBuffer buf = buffer();
 537         buf.startEdit();
 538 
 539         assert(pos <= MethodType.MAX_JVM_ARITY);
 540         assert(pos + arrayLength <= lambdaForm.arity);
 541         assert(pos > 0);  // cannot spread the MH arg itself
 542 
 543         Name spreadParam = new Name(L_TYPE);
 544         Name checkSpread = new Name(MethodHandleImpl.checkSpreadArgumentFunction(), spreadParam, arrayLength);
 545 
 546         // insert the new expressions
 547         int exprPos = lambdaForm.arity();
 548         buf.insertExpression(exprPos++, checkSpread);
 549         // adjust the arguments
 550         MethodHandle aload = MethodHandles.arrayElementGetter(erasedArrayType);
 551         for (int i = 0; i < arrayLength; i++) {
 552             Name loadArgument = new Name(aload, spreadParam, i);
 553             buf.insertExpression(exprPos + i, loadArgument);
 554             buf.replaceParameterByCopy(pos + i, exprPos + i);
 555         }
 556         buf.insertParameter(pos, spreadParam);
 557 
 558         form = buf.endEdit();
 559         return putInCache(key, form);
 560     }
 561 
 562     LambdaForm collectArgumentsForm(int pos, MethodType collectorType) {
 563         int collectorArity = collectorType.parameterCount();
 564         boolean dropResult = (collectorType.returnType() == void.class);


< prev index next >