From 1610dbb4e4d1a1ecf31eb837a47e0f5be04afdac Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Wed, 20 Mar 2013 02:15:53 +0100 Subject: Fix intptr_t*, uintptr_t*, ptrdiff_t* and size_t* mapping, map them to PointerBuffer, since referenced memory-size is arch dependent Added extensive PointerBuffer unit tests w/ new mapping in generated test class. --- make/scripts/runtest.sh | 4 +- src/java/com/jogamp/gluegen/JavaEmitter.java | 7 +- src/java/com/jogamp/gluegen/package.html | 8 +- .../gluegen/test/junit/generation/BaseClass.java | 188 ++++++++++++++++++--- .../gluegen/test/junit/generation/test1-common.cfg | 7 + .../jogamp/gluegen/test/junit/generation/test1.c | 58 +++++++ .../jogamp/gluegen/test/junit/generation/test1.h | 27 +++ 7 files changed, 270 insertions(+), 29 deletions(-) diff --git a/make/scripts/runtest.sh b/make/scripts/runtest.sh index 482843b..19cfd43 100755 --- a/make/scripts/runtest.sh +++ b/make/scripts/runtest.sh @@ -88,13 +88,13 @@ function onetest() { #onetest com.jogamp.common.util.TestArrayHashSet01 2>&1 | tee -a $LOG #onetest com.jogamp.common.util.IntIntHashMapTest 2>&1 | tee -a $LOG #onetest com.jogamp.common.util.IntObjectHashMapTest 2>&1 | tee -a $LOG -onetest com.jogamp.common.util.LongIntHashMapTest 2>&1 | tee -a $LOG +#onetest com.jogamp.common.util.LongIntHashMapTest 2>&1 | tee -a $LOG #onetest com.jogamp.common.nio.TestBuffersFloatDoubleConversion 2>&1 | tee -a $LOG #onetest com.jogamp.gluegen.PCPPTest 2>&1 | tee -a $LOG #onetest com.jogamp.common.nio.TestPointerBufferEndian 2>&1 | tee -a $LOG #onetest com.jogamp.common.nio.TestStructAccessorEndian 2>&1 | tee -a $LOG #onetest com.jogamp.common.os.TestElfReader01 2>&1 | tee -a $LOG -#onetest com.jogamp.gluegen.test.junit.generation.Test1p1JavaEmitter 2>&1 | tee -a $LOG +onetest com.jogamp.gluegen.test.junit.generation.Test1p1JavaEmitter 2>&1 | tee -a $LOG #onetest com.jogamp.gluegen.test.junit.generation.Test1p2ProcAddressEmitter 2>&1 | tee -a $LOG #onetest com.jogamp.common.util.TestPlatform01 2>&1 | tee -a $LOG #onetest com.jogamp.common.util.TestRunnableTask01 2>&1 | tee -a $LOG diff --git a/src/java/com/jogamp/gluegen/JavaEmitter.java b/src/java/com/jogamp/gluegen/JavaEmitter.java index df6f00a..1a6c313 100644 --- a/src/java/com/jogamp/gluegen/JavaEmitter.java +++ b/src/java/com/jogamp/gluegen/JavaEmitter.java @@ -1245,7 +1245,7 @@ public class JavaEmitter implements GlueEmitter { // t is [], we need to get targetType = t.asArray().getElementType(); } - + // Handle Types of form pointer-to-type or array-of-type, like // char* or int[]; these are expanded out into Java primitive // arrays, NIO buffers, or both in expandMethodBinding @@ -1253,8 +1253,9 @@ public class JavaEmitter implements GlueEmitter { if (targetType.isVoid()) { return JavaType.createForCVoidPointer(); } else if (targetType.isInt()) { - // size_t and intptr_t is always a PointerBuffer since size is arch dependent - if ("size_t".equals(targetType.getName()) || "intptr_t".equals(targetType.getName())) { + final SizeThunk targetSizeThunk = targetType.getSize(); + if( null != targetSizeThunk && SizeThunk.POINTER == targetSizeThunk ) { + // Map intptr_t*, uintptr_t*, ptrdiff_t* and size_t* to PointerBuffer, since referenced memory-size is arch dependent return JavaType.forNIOPointerBufferClass(); } switch ((int) targetType.getSize(curMachDesc)) { diff --git a/src/java/com/jogamp/gluegen/package.html b/src/java/com/jogamp/gluegen/package.html index 7ea9d51..2b4f1fa 100644 --- a/src/java/com/jogamp/gluegen/package.html +++ b/src/java/com/jogamp/gluegen/package.html @@ -37,7 +37,13 @@

Warning: Try to avoid unspecified bit sized types, especially long, since it differs on Unix and Windows!
- Note 1: Type long will result in broken code on Windows, since we don't differentiate the OS and it's bit size is ambiguous. + Notes: +

    +
  1. Type long will result in broken code on Windows, since we don't differentiate the OS and it's bit size is ambiguous.
  2. +
  3. Anonymous void-pointer void* are mapped to NIO Buffer.
  4. +
  5. Pointers to pointer-size types like intptr_t*, uintptr_t*, ptrdiff_t* and size_t* are mapped to PointerBuffer, + to reflect the architecture depending storage size.
  6. +

GlueGen Internal Alignment for Compound Data

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 8dff4be..1ce97b5 100644 --- a/src/junit/com/jogamp/gluegen/test/junit/generation/BaseClass.java +++ b/src/junit/com/jogamp/gluegen/test/junit/generation/BaseClass.java @@ -77,9 +77,7 @@ public class BaseClass extends JunitTracer { public void chapter__TestCoverageSignature(Bindingtest1 binding) throws Exception { int i; long context = 0; - ByteBuffer bb=null; LongBuffer lb=null; - PointerBuffer pb=null; IntBuffer ib=null; long[] larray = null; int larray_offset = 0; @@ -90,6 +88,38 @@ public class BaseClass extends JunitTracer { long result = 0; long l = result; + { + ByteBuffer bb = binding.createAPtrBlob(); + PointerBuffer pb = safeByteBuffer2PointerBuffer(bb, 1); + long bb2A = binding.getAPtrAddress(bb); + bb2A = bb2A - 0; // avoid warning + + binding.arrayTestAVoidPtrTypeDim1Mutable(pb); + pb = PointerBuffer.wrap( binding.arrayTestAVoidPtrTypeDim1Immutable(pb) ); + pb = PointerBuffer.wrap( binding.arrayTestAVoidPtrTypeDim0(pb.getBuffer()) ); + binding.releaseAPtrBlob( binding.getAPtrMemory( pb.get(0) ) ); + + binding.arrayTestAIntPtrTypeDim1Mutable(pb); + result = binding.arrayTestAIntPtrTypeDim1Immutable(pb); + result = binding.arrayTestAIntPtrTypeDim0(pb.get(0)); + binding.releaseAPtrBlob( binding.getAPtrMemory( pb.get(0) ) ); + + binding.arrayTestAPtr1TypeDim1Mutable(pb); + pb = PointerBuffer.wrap( binding.arrayTestAPtr1TypeDim1Immutable(pb) ); + pb = PointerBuffer.wrap( binding.arrayTestAPtr1TypeDim0(pb.getBuffer()) ); + binding.releaseAPtrBlob( binding.getAPtrMemory( pb.get(0) ) ); + + binding.arrayTestAPtr2TypeDim1Mutable(pb); + result = binding.arrayTestAPtr2TypeDim1Immutable(pb); + result = binding.arrayTestAPtr2TypeDim0(pb.get(0)); + binding.releaseAPtrBlob( binding.getAPtrMemory( pb.get(0) ) ); + + binding.releaseAPtrBlob(bb); + } + + ByteBuffer bb=null; + PointerBuffer pb=null; + result = binding.arrayTestInt32(context, ib); result = binding.arrayTestInt32(context, iarray, iarray_offset); @@ -199,6 +229,31 @@ public class BaseClass extends JunitTracer { } } + long cleanAddress(long a) { + if (Platform.is32Bit()) { + return a & 0x00000000FFFFFFFFL; + } else { + return a; + } + } + + PointerBuffer validatePointerBuffer(PointerBuffer pb, int elements) { + Assert.assertNotNull(pb); + Assert.assertEquals("PointerBuffer capacity not "+elements, elements, pb.capacity()); + Assert.assertEquals("PointerBuffer remaining not "+elements, elements, pb.remaining()); + System.err.println("Testing accessing PointerBuffer values [0.."+(elements-1)+"]"); + for(int i=0; i