diff options
author | Sven Gothel <[email protected]> | 2014-03-10 13:32:26 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2014-03-10 13:32:26 +0100 |
commit | d5d6f47dad574c6b28522649bdff746102280e68 (patch) | |
tree | a032b3b07e0237ff3e5925849eb1533737ba5f1e | |
parent | 2d94feea41d648fccaa96090e08e754a31aa1b14 (diff) | |
parent | 0b2b05c25b5072ccbce0f92e66f29b45bde762cd (diff) |
Merge remote-tracking branch 'remotes/wwalker/bug_990_fix_gluegen_c_warnings'
6 files changed, 67 insertions, 4 deletions
diff --git a/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java b/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java index d856767..d18ea3d 100644 --- a/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java +++ b/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java @@ -427,7 +427,8 @@ public class CMethodBindingEmitter extends FunctionEmitter { writer.println(" jsize _tmpArrayLen;"); // Pointer to the data in the Buffer, taking the offset into account - writer.println(" int * _offsetHandle = NULL;"); + if(type.isNIOBufferArray()) + writer.println(" int * _offsetHandle = NULL;"); emittedDataCopyTemps = true; } @@ -925,6 +926,15 @@ public class CMethodBindingEmitter extends FunctionEmitter { if (isConstPtrPtr(cArgType)) { writer.print("const "); } + + // if this is a pointer to an unsigned type, add unsigned to the name to avoid compiler warnings + if(cArgType.isPointer()) { + Type typeLast = ((PointerType)cArgType).getLastTargetType(); + if(typeLast.isInt() && (((IntType)typeLast).isPrimitiveUnsigned())) { + writer.print("unsigned "); + } + } + writer.print(cArgType.getName()); writer.print(") "); if (binding.getCArgumentType(i).isPointer() && javaArgType.isPrimitive()) { @@ -1048,11 +1058,11 @@ public class CMethodBindingEmitter extends FunctionEmitter { writer.println(" " + arrayRes + " = (*env)->NewObjectArray(env, " + arrayResLength + ", (*env)->FindClass(env, \"java/nio/ByteBuffer\"), NULL);"); writer.println(" for (" + arrayIdx + " = 0; " + arrayIdx + " < " + arrayResLength + "; " + arrayIdx + "++) {"); Type retType = binding.getCSymbol().getReturnType(); - Type pointerType; + Type pointerType; if (retType.isPointer()) { - pointerType = retType.asPointer().getTargetType(); + pointerType = retType.asPointer().getTargetType(); } else { - pointerType = retType.asArray().getElementType(); + pointerType = retType.asArray().getElementType(); } writer.println(" (*env)->SetObjectArrayElement(env, " + arrayRes + ", " + arrayIdx + ", (*env)->NewDirectByteBuffer(env, _res[" + arrayIdx + "], sizeof(" + pointerType.getName() + ")));"); diff --git a/src/java/com/jogamp/gluegen/cgram/types/IntType.java b/src/java/com/jogamp/gluegen/cgram/types/IntType.java index ffc5696..6eeb997 100644 --- a/src/java/com/jogamp/gluegen/cgram/types/IntType.java +++ b/src/java/com/jogamp/gluegen/cgram/types/IntType.java @@ -82,6 +82,11 @@ public class IntType extends PrimitiveType implements Cloneable { return unsigned; } + /** Indicates whether this type is an unsigned primitive type, as opposed to a typedef type that's unsigned. */ + public boolean isPrimitiveUnsigned() { + return unsigned && !typedefedUnsigned; + } + @Override public String toString() { return getCVAttributesString() + ((isUnsigned() & (!typedefedUnsigned)) ? "unsigned " : "") + getName(); diff --git a/src/java/com/jogamp/gluegen/cgram/types/PointerType.java b/src/java/com/jogamp/gluegen/cgram/types/PointerType.java index 4922d28..af33f41 100644 --- a/src/java/com/jogamp/gluegen/cgram/types/PointerType.java +++ b/src/java/com/jogamp/gluegen/cgram/types/PointerType.java @@ -120,6 +120,13 @@ public class PointerType extends Type implements Cloneable { return targetType; } + public Type getLastTargetType() { + if(targetType.isPointer()) + return ((PointerType)targetType).getLastTargetType(); + else + return targetType; + } + @Override public boolean isFunctionPointer() { return targetType.isFunction(); diff --git a/src/junit/com/jogamp/gluegen/test/junit/generation/BaseClass.java b/src/junit/com/jogamp/gluegen/test/junit/generation/BaseClass.java index f22b1df..a97430a 100644 --- a/src/junit/com/jogamp/gluegen/test/junit/generation/BaseClass.java +++ b/src/junit/com/jogamp/gluegen/test/junit/generation/BaseClass.java @@ -155,6 +155,8 @@ public class BaseClass extends JunitTracer { i = binding.stringArrayRead(strings, i); + i = binding.binaryArrayRead(pb, pb, 0); + i = binding.intArrayRead(ib, i); i = binding.intArrayRead(iarray, iarray_offset, i); @@ -557,6 +559,30 @@ public class BaseClass extends JunitTracer { i = binding.stringArrayRead(null, 0); Assert.assertTrue("Wrong result: "+i, 0==i); + { + // one 0xff in each byte array + // the referenced buffer must be direct, non direct is not supported + ByteBuffer bbB = Buffers.newDirectByteBuffer(new byte [] {(byte)0xaa, (byte)0xff, (byte)0xba, (byte)0xbe}); + bbB.rewind(); + PointerBuffer pbB = newPointerBuffer(Bindingtest1.ARRAY_SIZE, direct); + PointerBuffer pbL = newPointerBuffer(Bindingtest1.ARRAY_SIZE, direct); + for(int j=0; j<Bindingtest1.ARRAY_SIZE; j++) { + pbB.referenceBuffer(bbB); + pbL.put(bbB.capacity()); + } + pbB.rewind(); + pbL.rewind(); + validatePointerBuffer(pbB, Bindingtest1.ARRAY_SIZE); + Assert.assertNotNull(pbB.getReferencedBuffer(0)); + Assert.assertTrue("Wrong result: "+pbB.getReferencedBuffer(0)+" != "+bbB, pbB.getReferencedBuffer(0).equals(bbB)); + validatePointerBuffer(pbL, Bindingtest1.ARRAY_SIZE); + long temp = pbL.get(); + Assert.assertTrue("Wrong result: "+temp, temp==bbB.capacity()); + pbL.rewind(); + i = binding.binaryArrayRead(pbL, pbB, Bindingtest1.ARRAY_SIZE); + Assert.assertTrue("Wrong result: "+i, Bindingtest1.ARRAY_SIZE==i); + } + IntBuffer ib = newIntBuffer(3, direct); ib.put(0, 1); ib.put(1, 2); diff --git a/src/junit/com/jogamp/gluegen/test/junit/generation/test1.c b/src/junit/com/jogamp/gluegen/test/junit/generation/test1.c index 31307a9..fda37f7 100644 --- a/src/junit/com/jogamp/gluegen/test/junit/generation/test1.c +++ b/src/junit/com/jogamp/gluegen/test/junit/generation/test1.c @@ -236,6 +236,18 @@ MYAPI int MYAPIENTRY stringArrayRead(const char * * strings, int num) { return l; } +MYAPI int MYAPIENTRY binaryArrayRead(const size_t * lengths, const unsigned char * * binaries, int num) { + int i, j, n=0; + for(i=0; i<num; i++) { + for(j=0; j<lengths[i]; j++) { + if(0xff==binaries[i][j]) { + ++n; + } + } + } + return n; +} + MYAPI int MYAPIENTRY intArrayRead(const int * ints, int num) { int i=0, s=0; if(NULL!=ints) { diff --git a/src/junit/com/jogamp/gluegen/test/junit/generation/test1.h b/src/junit/com/jogamp/gluegen/test/junit/generation/test1.h index 555a113..b6b6fd3 100644 --- a/src/junit/com/jogamp/gluegen/test/junit/generation/test1.h +++ b/src/junit/com/jogamp/gluegen/test/junit/generation/test1.h @@ -119,6 +119,9 @@ MYAPI const char * MYAPIENTRY intToStr(int i); /** Returns the length of all strings, strings maybe NULL. */ MYAPI int MYAPIENTRY stringArrayRead(const char * * strings, int num); +/** Returns the number of 0xff bytes found in all binaries. */ +MYAPI int MYAPIENTRY binaryArrayRead(const size_t * lengths, const unsigned char * * binaries, int num); + /** Returns the sum of all integers, ints maybe NULL. */ MYAPI int MYAPIENTRY intArrayRead(const int * ints, int num); |