< 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 >