private static MethodHandle buildVarargsArray( MethodHandle newArray, MethodHandle finisher, int nargs) { // Build up the result mh as a sequence of fills like this: // finisher(fill(fill(newArrayWA(23,x1..x10),10,x11..x20),20,x21..x23)) // The various fill(_,10*I,___*[J]) are reusable. int leftLen = Math.min(nargs, LEFT_ARGS); // absorb some arguments immediately int rightLen = nargs - leftLen; MethodHandle leftCollector = newArray.bindTo(nargs); leftCollector = leftCollector.asCollector(Object[].class, leftLen); MethodHandle mh = finisher; if (rightLen > 0) { MethodHandle rightFiller = fillToRight(LEFT_ARGS + rightLen); if (mh == ARRAY_IDENTITY) mh = rightFiller; else mh = MethodHandles.collectArguments(mh, 0, rightFiller); } if (mh == ARRAY_IDENTITY) mh = leftCollector; else mh = MethodHandles.collectArguments(mh, 0, leftCollector); return mh; }