aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java')
-rw-r--r--src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java b/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
index dc3dfa629..c1f05b564 100644
--- a/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
+++ b/src/net/java/games/gluegen/JavaMethodBindingImplEmitter.java
@@ -106,7 +106,9 @@ public class JavaMethodBindingImplEmitter extends JavaMethodBindingEmitter
emitArrayLengthAndNIOBufferChecks(binding, writer);
}
+
protected void emitArrayLengthAndNIOBufferChecks(MethodBinding binding, PrintWriter writer) {
+ int numBufferOffsetArrayArgs = 0;
// Check lengths of any incoming arrays if necessary
for (int i = 0; i < binding.getNumArguments(); i++) {
Type type = binding.getCArgumentType(i);
@@ -122,14 +124,21 @@ public class JavaMethodBindingImplEmitter extends JavaMethodBindingEmitter
writer.println(" throw new " + getRuntimeExceptionType() + "(\"Argument \\\"" +
binding.getArgumentName(i) + "\\\" was not a direct buffer\");");
} else if (javaType.isNIOBufferArray()) {
+ numBufferOffsetArrayArgs++;
String argName = binding.getArgumentName(i);
+ String arrayName = byteOffsetArrayConversionArgName(numBufferOffsetArrayArgs);
+ writer.println(" int[] " + arrayName + " = new int[" + argName + ".length];");
// Check direct buffer properties of all buffers within
writer.println(" if (" + argName + " != null) {");
writer.println(" for (int _ctr = 0; _ctr < " + argName + ".length; _ctr++) {");
writer.println(" if (!BufferFactory.isDirect(" + argName + "[_ctr])) {");
- writer.println(" throw new " + getRuntimeExceptionType() + "(\"Element \" + _ctr + \" of argument \\\"" +
+ writer.println(" throw new " + getRuntimeExceptionType() +
+ "(\"Element \" + _ctr + \" of argument \\\"" +
binding.getArgumentName(i) + "\\\" was not a direct buffer\");");
writer.println(" }");
+ // get the Buffer Array offset values and save them into another array to send down to JNI
+ writer.print(" " + arrayName + "[_ctr] = BufferFactory.getPositionByteOffset(");
+ writer.println(argName + "[_ctr]);");
writer.println(" }");
writer.println(" }");
}
@@ -165,12 +174,16 @@ public class JavaMethodBindingImplEmitter extends JavaMethodBindingEmitter
protected int emitCallArguments(MethodBinding binding, PrintWriter writer) {
boolean needComma = false;
int numArgsEmitted = 0;
+ int numBufferOffsetArgs = 0, numBufferOffsetArrayArgs = 0;
if (binding.hasContainingType()) {
// Emit this pointer
assert(binding.getContainingType().isCompoundTypeWrapper());
writer.print("getBuffer()");
needComma = true;
++numArgsEmitted;
+ numBufferOffsetArgs++;
+ //writer.print(", " + byteOffsetConversionArgName(numBufferOffsetArgs));
+ writer.print(", BufferFactory.getPositionByteOffset(getBuffer())");
}
for (int i = 0; i < binding.getNumArguments(); i++) {
JavaType type = binding.getJavaArgumentType(i);
@@ -198,9 +211,23 @@ public class JavaMethodBindingImplEmitter extends JavaMethodBindingEmitter
writer.print(" == null) ? null : ");
writer.print(binding.getArgumentName(i));
writer.print(".getBuffer())");
+ numBufferOffsetArgs++;
+ //writer.print(", " + byteOffsetConversionArgName(numBufferOffsetArgs));
+ writer.print(", BufferFactory.getPositionByteOffset(((" + binding.getArgumentName(i));
+ writer.print(" == null) ? null : " + binding.getArgumentName(i) + ".getBuffer()))");
}
needComma = true;
++numArgsEmitted;
+ if(type.isNIOBuffer() || type.isNIOBufferArray()) {
+ if(!type.isArray()) {
+ numBufferOffsetArgs++;
+ writer.print
+ (", BufferFactory.getPositionByteOffset(" + binding.getArgumentName(i) + ")");
+ } else {
+ numBufferOffsetArrayArgs++;
+ writer.print(", " + byteOffsetArrayConversionArgName(numBufferOffsetArrayArgs));
+ }
+ }
}
return numArgsEmitted;
}