< prev index next >

src/java.base/share/classes/java/lang/invoke/MethodHandles.java

Print this page
rev 14276 : 8154754: MethodHandles.countedLoop errors in deriving loop arguments, result type, and local state

*** 4474,4493 **** * @throws IllegalArgumentException if any argument has a type inconsistent with the loop structure * * @since 9 */ public static MethodHandle countedLoop(MethodHandle start, MethodHandle end, MethodHandle init, MethodHandle body) { ! MethodHandle defaultResultHandle = init == null || init.type().returnType() == void.class ? ! zero(void.class) : ! identity(init.type().returnType()); ! MethodHandle adaptedBody = body == null ? dropArguments(defaultResultHandle, 0, int.class) : body; MethodHandle returnVar = dropArguments(defaultResultHandle, 0, int.class, int.class); MethodHandle[] indexVar = {start, MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_countedLoopStep)}; ! MethodHandle[] loopLimit = {end, null, MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_countedLoopPred), ! returnVar}; ! MethodHandle[] bodyClause = {init, ! filterArgument(dropArguments(adaptedBody, 1, int.class), 0, MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_decrementCounter))}; return loop(indexVar, loopLimit, bodyClause); } /** --- 4474,4501 ---- * @throws IllegalArgumentException if any argument has a type inconsistent with the loop structure * * @since 9 */ public static MethodHandle countedLoop(MethodHandle start, MethodHandle end, MethodHandle init, MethodHandle body) { ! Class<?> resultType; ! MethodHandle actualInit; ! if (init == null) { ! resultType = body == null ? void.class : body.type().returnType(); ! actualInit = empty(methodType(resultType)); ! } else { ! resultType = init.type().returnType(); ! actualInit = init; ! } ! MethodHandle defaultResultHandle = resultType == void.class ? zero(void.class) : identity(resultType); ! MethodHandle actualBody = body == null ? dropArguments(defaultResultHandle, 0, int.class) : body; MethodHandle returnVar = dropArguments(defaultResultHandle, 0, int.class, int.class); + MethodHandle actualEnd = end == null ? constant(int.class, 0) : end; MethodHandle[] indexVar = {start, MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_countedLoopStep)}; ! MethodHandle[] loopLimit = {actualEnd, null, ! MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_countedLoopPred), returnVar}; ! MethodHandle[] bodyClause = {actualInit, ! filterArgument(dropArguments(actualBody, 1, int.class), 0, MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_decrementCounter))}; return loop(indexVar, loopLimit, bodyClause); } /**
< prev index next >