From f4e753ff1f39be381307ffdb0fb6bb7a2d323eff Mon Sep 17 00:00:00 2001 From: Sven Gothel <sgothel@jausoft.com> Date: Tue, 17 Jun 2014 08:26:36 +0200 Subject: GlueGen: Add support for 'compound array call-by-value' Completing commit c3054a01990e55ab35756ea23ab7d7c05f24dd37 by allowing passing compound arrays via 'call-by-value. - Creating linear temp heap, copying NIO values into it and passing to C function. Copy-back if not 'const', see below. - Respect 'const' qualifier to skip write-back of temp heap passed to C function - See tag: // FIXME: Compound and Compound-Arrays for code changes and validation of completeness - triggers for compound arrays are: - javaType.isArrayOfCompoundTypeWrappers() - type.isArray() - simplified const query by c-type: FunctionEmitter.isBaseTypeConst(ctype) +++ Tests: Added call-by-value to test1.[ch] binding test! --- src/java/com/jogamp/gluegen/JavaEmitter.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'src/java/com/jogamp/gluegen/JavaEmitter.java') diff --git a/src/java/com/jogamp/gluegen/JavaEmitter.java b/src/java/com/jogamp/gluegen/JavaEmitter.java index 66e9b24..9a5c2af 100644 --- a/src/java/com/jogamp/gluegen/JavaEmitter.java +++ b/src/java/com/jogamp/gluegen/JavaEmitter.java @@ -524,7 +524,7 @@ public class JavaEmitter implements GlueEmitter { cfg.unsupportedExceptionType(), !signatureOnly && needsBody, cfg.tagNativeBinding(), - false, + false, // eraseBufferAndArrayTypes cfg.useNIOOnly(binding.getName()), cfg.useNIODirectOnly(binding.getName()), false, @@ -575,14 +575,14 @@ public class JavaEmitter implements GlueEmitter { // method, don't emit another one if (!cfg.isUnimplemented(binding.getName()) && (binding.needsNIOWrappingOrUnwrapping() || - binding.signatureUsesJavaPrimitiveArrays() || + // binding.signatureUsesJavaPrimitiveArrays() /* excluded below */ || hasPrologueOrEpilogue)) { PrintWriter writer = (cfg.allStatic() ? javaWriter() : javaImplWriter()); // If the binding uses primitive arrays, we are going to emit // the private native entry point for it along with the version // taking only NIO buffers - if (!binding.signatureUsesJavaPrimitiveArrays()) { + if ( !binding.signatureUsesJavaPrimitiveArrays() ) { // (Always) emit the entry point taking only direct buffers JavaMethodBindingEmitter emitter = new JavaMethodBindingEmitter(binding, @@ -591,7 +591,7 @@ public class JavaEmitter implements GlueEmitter { cfg.unsupportedExceptionType(), false, cfg.tagNativeBinding(), - true, + true, // eraseBufferAndArrayTypes cfg.useNIOOnly(binding.getName()), cfg.useNIODirectOnly(binding.getName()), true, @@ -1012,7 +1012,7 @@ public class JavaEmitter implements GlueEmitter { cfg.unsupportedExceptionType(), true, cfg.tagNativeBinding(), - false, + false, // eraseBufferAndArrayTypes true, // FIXME: should unify this with the general emission code true, // FIXME: should unify this with the general emission code false, @@ -1255,7 +1255,7 @@ public class JavaEmitter implements GlueEmitter { targetType = t.asPointer().getTargetType(); } else { // t is <type>[], we need to get <type> - targetType = t.asArray().getElementType(); + targetType = t.asArray().getBaseElementType(); } if (t.pointerDepth() == 2 || t.arrayDimension() == 2) { // Get the target type of the target type (targetType was computer earlier @@ -1297,7 +1297,7 @@ public class JavaEmitter implements GlueEmitter { targetType = t.asPointer().getTargetType(); } else { // t is <type>[], we need to get <type> - targetType = t.asArray().getElementType(); + targetType = t.asArray().getBaseElementType(); } // Handle Types of form pointer-to-type or array-of-type, like @@ -1326,7 +1326,7 @@ public class JavaEmitter implements GlueEmitter { return JavaType.createForCDoublePointer(); } else if (targetType.isCompound()) { if (t.isArray()) { // FIXME: Compound and Compound-Arrays - throw new RuntimeException("Arrays of compound types not handled yet"); + return JavaType.createForCArray(targetType); } // Special cases for known JNI types (in particular for converting jawt.h) if (t.getName() != null && @@ -1361,7 +1361,7 @@ public class JavaEmitter implements GlueEmitter { return JavaType.forNIOPointerBufferClass(); } else { // t is<type>[][], targetType is <type>[], we need to get <type> - bottomType = targetType.asArray().getElementType(); + bottomType = targetType.asArray().getBaseElementType(); LOG.log(WARNING, "typeToJavaType(ptr-ptr): {0}, targetType: {1}, bottomType: {2} -> Unhandled!", new Object[]{t, targetType, bottomType}); } -- cgit v1.2.3