< prev index next >

src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java

Print this page
@@ -30,10 +30,11 @@
  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;

@@ -427,28 +428,47 @@
  
              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 >