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