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:
+
+ - Type long will result in broken code on Windows, since we don't differentiate the OS and it's bit size is ambiguous.
+ - Anonymous void-pointer void* are mapped to NIO Buffer.
+ - 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.
+
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