src/share/classes/java/lang/invoke/BoundMethodHandle.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/classes/java/lang/invoke/BoundMethodHandle.java	Mon Jul 14 19:53:24 2014
--- new/src/share/classes/java/lang/invoke/BoundMethodHandle.java	Mon Jul 14 19:53:24 2014

*** 115,124 **** --- 115,149 ---- MethodType type = type().dropParameterTypes(pos, pos + 1); LambdaForm form = internalForm().bind(1+pos, speciesData()); return copyWithExtendD(type, form, value); } + @Override + BoundMethodHandle rebind() { + if (!tooComplex()) { + return this; + } + return makeReinvoker(this); + } + + private boolean tooComplex() { + return (fieldCount() > FIELD_COUNT_THRESHOLD || + form.expressionCount() > FORM_EXPRESSION_THRESHOLD); + } + private static int FIELD_COUNT_THRESHOLD = 12; // largest convenient BMH field count + private static int FORM_EXPRESSION_THRESHOLD = 24; // largest convenient BMH expression count + + /** + * A reinvoker MH has this form: + * {@code lambda (bmh, arg*) { thismh = bmh[0]; invokeBasic(thismh, arg*) }} + */ + static BoundMethodHandle makeReinvoker(MethodHandle target) { + LambdaForm form = DelegatingMethodHandle.makeReinvokerForm( + target, MethodTypeForm.LF_REBIND, Species_L.SPECIES_DATA.getterFunction(0) ); + return Species_L.make(target.type(), form, target); + } + /** * Return the {@link SpeciesData} instance representing this BMH species. All subclasses must provide a * static field containing this value, and they must accordingly implement this method. */ /*non-public*/ abstract SpeciesData speciesData();
*** 166,184 **** --- 191,200 ---- /*non-public*/ abstract BoundMethodHandle copyWithExtendI(MethodType mt, LambdaForm lf, int narg); /*non-public*/ abstract BoundMethodHandle copyWithExtendJ(MethodType mt, LambdaForm lf, long narg); /*non-public*/ abstract BoundMethodHandle copyWithExtendF(MethodType mt, LambdaForm lf, float narg); /*non-public*/ abstract BoundMethodHandle copyWithExtendD(MethodType mt, LambdaForm lf, double narg); // The following is a grossly irregular hack: @Override MethodHandle reinvokerTarget() { try { return (MethodHandle) arg(0); } catch (Throwable ex) { throw newInternalError(ex); } } // // concrete BMH classes required to close bootstrap loops // private // make it private to force users to access the enclosing class first
*** 186,197 **** --- 202,211 ---- final Object argL0; private Species_L(MethodType mt, LambdaForm lf, Object argL0) { super(mt, lf); this.argL0 = argL0; } // The following is a grossly irregular hack: @Override MethodHandle reinvokerTarget() { return (MethodHandle) argL0; } @Override /*non-public*/ SpeciesData speciesData() { return SPECIES_DATA; } @Override
*** 567,586 **** --- 581,590 ---- mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); // emit implementation of reinvokerTarget() mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "reinvokerTarget", "()" + MH_SIG, null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, className, "argL0", JLO_SIG); mv.visitTypeInsn(CHECKCAST, MH); mv.visitInsn(ARETURN); mv.visitMaxs(0, 0); mv.visitEnd(); // emit implementation of speciesData() mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "speciesData", MYSPECIES_DATA_SIG, null, null); mv.visitCode(); mv.visitFieldInsn(GETSTATIC, className, "SPECIES_DATA", SPECIES_DATA_SIG); mv.visitInsn(ARETURN);

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