< prev index next > src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java
Print this page
import java.lang.classfile.ClassFile;
import java.lang.classfile.attribute.SourceFileAttribute;
import java.lang.constant.ClassDesc;
import java.util.ArrayList;
import java.util.HashSet;
+ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
LambdaForm form = DirectMethodHandle.makePreparedLambdaForm(methodTypes[i], types[i]);
forms.add(form);
names.add(form.kind.defaultLambdaName);
}
- for (Wrapper wrapper : Wrapper.values()) {
- int ftype = wrapper == Wrapper.VOID ? DirectMethodHandle.FT_CHECKED_REF : DirectMethodHandle.ftypeKind(wrapper.primitiveType());
- for (byte b = DirectMethodHandle.AF_GETFIELD; b < DirectMethodHandle.AF_LIMIT; b++) {
- LambdaForm form = DirectMethodHandle
- .makePreparedFieldLambdaForm(b, /*isVolatile*/false, ftype);
- if (form.kind == GENERIC)
- throw new InternalError(b + " non-volatile " + ftype);
- forms.add(form);
- names.add(form.kind.defaultLambdaName);
- // volatile
- form = DirectMethodHandle
- .makePreparedFieldLambdaForm(b, /*isVolatile*/true, ftype);
- if (form.kind == GENERIC)
- throw new InternalError(b + " volatile " + ftype);
- forms.add(form);
- names.add(form.kind.defaultLambdaName);
+ record FieldLfToken(byte formOp, int ftypeKind) {}
+ List<FieldLfToken> tokens = new ArrayList<>();
+ for (int i = 0; i <= DirectMethodHandle.FT_CHECKED_REF; i++) {
+ for (byte formOp = DirectMethodHandle.AF_GETFIELD; formOp < DirectMethodHandle.AF_LIMIT; formOp++) {
+ tokens.add(new FieldLfToken(formOp, i));
}
}
+ for (int i : new int[] {DirectMethodHandle.FT_UNCHECKED_NR_REF, DirectMethodHandle.FT_CHECKED_NR_REF}) {
+ for (byte formOp = DirectMethodHandle.AF_GETFIELD; formOp < DirectMethodHandle.AF_LIMIT; formOp++) {
+ boolean isGetter = (formOp & 1) == (DirectMethodHandle.AF_GETFIELD & 1);
+ if (!isGetter) {
+ tokens.add(new FieldLfToken(formOp, i));
+ }
+ }
+ }
+ // Only legal flat combinations; no static
+ tokens.add(new FieldLfToken(DirectMethodHandle.AF_GETFIELD, DirectMethodHandle.FT_NULLABLE_FLAT));
+ tokens.add(new FieldLfToken(DirectMethodHandle.AF_PUTFIELD, DirectMethodHandle.FT_NULLABLE_FLAT));
+ tokens.add(new FieldLfToken(DirectMethodHandle.AF_PUTFIELD, DirectMethodHandle.FT_NR_FLAT));
+ // Compile
+ for (var token : tokens) {
+ byte b = token.formOp;
+ int ftype = token.ftypeKind;
+ LambdaForm form = DirectMethodHandle
+ .makePreparedFieldLambdaForm(b, /*isVolatile*/false, ftype);
+ if (form.kind == GENERIC)
+ throw new InternalError(b + " non-volatile " + ftype);
+ forms.add(form);
+ names.add(form.kind.defaultLambdaName);
+ // volatile
+ form = DirectMethodHandle
+ .makePreparedFieldLambdaForm(b, /*isVolatile*/true, ftype);
+ if (form.kind == GENERIC)
+ throw new InternalError(b + " volatile " + ftype);
+ forms.add(form);
+ names.add(form.kind.defaultLambdaName);
+ }
return generateCodeBytesForLFs(className,
names.toArray(new String[0]),
forms.toArray(new LambdaForm[0]));
}
< prev index next >