< prev index next >

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

Print this page




 205         /* FIXME: Member interface is implicit static, also ASM.CheckClassAdapter is not
 206          * taking static as a valid flag, so comment this out during development.
 207          */
 208         global_cw.visitInnerClass(name, internal_name, intf, ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
 209         ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
 210         cw.visit(V1_8, ACC_PUBLIC /*| ACC_STATIC*/ | ACC_INTERFACE | ACC_ABSTRACT,
 211                 name, "Ljava/lang/Object;Ljava/nicl/types/Reference<L" + name + ";>;",
 212                 "java/lang/Object", new String[] {"java/nicl/types/Reference"});
 213         annotateC(cw, cursor);
 214         AnnotationVisitor av = cw.visitAnnotation(
 215                 "Ljava/nicl/metadata/NativeType;", true);
 216         av.visit("layout", Utils.getLayout(t));
 217         av.visit("ctype", t.spelling());
 218         av.visit("size", t.size());
 219         av.visit("isRecordType", true);
 220         av.visitEnd();
 221         cw.visitInnerClass(name, internal_name, intf, ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
 222 
 223         // fields
 224         Printer dbg = new Printer();
 225         cursor.stream()
 226                 .filter(cx -> cx.kind() == CursorKind.FieldDecl)
 227                 .forEachOrdered(cx -> addField(cw, cx, cursor.type()));
 228         // Write class
 229         try {
 230             writeClassFile(cw, owner.clsName + "$" + intf);
 231         } catch (IOException ex) {
 232             handleException(ex);
 233         }
 234     }
 235 
 236     private void createEnum(Cursor cursor) {
 237         String nativeName = Utils.getIdentifier(cursor);
 238         logger.fine(() -> "create enum: " + nativeName);
 239 
 240         String intf = Utils.toClassName(nativeName);
 241         String name = internal_name + "$" + intf;
 242 
 243         logger.fine(() -> "Define class " + name + " for native type " + nativeName);
 244         global_cw.visitInnerClass(name, internal_name, intf,
 245                 ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE | ACC_ANNOTATION);


 518                     createStruct(cursor);
 519                     break;
 520                 case FunctionDecl:
 521                     assert (jt instanceof JType.Function);
 522                     addMethod(cursor, (JType.Function) jt);
 523                     break;
 524                 case EnumDecl:
 525                     createEnum(cursor);
 526                     break;
 527                 case TypedefDecl:
 528                     // anonymous typedef struct {} xxx will not get TypeAlias
 529                     if (jt instanceof TypeAlias) {
 530                         defineType(cursor, (TypeAlias) jt);
 531                     }
 532                     break;
 533                 case VarDecl:
 534                     addField(global_cw, cursor, null);
 535                     break;
 536                 default:
 537                     logger.warning(() -> "Unsupported declaration Cursor:");
 538                     logger.fine(() -> Printer.Stringifier(p -> p.dumpCursor(cursor, true)));
 539                     break;
 540             }
 541         } catch (Exception ex) {
 542             handleException(ex);
 543             logger.warning("Cursor causing above exception is: " + cursor.spelling());
 544             logger.fine(() -> Printer.Stringifier(p -> p.dumpCursor(cursor, true)));
 545         }
 546         return this;
 547     }
 548 
 549     private static class Literal {
 550         private enum Type {
 551             INT(int.class),
 552             LONG(long.class),
 553             STRING(String.class);
 554 
 555             private Class<?> c;
 556 
 557             Type(Class<?> c) {
 558                 this.c = c;
 559             }
 560 
 561             Class<?> getTypeClass() {
 562                 return c;
 563             }
 564         }




 205         /* FIXME: Member interface is implicit static, also ASM.CheckClassAdapter is not
 206          * taking static as a valid flag, so comment this out during development.
 207          */
 208         global_cw.visitInnerClass(name, internal_name, intf, ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
 209         ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
 210         cw.visit(V1_8, ACC_PUBLIC /*| ACC_STATIC*/ | ACC_INTERFACE | ACC_ABSTRACT,
 211                 name, "Ljava/lang/Object;Ljava/nicl/types/Reference<L" + name + ";>;",
 212                 "java/lang/Object", new String[] {"java/nicl/types/Reference"});
 213         annotateC(cw, cursor);
 214         AnnotationVisitor av = cw.visitAnnotation(
 215                 "Ljava/nicl/metadata/NativeType;", true);
 216         av.visit("layout", Utils.getLayout(t));
 217         av.visit("ctype", t.spelling());
 218         av.visit("size", t.size());
 219         av.visit("isRecordType", true);
 220         av.visitEnd();
 221         cw.visitInnerClass(name, internal_name, intf, ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
 222 
 223         // fields
 224         Printer dbg = new Printer();
 225         cursor.children()
 226                 .filter(cx -> cx.kind() == CursorKind.FieldDecl)
 227                 .forEachOrdered(cx -> addField(cw, cx, cursor.type()));
 228         // Write class
 229         try {
 230             writeClassFile(cw, owner.clsName + "$" + intf);
 231         } catch (IOException ex) {
 232             handleException(ex);
 233         }
 234     }
 235 
 236     private void createEnum(Cursor cursor) {
 237         String nativeName = Utils.getIdentifier(cursor);
 238         logger.fine(() -> "create enum: " + nativeName);
 239 
 240         String intf = Utils.toClassName(nativeName);
 241         String name = internal_name + "$" + intf;
 242 
 243         logger.fine(() -> "Define class " + name + " for native type " + nativeName);
 244         global_cw.visitInnerClass(name, internal_name, intf,
 245                 ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE | ACC_ANNOTATION);


 518                     createStruct(cursor);
 519                     break;
 520                 case FunctionDecl:
 521                     assert (jt instanceof JType.Function);
 522                     addMethod(cursor, (JType.Function) jt);
 523                     break;
 524                 case EnumDecl:
 525                     createEnum(cursor);
 526                     break;
 527                 case TypedefDecl:
 528                     // anonymous typedef struct {} xxx will not get TypeAlias
 529                     if (jt instanceof TypeAlias) {
 530                         defineType(cursor, (TypeAlias) jt);
 531                     }
 532                     break;
 533                 case VarDecl:
 534                     addField(global_cw, cursor, null);
 535                     break;
 536                 default:
 537                     logger.warning(() -> "Unsupported declaration Cursor:");
 538                     logger.warning(() -> Printer.Stringifier(p -> p.dumpCursor(cursor, true)));
 539                     break;
 540             }
 541         } catch (Exception ex) {
 542             handleException(ex);
 543             logger.warning("Cursor causing above exception is: " + cursor.spelling());
 544             logger.warning(() -> Printer.Stringifier(p -> p.dumpCursor(cursor, true)));
 545         }
 546         return this;
 547     }
 548 
 549     private static class Literal {
 550         private enum Type {
 551             INT(int.class),
 552             LONG(long.class),
 553             STRING(String.class);
 554 
 555             private Class<?> c;
 556 
 557             Type(Class<?> c) {
 558                 this.c = c;
 559             }
 560 
 561             Class<?> getTypeClass() {
 562                 return c;
 563             }
 564         }


< prev index next >