summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xmake/build.xml2
-rw-r--r--src/java/com/sun/gluegen/JavaEmitter.java4
-rw-r--r--src/java/com/sun/gluegen/JavaMethodBindingEmitter.java6
-rw-r--r--src/java/com/sun/gluegen/JavaType.java15
4 files changed, 22 insertions, 5 deletions
diff --git a/make/build.xml b/make/build.xml
index f4d7289..4537582 100755
--- a/make/build.xml
+++ b/make/build.xml
@@ -50,11 +50,13 @@
<target name="setup.javase" unless="isCDCFP">
<copy file="../src/java/com/sun/gluegen/runtime/BufferFactory.java.javase" tofile="../${rootrel.build}/gensrc/java/com/sun/gluegen/runtime/BufferFactory.java" />
<copy file="../src/java/com/sun/gluegen/runtime/StructAccessor.java.javase" tofile="../${rootrel.build}/gensrc/java/com/sun/gluegen/runtime/StructAccessor.java" />
+ <copy file="../src/java/com/sun/gluegen/runtime/PointerBuffer.java.javase" tofile="../${rootrel.build}/gensrc/java/com/sun/gluegen/runtime/PointerBuffer.java" />
</target>
<target name="setup.javame.cdc.fp" if="isCDCFP">
<copy file="../src/java/com/sun/gluegen/runtime/BufferFactory.java.javame_cdc_fp" tofile="../${rootrel.build}/gensrc/java/com/sun/gluegen/runtime/BufferFactory.java" />
<copy file="../src/java/com/sun/gluegen/runtime/StructAccessor.java.javame_cdc_fp" tofile="../${rootrel.build}/gensrc/java/com/sun/gluegen/runtime/StructAccessor.java" />
+ <copy file="../src/java/com/sun/gluegen/runtime/PointerBuffer.java.javame_cdc_fp" tofile="../${rootrel.build}/gensrc/java/com/sun/gluegen/runtime/PointerBuffer.java" />
</target>
<target name="init" depends="load.user.properties,setup-excludes-1,setup-excludes-2,init.javame.cdc.fp">
diff --git a/src/java/com/sun/gluegen/JavaEmitter.java b/src/java/com/sun/gluegen/JavaEmitter.java
index ffd273f..603881c 100644
--- a/src/java/com/sun/gluegen/JavaEmitter.java
+++ b/src/java/com/sun/gluegen/JavaEmitter.java
@@ -1741,7 +1741,7 @@ public class JavaEmitter implements GlueEmitter {
if (convertToArrays) {
result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.longArrayClass));
} else {
- result = result.replaceJavaArgumentType(i, JavaType.forNIOLongBufferClass());
+ result = result.replaceJavaArgumentType(i, JavaType.forNIOPointerBufferClass());
}
} else if (t.isCFloatPointerType()) {
arrayPossible = true;
@@ -1775,7 +1775,7 @@ public class JavaEmitter implements GlueEmitter {
} else if (t.isCInt32PointerType()) {
result = result.replaceJavaArgumentType(-1, JavaType.forNIOIntBufferClass());
} else if (t.isCInt64PointerType()) {
- result = result.replaceJavaArgumentType(-1, JavaType.forNIOLongBufferClass());
+ result = result.replaceJavaArgumentType(-1, JavaType.forNIOPointerBufferClass());
} else if (t.isCFloatPointerType()) {
result = result.replaceJavaArgumentType(-1, JavaType.forNIOFloatBufferClass());
} else if (t.isCDoublePointerType()) {
diff --git a/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java
index d7fa7c4..9fa232d 100644
--- a/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java
+++ b/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java
@@ -640,6 +640,8 @@ public class JavaMethodBindingEmitter extends FunctionEmitter
writer.print("BufferFactory.getArray(" + getArgumentName(i) + ")");
} else if (type.isArrayOfCompoundTypeWrappers()) {
writer.print(getArgumentName(i) + COMPOUND_ARRAY_SUFFIX);
+ } else if(type.isNIOPointerBuffer()) {
+ writer.print(getArgumentName(i) + ".getBuffer()");
} else {
writer.print(getArgumentName(i));
}
@@ -755,11 +757,11 @@ public class JavaMethodBindingEmitter extends FunctionEmitter
if (!returnType.isNIOByteBuffer()) {
// See whether we have to expand pointers to longs
if (getBinding().getCReturnType().pointerDepth() >= 2) {
- if (!returnType.isNIOLongBuffer()) {
+ if (!returnType.isNIOPointerBuffer()) {
throw new RuntimeException("While emitting glue code for " + getName() +
": can not legally make pointers opaque to anything but longs");
}
- writer.println(" return BufferFactory.asPointerBuffer(_res);");
+ writer.println(" return PointerBuffer.wrapNative2Java(_res, false);");
} else {
String returnTypeName = returnType.getName().substring("java.nio.".length());
writer.println(" return _res.as" + returnTypeName + "();");
diff --git a/src/java/com/sun/gluegen/JavaType.java b/src/java/com/sun/gluegen/JavaType.java
index 1f795ef..5e30810 100644
--- a/src/java/com/sun/gluegen/JavaType.java
+++ b/src/java/com/sun/gluegen/JavaType.java
@@ -70,6 +70,7 @@ public class JavaType {
private static JavaType nioShortBufferType;
private static JavaType nioIntBufferType;
private static JavaType nioLongBufferType;
+ private static JavaType nioPointerBufferType;
private static JavaType nioFloatBufferType;
private static JavaType nioDoubleBufferType;
private static JavaType nioByteBufferArrayType;
@@ -191,6 +192,13 @@ public class JavaType {
return nioLongBufferType;
}
+ public static JavaType forNIOPointerBufferClass()
+ {
+ if(nioPointerBufferType == null)
+ nioPointerBufferType = createForClass(com.sun.gluegen.runtime.PointerBuffer.class);
+ return nioPointerBufferType;
+ }
+
public static JavaType forNIOFloatBufferClass() {
if (nioFloatBufferType == null) {
nioFloatBufferType = createForClass(java.nio.FloatBuffer.class);
@@ -323,7 +331,7 @@ public class JavaType {
}
public boolean isNIOBuffer() {
- return (clazz != null && java.nio.Buffer.class.isAssignableFrom(clazz));
+ return clazz != null && ((java.nio.Buffer.class).isAssignableFrom(clazz) || isNIOPointerBuffer());
}
public boolean isNIOByteBuffer() {
@@ -343,6 +351,11 @@ public class JavaType {
return (clazz == java.nio.LongBuffer.class);
}
+ public boolean isNIOPointerBuffer()
+ {
+ return clazz == (com.sun.gluegen.runtime.PointerBuffer.class);
+ }
+
public boolean isString() {
return (clazz == java.lang.String.class);
}