src/share/classes/java/lang/invoke/DirectMethodHandle.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/classes/java/lang/invoke/DirectMethodHandle.java Wed Sep 11 15:00:32 2013
--- new/src/share/classes/java/lang/invoke/DirectMethodHandle.java Wed Sep 11 15:00:32 2013
*** 255,270 ****
--- 255,270 ----
final int LINKER_CALL = nameCursor++;
Name[] names = arguments(nameCursor - ARG_LIMIT, mtype.invokerType());
assert(names.length == nameCursor);
if (doesAlloc) {
// names = { argx,y,z,... new C, init method }
! names[NEW_OBJ] = new Name(NF_allocateInstance, names[DMH_THIS]);
! names[GET_MEMBER] = new Name(NF_constructorMethod, names[DMH_THIS]);
! names[NEW_OBJ] = new Name(NF.allocateInstance, names[DMH_THIS]);
! names[GET_MEMBER] = new Name(NF.constructorMethod, names[DMH_THIS]);
} else if (needsInit) {
! names[GET_MEMBER] = new Name(NF_internalMemberNameEnsureInit, names[DMH_THIS]);
! names[GET_MEMBER] = new Name(NF.internalMemberNameEnsureInit, names[DMH_THIS]);
} else {
! names[GET_MEMBER] = new Name(NF_internalMemberName, names[DMH_THIS]);
! names[GET_MEMBER] = new Name(NF.internalMemberName, names[DMH_THIS]);
}
Object[] outArgs = Arrays.copyOfRange(names, ARG_BASE, GET_MEMBER+1, Object[].class);
assert(outArgs[outArgs.length-1] == names[GET_MEMBER]); // look, shifted args!
int result = LambdaForm.LAST_RESULT;
if (doesAlloc) {
*** 635,705 ****
--- 635,710 ----
final int LINKER_CALL = nameCursor++;
final int POST_CAST = (needsCast && isGetter ? nameCursor++ : -1);
final int RESULT = nameCursor-1; // either the call or the cast
Name[] names = arguments(nameCursor - ARG_LIMIT, mtype.invokerType());
if (needsInit)
! names[INIT_BAR] = new Name(NF_ensureInitialized, names[DMH_THIS]);
! names[INIT_BAR] = new Name(NF.ensureInitialized, names[DMH_THIS]);
if (needsCast && !isGetter)
! names[PRE_CAST] = new Name(NF_checkCast, names[DMH_THIS], names[SET_VALUE]);
! names[PRE_CAST] = new Name(NF.checkCast, names[DMH_THIS], names[SET_VALUE]);
Object[] outArgs = new Object[1 + linkerType.parameterCount()];
assert(outArgs.length == (isGetter ? 3 : 4));
outArgs[0] = UNSAFE;
if (isStatic) {
! outArgs[1] = names[F_HOLDER] = new Name(NF_staticBase, names[DMH_THIS]);
! outArgs[2] = names[F_OFFSET] = new Name(NF_staticOffset, names[DMH_THIS]);
! outArgs[1] = names[F_HOLDER] = new Name(NF.staticBase, names[DMH_THIS]);
! outArgs[2] = names[F_OFFSET] = new Name(NF.staticOffset, names[DMH_THIS]);
} else {
! outArgs[1] = names[OBJ_CHECK] = new Name(NF_checkBase, names[OBJ_BASE]);
! outArgs[2] = names[F_OFFSET] = new Name(NF_fieldOffset, names[DMH_THIS]);
! outArgs[1] = names[OBJ_CHECK] = new Name(NF.checkBase, names[OBJ_BASE]);
! outArgs[2] = names[F_OFFSET] = new Name(NF.fieldOffset, names[DMH_THIS]);
}
if (!isGetter) {
outArgs[3] = (needsCast ? names[PRE_CAST] : names[SET_VALUE]);
}
for (Object a : outArgs) assert(a != null);
names[LINKER_CALL] = new Name(linker, outArgs);
if (needsCast && isGetter)
! names[POST_CAST] = new Name(NF_checkCast, names[DMH_THIS], names[LINKER_CALL]);
! names[POST_CAST] = new Name(NF.checkCast, names[DMH_THIS], names[LINKER_CALL]);
for (Name n : names) assert(n != null);
String fieldOrStatic = (isStatic ? "Static" : "Field");
String lambdaName = (linkerName + fieldOrStatic); // significant only for debugging
if (needsCast) lambdaName += "Cast";
if (needsInit) lambdaName += "Init";
return new LambdaForm(lambdaName, ARG_LIMIT, names, RESULT);
}
private static final NamedFunction
NF_internalMemberName,
NF_internalMemberNameEnsureInit,
NF_ensureInitialized,
NF_fieldOffset,
NF_checkBase,
! NF_staticBase,
! NF_staticOffset,
! NF_checkCast,
! NF_allocateInstance,
NF_constructorMethod;
+ /**
+ * Pre-initialized NamedFunctions for bootstrapping purposes.
+ * Factored in an inner class to delay initialization until first usage.
+ */
+ private static class NF {
+ static final NamedFunction
! internalMemberName,
! internalMemberNameEnsureInit,
! ensureInitialized,
! fieldOffset,
+ checkBase,
+ staticBase,
+ staticOffset,
+ checkCast,
+ allocateInstance,
+ constructorMethod;
static {
try {
NamedFunction nfs[] = {
! NF_internalMemberName = new NamedFunction(DirectMethodHandle.class
! internalMemberName = new NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("internalMemberName", Object.class)),
! NF_internalMemberNameEnsureInit = new NamedFunction(DirectMethodHandle.class
! internalMemberNameEnsureInit = new NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("internalMemberNameEnsureInit", Object.class)),
! NF_ensureInitialized = new NamedFunction(DirectMethodHandle.class
! ensureInitialized = new NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("ensureInitialized", Object.class)),
! NF_fieldOffset = new NamedFunction(DirectMethodHandle.class
! fieldOffset = new NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("fieldOffset", Object.class)),
! NF_checkBase = new NamedFunction(DirectMethodHandle.class
! checkBase = new NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("checkBase", Object.class)),
! NF_staticBase = new NamedFunction(DirectMethodHandle.class
! staticBase = new NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("staticBase", Object.class)),
! NF_staticOffset = new NamedFunction(DirectMethodHandle.class
! staticOffset = new NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("staticOffset", Object.class)),
! NF_checkCast = new NamedFunction(DirectMethodHandle.class
! checkCast = new NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("checkCast", Object.class, Object.class)),
! NF_allocateInstance = new NamedFunction(DirectMethodHandle.class
! allocateInstance = new NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("allocateInstance", Object.class)),
! NF_constructorMethod = new NamedFunction(DirectMethodHandle.class
! constructorMethod = new NamedFunction(DirectMethodHandle.class
.getDeclaredMethod("constructorMethod", Object.class))
};
for (NamedFunction nf : nfs) {
// Each nf must be statically invocable or we get tied up in our bootstraps.
assert(InvokerBytecodeGenerator.isStaticallyInvocable(nf.member)) : nf;
*** 707,712 ****
--- 712,718 ----
}
} catch (ReflectiveOperationException ex) {
throw newInternalError(ex);
}
}
+ }
}
src/share/classes/java/lang/invoke/DirectMethodHandle.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File