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 }
|