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
    }