src/java.base/share/classes/java/lang/invoke/LambdaForm.java
Print this page
*** 122,132 ****
@Stable final Name[] names;
final String debugName;
MemberName vmentry; // low-level behavior, or null if not yet prepared
private boolean isCompiled;
! Object transformCache; // managed by LambdaFormEditor
public static final int VOID_RESULT = -1, LAST_RESULT = -2;
enum BasicType {
L_TYPE('L', Object.class, Wrapper.OBJECT), // all reference types
--- 122,138 ----
@Stable final Name[] names;
final String debugName;
MemberName vmentry; // low-level behavior, or null if not yet prepared
private boolean isCompiled;
! volatile Object transformCache; // managed by LambdaFormEditor
!
! // non-null only if this is a derived LF that is cached in
! // baseLambdaForm.transformCache. this is necessary so that base LF
! // this LF was derived from is not GC-ed for as long as this LF is retained.
! // no program logic is dependent on this field. just GC.
! private final LambdaForm baseLambdaForm;
public static final int VOID_RESULT = -1, LAST_RESULT = -2;
enum BasicType {
L_TYPE('L', Object.class, Wrapper.OBJECT), // all reference types
*** 239,251 ****
assert !Arrays.asList(ARG_TYPES).contains(V_TYPE);
return true;
}
}
! LambdaForm(String debugName,
int arity, Name[] names, int result) {
assert(namesOK(arity, names));
this.arity = arity;
this.result = fixResult(result, names);
this.names = names.clone();
this.debugName = fixDebugName(debugName);
int maxOutArity = normalize();
--- 245,258 ----
assert !Arrays.asList(ARG_TYPES).contains(V_TYPE);
return true;
}
}
! LambdaForm(LambdaForm baseLambdaForm, String debugName,
int arity, Name[] names, int result) {
assert(namesOK(arity, names));
+ this.baseLambdaForm = baseLambdaForm;
this.arity = arity;
this.result = fixResult(result, names);
this.names = names.clone();
this.debugName = fixDebugName(debugName);
int maxOutArity = normalize();
*** 255,264 ****
--- 262,276 ----
compileToBytecode();
}
}
LambdaForm(String debugName,
+ int arity, Name[] names, int result) {
+ this(null, debugName, arity, names, result);
+ }
+
+ LambdaForm(String debugName,
int arity, Name[] names) {
this(debugName,
arity, names, LAST_RESULT);
}
*** 281,290 ****
--- 293,303 ----
private LambdaForm(String sig) {
// Make a blank lambda form, which returns a constant zero or null.
// It is used as a template for managing the invocation of similar forms that are non-empty.
// Called only from getPreparedForm.
assert(isValidSignature(sig));
+ this.baseLambdaForm = null;
this.arity = signatureArity(sig);
this.result = (signatureReturn(sig) == V_TYPE ? -1 : arity);
this.names = buildEmptyNames(arity, sig);
this.debugName = "LF.zero";
assert(nameRefsAreLegal());