747 assert(AdapterMethodHandle.canCollectArguments(foldTargetType, test.type(), 0, true)); |
747 assert(AdapterMethodHandle.canCollectArguments(foldTargetType, test.type(), 0, true)); |
748 // working backwards, as usual: |
748 // working backwards, as usual: |
749 assert(target.type().equals(fallback.type())); |
749 assert(target.type().equals(fallback.type())); |
750 MethodHandle tailcall = MethodHandles.exactInvoker(target.type()); |
750 MethodHandle tailcall = MethodHandles.exactInvoker(target.type()); |
751 MethodHandle select = selectAlternative(); |
751 MethodHandle select = selectAlternative(); |
752 select = bindArgument(select, 2, fallback); |
752 select = bindArgument(select, 2, CountingMethodHandle.wrap(fallback)); |
753 select = bindArgument(select, 1, target); |
753 select = bindArgument(select, 1, CountingMethodHandle.wrap(target)); |
754 // select(z: boolean) => (z ? target : fallback) |
754 // select(z: boolean) => (z ? target : fallback) |
755 MethodHandle filter = filterArgument(tailcall, 0, select); |
755 MethodHandle filter = filterArgument(tailcall, 0, select); |
756 assert(filter.type().parameterType(0) == boolean.class); |
756 assert(filter.type().parameterType(0) == boolean.class); |
757 MethodHandle fold = foldArguments(filter, filter.type().dropParameterTypes(0, 1), 0, test); |
757 MethodHandle fold = foldArguments(filter, filter.type().dropParameterTypes(0, 1), 0, test); |
758 return fold; |
758 return fold; |