< prev index next >

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

Print this page
rev 13064 : 8142334: Improve lazy initialization of java.lang.invoke
Reviewed-by: psandoz, vlivanov, mhaupt

*** 748,758 **** */ void emitInvoke(Name name) { assert(!isLinkerMethodInvoke(name)); // should use the static path for these if (true) { // push receiver ! MethodHandle target = name.function.resolvedHandle; assert(target != null) : name.exprString(); mv.visitLdcInsn(constantPlaceholder(target)); emitReferenceCast(MethodHandle.class, target); } else { // load receiver --- 748,758 ---- */ void emitInvoke(Name name) { assert(!isLinkerMethodInvoke(name)); // should use the static path for these if (true) { // push receiver ! MethodHandle target = name.function.resolvedHandle(); assert(target != null) : name.exprString(); mv.visitLdcInsn(constantPlaceholder(target)); emitReferenceCast(MethodHandle.class, target); } else { // load receiver
*** 777,786 **** --- 777,795 ---- java.util.Arrays.class, jdk.internal.misc.Unsafe.class //MethodHandle.class already covered }; + static boolean isStaticallyInvocable(NamedFunction[] functions) { + for (NamedFunction nf : functions) { + if (!isStaticallyInvocable(nf.member)) { + return false; + } + } + return true; + } + static boolean isStaticallyInvocable(Name name) { return isStaticallyInvocable(name.function.member()); } static boolean isStaticallyInvocable(MemberName member) {
*** 879,889 **** Class<?> rtype = name.function.methodType().returnType(); if (name.arguments.length == 0) { // The array will be a constant. Object emptyArray; try { ! emptyArray = name.function.resolvedHandle.invoke(); } catch (Throwable ex) { throw newInternalError(ex); } assert(java.lang.reflect.Array.getLength(emptyArray) == 0); assert(emptyArray.getClass() == rtype); // exact typing --- 888,898 ---- Class<?> rtype = name.function.methodType().returnType(); if (name.arguments.length == 0) { // The array will be a constant. Object emptyArray; try { ! emptyArray = name.function.resolvedHandle().invoke(); } catch (Throwable ex) { throw newInternalError(ex); } assert(java.lang.reflect.Array.getLength(emptyArray) == 0); assert(emptyArray.getClass() == rtype); // exact typing
*** 1083,1094 **** Label L_startBlock = new Label(); Label L_endBlock = new Label(); Label L_handler = new Label(); Label L_done = new Label(); ! Class<?> returnType = result.function.resolvedHandle.type().returnType(); ! MethodType type = args.function.resolvedHandle.type() .dropParameterTypes(0,1) .changeReturnType(returnType); mv.visitTryCatchBlock(L_startBlock, L_endBlock, L_handler, "java/lang/Throwable"); --- 1092,1103 ---- Label L_startBlock = new Label(); Label L_endBlock = new Label(); Label L_handler = new Label(); Label L_done = new Label(); ! Class<?> returnType = result.function.resolvedHandle().type().returnType(); ! MethodType type = args.function.resolvedHandle().type() .dropParameterTypes(0,1) .changeReturnType(returnType); mv.visitTryCatchBlock(L_startBlock, L_endBlock, L_handler, "java/lang/Throwable");
< prev index next >