< prev index next >

src/jdk.jextract/share/classes/com/sun/tools/jextract/AsmCodeFactory.java

Print this page

        

@@ -88,10 +88,12 @@
     private final String internal_name;
     private final HeaderFile owner;
     private final Map<String, byte[]> types;
     private final Logger logger = Logger.getLogger(getClass().getPackage().getName());
     private final List<String> headerDeclarations = new ArrayList<>();
+    private final StaticForwarderGenerator staticForwardGen;
+
     private transient boolean built = false;
 
     AsmCodeFactory(Context ctx, HeaderFile header) {
         this.ctx = ctx;
         logger.info(() -> "Instantiate AsmCodeFactory for " + header.path);

@@ -100,10 +102,15 @@
         this.global_cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
         this.types = new HashMap<>();
         global_cw.visit(V1_8, ACC_PUBLIC | ACC_ABSTRACT | ACC_INTERFACE,
                 internal_name,
                 null, "java/lang/Object", null);
+        if (ctx.getGenStaticForwarder()) {
+            this.staticForwardGen = new StaticForwarderGenerator(header);
+        } else {
+            this.staticForwardGen = null;
+        }
     }
 
     private void generateNativeHeader() {
         AnnotationVisitor av = global_cw.visitAnnotation(NATIVE_HEADER, true);
         av.visit("path", owner.path.toAbsolutePath().toString());

@@ -187,26 +194,31 @@
         av.visit("column", loc.column());
         av.visit("USR", tree.USR());
         av.visitEnd();
 
         mv.visitEnd();
-        cw.visitMethod(ACC_PUBLIC | ACC_ABSTRACT, fieldName + "$set",
+        mv = cw.visitMethod(ACC_PUBLIC | ACC_ABSTRACT, fieldName + "$set",
                 "(" + jt.getDescriptor() + ")V",
                 "(" + JType.getPointerVoidAsWildcard(jt) + ")V", null);
+        mv.visitEnd();
         if (tree instanceof VarTree || !isBitField(tree)) {
             JType ptrType = new PointerType(jt);
-            cw.visitMethod(ACC_PUBLIC | ACC_ABSTRACT, fieldName + "$ptr",
+            mv = cw.visitMethod(ACC_PUBLIC | ACC_ABSTRACT, fieldName + "$ptr",
                     "()" + ptrType.getDescriptor(), "()" + ptrType.getSignature(), null);
+            mv.visitEnd();
         }
     }
 
     @Override
     public Void visitVar(VarTree varTree, JType jt) {
         addField(global_cw, varTree, null);
         Layout layout = varTree.layout();
         String descStr = decorateAsAccessor(varTree, layout).toString();
         addHeaderDecl(varTree.name(), descStr);
+        if (staticForwardGen != null) {
+            staticForwardGen.visitVar(varTree, jt);
+        }
         return null;
     }
 
     private void addHeaderDecl(String symbol, String desc) {
         headerDeclarations.add(String.format("%s=%s", symbol, desc));

@@ -306,10 +318,13 @@
             return null;
         }
 
         // generate annotation class for named enum
         createAnnotationCls(enumTree);
+        if (staticForwardGen != null) {
+            staticForwardGen.visitEnum(enumTree, jt);
+        }
         return null;
     }
 
     private void createAnnotationCls(Tree tree) {
         String nativeName = tree.name();

@@ -478,10 +493,13 @@
                         null, alias.getAnnotationDescriptor(), true)
                   .visitEnd();
             }
         }
         mv.visitEnd();
+        if (staticForwardGen != null) {
+            staticForwardGen.visitFunction(funcTree, jt);
+        }
         return null;
     }
 
     protected AsmCodeFactory addType(JType jt, Tree tree) {
         JType2 jt2 = null;

@@ -564,10 +582,13 @@
         } else if (macroType.equals(String.class)) {
             mv.visitInsn(ARETURN);
         }
         mv.visitMaxs(0, 0);
         mv.visitEnd();
+        if (staticForwardGen != null) {
+            staticForwardGen.visitMacro(macroTree, jt);
+        }
         return null;
     }
 
     protected synchronized void produce() {
         if (built) {

@@ -578,10 +599,13 @@
         try {
             writeClassFile(global_cw, owner.clsName);
         } catch (IOException ex) {
             handleException(ex);
         }
+        if (staticForwardGen != null) {
+            types.put(staticForwardGen.getSimpleClassName(), staticForwardGen.getClassBytes());
+        }
     }
 
     protected Map<String, byte[]> collect() {
         // Ensure classes are produced
         if (!built) produce();
< prev index next >