aboutsummaryrefslogtreecommitdiffstats
path: root/src/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java')
-rw-r--r--src/java/com/jogamp/gluegen/CMethodBindingEmitter.java57
-rw-r--r--src/java/com/jogamp/gluegen/JavaCallbackEmitter.java38
-rw-r--r--src/java/com/jogamp/gluegen/JavaConfiguration.java51
-rw-r--r--src/java/com/jogamp/gluegen/JavaEmitter.java83
-rw-r--r--src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java4
-rw-r--r--src/java/com/jogamp/gluegen/JavaType.java116
-rw-r--r--src/java/com/jogamp/gluegen/MethodBinding.java4
7 files changed, 210 insertions, 143 deletions
diff --git a/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java b/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
index cbd33fd..9d0eb96 100644
--- a/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
+++ b/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
@@ -384,7 +384,7 @@ public class CMethodBindingEmitter extends FunctionEmitter {
assert(binding.getNumArguments() == 1);
continue;
}
- if (javaArgType.isJNIEnv() || binding.isArgumentThisPointer(i)) {
+ if (javaArgType.isJNIEnv() || javaArgType.isPascalLen() || binding.isArgumentThisPointer(i)) {
continue;
}
buf.append(", ");
@@ -730,11 +730,16 @@ public class CMethodBindingEmitter extends FunctionEmitter {
unit.emitln(", _copyIndex);");
if (javaArgType.isStringArray()) {
+ if ( javaArgType.isPascalStr() ) {
+ throw new GlueGenException(
+ "Cannot handle String[] of type PascalString java " + javaArgType.getDebugString() + ", c "+ cArgType.getDebugString() +
+ "\": "+binding, binding.getCSymbol().getASTLocusTag());
+ }
unit.emit(" ");
emitGetStringChars("(jstring) _tmpObj",
convName+"_copy[_copyIndex]",
isUTF8Type(cArgType),
- true);
+ false, true);
} else if (javaArgType.isNIOBufferArray()) {
/* We always assume an integer "byte offset" argument follows any Buffer
in the method binding. */
@@ -791,10 +796,13 @@ public class CMethodBindingEmitter extends FunctionEmitter {
unit.emitln(" }");
} else if (javaArgType.isString()) {
+ if ( javaArgType.isPascalStr() ) {
+ unit.emitln(" size_t "+STRING_CHARS_PREFIX + javaArgName + "_len;");
+ }
emitGetStringChars(javaArgName,
STRING_CHARS_PREFIX + javaArgName,
isUTF8Type(binding.getCArgumentType(i)),
- false);
+ javaArgType.isPascalStr(), false);
}
}
}
@@ -953,6 +961,9 @@ public class CMethodBindingEmitter extends FunctionEmitter {
if (javaArgType.isJNIEnv()) {
unit.emit("env");
+ } else if( javaArgType.isPascalLen() ) {
+ final Type cArgType = binding.getCArgumentType(i);
+ unit.emit(" ("+cArgType.getCName(true)+") "+STRING_CHARS_PREFIX + binding.getArgumentName(javaArgType.pascalStrElem.valueIdx) + "_len");
} else if (binding.isArgumentThisPointer(i)) {
unit.emit(CMethodBindingEmitter.cThisArgumentName());
} else {
@@ -1182,11 +1193,10 @@ public class CMethodBindingEmitter extends FunctionEmitter {
}
unit.emitln(" }");
} else if (javaType.isString()) {
- final boolean pascalString = javaType.isPascalStringVariant();
+ final boolean pascalString = javaType.isPascalStrElem();
final String lenArgName;
if( pascalString ) {
- final int lenIdx = cfg.pascalStringLengthIndex(getCSymbol(), argIdx);
- lenArgName = 0 <= lenIdx ? binding.getArgumentName(lenIdx) : null;
+ lenArgName = binding.getArgumentName( javaType.pascalStrElem.lengthIdx );
} else {
lenArgName = null;
}
@@ -1315,7 +1325,9 @@ public class CMethodBindingEmitter extends FunctionEmitter {
throw new GlueGenException("Saw illegal \"void\" argument while emitting arg "+i+" of "+binding,
binding.getCArgumentType(i).getASTLocusTag());
}
- } else {
+ } else if ( type.isPascalLen() ) {
+ // drop
+ } else {
Class<?> c = type.getJavaClass();
if (c != null) {
JavaType.appendJNIDescriptor(buf, c, false);
@@ -1411,10 +1423,19 @@ public class CMethodBindingEmitter extends FunctionEmitter {
private void emitGetStringChars(final String sourceVarName,
final String receivingVarName,
final boolean isUTF8,
+ final boolean addLengthVar,
final boolean emitElseClause) {
unit.emitln(" if ( NULL != " + sourceVarName + " ) {");
+ if( addLengthVar ) {
+ unit.emit(" "+receivingVarName+"_len = (size_t) ");
+ }
if (isUTF8) {
+ if( addLengthVar ) {
+ unit.emit(" (*env)->GetStringUTFLength(env, ");
+ unit.emit(sourceVarName);
+ unit.emitln(");");
+ }
unit.emit(" ");
unit.emit(receivingVarName);
unit.emit(" = (*env)->GetStringUTFChars(env, ");
@@ -1431,12 +1452,26 @@ public class CMethodBindingEmitter extends FunctionEmitter {
// null-terminated Unicode string. For this reason we explicitly
// calloc our buffer, including the null terminator, and use
// GetStringRegion to fetch the string's characters.
- emitCalloc(receivingVarName,
- "jchar",
- "(*env)->GetStringLength(env, " + sourceVarName + ") + 1",
- "Could not allocate temporary buffer for copying string argument \\\""+sourceVarName+"\\\"");
+ if( addLengthVar ) {
+ unit.emit(" (*env)->GetStringLength(env, ");
+ unit.emit(sourceVarName);
+ unit.emitln(");");
+ emitCalloc(receivingVarName,
+ "jchar",
+ receivingVarName+"_len + 1",
+ "Could not allocate temporary buffer for copying string argument \\\""+sourceVarName+"\\\"");
+ } else {
+ emitCalloc(receivingVarName,
+ "jchar",
+ "(*env)->GetStringLength(env, " + sourceVarName + ") + 1",
+ "Could not allocate temporary buffer for copying string argument \\\""+sourceVarName+"\\\"");
+ }
unit.emitln(" (*env)->GetStringRegion(env, " + sourceVarName + ", 0, (*env)->GetStringLength(env, " + sourceVarName + "), " + receivingVarName + ");");
}
+ if( addLengthVar ) {
+ unit.emitln(" } else {");
+ unit.emitln(" "+receivingVarName+"_len = 0;");
+ }
unit.emit(" }");
if (emitElseClause) {
unit.emit(" else {");
diff --git a/src/java/com/jogamp/gluegen/JavaCallbackEmitter.java b/src/java/com/jogamp/gluegen/JavaCallbackEmitter.java
index 3359c1c..1c6a3c7 100644
--- a/src/java/com/jogamp/gluegen/JavaCallbackEmitter.java
+++ b/src/java/com/jogamp/gluegen/JavaCallbackEmitter.java
@@ -483,7 +483,7 @@ public final class JavaCallbackEmitter {
final StringBuilder buf = new StringBuilder();
buf.append("(");
info.cbFuncBinding.forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> {
- if( !cType.isVoid() ) {
+ if( !cType.isVoid() && !jType.isPascalLen() ) {
if( idx == info.cbFuncUserParamIdx ) {
buf.append("J");
} else {
@@ -568,7 +568,7 @@ public final class JavaCallbackEmitter {
final boolean[] mapNativePtrToCompound = { false };
final JavaType[] origUserParamJType = { null };
info.cbFuncBinding.forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> {
- if( !cType.isVoid() ) {
+ if( !cType.isVoid() && !jType.isPascalLen() ) {
if( 0 < consumedCount ) { unit.emit(", "); }
if( idx == info.cbFuncUserParamIdx ) {
unit.emit("long nativeUserParam");
@@ -623,10 +623,12 @@ public final class JavaCallbackEmitter {
}
unit.emit("value.func.callback(");
info.cbFuncBinding.forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> {
- if( !cType.isVoid() ) {
+ if( !cType.isVoid() && !jType.isPascalLen() ) {
if( 0 < consumedCount ) { unit.emit(", "); }
if( idx == info.cbFuncUserParamIdx && !useParamLocal[0] ) {
unit.emit("value.param");
+ } else if( jType.isPascalLen() ){
+ unit.emit( "/* "+name+" */");
} else {
unit.emit(name);
}
@@ -834,7 +836,7 @@ public final class JavaCallbackEmitter {
}
unit.emit("(*env)->CallStatic" + CodeGenUtils.capitalizeString( jretType.getName() ) +"Method(env, cbClazz, cbMethod, ");
// javaCallback.cbFuncCEmitter.emitBodyPassCArguments();
- emitJavaCallbackBodyPassJavaArguments(unit);
+ emitCBodyPassArguments(unit);
unit.emitln(");");
unit.emitln(" if( (*env)->ExceptionCheck(env) ) {");
unit.emitln(" fprintf(stderr, \"Info: Callback '"+jcbFriendlyBasename+"': Exception in Java Callback caught:\\n\");");
@@ -865,24 +867,26 @@ public final class JavaCallbackEmitter {
return count;
}
- private int emitJavaCallbackBodyPassJavaArguments(final CodeUnit unit) {
+ private int emitCBodyPassArguments(final CodeUnit unit) {
int count = 0;
boolean needsComma = false;
for (int i = 0; i < info.cbFuncBinding.getNumArguments(); i++) {
- if (needsComma) {
- unit.emit(", ");
- needsComma = false;
- }
- final String baseArgName = info.cbFuncBinding.getArgumentName(i);
final JavaType currentJavaType = info.cbFuncBinding.getJavaArgumentType(i);
- if( i != info.cbFuncUserParamIdx && currentJavaType.isCompoundTypeWrapper() ) {
- final String cBaseArgName = CodeGenUtils.capitalizeString( baseArgName );
- unit.emit( "(*env)->CallStaticObjectMethod(env, cbClazzArg" + cBaseArgName + ", cbMethodArg" + cBaseArgName + ", " + baseArgName + "_jni)" );
- } else {
- unit.emit( baseArgName + "_jni" );
+ if( !currentJavaType.isPascalLen() ) {
+ if (needsComma) {
+ unit.emit(", ");
+ needsComma = false;
+ }
+ final String baseArgName = info.cbFuncBinding.getArgumentName(i);
+ if( i != info.cbFuncUserParamIdx && currentJavaType.isCompoundTypeWrapper() ) {
+ final String cBaseArgName = CodeGenUtils.capitalizeString( baseArgName );
+ unit.emit( "(*env)->CallStaticObjectMethod(env, cbClazzArg" + cBaseArgName + ", cbMethodArg" + cBaseArgName + ", " + baseArgName + "_jni)" );
+ } else {
+ unit.emit( baseArgName + "_jni" );
+ }
+ needsComma = true;
+ ++count;
}
- needsComma = true;
- ++count;
}
return count;
}
diff --git a/src/java/com/jogamp/gluegen/JavaConfiguration.java b/src/java/com/jogamp/gluegen/JavaConfiguration.java
index bc78b48..f247ebf 100644
--- a/src/java/com/jogamp/gluegen/JavaConfiguration.java
+++ b/src/java/com/jogamp/gluegen/JavaConfiguration.java
@@ -144,35 +144,6 @@ public class JavaConfiguration {
private final Map<String, String> returnedArrayLengths = new HashMap<String, String>();
private final Set<String> maxOneElement = new HashSet<String>();
- /** Pascal string argument index tuple for length and value. */
- public static class PascalStringIdx {
- public final int lengthIndex;
- public final int valueIndex;
-
- PascalStringIdx(final int lenIdx, final int valIdx) {
- lengthIndex = lenIdx;
- valueIndex = valIdx;
- }
-
- public void pushValueIndex(final List<Integer> indices) {
- indices.add(valueIndex);
- }
- public static final List<Integer> pushValueIndex(final List<PascalStringIdx> source, List<Integer> indices) {
- if( null == indices ) {
- indices = new ArrayList<Integer>(2);
- }
- for(final PascalStringIdx p : source) {
- p.pushValueIndex(indices);
- }
- return indices;
- }
-
- @Override
- public String toString() {
- return "PascalString[lenIdx "+lengthIndex+", valIdx "+valueIndex+"]";
- }
- }
-
/**
* Key is function that has some byte[] or short[] arguments that should be
* converted to String args; value is List of Integer argument indices
@@ -183,7 +154,7 @@ public class JavaConfiguration {
* Key is function that has a pascal string, i.e. length and some byte[] or short[] arguments that should be
* converted to String args; value is a list of PascalStringArg
*/
- private final Map<String, List<PascalStringIdx>> argumentsArePascalString = new HashMap<String, List<PascalStringIdx>>();
+ private final Map<String, List<JavaType.PascalStringElem>> argumentsArePascalString = new HashMap<String, List<JavaType.PascalStringElem>>();
/** JavaCallback configuration definition (static) */
public static class JavaCallbackDef {
@@ -668,11 +639,11 @@ public class JavaConfiguration {
/** Returns a list of PascalStringIdx which are tuples of indices of <code>int len, const char*</code>
arguments that should be converted to <code>String</code>s. Returns null if there are no
such hints for the given function alias symbol. */
- public List<PascalStringIdx> pascalStringArgument(final AliasedSymbol symbol) {
+ public List<JavaType.PascalStringElem> pascalStringArgument(final AliasedSymbol symbol) {
final String name = symbol.getName();
final Set<String> aliases = symbol.getAliasedNames();
- List<PascalStringIdx> res = argumentsArePascalString.get(name);
+ List<JavaType.PascalStringElem> res = argumentsArePascalString.get(name);
if( null == res ) {
res = oneInMap(argumentsArePascalString, aliases);
if( null == res ) {
@@ -683,18 +654,6 @@ public class JavaConfiguration {
return res;
}
- public int pascalStringLengthIndex(final AliasedSymbol symbol, final int valueIndex) {
- final List<PascalStringIdx> pascals = pascalStringArgument(symbol);
- if( null != pascals ) {
- for(final PascalStringIdx p : pascals) {
- if( valueIndex == p.valueIndex ) {
- return p.lengthIndex;
- }
- }
- }
- return -1;
- }
-
public boolean isForceUsingNIOOnly4All() { return forceUseNIOOnly4All; }
public void addUseNIOOnly(final String fname ) {
@@ -2058,11 +2017,11 @@ public class JavaConfiguration {
protected void readArgumentIsPascalString(final StringTokenizer tok, final String filename, final int lineNo) {
try {
final String methodName = tok.nextToken();
- final List<PascalStringIdx> pascalTuples = new ArrayList<PascalStringIdx>(2);
+ final List<JavaType.PascalStringElem> pascalTuples = new ArrayList<JavaType.PascalStringElem>(2);
while (tok.countTokens() >= 2) {
final int lenIdx = Integer.valueOf(tok.nextToken()).intValue();
final int valIdx = Integer.valueOf(tok.nextToken()).intValue();
- pascalTuples.add(new PascalStringIdx(lenIdx, valIdx));
+ pascalTuples.add(new JavaType.PascalStringElem(lenIdx, valIdx));
}
if( pascalTuples.size() > 0 ) {
argumentsArePascalString.put(methodName, pascalTuples);
diff --git a/src/java/com/jogamp/gluegen/JavaEmitter.java b/src/java/com/jogamp/gluegen/JavaEmitter.java
index 0d26071..1725b18 100644
--- a/src/java/com/jogamp/gluegen/JavaEmitter.java
+++ b/src/java/com/jogamp/gluegen/JavaEmitter.java
@@ -79,7 +79,7 @@ import com.jogamp.common.util.HashUtil;
import com.jogamp.gluegen.ASTLocusTag.ASTLocusTagProvider;
import com.jogamp.gluegen.JavaConfiguration.JavaCallbackDef;
import com.jogamp.gluegen.JavaConfiguration.JavaCallbackInfo;
-import com.jogamp.gluegen.JavaConfiguration.PascalStringIdx;
+import com.jogamp.gluegen.JavaType.PascalStringElem;
import com.jogamp.gluegen.Logging.LoggerIf;
import com.jogamp.gluegen.cgram.types.AliasedSymbol;
import com.jogamp.gluegen.cgram.types.ArrayType;
@@ -309,7 +309,7 @@ public class JavaEmitter implements GlueEmitter {
}
}
- /** Mangle a class, package or function name for JNI usage, i.e. replace all '.' w/ '_' */
+ /** Mangle a class, package or function name for JNI usage, i.e. replace all '_' w/ '_1' and '.' w/ '_' */
protected static String jniMangle(final String name) {
return name.replaceAll("_", "_1").replace('.', '_');
}
@@ -3105,8 +3105,8 @@ public class JavaEmitter implements GlueEmitter {
private JavaType javaType(final Class<?> c) {
return JavaType.createForClass(c);
}
- private JavaType javaStringType(final Class<?> c, final boolean pascalString) {
- return JavaType.createForStringClass(c, pascalString);
+ private JavaType javaStringType(final Class<?> c, final PascalStringElem pascalStrElem) {
+ return JavaType.createForStringClass(c, pascalStrElem);
}
/** Maps the C types in the specified function to Java types through
@@ -3140,7 +3140,7 @@ public class JavaEmitter implements GlueEmitter {
"\". ReturnsString requires native method to have return type \"char *\"",
sym.getASTLocusTag());
}
- javaReturnType = javaStringType(java.lang.String.class, false);
+ javaReturnType = javaStringType(java.lang.String.class, null);
} else {
final JavaType r = cfg.getOpaqueReturnType(sym);
if( null != r ) {
@@ -3153,10 +3153,10 @@ public class JavaEmitter implements GlueEmitter {
// List of the indices of the arguments in this function that should be
// converted from byte[] or short[] to String
final List<JavaType> javaArgumentTypes = new ArrayList<JavaType>();
- List<Integer> stringArgIndices = cfg.stringArguments(sym);
- final List<PascalStringIdx> pascalStringArgs = cfg.pascalStringArgument(sym);
+ List<Integer> stringValueIndices = cfg.stringArguments(sym);
+ final List<JavaType.PascalStringElem> pascalStringArgs = cfg.pascalStringArgument(sym);
if( null != pascalStringArgs ) {
- stringArgIndices = PascalStringIdx.pushValueIndex(pascalStringArgs, stringArgIndices);
+ stringValueIndices = JavaType.PascalStringElem.pushValueIndex(pascalStringArgs, stringValueIndices);
}
final JavaCallbackInfo jcbi = cfg.setFuncToJavaCallbackMap.get( sym.getName() );
int jcbiSetFuncCBParamIdx=-1;
@@ -3191,36 +3191,45 @@ public class JavaEmitter implements GlueEmitter {
// fallthrough intended
}
}
- if ( 0 == mapMode && stringArgIndices != null && stringArgIndices.contains(i) ) {
- // Take into account any ArgumentIsString configuration directives that apply
- // System.out.println("Forcing conversion of " + binding.getName() + " arg #" + i + " from byte[] to String ");
- if ( mappedType.isCVoidPointerType() ||
- mappedType.isCCharPointerType() ||
- mappedType.isCShortPointerType() ||
- mappedType.isNIOPointerBuffer() ||
- ( mappedType.isArray() &&
- ( mappedType.getJavaClass() == ArrayTypes.byteBufferArrayClass ) ||
- ( mappedType.getJavaClass() == ArrayTypes.shortBufferArrayClass ) ) )
- {
- // convert mapped type from:
- // void*, byte[], and short[] to String
- // ByteBuffer[] and ShortBuffer[] to String[]
- final boolean pascalString = cfg.pascalStringLengthIndex(sym, i) >= 0;
- if (mappedType.isArray() || mappedType.isNIOPointerBuffer()) {
- mappedType = javaStringType(ArrayTypes.stringArrayClass, pascalString);
- mapMode = 30;
- } else {
- mappedType = javaStringType(String.class, pascalString);
- mapMode = 31;
+ if( 0 == mapMode ) {
+ if ( stringValueIndices != null && stringValueIndices.contains(i) ) {
+ // Take into account any ArgumentIsString configuration directives that apply
+ // System.out.println("Forcing conversion of " + binding.getName() + " arg #" + i + " from byte[] to String ");
+ if ( mappedType.isCVoidPointerType() ||
+ mappedType.isCCharPointerType() ||
+ mappedType.isCShortPointerType() ||
+ mappedType.isNIOPointerBuffer() ||
+ ( mappedType.isArray() &&
+ ( mappedType.getJavaClass() == ArrayTypes.byteBufferArrayClass ) ||
+ ( mappedType.getJavaClass() == ArrayTypes.shortBufferArrayClass ) ) )
+ {
+ // convert mapped type from:
+ // void*, byte[], and short[] to String
+ // ByteBuffer[] and ShortBuffer[] to String[]
+ final JavaType.PascalStringElem pascalStrElem = JavaType.PascalStringElem.getByValueIdx(pascalStringArgs, i);
+ if (mappedType.isArray() || mappedType.isNIOPointerBuffer()) {
+ mappedType = javaStringType(ArrayTypes.stringArrayClass, pascalStrElem);
+ mapMode = 30;
+ } else {
+ mappedType = javaStringType(String.class, pascalStrElem);
+ mapMode = 31;
+ }
+ } else {
+ mapMode = 99;
+ throw new GlueGenException(
+ "Cannot apply ArgumentIsString configuration directive to " +
+ "argument " + i + " of \"" + sym + "\": argument type is not " +
+ "a \"void*\", \"char *\", \"short *\", \"char**\", or \"short**\" equivalent",
+ sym.getASTLocusTag());
+ }
+ } else if ( ( mappedType.isInt() || mappedType.isLong() ) && null != pascalStringArgs ) {
+ final JavaType.PascalStringElem pascalStrElem = JavaType.PascalStringElem.getByLengthIdx(pascalStringArgs, i);
+ if( null != pascalStrElem ) {
+ // mark pascal-string length in Java API to be erased for using Java String length
+ mapMode = 40;
+ mappedType = new JavaType(mappedType, pascalStrElem);
+ }
}
- } else {
- mapMode = 99;
- throw new GlueGenException(
- "Cannot apply ArgumentIsString configuration directive to " +
- "argument " + i + " of \"" + sym + "\": argument type is not " +
- "a \"void*\", \"char *\", \"short *\", \"char**\", or \"short**\" equivalent",
- sym.getASTLocusTag());
- }
}
javaArgumentTypes.add(mappedType);
LOG.log(INFO, "BindFunc: {0}: added mapping ({1}) for {2} from C type: {3} to Java type: {4}",
diff --git a/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java b/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java
index 1b510c0..ee2adc9 100644
--- a/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java
+++ b/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java
@@ -385,7 +385,7 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
continue;
}
- if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) {
+ if ( type.isJNIEnv() || type.isPascalLen() || binding.isArgumentThisPointer(i) ) {
// Don't need to expose these at the Java level
continue;
}
@@ -661,7 +661,7 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
}
for (int i = 0; i < binding.getNumArguments(); i++) {
final JavaType type = binding.getJavaArgumentType(i);
- if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) {
+ if (type.isJNIEnv() || type.isPascalLen() || binding.isArgumentThisPointer(i)) {
// Don't need to expose these at the Java level
continue;
}
diff --git a/src/java/com/jogamp/gluegen/JavaType.java b/src/java/com/jogamp/gluegen/JavaType.java
index d58eca5..7e894c8 100644
--- a/src/java/com/jogamp/gluegen/JavaType.java
+++ b/src/java/com/jogamp/gluegen/JavaType.java
@@ -41,6 +41,8 @@
package com.jogamp.gluegen;
import java.nio.*;
+import java.util.ArrayList;
+import java.util.List;
import com.jogamp.gluegen.cgram.types.*;
@@ -59,13 +61,67 @@ public class JavaType {
VOID, CHAR, SHORT, INT32, INT64, FLOAT, DOUBLE;
}
- private final Class<?> clazz; // Primitive types and other types representable as Class objects
+ /** Pascal string argument index tuple for length and value. */
+public static class PascalStringElem {
+ public final int lengthIdx;
+ public final int valueIdx;
+
+ PascalStringElem(final int lenIdx, final int valIdx) {
+ lengthIdx = lenIdx;
+ valueIdx = valIdx;
+ }
+
+ public static final List<Integer> pushValueIndex(final List<PascalStringElem> source, List<Integer> indices) {
+ if( null == indices ) {
+ indices = new ArrayList<Integer>(2);
+ }
+ for(final PascalStringElem p : source) {
+ indices.add(p.valueIdx);
+ }
+ return indices;
+ }
+ public static final List<Integer> pushLengthIndex(final List<PascalStringElem> source) {
+ final List<Integer> lengths = new ArrayList<Integer>(2);
+ for(final PascalStringElem p : source) {
+ lengths.add(p.lengthIdx);
+ }
+ return lengths;
+ }
+
+ public static PascalStringElem getByValueIdx(final List<PascalStringElem> pascals, final int valueIdx) {
+ if( null != pascals ) {
+ for(final PascalStringElem p : pascals) {
+ if( valueIdx == p.valueIdx ) {
+ return p;
+ }
+ }
+ }
+ return null;
+ }
+ public static PascalStringElem getByLengthIdx(final List<PascalStringElem> pascals, final int lengthIdx) {
+ if( null != pascals ) {
+ for(final PascalStringElem p : pascals) {
+ if( lengthIdx == p.lengthIdx ) {
+ return p;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ return "PascalStr[lenIdx "+lengthIdx+", valIdx "+valueIdx+"]";
+ }
+}
+
+private final Class<?> clazz; // Primitive types and other types representable as Class objects
private final String clazzName; // Future (not yet generated or existing) Class objects (existing at runtime)
private final String structName; // Types we're generating glue code for (i.e., C structs)
private final Type elementType; // Element type if this JavaType represents a C array
private final C_PTR primitivePointerType;
private final boolean opaqued;
- private final boolean pascalString;
+ public final PascalStringElem pascalStrElem;
private static JavaType objectType;
private static JavaType nioBufferType;
@@ -131,7 +187,7 @@ public class JavaType {
the emitters understand how to perform proper conversion from
the corresponding C type. */
public static JavaType createForOpaqueClass(final Class<?> clazz) {
- return new JavaType(clazz, true, false);
+ return new JavaType(clazz, true, null);
}
/** Creates a JavaType corresponding to the given Java type. This
@@ -139,11 +195,10 @@ public class JavaType {
the emitters understand how to perform proper conversion from
the corresponding C type. */
public static JavaType createForClass(final Class<?> clazz) {
- return new JavaType(clazz, false, false);
+ return new JavaType(clazz, false, null);
}
-
- public static JavaType createForStringClass(final Class<?> clazz, final boolean pascalString) {
- return new JavaType(clazz, false, pascalString);
+ public static JavaType createForStringClass(final Class<?> clazz, final PascalStringElem pascalStrElem) {
+ return new JavaType(clazz, false, pascalStrElem);
}
/**
@@ -567,11 +622,11 @@ public class JavaType {
return (clazz == java.lang.String.class);
}
- public boolean isPascalStringVariant() { return pascalString; }
+ public boolean isPascalStrElem() { return null != pascalStrElem; }
- public boolean isPascalString() {
- return isString() && this.pascalString;
- }
+ public boolean isPascalStr() { return isPascalStrElem() && isString() ; }
+
+ public boolean isPascalLen() { return isPascalStrElem() && !isString() ; }
public boolean isArray() {
return ((clazz != null) && clazz.isArray());
@@ -605,9 +660,7 @@ public class JavaType {
return (clazz != null && clazz.isArray() && clazz.getComponentType() == java.lang.String.class);
}
- public boolean isPascalStringArray() {
- return isStringArray() && this.pascalString;
- }
+ public boolean isPascalStrArray() { return isPascalStrElem() && isStringArray() ; }
public boolean isPrimitive() {
return ((clazz != null) && !isArray() && clazz.isPrimitive() && (clazz != Void.TYPE));
@@ -696,7 +749,7 @@ public class JavaType {
@Override
public Object clone() {
- return new JavaType(primitivePointerType, clazz, clazzName, structName, elementType, pascalString);
+ return new JavaType(primitivePointerType, clazz, clazzName, structName, elementType, pascalStrElem);
}
@Override
@@ -747,16 +800,13 @@ public class JavaType {
if( isOpaqued() ) {
append(sb, "opaque", prepComma); prepComma=true;
}
+ if( isPascalStrElem() ) {
+ sb.append("pascal ");
+ }
if( isString() ) {
- if( pascalString ) {
- sb.append("pascal ");
- }
append(sb, "string", prepComma); prepComma=true;
}
if( isStringArray() ) {
- if( pascalString ) {
- sb.append("pascal ");
- }
append(sb, "stringArray", prepComma); prepComma=true;
} else if( isArray() ) {
append(sb, "array", prepComma); prepComma=true;
@@ -800,7 +850,7 @@ public class JavaType {
* Constructs a representation for a type corresponding to the given Class
* argument.
*/
- private JavaType(final Class<?> clazz, final boolean opaqued, final boolean pascalString) {
+ private JavaType(final Class<?> clazz, final boolean opaqued, final PascalStringElem pascalStrElem) {
if( null == clazz ) {
throw new IllegalArgumentException("null clazz passed");
}
@@ -810,7 +860,7 @@ public class JavaType {
this.structName = null;
this.elementType = null;
this.opaqued = opaqued;
- this.pascalString = pascalString;
+ this.pascalStrElem = pascalStrElem;
}
/** Constructs a type representing a either a named clazz or a named C struct.*/
@@ -831,7 +881,7 @@ public class JavaType {
this.clazz = null;
this.elementType = null;
this.opaqued = false;
- this.pascalString = false;
+ this.pascalStrElem = null;
}
/** Constructs a type representing a pointer to a C primitive
@@ -846,7 +896,7 @@ public class JavaType {
this.structName = null;
this.elementType = null;
this.opaqued = false;
- this.pascalString = false;
+ this.pascalStrElem = null;
}
/** Constructs a type representing an array of C pointers. */
@@ -860,18 +910,28 @@ public class JavaType {
this.structName = null;
this.elementType = elementType;
this.opaqued = false;
- this.pascalString = false;
+ this.pascalStrElem = null;
}
/** clone only */
- private JavaType(final C_PTR primitivePointerType, final Class<?> clazz, final String clazzName, final String structName, final Type elementType, final boolean pascalString) {
+ private JavaType(final C_PTR primitivePointerType, final Class<?> clazz, final String clazzName, final String structName, final Type elementType,
+ final PascalStringElem pascalStrElem)
+ {
this.primitivePointerType = primitivePointerType;
this.clazz = clazz;
this.clazzName = clazzName;
this.structName = structName;
this.elementType = elementType;
this.opaqued = false;
- this.pascalString = pascalString;
+ this.pascalStrElem = pascalStrElem;
+ }
+ /** Copy ctor */
+ public JavaType(final JavaType o) {
+ this(o.primitivePointerType, o.clazz, o.clazzName, o.structName, o.elementType, o.pascalStrElem);
+ }
+ /** Copy ctor w/ pascalString variant override */
+ public JavaType(final JavaType o, final PascalStringElem pascalStrElem) {
+ this(o.primitivePointerType, o.clazz, o.clazzName, o.structName, o.elementType, pascalStrElem);
}
private static String arrayName(Class<?> clazz) {
diff --git a/src/java/com/jogamp/gluegen/MethodBinding.java b/src/java/com/jogamp/gluegen/MethodBinding.java
index 6059003..cb9e6ed 100644
--- a/src/java/com/jogamp/gluegen/MethodBinding.java
+++ b/src/java/com/jogamp/gluegen/MethodBinding.java
@@ -221,7 +221,7 @@ public class MethodBinding {
*/
public StringBuilder getJavaParameterList(final StringBuilder buf, final List<Integer> exclude) {
forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> {
- if( !cType.isVoid() && ( null == exclude || !exclude.contains(idx) ) ) {
+ if( !cType.isVoid() && !jType.isPascalLen() && ( null == exclude || !exclude.contains(idx) ) ) {
if( 0 < consumedCount ) {
buf.append(", ");
}
@@ -731,7 +731,7 @@ public class MethodBinding {
assert(getNumArguments() == 1);
continue;
}
- if (type.isJNIEnv() || isArgumentThisPointer(i)) {
+ if (type.isJNIEnv() || type.isPascalLen() || isArgumentThisPointer(i)) {
// Don't need to expose these at the Java level
continue;
}