src/share/classes/java/lang/invoke/DirectMethodHandle.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File jdk Cdiff src/share/classes/java/lang/invoke/DirectMethodHandle.java

src/share/classes/java/lang/invoke/DirectMethodHandle.java

Print this page

        

*** 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]); } else if (needsInit) { ! names[GET_MEMBER] = new Name(NF_internalMemberNameEnsureInit, names[DMH_THIS]); } else { ! 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) { --- 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]); } else if (needsInit) { ! names[GET_MEMBER] = new Name(NF.internalMemberNameEnsureInit, names[DMH_THIS]); } else { ! 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 **** 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]); if (needsCast && !isGetter) ! 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]); } 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]); } 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]); 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; static { try { NamedFunction nfs[] = { ! NF_internalMemberName = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("internalMemberName", Object.class)), ! NF_internalMemberNameEnsureInit = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("internalMemberNameEnsureInit", Object.class)), ! NF_ensureInitialized = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("ensureInitialized", Object.class)), ! NF_fieldOffset = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("fieldOffset", Object.class)), ! NF_checkBase = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("checkBase", Object.class)), ! NF_staticBase = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("staticBase", Object.class)), ! NF_staticOffset = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("staticOffset", Object.class)), ! NF_checkCast = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("checkCast", Object.class, Object.class)), ! NF_allocateInstance = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("allocateInstance", Object.class)), ! NF_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; --- 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]); if (needsCast && !isGetter) ! 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]); } 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]); } 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]); 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); } ! /** ! * 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[] = { ! internalMemberName = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("internalMemberName", Object.class)), ! internalMemberNameEnsureInit = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("internalMemberNameEnsureInit", Object.class)), ! ensureInitialized = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("ensureInitialized", Object.class)), ! fieldOffset = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("fieldOffset", Object.class)), ! checkBase = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("checkBase", Object.class)), ! staticBase = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("staticBase", Object.class)), ! staticOffset = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("staticOffset", Object.class)), ! checkCast = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("checkCast", Object.class, Object.class)), ! allocateInstance = new NamedFunction(DirectMethodHandle.class .getDeclaredMethod("allocateInstance", Object.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