diff options
author | Sven Gothel <[email protected]> | 2010-03-28 01:27:01 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2010-03-28 01:27:01 +0100 |
commit | a41f4d504d2f8cf58114d570d23f757ab2659cfc (patch) | |
tree | ebe021734de27004c1424130b0150f0b3cc2b5bb | |
parent | 2b61964060ffb79a313030d795ad069fbbe97b88 (diff) |
http://www.jogamp.org/bugzilla/show_bug.cgi?id=389
Mixed types in generated code are functioning now,
even though not all permutations are generated - still.
However, this patch merges the indirect object passing,
wheather it is a primitive array or an indirect NIO buffer,
incl. PointerBuffer.
This allows the usage of only one JNI functions for all combinations.
Only in case of NIODirectOnly, the simplified direct only '0'
variation is created - otherwise the parametrized '1' variant.
The junit tests proves the implementation and
almost completes the gluegen junit tests coverage
for JavaEmitter and ProcAddressEmitter.
Impact/Result:
- Working mixed array types
- JOGL GL2 native library shrunk around 30%
- Simplified gluegen code
- Almost complete gluegen junit tests
TODO: Complete permutations of array/NIO arguments,
if desired.
++++
Misc changes:
- NativeLibrary implements DynamicLookupHelper:
lookupFunction() -> dynamicLookupFunction()
18 files changed, 883 insertions, 519 deletions
diff --git a/make/build-junit.xml b/make/build-junit.xml index dd87cdd..86292a2 100644 --- a/make/build-junit.xml +++ b/make/build-junit.xml @@ -193,6 +193,8 @@ <junit forkmode="once" showoutput="true" fork="true" haltonerror="true"> <jvmarg value="-Djava.library.path=${gluegen.lib}:${build_t.lib}"/> <jvmarg value="-Drootrel.build=${rootrel.build}"/> + <!--jvmarg value="-Dgluegen.debug.NativeLibrary=true"/--> + <!--jvmarg value="-Dgluegen.debug.ProcAddressHelper=true"/--> <formatter usefile="false" type="plain"/> <formatter usefile="true" type="xml"/> <classpath refid="junit.run.classpath"/> @@ -223,6 +225,7 @@ --> + <target name="junit.test1.java.generate"> <echo message=" - - - junit.test1.java.generate" /> @@ -234,19 +237,50 @@ literalInclude="${test.junit.dir}" includeRefid="stub.includes.fileset.test" emitter="com.sun.gluegen.JavaEmitter"> - <!-- emitter="com.sun.gluegen.procaddress.ProcAddressEmitter" --> <classpath refid="gluegen.classpath" /> </gluegen> + + <gluegen src="${test.junit.dir}/test1-gluegen.c" + outputRootDir="${build_t.gen}" + config="${test.junit.dir}/test1p1-gluegen.cfg" + literalInclude="${test.junit.dir}" + includeRefid="stub.includes.fileset.test" + emitter="com.sun.gluegen.JavaEmitter"> + <classpath refid="gluegen.classpath" /> + </gluegen> + + <gluegen src="${test.junit.dir}/test1-gluegen.c" + outputRootDir="${build_t.gen}" + config="${test.junit.dir}/test1p2-gluegen.cfg" + literalInclude="${test.junit.dir}" + includeRefid="stub.includes.fileset.test" + emitter="com.sun.gluegen.procaddress.ProcAddressEmitter"> + <classpath refid="gluegen.classpath" /> + </gluegen> + </target> + + <target name="junit.test1.c.build" depends="junit.test1p1.c.build, junit.test1p2.c.build" unless="build.javaonly" /> + + <target name="junit.test1p1.c.build"> + <patternset id="junit.test1p1.c.src.files"> + <include name="${test.junit.rootrel}/test1.c"/> + <include name="${build_t.gen.rootrel}/native/BindingTest1p1Impl_JNI.c"/> + </patternset> + + <c.build c.compiler.src.files="junit.test1p1.c.src.files" + output.lib.name="test1p1" + compiler.cfg.id="${compiler.cfg.id}" + linker.cfg.id="${linker.cfg.id}"/> </target> - <target name="junit.test1.c.build" unless="build.javaonly" > - <patternset id="junit.test1.c.src.files"> + <target name="junit.test1p2.c.build"> + <patternset id="junit.test1p2.c.src.files"> <include name="${test.junit.rootrel}/test1.c"/> - <include name="${build_t.gen.rootrel}/native/BindingTest1Impl_JNI.c"/> + <include name="${build_t.gen.rootrel}/native/BindingTest1p2Impl_JNI.c"/> </patternset> - <c.build c.compiler.src.files="junit.test1.c.src.files" - output.lib.name="test1" + <c.build c.compiler.src.files="junit.test1p2.c.src.files" + output.lib.name="test1p2" compiler.cfg.id="${compiler.cfg.id}" linker.cfg.id="${linker.cfg.id}"/> </target> diff --git a/src/java/com/sun/gluegen/CMethodBindingEmitter.java b/src/java/com/sun/gluegen/CMethodBindingEmitter.java index 91e3f99..c91e992 100644 --- a/src/java/com/sun/gluegen/CMethodBindingEmitter.java +++ b/src/java/com/sun/gluegen/CMethodBindingEmitter.java @@ -103,16 +103,6 @@ public class CMethodBindingEmitter extends FunctionEmitter */ private MessageFormat returnValueLengthExpression = null; - // Note: the VC++ 6.0 compiler emits hundreds of warnings when the - // (necessary) null-checking code is enabled. This appears to just - // be a compiler bug, but would be good to track down exactly why it - // is happening. When the null checking is enabled for just the - // GetPrimitiveArrayCritical calls, there are five warnings - // generated for several thousand new if tests added to the code. - // Which ones are the ones at fault? The line numbers for the - // warnings are incorrect. - private static final boolean EMIT_NULL_CHECKS = true; - protected static final String STRING_CHARS_PREFIX = "_strchars_"; // We need this in order to compute sizes of certain types @@ -369,6 +359,9 @@ public class CMethodBindingEmitter extends FunctionEmitter if (javaArgType.isPrimitiveArray() || javaArgType.isNIOBuffer()) { writer.print(", jint " + byteOffsetArgName(i)); + if(forIndirectBufferAndArrayImplementation) { + writer.print(", jboolean " + isNIOArgName(i)); + } } else if (javaArgType.isNIOBufferArray()) { writer.print(", jintArray " + byteOffsetArrayArgName(i)); @@ -383,12 +376,10 @@ public class CMethodBindingEmitter extends FunctionEmitter // writer.println("printf(\" - - - - "+ getName() + getImplSuffix() +" - - - -\\n\");"); emitBodyVariableDeclarations(writer); emitBodyUserVariableDeclarations(writer); - emitBodyVariablePreCallSetup(writer, false); - emitBodyVariablePreCallSetup(writer, true); + emitBodyVariablePreCallSetup(writer); emitBodyCallCFunction(writer); emitBodyUserVariableAssignments(writer); - emitBodyVariablePostCallCleanup(writer, true); - emitBodyVariablePostCallCleanup(writer, false); + emitBodyVariablePostCallCleanup(writer); emitBodyReturnResult(writer); writer.println("}"); writer.println(); @@ -548,22 +539,21 @@ public class CMethodBindingEmitter extends FunctionEmitter * emitBodyVariableDeclarations(), PRIOR TO calling the actual C * function. */ - protected void emitBodyVariablePreCallSetup(PrintWriter writer, boolean emittingPrimitiveArrayCritical) { + protected void emitBodyVariablePreCallSetup(PrintWriter writer) { - if (!emittingPrimitiveArrayCritical) { - // Convert all Buffers to pointers first so we don't have to - // call ReleasePrimitiveArrayCritical for any arrays if any - // incoming buffers aren't direct - if (binding.hasContainingType()) { + // Convert all Buffers to pointers first so we don't have to + // call ReleasePrimitiveArrayCritical for any arrays if any + // incoming buffers aren't direct + if (binding.hasContainingType()) { emitPointerConversion(writer, binding, binding.getContainingType(), binding.getContainingCType(), JavaMethodBindingEmitter.javaThisArgumentName(), CMethodBindingEmitter.cThisArgumentName(), null); - } + } - for (int i = 0; i < binding.getNumArguments(); i++) { + for (int i = 0; i < binding.getNumArguments(); i++) { JavaType type = binding.getJavaArgumentType(i); if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) { continue; @@ -577,7 +567,6 @@ public class CMethodBindingEmitter extends FunctionEmitter pointerConversionArgumentName(javaArgName), byteOffsetArgName(i)); } - } } // Convert all arrays to pointers, and get UTF-8 versions of jstring args @@ -594,19 +583,7 @@ public class CMethodBindingEmitter extends FunctionEmitter javaArgType.isArrayOfCompoundTypeWrappers()) { boolean needsDataCopy = javaArgTypeNeedsDataCopy(javaArgType); - // We only defer the emission of GetPrimitiveArrayCritical - // calls that won't be matched up until after the function - // we're calling - if ((!needsDataCopy && !emittingPrimitiveArrayCritical) || - (needsDataCopy && emittingPrimitiveArrayCritical)) { - continue; - } - - if (EMIT_NULL_CHECKS) { - writer.print(" if ("); - writer.print(javaArgName); - writer.println(" != NULL) {"); - } + writer.println(" if ( NULL != " + javaArgName + " ) {"); Type cArgType = binding.getCArgumentType(i); String cArgTypeName = cArgType.getName(); @@ -622,12 +599,10 @@ public class CMethodBindingEmitter extends FunctionEmitter cArgTypeName = "jstring *"; } writer.print(cArgTypeName); - writer.print(") (((char*) (*env)->GetPrimitiveArrayCritical(env, "); - writer.print(javaArgName); - writer.println(", NULL)) + " + byteOffsetArgName(i) + ");"); -//if(cargtypename is void*) -// _ptrX = ((char*)convName + index1*sizeof(thisArgsJavaType)); - + writer.print(") (((char*) ( JNI_TRUE == " + isNIOArgName(i) + " ? "); + writer.print(" (*env)->GetDirectBufferAddress(env, " + javaArgName + ") : "); + writer.print(" (*env)->GetPrimitiveArrayCritical(env, " + javaArgName + ", NULL) ) ) + "); + writer.println(byteOffsetArgName(i) + ");"); } else { // Handle the case where the array elements are of a type that needs a // data copy operation to convert from the java memory model to the C @@ -761,14 +736,9 @@ public class CMethodBindingEmitter extends FunctionEmitter writer.println(); } // end of data copy - if (EMIT_NULL_CHECKS) { - writer.println(" }"); - } - } else if (javaArgType.isString()) { - if (!emittingPrimitiveArrayCritical) { - continue; - } + writer.println(" }"); + } else if (javaArgType.isString()) { emitGetStringChars(writer, javaArgName, STRING_CHARS_PREFIX + javaArgName, isUTF8Type(binding.getCArgumentType(i)), @@ -782,7 +752,7 @@ public class CMethodBindingEmitter extends FunctionEmitter * Code to clean up any variables that were declared in * emitBodyVariableDeclarations(), AFTER calling the actual C function. */ - protected void emitBodyVariablePostCallCleanup(PrintWriter writer, boolean emittingPrimitiveArrayCritical) { + protected void emitBodyVariablePostCallCleanup(PrintWriter writer) { // Release primitive arrays and temporary UTF8 strings if necessary for (int i = 0; i < binding.getNumArguments(); i++) { @@ -799,27 +769,16 @@ public class CMethodBindingEmitter extends FunctionEmitter javaArgType.isArrayOfCompoundTypeWrappers()) { boolean needsDataCopy = javaArgTypeNeedsDataCopy(javaArgType); - if ((!needsDataCopy && !emittingPrimitiveArrayCritical) || - (needsDataCopy && emittingPrimitiveArrayCritical)) { - continue; - } - - if (EMIT_NULL_CHECKS) { - writer.print(" if ("); - writer.print(javaArgName); - writer.println(" != NULL) {"); - } - String convName = pointerConversionArgumentName(javaArgName); if (!needsDataCopy) { + writer.println(" if ( NULL != " + javaArgName + " && JNI_FALSE == " + isNIOArgName(i) + " ) {"); + // Release array - writer.print(" (*env)->ReleasePrimitiveArrayCritical(env, "); - writer.print(javaArgName); - writer.print(", "); - writer.print(convName); - writer.println(", 0);"); + writer.print(" (*env)->ReleasePrimitiveArrayCritical(env, " + javaArgName + ", " + convName + ", 0);"); } else { + writer.println(" if ( NULL != " + javaArgName + " ) {"); + // clean up the case where the array elements are of a type that needed // a data copy operation to convert from the java memory model to the // C memory model (e.g., int[][], String[], etc) @@ -909,19 +868,10 @@ public class CMethodBindingEmitter extends FunctionEmitter writer.println(");"); } // end of cleaning up copied data - if (EMIT_NULL_CHECKS) { - writer.println(" }"); - } - } else if (javaArgType.isString()) { - if (emittingPrimitiveArrayCritical) { - continue; - } + writer.println(" }"); - if (EMIT_NULL_CHECKS) { - writer.print(" if ("); - writer.print(javaArgName); - writer.println(" != NULL) {"); - } + } else if (javaArgType.isString()) { + writer.println(" if ( NULL != " + javaArgName + " ) {"); if (isUTF8Type(cArgType)) { writer.print(" (*env)->ReleaseStringUTFChars(env, "); @@ -933,9 +883,7 @@ public class CMethodBindingEmitter extends FunctionEmitter writer.println(" free((void*) " + STRING_CHARS_PREFIX + javaArgName + ");"); } - if (EMIT_NULL_CHECKS) { - writer.println(" }"); - } + writer.println(" }"); } } } @@ -1038,7 +986,7 @@ public class CMethodBindingEmitter extends FunctionEmitter writer.println("_res;"); } else if (javaReturnType.isNIOBuffer() || javaReturnType.isCompoundTypeWrapper()) { - writer.println(" if (_res == NULL) return NULL;"); + writer.println(" if (NULL == _res) return NULL;"); writer.print(" return (*env)->NewDirectByteBuffer(env, _res, "); // See whether capacity has been specified if (returnValueCapacityExpression != null) { @@ -1065,11 +1013,11 @@ public class CMethodBindingEmitter extends FunctionEmitter } writer.println(");"); } else if (javaReturnType.isString()) { - writer.print(" if (_res == NULL) return NULL;"); + writer.println(" if (NULL == _res) return NULL;"); writer.println(" return (*env)->NewStringUTF(env, _res);"); } else if (javaReturnType.isArrayOfCompoundTypeWrappers() || (javaReturnType.isArray() && javaReturnType.isNIOByteBufferArray())) { - writer.println(" if (_res == NULL) return NULL;"); + writer.println(" if (NULL == _res) return NULL;"); if (returnValueLengthExpression == null) { throw new RuntimeException("Error while generating C code: no length specified for array returned from function " + binding); @@ -1163,6 +1111,9 @@ public class CMethodBindingEmitter extends FunctionEmitter // extra arguments if (type.isNIOBuffer()) { jniMangle(Integer.TYPE, buf, false); + if(forIndirectBufferAndArrayImplementation) { + jniMangle(Boolean.TYPE, buf, false); + } } else if (type.isNIOBufferArray()) { int[] intArrayType = new int[0]; c = intArrayType.getClass(); @@ -1239,9 +1190,7 @@ public class CMethodBindingEmitter extends FunctionEmitter } private void emitOutOfMemoryCheck(PrintWriter writer, String varName, String errorMessage) { - writer.print(" if ("); - writer.print(varName); - writer.println(" == NULL) {"); + writer.println(" if ( NULL == " + varName + " ) {"); writer.println(" (*env)->ThrowNew(env, (*env)->FindClass(env, \"java/lang/OutOfMemoryError\"),"); writer.print(" \"" + errorMessage); writer.print(" in native dispatcher for \\\""); @@ -1274,11 +1223,7 @@ public class CMethodBindingEmitter extends FunctionEmitter writer.print(elementTypeString); writer.println("));"); // Catch memory allocation failure - if (EMIT_NULL_CHECKS) { - emitOutOfMemoryCheck( - writer, targetVarName, - mallocFailureErrorString); - } + emitOutOfMemoryCheck( writer, targetVarName, mallocFailureErrorString); } private void emitCalloc(PrintWriter writer, @@ -1296,11 +1241,7 @@ public class CMethodBindingEmitter extends FunctionEmitter writer.print(elementTypeString); writer.println("));"); // Catch memory allocation failure - if (EMIT_NULL_CHECKS) { - emitOutOfMemoryCheck( - writer, targetVarName, - mallocFailureErrorString); - } + emitOutOfMemoryCheck( writer, targetVarName, mallocFailureErrorString); } private void emitGetStringChars(PrintWriter writer, @@ -1308,11 +1249,8 @@ public class CMethodBindingEmitter extends FunctionEmitter String receivingVarName, boolean isUTF8, boolean emitElseClause) { - if (EMIT_NULL_CHECKS) { - writer.print(" if ("); - writer.print(sourceVarName); - writer.println(" != NULL) {"); - } + writer.println(" if ( NULL != " + sourceVarName + " ) {"); + if (isUTF8) { writer.print(" "); writer.print(receivingVarName); @@ -1321,11 +1259,7 @@ public class CMethodBindingEmitter extends FunctionEmitter writer.println(", (jboolean*)NULL);"); // Catch memory allocation failure in the event that the VM didn't pin // the String and failed to allocate a copy - if (EMIT_NULL_CHECKS) { - emitOutOfMemoryCheck( - writer, receivingVarName, - "Failed to get UTF-8 chars for argument \\\""+sourceVarName+"\\\""); - } + emitOutOfMemoryCheck( writer, receivingVarName, "Failed to get UTF-8 chars for argument \\\""+sourceVarName+"\\\""); } else { // The UTF-16 case is basically Windows specific. Unix platforms // tend to use only the UTF-8 encoding. On Windows the problem @@ -1341,17 +1275,15 @@ public class CMethodBindingEmitter extends FunctionEmitter "Could not allocate temporary buffer for copying string argument \\\""+sourceVarName+"\\\""); writer.println(" (*env)->GetStringRegion(env, " + sourceVarName + ", 0, (*env)->GetStringLength(env, " + sourceVarName + "), " + receivingVarName + ");"); } - if (EMIT_NULL_CHECKS) { - writer.print(" }"); - if (emitElseClause) { - writer.print(" else {"); - writer.print(" "); - writer.print(receivingVarName); - writer.println(" = NULL;"); - writer.println(" }"); - } else { - writer.println(); - } + writer.print(" }"); + if (emitElseClause) { + writer.print(" else {"); + writer.print(" "); + writer.print(receivingVarName); + writer.println(" = NULL;"); + writer.println(" }"); + } else { + writer.println(); } } @@ -1361,12 +1293,8 @@ public class CMethodBindingEmitter extends FunctionEmitter String receivingVarName, String byteOffsetVarName, boolean emitElseClause) { - if (EMIT_NULL_CHECKS) { - writer.print(" if ("); - writer.print(sourceVarName); - writer.println(" != NULL) {"); - writer.print(" "); - } + writer.println(" if ( NULL != " + sourceVarName + " ) {"); + writer.print(" "); writer.print(" "); writer.print(receivingVarName); @@ -1377,17 +1305,15 @@ public class CMethodBindingEmitter extends FunctionEmitter writer.print(sourceVarName); writer.println(")) + " + ((byteOffsetVarName != null) ? byteOffsetVarName : "0") + ");"); - if (EMIT_NULL_CHECKS) { - writer.print(" }"); - if (emitElseClause) { - writer.println(" else {"); - writer.print(" "); - writer.print(receivingVarName); - writer.println(" = NULL;"); - writer.println(" }"); - } else { - writer.println(); - } + writer.print(" }"); + if (emitElseClause) { + writer.println(" else {"); + writer.print(" "); + writer.print(receivingVarName); + writer.println(" = NULL;"); + writer.println(" }"); + } else { + writer.println(); } } @@ -1504,6 +1430,14 @@ public class CMethodBindingEmitter extends FunctionEmitter return s + "_byte_offset"; } + protected String isNIOArgName(int i) { + return isNIOArgName(binding.getArgumentName(i)); + } + + protected String isNIOArgName(String s) { + return s + "_is_nio"; + } + protected String byteOffsetArrayArgName(int i) { return binding.getArgumentName(i) + "_byte_offset_array"; } diff --git a/src/java/com/sun/gluegen/JavaEmitter.java b/src/java/com/sun/gluegen/JavaEmitter.java index df98839..b2f7578 100644 --- a/src/java/com/sun/gluegen/JavaEmitter.java +++ b/src/java/com/sun/gluegen/JavaEmitter.java @@ -586,36 +586,6 @@ public class JavaEmitter implements GlueEmitter { emitter.addModifier(JavaMethodBindingEmitter.NATIVE); emitter.setReturnedArrayLengthExpression(cfg.returnedArrayLength(binding.getName())); allEmitters.add(emitter); - - // Optionally emit the entry point taking arrays which handles - // both the public entry point taking arrays as well as the - // indirect buffer case - if (!cfg.nioDirectOnly(binding.getName()) && - binding.signatureCanUseIndirectNIO()) { - emitter = - new JavaMethodBindingEmitter(binding, - writer, - cfg.runtimeExceptionType(), - cfg.unsupportedExceptionType(), - false, - cfg.tagNativeBinding(), - true, - false, - true, - false, - true, - false, - false, - cfg); - - emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); - if (cfg.allStatic()) { - emitter.addModifier(JavaMethodBindingEmitter.STATIC); - } - emitter.addModifier(JavaMethodBindingEmitter.NATIVE); - emitter.setReturnedArrayLengthExpression(cfg.returnedArrayLength(binding.getName())); - allEmitters.add(emitter); - } } } @@ -656,51 +626,27 @@ public class JavaEmitter implements GlueEmitter { } } - CMethodBindingEmitter cEmitter = - new CMethodBindingEmitter(binding, - cWriter(), - cfg.implPackageName(), - cfg.implClassName(), - true, /* NOTE: we always disambiguate with a suffix now, so this is optional */ - cfg.allStatic(), - (binding.needsNIOWrappingOrUnwrapping() || hasPrologueOrEpilogue), - false, - machDesc64); - if (returnValueCapacityFormat != null) { - cEmitter.setReturnValueCapacityExpression(returnValueCapacityFormat); - } - if (returnValueLengthFormat != null) { - cEmitter.setReturnValueLengthExpression(returnValueLengthFormat); - } - cEmitter.setTemporaryCVariableDeclarations(cfg.temporaryCVariableDeclarations(binding.getName())); - cEmitter.setTemporaryCVariableAssignments(cfg.temporaryCVariableAssignments(binding.getName())); - allEmitters.add(cEmitter); - - // Now see if we have to emit another entry point to handle the - // indirect buffer and array case - if (binding.argumentsUseNIO() && - binding.signatureCanUseIndirectNIO() && - !cfg.nioDirectOnly(binding.getName())) { - cEmitter = + CMethodBindingEmitter cEmitter; + // Generate a binding without mixed access (NIO-direct, -indirect, array) + cEmitter = new CMethodBindingEmitter(binding, cWriter(), cfg.implPackageName(), cfg.implClassName(), - true, /* NOTE: we always disambiguate with a suffix now, so this is optional */ + true, // NOTE: we always disambiguate with a suffix now, so this is optional cfg.allStatic(), - binding.needsNIOWrappingOrUnwrapping(), - true, + (binding.needsNIOWrappingOrUnwrapping() || hasPrologueOrEpilogue), + !cfg.nioDirectOnly(binding.getName()), machDesc64); - if (returnValueCapacityFormat != null) { + if (returnValueCapacityFormat != null) { cEmitter.setReturnValueCapacityExpression(returnValueCapacityFormat); - } - if (returnValueLengthFormat != null) { + } + if (returnValueLengthFormat != null) { cEmitter.setReturnValueLengthExpression(returnValueLengthFormat); - } - cEmitter.setTemporaryCVariableDeclarations(cfg.temporaryCVariableDeclarations(binding.getName())); - cEmitter.setTemporaryCVariableAssignments(cfg.temporaryCVariableAssignments(binding.getName())); - allEmitters.add(cEmitter); } + cEmitter.setTemporaryCVariableDeclarations(cfg.temporaryCVariableDeclarations(binding.getName())); + cEmitter.setTemporaryCVariableAssignments(cfg.temporaryCVariableAssignments(binding.getName())); + allEmitters.add(cEmitter); } } @@ -746,14 +692,15 @@ public class JavaEmitter implements GlueEmitter { // Implementation class: // public void fooMethod(Buffer arg) { // ... bounds checks, etc. ... - // if (arg.isDirect()) { - // fooMethod0(arg, computeDirectBufferByteOffset(arg)); - // } else { - // fooMethod1(getIndirectBufferArray(arg), computeIndirectBufferByteOffset(arg)); - // } + // + // boolean arg_direct = arg != null && BufferFactory.isDirect(arg); + // + // fooMethod0(arg_direct?arg:BufferFactory.getArray(arg), + // arg_direct?BufferFactory.getDirectBufferByteOffset(arg):BufferFactory.getIndirectBufferByteOffset(arg), + // arg_direct, + // ... ); // } - // private native void fooMethod0(Object arg, int arg_byte_offset); - // private native void fooMethod1(Object arg, int arg_byte_offset); + // private native void fooMethod0(Object arg, int arg_byte_offset, boolean arg_is_direct, ...); // // Method taking primitive array argument: // Interface class: @@ -772,8 +719,7 @@ public class JavaEmitter implements GlueEmitter { // fooMethod1(getIndirectBufferArray(arg), computeIndirectBufferByteOffset(arg)); // } // } - // private native void fooMethod0(Object arg, int arg_byte_offset); - // private native void fooMethod1(Object arg, int arg_byte_offset); + // private native void fooMethod0(Object arg, int arg_byte_offset, boolean arg_is_direct, ...); // // Note in particular that the public entry point taking an // array is merely a special case of the indirect buffer case. @@ -1947,4 +1893,4 @@ public class JavaEmitter implements GlueEmitter { return Character.toUpperCase(string.charAt(0)) + string.substring(1); } -}
\ No newline at end of file +} diff --git a/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java index 2d7a8b2..da5484b 100644 --- a/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java +++ b/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java @@ -293,11 +293,7 @@ public class JavaMethodBindingEmitter extends FunctionEmitter protected void emitName(PrintWriter writer) { if (forImplementingMethodCall) { - if (forIndirectBufferAndArrayImplementation) { - writer.print(getImplMethodName(false)); - } else { - writer.print(getImplMethodName(true)); - } + writer.print(getImplMethodName()); } else { writer.print(getName()); } @@ -348,6 +344,9 @@ public class JavaMethodBindingEmitter extends FunctionEmitter if (forDirectBufferImplementation || forIndirectBufferAndArrayImplementation) { if (type.isNIOBuffer()) { writer.print(", int " + byteOffsetArgName(i)); + if(!directNIOOnly) { + writer.print(", boolean " + isNIOArgName(i)); + } } else if (type.isNIOBufferArray()) { writer.print(", int[] " + byteOffsetArrayArgName(i)); @@ -356,6 +355,9 @@ public class JavaMethodBindingEmitter extends FunctionEmitter // Add offset argument after each primitive array if (type.isPrimitiveArray()) { + if(directNIOOnly) { + throw new RuntimeException("NIODirectOnly "+binding+" is set, but "+getArgumentName(i)+" is a primitive array"); + } writer.print(", int " + offsetArgName(i)); } } @@ -363,12 +365,8 @@ public class JavaMethodBindingEmitter extends FunctionEmitter } - protected String getImplMethodName(boolean direct) { - if (direct) { - return binding.getName() + "0"; - } else { - return binding.getName() + "1"; - } + protected String getImplMethodName() { + return binding.getName() + ( directNIOOnly ? "0" : "1" ); } protected String byteOffsetArgName(int i) { @@ -379,6 +377,14 @@ public class JavaMethodBindingEmitter extends FunctionEmitter return s + "_byte_offset"; } + protected String isNIOArgName(int i) { + return isNIOArgName(binding.getArgumentName(i)); + } + + protected String isNIOArgName(String s) { + return s + "_is_direct"; + } + protected String byteOffsetArrayArgName(int i) { return getArgumentName(i) + "_byte_offset_array"; } @@ -428,7 +434,6 @@ public class JavaMethodBindingEmitter extends FunctionEmitter protected void emitArrayLengthAndNIOBufferChecks(MethodBinding binding, PrintWriter writer) { - boolean firstBuffer = true; // Check lengths of any incoming arrays if necessary for (int i = 0; i < binding.getNumArguments(); i++) { Type type = binding.getCArgumentType(i); @@ -439,6 +444,8 @@ public class JavaMethodBindingEmitter extends FunctionEmitter writer.println(" throw new " + getRuntimeExceptionType() + "(\"Length of array \\\"" + getArgumentName(i) + "\\\" was less than the required " + arrayType.getLength() + "\");"); + // FIXME: What is this ??? Until resolved - throw an exception ! + throw new RuntimeException("????? "+binding+": binding.getCArgumentType("+i+").isArray(): "+type); } else { JavaType javaType = binding.getJavaArgumentType(i); if (javaType.isNIOBuffer()) { @@ -447,29 +454,8 @@ public class JavaMethodBindingEmitter extends FunctionEmitter writer.println(" throw new " + getRuntimeExceptionType() + "(\"Argument \\\"" + getArgumentName(i) + "\\\" was not a direct buffer\");"); } else { - if(firstBuffer) { - firstBuffer = false; - writer.print(" boolean _direct = "); - for (int j = i; j < binding.getNumArguments(); j++) { - JavaType buff = binding.getJavaArgumentType(j); - - if(buff.isNIOBuffer()) { - if(i!=j) { // not the first one - writer.println(); - writer.print(" ||"); - } - writer.print(getArgumentName(j)+" != null && BufferFactory.isDirect(" + getArgumentName(j) + ")"); - } - - } - writer.println(";"); - - } else { - writer.println(" if (" + getArgumentName(i) + " != null && _direct != BufferFactory.isDirect(" + getArgumentName(i) + "))"); - writer.println(" throw new " + getRuntimeExceptionType() + - "(\"Argument \\\"" + getArgumentName(i) + - "\\\" : Buffers passed to this method must all be either direct or indirect\");"); - } + writer.print(" boolean " + isNIOArgName(i) + " = "); + writer.println(getArgumentName(i) + " != null && BufferFactory.isDirect(" + getArgumentName(i) + ");"); } } else if (javaType.isNIOBufferArray()) { // All buffers passed down in an array of NIO buffers must be direct @@ -521,11 +507,11 @@ public class JavaMethodBindingEmitter extends FunctionEmitter } } - protected void emitCall(MethodBinding binding, PrintWriter writer, boolean direct) { - writer.print(getImplMethodName(direct)); + protected void emitCall(MethodBinding binding, PrintWriter writer) { + writer.print(getImplMethodName()); writer.print("("); - emitCallArguments(binding, writer, direct); - writer.print(")"); + emitCallArguments(binding, writer); + writer.print(");"); } @@ -550,13 +536,6 @@ public class JavaMethodBindingEmitter extends FunctionEmitter } } - if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { - // Must generate two calls for this gated on whether the NIO - // buffers coming in are all direct or indirect - writer.println("if (_direct) {"); - writer.print (" "); - } - if (needsResultAssignment) { writer.print(" _res = "); } else { @@ -566,43 +545,9 @@ public class JavaMethodBindingEmitter extends FunctionEmitter } } - if (binding.signatureUsesJavaPrimitiveArrays() && - !binding.signatureCanUseIndirectNIO()) { - // FIXME: what happens with a C function of the form - // void foo(int* arg0, void* arg1); - // ? - - // Only one call being made in this body, going to indirect - // buffer / array entry point - emitCall(binding, writer, false); - writer.print(";"); - writer.println(); - } else { - emitCall(binding, writer, true); - writer.print(";"); - } + emitCall(binding, writer); + writer.println(); - if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { - // Must generate two calls for this gated on whether the NIO - // buffers coming in are all direct or indirect - writer.println(); - writer.println(" } else {"); - writer.print (" "); - if (needsResultAssignment) { - writer.print(" _res = "); - } else { - writer.print(" "); - if (!returnType.isVoid()) { - writer.print("return "); - } - } - emitCall(binding, writer, false); - writer.print(";"); - writer.println(); - writer.println(" }"); - } else { - writer.println(); - } emitPostCallCleanup(binding, writer); emitPrologueOrEpilogue(epilogue, writer); if (needsResultAssignment) { @@ -610,7 +555,7 @@ public class JavaMethodBindingEmitter extends FunctionEmitter } } - protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean direct) { + protected int emitCallArguments(MethodBinding binding, PrintWriter writer) { boolean needComma = false; int numArgsEmitted = 0; @@ -643,14 +588,25 @@ public class JavaMethodBindingEmitter extends FunctionEmitter writer.print("(("); } - if (type.isNIOBuffer() && !direct) { - writer.print("BufferFactory.getArray(" + getArgumentName(i) + ")"); + if (type.isNIOBuffer()) { + if(type.isNIOPointerBuffer()) { + if (directNIOOnly) { + writer.print( getArgumentName(i)+ " != null ? " + getArgumentName(i) + ".getBuffer() : null"); + } else { + writer.print( isNIOArgName(i) + " ? ( " + getArgumentName(i)+ " != null ? " + getArgumentName(i) + ".getBuffer() : null )"); + writer.print( " : BufferFactory.getArray(" + getArgumentName(i) + ")" ); + } + } else { + if (directNIOOnly) { + writer.print( getArgumentName(i) ); + } else { + writer.print( isNIOArgName(i) + " ? " + getArgumentName(i) + " : BufferFactory.getArray(" + getArgumentName(i) + ")" ); + } + } } else if (type.isArrayOfCompoundTypeWrappers()) { - writer.print(getArgumentName(i) + COMPOUND_ARRAY_SUFFIX); - } else if(type.isNIOPointerBuffer()) { - writer.print(getArgumentName(i)+"!=null?"+getArgumentName(i) + ".getBuffer():null"); + writer.print(getArgumentName(i) + COMPOUND_ARRAY_SUFFIX); } else { - writer.print(getArgumentName(i)); + writer.print(getArgumentName(i)); } if (type.isCompoundTypeWrapper()) { @@ -658,18 +614,17 @@ public class JavaMethodBindingEmitter extends FunctionEmitter writer.print(getArgumentName(i)); writer.print(".getBuffer())"); } + if (type.isNIOBuffer()) { - if (direct) { - writer.print(", BufferFactory.getDirectBufferByteOffset(" + getArgumentName(i) + ")"); + if (directNIOOnly) { + writer.print( ", BufferFactory.getDirectBufferByteOffset(" + getArgumentName(i) + ")"); } else { - writer.print(", BufferFactory.getIndirectBufferByteOffset(" + getArgumentName(i) + ")"); + writer.print( ", " + isNIOArgName(i) + " ? BufferFactory.getDirectBufferByteOffset(" + getArgumentName(i) + ")"); + writer.print( " : BufferFactory.getIndirectBufferByteOffset(" + getArgumentName(i) + ")"); } } else if (type.isNIOBufferArray()) { writer.print(", " + byteOffsetArrayArgName(i)); - } - - // Add Array offset parameter for primitive arrays - if (type.isPrimitiveArray()) { + } else if (type.isPrimitiveArray()) { if(type.isFloatArray()) { writer.print(", BufferFactory.SIZEOF_FLOAT * "); } else if(type.isDoubleArray()) { @@ -690,6 +645,17 @@ public class JavaMethodBindingEmitter extends FunctionEmitter writer.print(offsetArgName(i)); } + if (type.isNIOBuffer()) { + if (!directNIOOnly) { + writer.print( ", " + isNIOArgName(i) ); + } + } else if (type.isPrimitiveArray()) { + if (directNIOOnly) { + throw new RuntimeException("NIODirectOnly "+binding+" is set, but "+getArgumentName(i)+" is a primitive array"); + } + writer.print( ", false"); + } + needComma = true; ++numArgsEmitted; } diff --git a/src/java/com/sun/gluegen/MethodBinding.java b/src/java/com/sun/gluegen/MethodBinding.java index dae381b..5805be1 100644 --- a/src/java/com/sun/gluegen/MethodBinding.java +++ b/src/java/com/sun/gluegen/MethodBinding.java @@ -81,7 +81,7 @@ public class MethodBinding { this.containingType = bindingToCopy.containingType; this.containingCType = bindingToCopy.containingCType; this.javaReturnType = bindingToCopy.javaReturnType; - this.javaArgumentTypes = new ArrayList<JavaType>(bindingToCopy.javaArgumentTypes); + this.javaArgumentTypes = ( null != bindingToCopy.javaArgumentTypes ) ? new ArrayList<JavaType>(bindingToCopy.javaArgumentTypes) : null; this.computedSignatureProperties = bindingToCopy.computedSignatureProperties; this.argumentsUseNIO = bindingToCopy.argumentsUseNIO; this.signatureUsesNIO = bindingToCopy.signatureUsesNIO; diff --git a/src/java/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java b/src/java/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java index 54263a5..b7fac1b 100755 --- a/src/java/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java +++ b/src/java/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java @@ -140,12 +140,10 @@ public class ProcAddressCMethodBindingEmitter extends CMethodBindingEmitter { super.emitBodyVariableDeclarations(writer); } - protected void emitBodyVariablePreCallSetup(PrintWriter writer, - boolean emittingPrimitiveArrayCritical) { - super.emitBodyVariablePreCallSetup(writer, emittingPrimitiveArrayCritical); + protected void emitBodyVariablePreCallSetup(PrintWriter writer) { + super.emitBodyVariablePreCallSetup(writer); if (callThroughProcAddress) { - if (!emittingPrimitiveArrayCritical) { // set the function pointer to the value of the passed-in procAddress FunctionSymbol cSym = getBinding().getCSymbol(); String funcPointerTypedefName = emitter.getFunctionPointerTypedefName(cSym); @@ -162,7 +160,6 @@ public class ProcAddressCMethodBindingEmitter extends CMethodBindingEmitter { writer.println(") (intptr_t) procAddress;"); writer.println(" assert(" + ptrVarName + " != NULL);"); - } } } diff --git a/src/java/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java index f6ae58e..2dda752 100755 --- a/src/java/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java +++ b/src/java/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java @@ -110,8 +110,8 @@ public class ProcAddressJavaMethodBindingEmitter extends JavaMethodBindingEmitte return numEmitted; } - protected String getImplMethodName(boolean direct) { - String name = super.getImplMethodName(direct); + protected String getImplMethodName() { + String name = super.getImplMethodName(); if (callThroughProcAddress) { return ProcAddressEmitter.WRAP_PREFIX + name; } @@ -131,8 +131,8 @@ public class ProcAddressJavaMethodBindingEmitter extends JavaMethodBindingEmitte } } - protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean indirect) { - int numEmitted = super.emitCallArguments(binding, writer, indirect); + protected int emitCallArguments(MethodBinding binding, PrintWriter writer) { + int numEmitted = super.emitCallArguments(binding, writer); if (callThroughProcAddress) { if (numEmitted > 0) { writer.print(", "); diff --git a/src/java/com/sun/gluegen/runtime/NativeLibrary.java b/src/java/com/sun/gluegen/runtime/NativeLibrary.java index c4c9f25..eb465c8 100755 --- a/src/java/com/sun/gluegen/runtime/NativeLibrary.java +++ b/src/java/com/sun/gluegen/runtime/NativeLibrary.java @@ -57,7 +57,7 @@ import java.util.*; ProcAddressTable glue code generation style without additional supporting code needed in the generated library. */ -public class NativeLibrary { +public class NativeLibrary implements DynamicLookupHelper { private static final int WINDOWS = 1; private static final int UNIX = 2; private static final int MACOSX = 3; @@ -202,10 +202,10 @@ public class NativeLibrary { } /** Looks up the given function name in this native library. */ - public long lookupFunction(String functionName) { + public long dynamicLookupFunction(String funcName) { if (libraryHandle == 0) throw new RuntimeException("Library is not open"); - return dynLink.lookupSymbol(libraryHandle, functionName); + return dynLink.lookupSymbol(libraryHandle, funcName); } /** Retrieves the low-level library handle from this NativeLibrary diff --git a/src/junit/com/jogamp/gluegen/test/junit/BaseTest1.java b/src/junit/com/jogamp/gluegen/test/junit/BaseTest1.java new file mode 100644 index 0000000..457d96f --- /dev/null +++ b/src/junit/com/jogamp/gluegen/test/junit/BaseTest1.java @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2010 Sven Gothel. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name Sven Gothel or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SVEN GOTHEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +package com.jogamp.gluegen.test.junit; + +import com.sun.gluegen.runtime.BufferFactory; +import com.sun.gluegen.runtime.PointerBuffer; +import java.nio.*; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URISyntaxException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import static java.lang.System.*; +import static com.jogamp.gluegen.test.junit.BuildEnvironment.*; + +/** + * @author Michael Bien + * @author Sven Gothel + */ +public class BaseTest1 { + + /** + * Verifies the existence and creation of the generated class. + */ + public void testClassExist(String name) throws Exception { + String ifName = "com.jogamp.gluegen.test.junit.Binding"+name; + String implName = "com.jogamp.gluegen.test.junit.impl.Binding"+name+"Impl"; + + Class<?> clazzIf = Class.forName(ifName); + Class<?> clazzImpl = Class.forName(implName); + + Assert.assertNotNull(ifName+" does not exist", clazzIf); + Assert.assertNotNull(implName+" does not exist", clazzImpl); + + Assert.assertEquals((int)1, clazzIf.getDeclaredField("CONSTANT_ONE").get(null)); + + Object obj = clazzImpl.newInstance(); + Assert.assertTrue("Not of type "+ifName, clazzIf.isAssignableFrom(obj.getClass())); + Assert.assertTrue("Not of type com.jogamp.gluegen.test.junit.BindingTest1", (obj instanceof com.jogamp.gluegen.test.junit.BindingTest1)); + } + + /** + * Verifies if all generated method signatures are completed, + * ie a compilation only coverage test without functional tests. + */ + public void chapter__TestCoverageSignature(BindingTest1 binding) throws Exception { + int i; + long result; + long context = 0; + ByteBuffer bb=null; + PointerBuffer pb=null; + LongBuffer lb=null; + long[] larray = null; + int array_offset = 0; + String str=null; + String[] strings = null; + IntBuffer ib = null; + int[] iarray = null; + int iarray_offset = 0; + + result = binding.arrayTest(context, pb); + result = binding.arrayTest(context, larray, array_offset); + result = binding.arrayTestNioOnly(context, pb); + + result = binding.bufferTest(bb); + result = binding.bufferTestNioOnly(bb); + + result = binding.doubleTest(context, bb, pb, bb, pb); + result = binding.doubleTest(context, bb, larray, array_offset, bb, larray, array_offset); + result = binding.doubleTestNioOnly(context, bb, pb, bb, pb); + + result = binding.mixedTest(context, bb, pb); + result = binding.mixedTest(context, bb, larray, array_offset); + result = binding.mixedTestNioOnly(context, bb, pb); + + result = binding.nopTest(); + + i = binding.strToInt(str); + str = binding.intToStr(i); + + i = binding.stringArrayRead(strings, i); + + i = binding.intArrayRead(ib, i); + i = binding.intArrayRead(iarray, iarray_offset, i); + + } + + /** + * Verifies if all methods / signatures are properly generated, + * can be invoked and functions. + * This is a compilation (coverage) and runtime time (semantic) test. + * This covers indirect primitive arrays and direct NIO buffers. + */ + public void chapter03TestCoverageFunctionalityDirectNIOAndPrimitiveArray(BindingTest1 binding) throws Exception { + int i; + long result; + + long context = 1; + ByteBuffer bb1 = BufferFactory.newDirectByteBuffer(BufferFactory.SIZEOF_LONG); + LongBuffer bb1L = bb1.asLongBuffer(); + bb1L.put(0, 10); + + ByteBuffer bb2 = BufferFactory.newDirectByteBuffer(BufferFactory.SIZEOF_LONG); + LongBuffer bb2L = bb2.asLongBuffer(); + bb2L.put(0, 100); + + PointerBuffer pb1 = PointerBuffer.allocateDirect(BindingTest1.ARRAY_SIZE); + for(i=0; i<BindingTest1.ARRAY_SIZE; i++) { + pb1.put(i, 1000); + } + PointerBuffer pb2 = PointerBuffer.allocateDirect(BindingTest1.ARRAY_SIZE); + for(i=0; i<BindingTest1.ARRAY_SIZE; i++) { + pb2.put(i, 10000); + } + + long[] larray1 = new long[BindingTest1.ARRAY_SIZE]; + int array1_offset = 0; + for(i=0; i<BindingTest1.ARRAY_SIZE; i++) { + larray1[i]= 1000; + } + + long[] larray2 = new long[BindingTest1.ARRAY_SIZE]; + int array2_offset = 0; + for(i=0; i<BindingTest1.ARRAY_SIZE; i++) { + larray2[i]= 10000; + } + + result = binding.arrayTest(context, pb1); + Assert.assertTrue("Wrong result: "+result, 1+8000==result); + + result = binding.arrayTest(context, larray1, array1_offset); + Assert.assertTrue("Wrong result: "+result, 1+8000==result); + + result = binding.arrayTestNioOnly(context, pb1); + Assert.assertTrue("Wrong result: "+result, 1+8000==result); + + result = binding.bufferTest(bb1); + Assert.assertTrue("Wrong result: "+result, 10==result); + + result = binding.bufferTestNioOnly(bb1); + Assert.assertTrue("Wrong result: "+result, 10==result); + + result = binding.doubleTest(context, bb1, pb1, bb2, pb2); + Assert.assertTrue("Wrong result: "+result, 1+10+8000+100+80000==result); + + result = binding.doubleTest(context, bb1, larray1, array1_offset, bb2, larray2, array2_offset); + Assert.assertTrue("Wrong result: "+result, 1+10+8000+100+80000==result); + + result = binding.doubleTestNioOnly(context, bb1, pb1, bb2, pb2); + Assert.assertTrue("Wrong result: "+result, 1+10+8000+100+80000==result); + + result = binding.mixedTest(context, bb1, pb1); + Assert.assertTrue("Wrong result: "+result, 1+10+8000==result); + + result = binding.mixedTest(context, bb1, larray1, array1_offset); + Assert.assertTrue("Wrong result: "+result, 1+10+8000==result); + + result = binding.mixedTestNioOnly(context, bb1, pb1); + Assert.assertTrue("Wrong result: "+result, 1+10+8000==result); + + result = binding.nopTest(); + Assert.assertTrue("Wrong result: "+result, 42==result); + + i = binding.strToInt("42"); + Assert.assertTrue("Wrong result: "+i, 42==i); + + String str = binding.intToStr(42); + Assert.assertTrue("Wrong result: "+str, str.equals("42")); + + i = binding.stringArrayRead(new String[] { "1234", "5678", "9a" }, 3); + Assert.assertTrue("Wrong result: "+i, 10==i); + + ByteBuffer bb3 = BufferFactory.newDirectByteBuffer(BufferFactory.SIZEOF_INT * 3); + IntBuffer ib = bb3.asIntBuffer(); + ib.put(0, 1); + ib.put(1, 2); + ib.put(2, 3); + + int[] iarray = new int[] { 1, 2, 3 }; + int iarray_offset = 0; + + i = binding.intArrayRead(ib, 3); + Assert.assertTrue("Wrong result: "+i, 6==i); + + i = binding.intArrayRead(iarray, 0, 3); + Assert.assertTrue("Wrong result: "+i, 6==i); + } + + /** + * This covers indirect primitive arrays and indirect NIO buffers. + */ + public void chapter04TestSomeFunctionsAllIndirect(BindingTest1 binding) throws Exception { + int i; + long result; + + IntBuffer ib = IntBuffer.allocate(3); + ib.put(0, 1); + ib.put(1, 2); + ib.put(2, 3); + + int[] iarray = new int[] { 1, 2, 3 }; + int iarray_offset = 0; + + i = binding.intArrayRead(ib, 3); + Assert.assertTrue("Wrong result: "+i, 6==i); + + i = binding.intArrayRead(iarray, 0, 3); + Assert.assertTrue("Wrong result: "+i, 6==i); + } + +} diff --git a/src/junit/com/jogamp/gluegen/test/junit/Test1.java b/src/junit/com/jogamp/gluegen/test/junit/Test1.java deleted file mode 100644 index 03fbaee..0000000 --- a/src/junit/com/jogamp/gluegen/test/junit/Test1.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2010 Sven Gothel. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * Neither the name Sven Gothel or the names of - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. ALL - * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, - * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN - * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR - * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR - * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR - * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR - * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE - * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, - * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF - * SVEN GOTHEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - */ - -package com.jogamp.gluegen.test.junit; - -import com.jogamp.gluegen.test.junit.impl.BindingTest1Impl; - -import com.sun.gluegen.runtime.BufferFactory; -import com.sun.gluegen.runtime.PointerBuffer; -import java.nio.*; -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URISyntaxException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import static java.lang.System.*; -import static com.jogamp.gluegen.test.junit.BuildEnvironment.*; - -/** - * @author Michael Bien - * @author Sven Gothel - */ -public class Test1 { - - /** - * Verifies loading of the new library. - */ - @Test - public void chapter01TestLoadLibrary() throws Exception { - String nativesPath = testOutput + "/build/natives"; - System.load(nativesPath + "/libtest1.so"); - } - - /** - * Verifies the existence and creation of the generated class. - */ - @Test - public void chapter01TestClassExist() throws Exception { - Class<?> clazzIf = Class.forName("com.jogamp.gluegen.test.junit.BindingTest1"); - Class<?> clazzImpl = Class.forName("com.jogamp.gluegen.test.junit.impl.BindingTest1Impl"); - - Assert.assertNotNull("com.jogamp.gluegen.test.junit.BindingTest1 does not exist", clazzIf); - Assert.assertNotNull("com.jogamp.gluegen.test.junit.impl.BindingTest1Impl does not exist", clazzImpl); - - Assert.assertEquals((int)1, clazzIf.getDeclaredField("CONSTANT_ONE").get(null)); - - Object obj = clazzImpl.newInstance(); - Assert.assertTrue("Not of type com.jogamp.gluegen.test.junit.BindingTest1", (obj instanceof com.jogamp.gluegen.test.junit.BindingTest1)); - - BindingTest1 bindingTest1 = (BindingTest1) obj; - Assert.assertTrue("nopTest1 failed", 42==bindingTest1.nopTest()); - } - - /** - * Verifies if all methods / signatures are properly generated, - * and can be invoked. - * Gluegen Coverage test. - * This is a compilation and runtime time test. - */ - @Test - public void chapter01TestCoverage() throws Exception { - int dummy; - - int array_size = 10; - long context = 0; - ByteBuffer bb1 = BufferFactory.newDirectByteBuffer(PointerBuffer.elementSize() * array_size); - ByteBuffer bb2 = BufferFactory.newDirectByteBuffer(PointerBuffer.elementSize() * array_size); - - PointerBuffer pb1 = PointerBuffer.allocateDirect(array_size); - PointerBuffer pb2 = PointerBuffer.allocateDirect(array_size); - - long[] larray1 = new long[array_size]; - int array1_offset = 0; - - long[] larray2 = new long[array_size]; - int array2_offset = 0; - - BindingTest1 binding = new BindingTest1Impl(); - - /** Interface to C language function: <br> <code> int arrayTest(long context, foo * array); </code> */ - dummy = binding.arrayTest(context, pb1); - Assert.assertTrue(42==dummy); - - /** Interface to C language function: <br> <code> int arrayTest(long context, foo * array); </code> */ - dummy = binding.arrayTest(context, larray1, array1_offset); - Assert.assertTrue(42==dummy); - - /** Interface to C language function: <br> <code> int bufferTest(void * object); </code> */ - dummy = binding.bufferTest(bb1); - Assert.assertTrue(42==dummy); - - /** Interface to C language function: <br> <code> int doubleTest(long context, void * object1, foo * array1, void * object2, foo * array2); </code> */ - dummy = binding.doubleTest(context, bb1, pb1, bb2, pb2); - Assert.assertTrue(42==dummy); - - /** Interface to C language function: <br> <code> int doubleTest(long context, void * object1, foo * array1, void * object2, foo * array2); </code> */ - dummy = binding.doubleTest(context, bb1, larray1, array1_offset, bb2, larray2, array2_offset); - Assert.assertTrue(42==dummy); - - /** Interface to C language function: <br> <code> int mixedTest(long context, void * object, foo * array); </code> */ - dummy = binding.mixedTest(context, bb1, pb1); - Assert.assertTrue(42==dummy); - - /** Interface to C language function: <br> <code> int mixedTest(long context, void * object, foo * array); </code> */ - dummy = binding.mixedTest(context, bb1, larray1, array1_offset); - Assert.assertTrue(42==dummy); - - /** Interface to C language function: <br> <code> int nopTest(); </code> */ - dummy = binding.nopTest(); - Assert.assertTrue(42==dummy); - } - -} diff --git a/src/junit/com/jogamp/gluegen/test/junit/Test1p1JavaEmitter.java b/src/junit/com/jogamp/gluegen/test/junit/Test1p1JavaEmitter.java new file mode 100644 index 0000000..1edb70e --- /dev/null +++ b/src/junit/com/jogamp/gluegen/test/junit/Test1p1JavaEmitter.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2010 Sven Gothel. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name Sven Gothel or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SVEN GOTHEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +package com.jogamp.gluegen.test.junit; + +import com.jogamp.gluegen.test.junit.impl.BindingTest1p1Impl; + +import com.sun.gluegen.runtime.BufferFactory; +import com.sun.gluegen.runtime.PointerBuffer; +import java.nio.*; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URISyntaxException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import static java.lang.System.*; +import static com.jogamp.gluegen.test.junit.BuildEnvironment.*; + +/** + * @author Michael Bien + * @author Sven Gothel + */ +public class Test1p1JavaEmitter extends BaseTest1 { + + /** + * Verifies loading of the new library. + */ + @Test + public void chapter01TestLoadLibrary() throws Exception { + String nativesPath = testOutput + "/build/natives"; + System.load(nativesPath + "/libtest1p1.so"); + } + + /** + * Verifies the existence and creation of the generated class. + */ + @Test + public void chapter02TestClassExist() throws Exception { + testClassExist("Test1p1"); + } + + /** + * Verifies if all generated method signatures are completed, + * ie a compilation only coverage test without functional tests. + */ + public void chapter__TestCoverageSignature() throws Exception { + chapter__TestCoverageSignature(new BindingTest1p1Impl()); + } + + /** + * Verifies if all methods / signatures are properly generated, + * can be invoked and functions. + * This is a compilation (coverage) and runtime time (semantic) test. + * This covers indirect primitive arrays and direct NIO buffers. + */ + @Test + public void chapter03TestCoverageFunctionalityDirectNIOAndPrimitiveArray() throws Exception { + chapter03TestCoverageFunctionalityDirectNIOAndPrimitiveArray(new BindingTest1p1Impl()); + } + + /** + * This covers indirect primitive arrays and indirect NIO buffers. + */ + @Test + public void chapter04TestSomeFunctionsAllIndirect() throws Exception { + chapter04TestSomeFunctionsAllIndirect(new BindingTest1p1Impl()); + } + +} diff --git a/src/junit/com/jogamp/gluegen/test/junit/Test1p2ProcAddressEmitter.java b/src/junit/com/jogamp/gluegen/test/junit/Test1p2ProcAddressEmitter.java new file mode 100644 index 0000000..63d41f3 --- /dev/null +++ b/src/junit/com/jogamp/gluegen/test/junit/Test1p2ProcAddressEmitter.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2010 Sven Gothel. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name Sven Gothel or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SVEN GOTHEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +package com.jogamp.gluegen.test.junit; + +import com.jogamp.gluegen.test.junit.impl.BindingTest1p2Impl; + +import com.sun.gluegen.runtime.BufferFactory; +import com.sun.gluegen.runtime.PointerBuffer; +import com.sun.gluegen.runtime.NativeLibrary; +import com.sun.gluegen.runtime.DynamicLookupHelper; +import java.nio.*; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URISyntaxException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import static java.lang.System.*; +import static com.jogamp.gluegen.test.junit.BuildEnvironment.*; + +/** + * @author Michael Bien + * @author Sven Gothel + */ +public class Test1p2ProcAddressEmitter extends BaseTest1 { + + DynamicLookupHelper dynamicLookupHelper; + + /** + * Verifies loading of the new library. + */ + @Test + public void chapter01TestLoadLibrary() throws Exception { + System.loadLibrary("test1p2"); + dynamicLookupHelper = NativeLibrary.open("test1p2", getClass().getClassLoader(), true); + Assert.assertNotNull("NativeLibrary.open(test1p2) failed", dynamicLookupHelper); + + BindingTest1p2Impl.resetProcAddressTable(dynamicLookupHelper); + } + + /** + * Verifies the existence and creation of the generated class. + */ + @Test + public void chapter02TestClassExist() throws Exception { + testClassExist("Test1p2"); + } + + /** + * Verifies if all generated method signatures are completed, + * ie a compilation only coverage test without functional tests. + */ + public void chapter__TestCoverageSignature() throws Exception { + chapter__TestCoverageSignature(new BindingTest1p2Impl()); + } + + /** + * Verifies if all methods / signatures are properly generated, + * can be invoked and functions. + * This is a compilation (coverage) and runtime time (semantic) test. + * This covers indirect primitive arrays and direct NIO buffers. + */ + @Test + public void chapter03TestCoverageFunctionalityDirectNIOAndPrimitiveArray() throws Exception { + chapter03TestCoverageFunctionalityDirectNIOAndPrimitiveArray(new BindingTest1p2Impl()); + } + + /** + * This covers indirect primitive arrays and indirect NIO buffers. + */ + @Test + public void chapter04TestSomeFunctionsAllIndirect() throws Exception { + chapter04TestSomeFunctionsAllIndirect(new BindingTest1p2Impl()); + } + + public static void main(String[] args) { + Test1p2ProcAddressEmitter test = new Test1p2ProcAddressEmitter(); + try { + test.chapter01TestLoadLibrary(); + test.chapter02TestClassExist(); + test.chapter03TestCoverageFunctionalityDirectNIOAndPrimitiveArray(); + test.chapter04TestSomeFunctionsAllIndirect(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/junit/com/jogamp/gluegen/test/junit/test1-common.cfg b/src/junit/com/jogamp/gluegen/test/junit/test1-common.cfg new file mode 100644 index 0000000..d775424 --- /dev/null +++ b/src/junit/com/jogamp/gluegen/test/junit/test1-common.cfg @@ -0,0 +1,18 @@ + +NIODirectOnly arrayTestNioOnly +NIODirectOnly bufferTestNioOnly +NIODirectOnly mixedTestNioOnly +NIODirectOnly doubleTestNioOnly + +ReturnsString intToStr +ArgumentIsString strToInt 0 +ArgumentIsString stringArrayRead 0 + +CustomCCode #include "test1.h" + +# Imports needed by all glue code +Import java.nio.* +Import java.util.* + + + diff --git a/src/junit/com/jogamp/gluegen/test/junit/test1-gluegen.cfg b/src/junit/com/jogamp/gluegen/test/junit/test1-gluegen.cfg index 291e6cc..9d0f856 100644 --- a/src/junit/com/jogamp/gluegen/test/junit/test1-gluegen.cfg +++ b/src/junit/com/jogamp/gluegen/test/junit/test1-gluegen.cfg @@ -1,35 +1,9 @@ Package com.jogamp.gluegen.test.junit JavaClass BindingTest1 -Style InterfaceAndImpl +Style InterfaceOnly JavaOutputDir classes -NativeOutputDir native -# Use a ProcAddressTable so we dynamically look up the routines -#ProcAddressNameExpr PFN $UPPERCASE({0}) PROC -#EmitProcAddressTable true -#ProcAddressTableClassName BindingTest1ProcAddressTable -#GetProcAddressTableExpr _table +Include test1-common.cfg -# Force all of the methods to be emitted using dynamic linking so we -# don't need to link against any emulation library on the desktop or -# depend on the presence of an import library for a particular device -#ForceProcAddressGen __ALL__ - -# Also force the calling conventions of the locally generated function -# pointer typedefs for these routines to MYAPIENTRY -#LocalProcAddressCallingConvention __ALL__ MYAPIENTRY - -#EmitProcAddressTable true -#ProcAddressTableClassName CLProcAddressTable -#GetProcAddressTableExpr addressTable -#ProcAddressNameExpr $UpperCase(arg) -#ForceProcAddressGen clGetGLContextInfoKHR - -CustomCCode #include "test1.h" - -# Imports needed by all glue code -Import java.nio.* -Import java.util.* -Import com.jogamp.gluegen.test.junit.BindingTest1 diff --git a/src/junit/com/jogamp/gluegen/test/junit/test1.c b/src/junit/com/jogamp/gluegen/test/junit/test1.c index 6b63f90..31c5f40 100644 --- a/src/junit/com/jogamp/gluegen/test/junit/test1.c +++ b/src/junit/com/jogamp/gluegen/test/junit/test1.c @@ -1,21 +1,101 @@ #include "test1.h" +#include <assert.h> +#include <stdlib.h> -int nopTest() { +foo nopTest() { return 42; } -int arrayTest(long context, foo * array) { - return 42; +foo arrayTest(long context, foo * array) { + foo r=0; + int i; + assert(NULL!=array); + // printf("array test - %p\n", array); + for(i=0; i<ARRAY_SIZE; i++) { + r+=array[i]; + } + return r+context; } -int bufferTest(void * object) { - return 42; +foo bufferTest(void * object) { + assert(NULL!=object); + return *((foo *)object); } -int mixedTest(long context, void * object, foo * array){ - return 42; +foo mixedTest(long context, void * object, foo * array){ + assert(NULL!=object); + assert(NULL!=array); + return arrayTest(context, array) + bufferTest(object); } -int doubleTest(long context, void * object1, foo * array1, void * object2, foo * array2) { - return 42; +foo doubleTest(long context, void * object1, foo * array1, void * object2, foo * array2) { + assert(NULL!=object1); + assert(NULL!=array1); + assert(NULL!=object2); + assert(NULL!=array2); + return arrayTest(context, array1) + + arrayTest( 0, array2) + + bufferTest(object1) + + bufferTest(object2); +} + +foo arrayTestNioOnly(long context, foo * array ) { + return arrayTest(context, array); +} + +foo bufferTestNioOnly(void * object) { + return bufferTest(object); +} + +foo mixedTestNioOnly(long context, void * object, foo * array ) { + return mixedTest(context, object, array); +} + +foo doubleTestNioOnly(long context, void * object1, foo * array1, void * object2, foo * array2 ) { + return doubleTest(context, object1, array1, object2, array2); +} + +int strToInt(const char * str) { + return atoi(str); } + +const char * intToStr(int i) { + static char singleton[200]; + snprintf(singleton, sizeof(singleton)-1, "%d", i); + return singleton; +} + +int stringArrayRead(const char * * strings, int num) { + int i=0, l=0; + if(NULL!=strings) { + for(i=0; i<num; i++) { + if(NULL!=strings[i]) { + l+=strlen(strings[i]); + } + } + } + return l; +} + +int intArrayRead(const int * ints, int num) { + int i=0, s=0; + if(NULL!=ints) { + for(i=0; i<num; i++) { + s+=ints[i]; + } + } + return s; +} + +/** +int intArrayWrite(int * * ints, int num) { + int i=0, s=0; + if(NULL!=ints) { + for(i=0; i<num; i++) { + *(ints[i]) = *(ints[i]) + 1; + s+=*(ints[i]); + } + } + return s; +} */ + diff --git a/src/junit/com/jogamp/gluegen/test/junit/test1.h b/src/junit/com/jogamp/gluegen/test/junit/test1.h index 776bc0a..38b4911 100644 --- a/src/junit/com/jogamp/gluegen/test/junit/test1.h +++ b/src/junit/com/jogamp/gluegen/test/junit/test1.h @@ -9,16 +9,49 @@ #define MYAPI #define CONSTANT_ONE 1 +#define ARRAY_SIZE 8 typedef unsigned long foo; -MYAPI int MYAPIENTRY nopTest(); +/** Returns 42 */ +MYAPI foo MYAPIENTRY nopTest(); -MYAPI int MYAPIENTRY arrayTest(long context, foo * array ); +/** Returns Sum(array) + context */ +MYAPI foo MYAPIENTRY arrayTest(long context, foo * array ); -MYAPI int MYAPIENTRY bufferTest(void * object); +/** Returns *((foo *)object) */ +MYAPI foo MYAPIENTRY bufferTest(void * object); -MYAPI int MYAPIENTRY mixedTest(long context, void * object, foo * array ); +/** Returns Sum(array) + context + *((foo *)object) */ +MYAPI foo MYAPIENTRY mixedTest(long context, void * object, foo * array ); -MYAPI int MYAPIENTRY doubleTest(long context, void * object1, foo * array1, void * object2, foo * array2 ); +/** Returns Sum(array1) + Sum(array2) + context + *((foo *)object1) + *((foo *)object2) */ +MYAPI foo MYAPIENTRY doubleTest(long context, void * object1, foo * array1, void * object2, foo * array2 ); + +/** Returns Sum(array) + context */ +MYAPI foo MYAPIENTRY arrayTestNioOnly(long context, foo * array ); + +/** Returns *((foo *)object) */ +MYAPI foo MYAPIENTRY bufferTestNioOnly(void * object); + +/** Returns Sum(array) + context + *((foo *)object) */ +MYAPI foo MYAPIENTRY mixedTestNioOnly(long context, void * object, foo * array ); + +/** Returns Sum(array1) + Sum(array2) + context + *((foo *)object1) + *((foo *)object2) */ +MYAPI foo MYAPIENTRY doubleTestNioOnly(long context, void * object1, foo * array1, void * object2, foo * array2 ); + +/** Returns atoi(str) */ +MYAPI int MYAPIENTRY strToInt(const char* str); + +/** Returns itoa(i) - not thread safe */ +MYAPI const char * MYAPIENTRY intToStr(int i); + +/** Returns the length of all strings */ +MYAPI int MYAPIENTRY stringArrayRead(const char * * strings, int num); + +/** Returns the sum of all integers */ +MYAPI int MYAPIENTRY intArrayRead(const int * ints, int num); + +/** Increases the elements by 1, and returns the sum +MYAPI int MYAPIENTRY intArrayWrite(int * * ints, int num); */ diff --git a/src/junit/com/jogamp/gluegen/test/junit/test1p1-gluegen.cfg b/src/junit/com/jogamp/gluegen/test/junit/test1p1-gluegen.cfg new file mode 100644 index 0000000..78e4d8a --- /dev/null +++ b/src/junit/com/jogamp/gluegen/test/junit/test1p1-gluegen.cfg @@ -0,0 +1,14 @@ +Package com.jogamp.gluegen.test.junit +JavaClass BindingTest1p1 +Style InterfaceAndImpl +JavaOutputDir classes +NativeOutputDir native + +Extends BindingTest1p1 BindingTest1 + +Include test1-common.cfg + +Import com.jogamp.gluegen.test.junit.BindingTest1 +Import com.jogamp.gluegen.test.junit.BindingTest1p1 + + diff --git a/src/junit/com/jogamp/gluegen/test/junit/test1p2-gluegen.cfg b/src/junit/com/jogamp/gluegen/test/junit/test1p2-gluegen.cfg new file mode 100644 index 0000000..c0a63b4 --- /dev/null +++ b/src/junit/com/jogamp/gluegen/test/junit/test1p2-gluegen.cfg @@ -0,0 +1,36 @@ +Package com.jogamp.gluegen.test.junit +JavaClass BindingTest1p2 +Style InterfaceAndImpl +JavaOutputDir classes +NativeOutputDir native + +Extends BindingTest1p2 BindingTest1 + +# Use a ProcAddressTable so we dynamically look up the routines +EmitProcAddressTable true +ProcAddressTableClassName BindingTest1p2ProcAddressTable +GetProcAddressTableExpr _table +ProcAddressNameExpr PFN $UPPERCASE({0}) PROC + +# Force all of the methods to be emitted using dynamic linking so we +# don't need to link against any emulation library on the desktop or +# depend on the presence of an import library for a particular device +ForceProcAddressGen __ALL__ + +# Also force the calling conventions of the locally generated function +# pointer typedefs for these routines to MYAPIENTRY +LocalProcAddressCallingConvention __ALL__ MYAPIENTRY + +Include test1-common.cfg +Include ../../../../../../../make/config/intptr.cfg + +Import com.jogamp.gluegen.test.junit.BindingTest1 +Import com.jogamp.gluegen.test.junit.BindingTest1p2 +Import com.sun.gluegen.runtime.* + +CustomJavaCode BindingTest1p2Impl private static BindingTest1p2ProcAddressTable _table = new BindingTest1p2ProcAddressTable(); +CustomJavaCode BindingTest1p2Impl public static void resetProcAddressTable(DynamicLookupHelper lookup) { +CustomJavaCode BindingTest1p2Impl ProcAddressHelper.resetProcAddressTable(_table, lookup); +CustomJavaCode BindingTest1p2Impl } + + |