diff options
Diffstat (limited to 'src/net/java/games/gluegen')
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()); + } } |