public static MethodHandle makeCollectArguments(MethodHandle target, MethodHandle collector, int collectArgPos, bool retainOriginalArgs) { #if FIRST_PASS return(null); #else MethodType targetType = target.type(); MethodType collectorType = collector.type(); bool isfilter = collectorType.returnType() == java.lang.Void.TYPE; MethodType newType = targetType.dropParameterTypes(collectArgPos, collectArgPos + (isfilter ? 0 : 1)); if (!retainOriginalArgs) { newType = newType.insertParameterTypes(collectArgPos, collectorType.parameterList()); } MethodHandleUtil.DynamicMethodBuilder dm = new MethodHandleUtil.DynamicMethodBuilder("AdapterMethodHandle.collectArguments", newType, target, collector.vmtarget); for (int i = 0, count = newType.parameterCount(); i < count || i == collectArgPos; i++) { if (i == collectArgPos) { dm.LoadValue(); for (int j = 0; j < collectorType.parameterCount(); j++) { dm.Ldarg(i + j); } dm.CallValue(); collectArgPos = -1; i--; if (!retainOriginalArgs) { i += collectorType.parameterCount(); } } else { dm.Ldarg(i); } } dm.CallTarget(); dm.Ret(); return(dm.CreateAdapter()); #endif }