From 8b3057585930357bb16546f584d998953b084034 Mon Sep 17 00:00:00 2001 From: Sven Gothel <sgothel@jausoft.com> Date: Wed, 20 Jul 2011 08:14:40 +0200 Subject: FIX StructAccessor / JavaEmitter's struct-emitter: Using byte offsets Problem: typedef struct { int8_t bits1; // +1 - 0 // +3 (p32) int32_t id; // +4 - 4 int8_t bits2; // +1 - 8 // +3 (p32) - int64_t long0; // +8 - 12 "longBuffer.get(<type-sized index>)" is invalid, but "byteBuffer.getLong(<byte index>)" must be done. The actual impl. doesn't matter, hence dropping the other nio type mappings is good. FIXES 32bit unit test, works well (static) on 32/64 bit (unix). TODO: Respect diff alignment for OS/ARCH either by offset tables for all, or runtime computing. --- src/java/com/jogamp/gluegen/JavaEmitter.java | 41 ++++------------------------ 1 file changed, 6 insertions(+), 35 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 770db38..dfa7594 100644 --- a/src/java/com/jogamp/gluegen/JavaEmitter.java +++ b/src/java/com/jogamp/gluegen/JavaEmitter.java @@ -1062,10 +1062,7 @@ public class JavaEmitter implements GlueEmitter { String paramType = typeToJavaType(baseElementType, false, extMachDesc).getName(); String capitalized = capitalizeString(fieldName); - int slot = -1; - if(!doBaseClass) { - slot = slot(fieldType, (int) field.getOffset(intMachDesc), intMachDesc); - } + final int byteOffset = doBaseClass ? -1 : (int) field.getOffset(intMachDesc); // Setter writer.println(); @@ -1074,7 +1071,7 @@ public class JavaEmitter implements GlueEmitter { writer.println(";"); } else { writer.println(" {"); - writer.print (" accessor.set" + capitalizeString(paramType) + "sAt(" + slot + ", "); + writer.print (" accessor.set" + capitalizeString(paramType) + "sAt(" + byteOffset + ", "); writer.println("val);"); writer.println(" return this;"); writer.println(" }"); @@ -1087,7 +1084,7 @@ public class JavaEmitter implements GlueEmitter { } else { writer.println(" {"); writer.print (" return "); - writer.println("accessor.get" + capitalizeString(paramType) + "sAt(" + slot + ", new " +paramType+"["+fieldType.asArray().getLength()+"]);"); + writer.println("accessor.get" + capitalizeString(paramType) + "sAt(" + byteOffset + ", new " +paramType+"["+fieldType.asArray().getLength()+"]);"); writer.println(" }"); } @@ -1123,10 +1120,7 @@ public class JavaEmitter implements GlueEmitter { if (!doBaseClass) { capitalized = capitalizeString(internalJavaTypeName); } - int slot = -1; - if (!doBaseClass) { - slot = slot(fieldType, (int) field.getOffset(intMachDesc), intMachDesc); - } + final int byteOffset = doBaseClass ? -1 : (int) field.getOffset(intMachDesc); writer.println(); String capitalizedFieldName = capitalizeString(fieldName); // Setter @@ -1135,7 +1129,7 @@ public class JavaEmitter implements GlueEmitter { writer.println(";"); } else { writer.println(" {"); - writer.print (" accessor.set" + capitalized + "At(" + slot + ", "); + writer.print (" accessor.set" + capitalized + "At(" + byteOffset + ", "); if (!externalJavaTypeName.equals(internalJavaTypeName)) { writer.print("(" + internalJavaTypeName + ") "); } @@ -1154,7 +1148,7 @@ public class JavaEmitter implements GlueEmitter { if (!externalJavaTypeName.equals(internalJavaTypeName)) { writer.print("(" + externalJavaTypeName + ") "); } - writer.println("accessor.get" + capitalized + "At(" + slot + ");"); + writer.println("accessor.get" + capitalized + "At(" + byteOffset + ");"); writer.println(" }"); } } else { @@ -1408,29 +1402,6 @@ public class JavaEmitter implements GlueEmitter { (c == Long.TYPE)); } - private int slot(Type t, int byteOffset, MachineDescription curMachDesc) { - if (t.isInt()) { - final int tsz = (int) t.getSize(curMachDesc); - switch (tsz) { - case 1: - case 2: - case 4: - case 8: return byteOffset / tsz; - default: throw new RuntimeException("Illegal type"); - } - } else if (t.isFloat()) { - return byteOffset / 4; - } else if (t.isDouble()) { - return byteOffset / 8; - } else if (t.isPointer()) { - return byteOffset / curMachDesc.pointerSizeInBytes(); - } else if (t.isArray()) { - return slot(t.asArray().getBaseElementType(), byteOffset, curMachDesc); - } else { - throw new RuntimeException("Illegal type " + t); - } - } - private StructLayout getLayout() { if (layout == null) { layout = StructLayout.create(0); -- cgit v1.2.3