Skip to content

Commit 4b70fd9

Browse files
committed
JNAerator: add explicit setFieldOrder call to struct constructors for JNA(erator) runtime outputs (BridJ does not need it as it has @field(i) annotations)
1 parent ffb7aca commit 4b70fd9

1 file changed

Lines changed: 24 additions & 1 deletion

File tree

libraries/jnaerator/jnaerator/src/main/java/com/ochafik/lang/jnaerator/DeclarationsConverter.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1594,7 +1594,7 @@ public VariablesDeclaration convertVariablesDeclarationToJNA(String name, TypeRe
15941594
mul = expr(c.getFirst(), BinaryOperator.Multiply, mul);
15951595
}
15961596
}
1597-
initVal = new Expression.NewArray(jr.getTarget(), mul);
1597+
initVal = new Expression.NewArray(jr.getTarget(), new Expression[] { mul }, new Expression[0]);
15981598
}
15991599
if (javaType == null) {
16001600
throw new UnsupportedConversionException(mutatedType, "failed to convert type to Java");
@@ -1963,24 +1963,29 @@ private void addStructConstructors(Identifier structName, Struct structJavaClass
19631963
Pair<List<VariablesDeclaration>, List<VariablesDeclaration>> decls = getParentAndOwnDeclarations(structJavaClass, nativeStruct);
19641964
Map<Integer, String> namesById = new TreeMap<Integer, String>();
19651965
Set<String> names = new HashSet<String>();
1966+
List<Expression> orderedFieldNames = new ArrayList<Expression>();
19661967
int iArg = 0;
19671968
for (VariablesDeclaration vd : new CompoundCollection<VariablesDeclaration>(decls.getFirst(), decls.getSecond())) {
19681969
String name = chooseJavaArgName(vd.getDeclarators().get(0).resolveName(), iArg, names);
19691970
namesById.put(vd.getId(), name);
19701971
fieldsConstr.addArg(new Arg(name, vd.getValueType().clone()));
19711972
iArg++;
19721973
}
1974+
19731975
FunctionCall superCall = methodCall("super");
1976+
// Adding parent fields
19741977
for (VariablesDeclaration vd : decls.getFirst()) {
19751978
String name = vd.getDeclarators().get(0).resolveName(), uname = namesById.get(vd.getId());
19761979
Struct parent = (Struct)vd.getParentElement();
19771980
Identifier parentTgName = result.getTaggedTypeIdentifierInJava(parent);
19781981
if (!result.config.noComments)
19791982
fieldsConstr.addToCommentBefore("@param " + name + " @see " + parentTgName + "#" + vd.getDeclarators().get(0).resolveName());
19801983
superCall.addArgument(varRef(uname));
1984+
orderedFieldNames.add(expr(name));
19811985
}
19821986
fieldsConstr.getBody().addStatement(stat(superCall));
19831987

1988+
// Adding class' own fields
19841989
for (VariablesDeclaration vd : decls.getSecond()) {
19851990
String name = vd.getDeclarators().get(0).resolveName(), uname = namesById.get(vd.getId());
19861991
if (!result.config.noComments)
@@ -1990,7 +1995,25 @@ private void addStructConstructors(Identifier structName, Struct structJavaClass
19901995
fieldsConstr.getBody().addStatement(throwIfArraySizeDifferent(uname));
19911996
fieldsConstr.getBody().addStatement(stat(
19921997
new Expression.AssignmentOp(memberRef(thisRef(), MemberRefStyle.Dot, ident(name)), AssignmentOperator.Equal, varRef(uname))));
1998+
1999+
orderedFieldNames.add(expr(name));
19932000
}
2001+
2002+
if (result.config.runtime != JNAeratorConfig.Runtime.BridJ) {
2003+
String initOrderName = "initFieldOrder";
2004+
Function initOrder = new Function(Type.JavaMethod, ident(initOrderName), typeRef(Void.TYPE)).setBody(block(
2005+
stat(
2006+
methodCall("setFieldOrder", new Expression.NewArray(typeRef(String.class), new Expression[0], orderedFieldNames.toArray(new Expression[orderedFieldNames.size()])))
2007+
)
2008+
)).addModifiers(Modifier.Protected);
2009+
if (signatures.add(initOrder.computeSignature(false))) {
2010+
structJavaClass.addDeclaration(initOrder);
2011+
Statement callInitOrder = stat(methodCall(initOrderName));
2012+
emptyConstructor.getBody().addStatement(callInitOrder);
2013+
fieldsConstr.getBody().addStatement(callInitOrder.clone());
2014+
}
2015+
}
2016+
19942017
int nArgs = fieldsConstr.getArgs().size();
19952018
if (nArgs == 0)
19962019
System.err.println("Struct with no field : " + structName);

0 commit comments

Comments
 (0)