< prev index next >
src/java.base/share/classes/jdk/internal/foreign/HeaderImplGenerator.java
Print this page
@@ -86,11 +86,23 @@
}
@Override
protected void generateMembers(BinderClassWriter cw) {
Class<?> headerClass = interfaces[0];
- String declarations = headerClass.getAnnotation(NativeHeader.class).declarations();
+ handleDeclarations(headerClass);
+ super.generateMembers(cw);
+ }
+
+ private void handleDeclarations(Class<?> cls) {
+ for (Class<?> si : cls.getInterfaces()) {
+ handleDeclarations(si);
+ }
+ if (!cls.isAnnotationPresent(NativeHeader.class)) {
+ // nothing to do!
+ return;
+ }
+ String declarations = cls.getAnnotation(NativeHeader.class).declarations();
for (Map.Entry<String, Object> declEntry : DescriptorParser.parseHeaderDeclarations(declarations).entrySet()) {
if (declEntry.getValue() instanceof Layout) {
Layout l = (Layout)declEntry.getValue();
for (Map.Entry<AccessorKind, String> accessorEntry : AccessorKind.from(l).entrySet()) {
nameToInfo.put(accessorEntry.getValue(), new GlobalVarInfo(declEntry.getKey(), l, accessorEntry.getKey()));
@@ -98,11 +110,10 @@
} else {
Function f = (Function)declEntry.getValue();
nameToInfo.put(declEntry.getKey(), new FunctionInfo(declEntry.getKey(), f));
}
}
- super.generateMembers(cw);
}
@Override
protected void generateConstructor(BinderClassWriter cw) {
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
< prev index next >