aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/java/games/gluegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/java/games/gluegen')
-rw-r--r--src/net/java/games/gluegen/CMethodBindingEmitter.java14
-rw-r--r--src/net/java/games/gluegen/CodeGenUtils.java1
-rw-r--r--src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java10
-rw-r--r--src/net/java/games/gluegen/MethodBinding.java4
-rw-r--r--src/net/java/games/gluegen/runtime/BufferFactory.java25
5 files changed, 37 insertions, 17 deletions
diff --git a/src/net/java/games/gluegen/CMethodBindingEmitter.java b/src/net/java/games/gluegen/CMethodBindingEmitter.java
index 763fe6695..27df36cea 100644
--- a/src/net/java/games/gluegen/CMethodBindingEmitter.java
+++ b/src/net/java/games/gluegen/CMethodBindingEmitter.java
@@ -1205,20 +1205,6 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer.print(incomingArgumentName);
writer.println(");");
- writer.print(" if (");
- writer.print(cVariableName);
- writer.println(" == NULL) {");
- writer.println(" (*env)->ThrowNew(env, (*env)->FindClass(env, \"java/lang/RuntimeException\"),");
- writer.print (" \"Argument \\\"");
- writer.print(incomingArgumentName);
- writer.println("\\\" was not a direct buffer\");");
- writer.print (" return");
- if (!binding.getJavaReturnType().isVoid()) {
- writer.print(" 0");
- }
- writer.println(";");
- writer.println(" }");
-
if (EMIT_NULL_CHECKS) {
writer.println(" }");
}
diff --git a/src/net/java/games/gluegen/CodeGenUtils.java b/src/net/java/games/gluegen/CodeGenUtils.java
index 313896d13..d982f2390 100644
--- a/src/net/java/games/gluegen/CodeGenUtils.java
+++ b/src/net/java/games/gluegen/CodeGenUtils.java
@@ -94,6 +94,7 @@ public class CodeGenUtils
w.print(imports[i]);
w.println(';');
}
+ w.println("import net.java.games.gluegen.runtime.*;");
w.println();
diff --git a/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java b/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
index 2ec2723bd..78a4a6ced 100644
--- a/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
+++ b/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
@@ -89,10 +89,10 @@ public class JavaMethodBindingImplEmitter extends JavaMethodBindingEmitter
}
protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) {
- emitArrayLengthChecks(binding, writer);
+ emitArrayLengthAndNIOBufferChecks(binding, writer);
}
- protected void emitArrayLengthChecks(MethodBinding binding, PrintWriter writer) {
+ protected void emitArrayLengthAndNIOBufferChecks(MethodBinding binding, PrintWriter writer) {
// Check lengths of any incoming arrays if necessary
for (int i = 0; i < binding.getNumArguments(); i++) {
Type type = binding.getCArgumentType(i);
@@ -101,6 +101,12 @@ public class JavaMethodBindingImplEmitter extends JavaMethodBindingEmitter
writer.println(" if (" + binding.getArgumentName(i) + ".length < " + arrayType.getLength() + ")");
writer.println(" throw new " + getRuntimeExceptionType() + "(\"Length of array \\\"" + binding.getArgumentName(i) +
"\\\" was less than the required " + arrayType.getLength() + "\");");
+ } else {
+ if (binding.getJavaArgumentType(i).isNIOBuffer()) {
+ writer.println(" if (!BufferFactory.isDirect(" + binding.getArgumentName(i) + "))");
+ writer.println(" throw new " + getRuntimeExceptionType() + "(\"Argument \\\"" +
+ binding.getArgumentName(i) + "\\\" was not a direct buffer\");");
+ }
}
}
}
diff --git a/src/net/java/games/gluegen/MethodBinding.java b/src/net/java/games/gluegen/MethodBinding.java
index b8f0eefdf..af86f0b66 100644
--- a/src/net/java/games/gluegen/MethodBinding.java
+++ b/src/net/java/games/gluegen/MethodBinding.java
@@ -184,8 +184,10 @@ public class MethodBinding {
JavaType javaArgType = getJavaArgumentType(i);
Type cArgType = getCArgumentType(i);
if (javaArgType.isCompoundTypeWrapper() ||
+ javaArgType.isNIOBuffer() ||
cArgType.isArray()) {
- // Needs unwrapping of accessors or checking of array lengths
+ // Needs unwrapping of accessors, checking of array
+ // lengths, or checking of direct buffer property
needsBody = true;
break;
}
diff --git a/src/net/java/games/gluegen/runtime/BufferFactory.java b/src/net/java/games/gluegen/runtime/BufferFactory.java
index 2efb78ca6..67ffea1d8 100644
--- a/src/net/java/games/gluegen/runtime/BufferFactory.java
+++ b/src/net/java/games/gluegen/runtime/BufferFactory.java
@@ -47,4 +47,29 @@ public class BufferFactory {
buf.order(ByteOrder.nativeOrder());
return buf;
}
+
+ /** Helper routine to tell whether a buffer is direct or not. Null
+ pointers are considered direct. isDirect() should really be
+ public in Buffer and not replicated in all subclasses. */
+ public static boolean isDirect(Buffer buf) {
+ if (buf == null) {
+ return true;
+ }
+ if (buf instanceof ByteBuffer) {
+ return ((ByteBuffer) buf).isDirect();
+ } else if (buf instanceof FloatBuffer) {
+ return ((FloatBuffer) buf).isDirect();
+ } else if (buf instanceof DoubleBuffer) {
+ return ((DoubleBuffer) buf).isDirect();
+ } else if (buf instanceof CharBuffer) {
+ return ((CharBuffer) buf).isDirect();
+ } else if (buf instanceof ShortBuffer) {
+ return ((ShortBuffer) buf).isDirect();
+ } else if (buf instanceof IntBuffer) {
+ return ((IntBuffer) buf).isDirect();
+ } else if (buf instanceof LongBuffer) {
+ return ((LongBuffer) buf).isDirect();
+ }
+ throw new RuntimeException("Unknown buffer type " + buf.getClass().getName());
+ }
}