Skip to content

Commit

Permalink
StructsGenerator: Fix bug where a JniClass extending another class th…
Browse files Browse the repository at this point in the history
…at has only ignored fields would generate calls to cache the fields.
  • Loading branch information
calin-iorgulescu committed Oct 17, 2018
1 parent 2b88a8f commit 5f52fee
Showing 1 changed file with 24 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@

import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.fusesource.hawtjni.generator.model.JNIClass;
import org.fusesource.hawtjni.generator.model.JNIField;
import org.fusesource.hawtjni.generator.model.JNIFieldAccessor;
import org.fusesource.hawtjni.generator.model.JNIType;
import org.fusesource.hawtjni.runtime.ClassFlag;

Expand All @@ -29,6 +31,8 @@ public class StructsGenerator extends JNIGenerator {

static final boolean GLOBAL_REF = false;

private HashMap<JNIClass, ArrayList<JNIField>> structFields = new HashMap<JNIClass, ArrayList<JNIField>>();

public StructsGenerator(boolean header) {
this.header = header;
}
Expand Down Expand Up @@ -60,15 +64,19 @@ public void generate(JNIClass clazz) {
}

private ArrayList<JNIField> getStructFields(JNIClass clazz) {
ArrayList<JNIField> rc = new ArrayList<JNIField>();
List<JNIField> fields = clazz.getDeclaredFields();
for (JNIField field : fields) {
int mods = field.getModifiers();
if ( (mods & Modifier.STATIC) == 0 && (mods & Modifier.TRANSIENT) == 0) {
rc.add(field);
if (!structFields.containsKey(clazz)) {
ArrayList<JNIField> rc = new ArrayList<JNIField>();
List<JNIField> fields = clazz.getDeclaredFields();
for (JNIField field : fields) {
int mods = field.getModifiers();
if ((mods & Modifier.STATIC) == 0 && (mods & Modifier.TRANSIENT) == 0) {
rc.add(field);
}
}

structFields.put(clazz, rc);
}
return rc;
return structFields.get(clazz);
}

void generateHeaderFile(JNIClass clazz) {
Expand Down Expand Up @@ -194,7 +202,7 @@ void generateCacheFunction(JNIClass clazz) {
output(simpleName);
outputln("Fc.cached) return;");
JNIClass superclazz = clazz.getSuperclass();
if (!superclazz.getName().equals("java.lang.Object")) {
if (!superclazz.getName().equals("java.lang.Object") && hasNonIgnoredFields(superclazz)) {
String superName = superclazz.getSimpleName();
output("\tcache");
output(superName);
Expand Down Expand Up @@ -253,7 +261,7 @@ void generateGetFields(JNIClass clazz) {
JNIClass superclazz = clazz.getSuperclass();
String clazzName = clazz.getNativeName();
String superName = superclazz.getNativeName();
if (!superclazz.getName().equals("java.lang.Object")) {
if (!superclazz.getName().equals("java.lang.Object") && hasNonIgnoredFields(superclazz)) {
/*
* Windows exception - cannot call get/set function of super class
* in this case
Expand Down Expand Up @@ -406,7 +414,7 @@ void generateSetFields(JNIClass clazz) {
JNIClass superclazz = clazz.getSuperclass();
String clazzName = clazz.getNativeName();
String superName = superclazz.getNativeName();
if (!superclazz.getName().equals("java.lang.Object")) {
if (!superclazz.getName().equals("java.lang.Object") && hasNonIgnoredFields(superclazz)) {
/*
* Windows exception - cannot call get/set function of super class
* in this case
Expand Down Expand Up @@ -561,4 +569,10 @@ boolean ignoreField(JNIField field) {
return field.ignore() || ((mods & Modifier.FINAL) != 0) || ((mods & Modifier.STATIC) != 0);
}

boolean hasNonIgnoredFields(JNIClass clazz) {
for (JNIField field : getStructFields(clazz))
if (!ignoreField(field)) return true;
return false;
}

}

0 comments on commit 5f52fee

Please sign in to comment.