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