aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/com/jogamp/gluegen/JavaEmitter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/jogamp/gluegen/JavaEmitter.java')
-rw-r--r--src/java/com/jogamp/gluegen/JavaEmitter.java491
1 files changed, 344 insertions, 147 deletions
diff --git a/src/java/com/jogamp/gluegen/JavaEmitter.java b/src/java/com/jogamp/gluegen/JavaEmitter.java
index ada1ce9..917ff35 100644
--- a/src/java/com/jogamp/gluegen/JavaEmitter.java
+++ b/src/java/com/jogamp/gluegen/JavaEmitter.java
@@ -126,6 +126,20 @@ public class JavaEmitter implements GlueEmitter {
private final String javaName;
}
+ /**
+ * Resource ownership.
+ */
+ public enum Ownership {
+ /** Parent ownership of resource, i.e. derived-from and shared-with compounding parent resource. */
+ Parent,
+ /** Java ownership of resource. */
+ Java,
+ /** Native ownership of resource. */
+ Native,
+ /** Ambiguous mixed ownership of resource, i.e. {@Link #Java} or {@link #Native}. */
+ Mixed;
+ }
+
private JavaCodeUnit javaUnit; // Covers either interface or, in AllStatic mode, everything
private JavaCodeUnit javaImplUnit; // Only used in non-AllStatic modes for impl class
private CCodeUnit cUnit;
@@ -911,7 +925,7 @@ public class JavaEmitter implements GlueEmitter {
for (final String doc : javadoc) {
javaUnit.emitln(doc);
}
- javaUnit.emit("public final class " + containingJTypeName + " ");
+ javaUnit.emit("public class " + containingJTypeName + " ");
boolean firstIteration = true;
final List<String> userSpecifiedInterfaces = cfg.implementedInterfaces(containingJTypeName);
for (final String userInterface : userSpecifiedInterfaces) {
@@ -1089,7 +1103,7 @@ public class JavaEmitter implements GlueEmitter {
field + "\" in type \"" + structCTypeName + "\")",
fieldType.getASTLocusTag());
}
- generateGetterSignature(javaUnit, fieldType, false, false, fieldType.getName(), fieldName, capitalizeString(fieldName), null, false, null);
+ generateGetterSignature(javaUnit, false, false, fieldName, fieldType, Ownership.Parent, fieldType.getName(), capitalizeString(fieldName), null, false, false, null, null);
javaUnit.emitln(" {");
javaUnit.emitln(" return " + fieldType.getName() + ".create( accessor.slice( " +
fieldName+"_offset[mdIdx], "+fieldName+"_size[mdIdx] ) );");
@@ -1128,7 +1142,7 @@ public class JavaEmitter implements GlueEmitter {
if( !immutableField && !fieldType.isConst() ) {
// Setter
- generateSetterSignature(javaUnit, fieldType, MethodAccess.PUBLIC, false, false, containingJTypeName, fieldName, capFieldName, null, javaTypeName, null, false, null);
+ generateSetterSignature(javaUnit, MethodAccess.PUBLIC, false, false, fieldName, fieldType, Ownership.Parent, containingJTypeName, capFieldName, null, javaTypeName, null, false, false, null, null, null);
javaUnit.emitln(" {");
if( fieldTypeNativeSizeFixed ) {
javaUnit.emitln(" accessor.set" + capJavaTypeName + "At(" + fieldName+"_offset[mdIdx], src);");
@@ -1141,7 +1155,7 @@ public class JavaEmitter implements GlueEmitter {
}
// Getter
- generateGetterSignature(javaUnit, fieldType, false, false, javaTypeName, fieldName, capFieldName, null, false, null);
+ generateGetterSignature(javaUnit, false, false, fieldName, fieldType, Ownership.Parent, javaTypeName, capFieldName, null, false, false, null, null);
javaUnit.emitln(" {");
javaUnit.emit (" return ");
if( fieldTypeNativeSizeFixed ) {
@@ -1200,60 +1214,143 @@ public class JavaEmitter implements GlueEmitter {
//----------------------------------------------------------------------
// Internals only below this point
//
+ private void generateArrayFieldNote(final CodeUnit unit, final String leadIn, final String leadOut,
+ final String fieldName, final Type fieldType, final Ownership ownership,
+ final boolean constElemCount, final boolean maxOneElem, final String elemCountExpr,
+ final boolean multiline, final boolean startNewPara) {
+ final boolean isPointer;
+ final Type referencedType;
+ {
+ final PointerType pointerType = fieldType.asPointer();
+ if( null != pointerType ) {
+ isPointer = true;
+ referencedType = pointerType.getBaseElementType();
+ } else {
+ isPointer = false;
+ referencedType = null;
+ }
+ }
+ // isPointer = true;
+ if( multiline ) {
+ if( startNewPara ) {
+ unit.emitln(" * <p>");
+ }
+ unit.emit (" * ");
+ }
+ if( null != leadIn ) {
+ unit.emit(leadIn+" ");
+ }
+ final String ownershipTerm;
+ switch( ownership ) {
+ case Parent: ownershipTerm = "an"; break;
+ case Java: ownershipTerm = "a <i>Java</i> owned"; break;
+ case Native: ownershipTerm = "a <i>natively</i> owned"; break;
+ default: ownershipTerm = "a <i>mixed and ambigously</i> owned (<b>warning</b>)"; break;
+ }
+ final String relationship = isPointer ? "referencing" : "being";
- private void generateIsNullSignature(final CodeUnit unit, final Type origFieldType,
- final boolean staticMethod, final boolean abstractMethod,
- final String fieldName, final String capitalizedFieldName,
- final boolean constElemCount, final String elemCountExpr) {
- unit.emit(" /** Is 'null' for native field <code>"+fieldName+"</code>: "+origFieldType.getDebugString());
+ unit.emit("native field <code>"+fieldName+"</code>, "+relationship+" "+ownershipTerm+" array with "+(constElemCount?"fixed":"variable")+" element count");
if( null != elemCountExpr ) {
- unit.emit(", with "+(constElemCount?"fixed":"initial")+" array length of <code>"+elemCountExpr+"</code>");
+ if( elemCountExpr.startsWith("get") && elemCountExpr.endsWith("()") ) {
+ unit.emit(" of {@link #"+elemCountExpr+"} ");
+ } else {
+ unit.emit(" of <code>"+elemCountExpr+"</code> ");
+ }
+ if( constElemCount || Ownership.Mixed == ownership ) {
+ unit.emit("elements.");
+ } else {
+ unit.emit("initial elements.");
+ }
+ } else {
+ unit.emit(".");
}
- unit.emitln(" */");
- unit.emit(" public final " + (staticMethod ? "static " : "") + (abstractMethod ? "abstract " : "") + "boolean is" + capitalizedFieldName + "Null()");
- }
- private void generateReleaseSignature(final CodeUnit unit, final Type origFieldType,
- final boolean abstractMethod,
- final String returnTypeName, final String fieldName, final String capitalizedFieldName,
- final boolean constElemCount, final String elemCountExpr) {
- unit.emit(" /** Release for native field <code>"+fieldName+"</code>: "+origFieldType.getDebugString());
- if( null != elemCountExpr ) {
- unit.emit(", with "+(constElemCount?"fixed":"initial")+" array length of <code>"+elemCountExpr+"</code>");
+ if( multiline ) {
+ unit.emitln();
+ if( startNewPara ) {
+ unit.emitln(" * </p>");
+ }
+ }
+ if( maxOneElem ) {
+ if( multiline ) {
+ unit.emitln(" * <p>");
+ unit.emitln(" * Maximum element count is <code>1</code>.");
+ unit.emitln(" * </p>");
+ } else {
+ unit.emit(" Maximum element count is <code>1</code>.");
+ }
+ }
+ if( multiline ) {
+ unit.emitln(" * <p>");
+ if( null == referencedType ) {
+ unit.emitln(" * Native Field Signature <code>"+fieldType.getSignature(null).toString()+"</code>");
+ } else {
+ unit.emitln(" * Native Signature:");
+ unit.emitln(" * <ul>");
+ unit.emitln(" * <li>field-type <code>"+fieldType.getSignature(null).toString()+"</code></li>");
+ unit.emitln(" * <li>referenced <code>"+referencedType.getSignature(null).toString()+"</code></li>");
+ unit.emitln(" * </ul>");
+ }
+ unit.emitln(" * </p>");
+ } else {
+ unit.emit(" NativeSig <code>"+fieldType.getSignature(null).toString()+"</code>");
+ }
+ if( null != leadOut ) {
+ unit.emit(" "+leadOut);
+ }
+ if( !multiline) {
+ unit.emitln();
}
- unit.emitln(" */");
- unit.emit(" public final " + (abstractMethod ? "abstract " : "") + returnTypeName + " release" + capitalizedFieldName + "()");
}
- private void generateGetterSignature(final CodeUnit unit, final Type origFieldType,
- final boolean staticMethod, final boolean abstractMethod,
- final String returnTypeName, final String fieldName, final String capitalizedFieldName,
- final String customArgs, final boolean constElemCount, final String elemCountExpr) {
- unit.emit(" /** Getter for native field <code>"+fieldName+"</code>: "+origFieldType.getDebugString());
- if( null != elemCountExpr ) {
- unit.emit(", with "+(constElemCount?"fixed":"initial")+" array length of <code>"+elemCountExpr+"</code>");
+ private void generateIsNullSignature(final CodeUnit unit, final boolean abstractMethod,
+ final String fieldName, final Type fieldType, final Ownership ownership,
+ final String capitalizedFieldName, final boolean constElemCount, final boolean maxOneElem, final String elemCountExpr) {
+ unit.emitln(" /**");
+ unit.emitln(" * Returns `true` if native pointer <code>"+fieldName+"</code> is `null`, otherwise `false`.");
+ generateArrayFieldNote(unit, "Corresponds to", null, fieldName, fieldType, ownership, constElemCount, maxOneElem, elemCountExpr, true, true);
+ unit.emitln(" */");
+ unit.emit(" public " + (abstractMethod ? "abstract " : "final ") + "boolean is" + capitalizedFieldName + "Null()");
+ }
+ private void generateReleaseSignature(final CodeUnit unit, final boolean abstractMethod,
+ final String fieldName, final Type fieldType, final Ownership ownership, final String returnTypeName,
+ final String capitalizedFieldName, final boolean constElemCount, final boolean maxOneElement, final String elemCountExpr) {
+ unit.emitln(" /**");
+ generateArrayFieldNote(unit, "Releases memory referenced by", null, fieldName, fieldType, ownership, constElemCount, maxOneElement, elemCountExpr, true, false);
+ unit.emitln(" */");
+ unit.emit(" public " + (abstractMethod ? "abstract " : "final ") + returnTypeName + " release" + capitalizedFieldName + "()");
+ }
+ private void generateGetterSignature(final CodeUnit unit, final boolean staticMethod, final boolean abstractMethod,
+ final String fieldName, final Type fieldType, final Ownership ownership, final String returnTypeName,
+ final String capitalizedFieldName, final String customArgs, final boolean constElemCount,
+ final boolean maxOneElem, final String elemCountExpr, final String apiDocTail) {
+ unit.emitln(" /**");
+ generateArrayFieldNote(unit, "Getter for", null, fieldName, fieldType, ownership, constElemCount, maxOneElem, elemCountExpr, true, false);
+ if( null != apiDocTail ) {
+ unit.emitln(" * "+apiDocTail);
}
- unit.emitln(" */");
- unit.emit(" public final " + (staticMethod ? "static " : "") + (abstractMethod ? "abstract " : "") + returnTypeName + " get" + capitalizedFieldName + "(");
+ unit.emitln(" */");
+ unit.emit(" public " + (staticMethod ? "static " : "final ") + (abstractMethod ? "abstract " : "") + returnTypeName + " get" + capitalizedFieldName + "(");
if( null != customArgs ) {
unit.emit(customArgs);
}
unit.emit(")");
}
-
- private void generateSetterAPIDoc(final CodeUnit unit, final String action,
- final Type origFieldType, final String fieldName,
- final boolean constElemCount, final String elemCountExpr) {
- unit.emit(" /** "+action+" native field <code>"+fieldName+"</code>: "+origFieldType.getDebugString());
- if( null != elemCountExpr ) {
- unit.emit(", with "+(constElemCount?"fixed native-ownership":"initial")+" array length of <code>"+elemCountExpr+"</code>");
+ private void generateSetterSignature(final CodeUnit unit, final MethodAccess accessMod, final boolean staticMethod, final boolean abstractMethod,
+ final String fieldName, final Type fieldType, final Ownership ownership, final String returnTypeName,
+ final String capitalizedFieldName, final String customArgsPre, final String paramTypeName,
+ final String customArgsPost, final boolean constElemCount, final boolean maxOneElem, final String elemCountExpr,
+ final String apiDocDetail, final String apiDocArgs) {
+ unit.emitln(" /**");
+ generateArrayFieldNote(unit, "Setter for", null, fieldName, fieldType, ownership, constElemCount, maxOneElem, elemCountExpr, true, false);
+ if( null != apiDocDetail ) {
+ unit.emitln(" * <p>");
+ unit.emitln(" * "+apiDocDetail);
+ unit.emitln(" * </p>");
}
- unit.emitln(" */");
- }
- private void generateSetterSignature(final CodeUnit unit, final Type origFieldType, final MethodAccess accessMod,
- final boolean staticMethod, final boolean abstractMethod,
- final String returnTypeName, final String fieldName, final String capitalizedFieldName,
- final String customArgsPre, final String paramTypeName, final String customArgsPost, final boolean constElemCount, final String elemCountExpr) {
- generateSetterAPIDoc(unit, "Setter for", origFieldType, fieldName, constElemCount, elemCountExpr);
- unit.emit(" "+accessMod.getJavaName()+" final " + (staticMethod ? "static " : "") + (abstractMethod ? "abstract " : "") + returnTypeName + " set" + capitalizedFieldName + "(");
+ if( null != apiDocArgs ) {
+ unit.emitln(apiDocArgs);
+ }
+ unit.emitln(" */");
+ unit.emit(" "+accessMod.getJavaName() + " " + (staticMethod ? "static " : "final ") + (abstractMethod ? "abstract " : "") + returnTypeName + " set" + capitalizedFieldName + "(");
if( null != customArgsPre ) {
unit.emit(customArgsPre+", ");
}
@@ -1427,8 +1524,40 @@ public class JavaEmitter implements GlueEmitter {
return false;
}
- private static final String SetArrayArgs = "final int srcPos, final int destPos, final int length";
- private static final String SetArrayArgsCheck = " if( 0 > srcPos || 0 > destPos || 0 > length || srcPos + length > src.length ) { throw new IndexOutOfBoundsException(\"src[pos \"+srcPos+\", length \"+src.length+\"], destPos \"+destPos+\", length \"+length); }";
+ private static final String GetElemValueApiDocTail = "@return element value of the corresponding field-array";
+ private static final String GetElemCountApiDocTail = "@return element count of the corresponding field-array";
+
+ private static final String SetSubArrayArgsPost = "final int srcPos, final int destPos, final int length";
+ private static final String SetSubArrayArgsCheck = " if( 0 > srcPos || 0 > destPos || 0 > length || srcPos + length > src.length ) { throw new IndexOutOfBoundsException(\"src[pos \"+srcPos+\", length \"+src.length+\"], destPos \"+destPos+\", length \"+length); }";
+ private static final String SetSubArrayApiDocDetail = "Copies the given source elements into the respective field's existing memory.";
+ private static final String SetSubArrayApiDocArgs =
+ " * @param src the source array of elements\n"+
+ " * @param srcPos starting element position within the source array with 'srcPos >= 0` && `srcPos + length <= src.length`, otherwise an {@link IndexOutOfBoundsException} is thrown\n"+
+ " * @param destPos starting element position within the destination with 'destPos >= 0` && `destPos + length <= elemCount`, otherwise an exception is thrown\n"+
+ " * @param length the element count to be copied with 'length >= 0` && `srcPos + length <= src.length` && `destPos + length <= elemCount`, otherwise an {@link IndexOutOfBoundsException} is thrown\n"+
+ " * @return this instance of chaining";
+
+ private static final String SetArrayArgsPre = "final boolean subset";
+ private static final String SetArrayArgsPost = "final int srcPos, final int destPos, final int length";
+ private static final String SetArrayArgsCheck = " if( 0 > srcPos || 0 > destPos || 0 > length || srcPos + length > src.length ) { throw new IndexOutOfBoundsException(\"subset \"+subset+\", src[pos \"+srcPos+\", length \"+src.length+\"], destPos \"+destPos+\", length \"+length); }";
+ private static final String SetArrayApiDocDetail = "Copies the given source elements into the respective field, either writing into the existing memory or creating a new memory and referencing it.";
+ private static final String SetArrayApiDocArgs =
+ " * @param subset if `true` keeps the underlying memory and only allows to set up to `elemCount` elements. Otherwise may replace the underlying memory if `destPos + length != elemCount`.\n"+
+ " * @param src the source array of elements\n"+
+ " * @param srcPos starting element position within the source array with 'srcPos >= 0` && `srcPos + length <= src.length`, otherwise an {@link IndexOutOfBoundsException} is thrown\n"+
+ " * @param destPos starting element position within the destination with 'destPos >= 0`. If `subset == true`, `destPos + length <= elemCount` also must be be `true`. Otherwise an exception is thrown\n"+
+ " * @param length the element count to be copied with 'length >= 0` && `srcPos + length <= src.length`, otherwise an {@link IndexOutOfBoundsException} is thrown\n"+
+ " * @return this instance of chaining";
+
+ private static final String SetReplaceArrayArgsPost = "final int srcPos, final int length";
+ private static final String SetReplaceArrayArgsCheck = " if( 0 > srcPos || 0 > length || srcPos + length > src.length ) { throw new IndexOutOfBoundsException(\"src[pos \"+srcPos+\", length \"+src.length+\"], length \"+length); }";
+ private static final String SetReplaceArrayApiDocDetail = "Replaces the respective field's memory with a new memory segment containing given source elements and referencing it.";
+ private static final String SetReplaceArrayApiDocArgs =
+ " * @param src the source array of elements\n"+
+ " * @param srcPos starting element position within the source array with 'srcPos >= 0` && `srcPos + length <= src.length`, otherwise an {@link IndexOutOfBoundsException} is thrown\n"+
+ " * @param length the element count to be copied with 'length >= 0` && `srcPos + length <= src.length`, otherwise an {@link IndexOutOfBoundsException} is thrown\n"+
+ " * @return this instance of chaining";
+
private static final String GetArrayArgs = "final int destPos, final int length";
private static final String GetArrayArgsCheck = " if( 0 > srcPos || 0 > destPos || 0 > length || destPos + length > dest.length ) { throw new IndexOutOfBoundsException(\"dest[pos \"+destPos+\", length \"+dest.length+\"], srcPos \"+srcPos+\", length \"+length); }";
@@ -1448,7 +1577,10 @@ public class JavaEmitter implements GlueEmitter {
returnSizeLookupName + "\", "+fieldType.getDebugString(), fieldType.getASTLocusTag(), e);
}
if( GlueGen.debug() ) {
- System.err.printf("SE.ac.%02d: javaType %s%n", (i+1), javaType.getDebugString());
+ System.err.printf("SE.ac.%02d: fieldName %s%n", (i+1), fieldName);
+ System.err.printf("SE.ac.%02d: structCType %s, %s%n", (i+1), structCType.toString(), structCType.getSignature(null).toString());
+ System.err.printf("SE.ac.%02d: fieldType %s, %s%n", (i+1), fieldType.toString(), fieldType.getSignature(null).toString());
+ System.err.printf("SE.ac.%02d: javaType %s, %s%n", (i+1), javaType.toString(), javaType.getSignature(null).toString());
}
//
@@ -1465,8 +1597,9 @@ public class JavaEmitter implements GlueEmitter {
final boolean isPrimitive;
final boolean isConstValue; // Immutable 'const type value', immutable array 'const type value[]', or as mutable pointer 'const type * value'
final MethodAccess accessMod = MethodAccess.PUBLIC;
+ final Ownership ownership;
final String elemCountExpr;
- final boolean constElemCount; // if true, implies native ownership of pointer referenced memory!
+ final boolean constElemCount; // if true, implies native ownership for pointer referenced memory!
final boolean staticElemCount;
final JavaType baseJElemType;
final String baseJElemTypeName;
@@ -1482,6 +1615,7 @@ public class JavaEmitter implements GlueEmitter {
isConstValue = fieldType.isConst();
elemCountExpr = "1";
constElemCount = true;
+ ownership = Ownership.Parent;
staticElemCount = true;
baseJElemType = null;
baseJElemTypeName = compatiblePrimitiveJavaTypeName(fieldType, javaType, machDescJava);
@@ -1498,6 +1632,7 @@ public class JavaEmitter implements GlueEmitter {
elemCountExpr = getArrayArrayLengthExpr(arrayType, returnSizeLookupName, _useFixedArrayLen, arrayLengthRes);
// final int arrayLength = arrayLengthRes[0][0];
constElemCount = _useFixedArrayLen[0];
+ ownership = Ownership.Parent; // a fixed linear array
staticElemCount = constElemCount;
baseCElemType = arrayType.getBaseElementType();
isPointer = false;
@@ -1519,44 +1654,50 @@ public class JavaEmitter implements GlueEmitter {
unit.addTailCode(optStringMaxStrnlenCode);
elemCountExpr = "Buffers.strnlen(pString, _max_strnlen)+1";
constElemCount = false;
+ ownership = Ownership.Java;
staticElemCount = constElemCount;
} else if( null == _elemCountExpr ) {
useGetCStringLength = false;
elemCountExpr = "0";
constElemCount = false;
+ ownership = Ownership.Java;
staticElemCount = constElemCount;
} else {
+ // null != _elemCountExpr
useGetCStringLength = false;
elemCountExpr = _elemCountExpr;
boolean _constElemCount = false;
boolean _staticElemCount = false;
- if( null != elemCountExpr ) {
- // try constant intenger 1st
- try {
- Integer.parseInt(elemCountExpr);
- _constElemCount = true;
- _staticElemCount = true;
- } catch (final Exception e ) {}
- if( !_constElemCount ) {
- // check for const length field
- if( elemCountExpr.startsWith("get") && elemCountExpr.endsWith("()") ) {
- final String lenFieldName = decapitalizeString( elemCountExpr.substring(3, elemCountExpr.length()-2) );
- final Field lenField = structCType.getField(lenFieldName);
- if( null != lenField ) {
- _constElemCount = lenField.getType().isConst();
- }
- LOG.log(INFO, structCType.getASTLocusTag(),
- unit.className+": elemCountExpr "+elemCountExpr+", lenFieldName "+lenFieldName+" -> "+lenField.toString()+", isConst "+_constElemCount);
+ // try constant intenger 1st
+ try {
+ Integer.parseInt(elemCountExpr);
+ _constElemCount = true;
+ _staticElemCount = true;
+ } catch (final Exception e ) {}
+ if( !_constElemCount ) {
+ // check for const length field
+ if( elemCountExpr.startsWith("get") && elemCountExpr.endsWith("()") ) {
+ final String lenFieldName = decapitalizeString( elemCountExpr.substring(3, elemCountExpr.length()-2) );
+ final Field lenField = structCType.getField(lenFieldName);
+ if( null != lenField ) {
+ _constElemCount = lenField.getType().isConst();
}
+ LOG.log(INFO, structCType.getASTLocusTag(),
+ unit.className+": elemCountExpr "+elemCountExpr+", lenFieldName "+lenFieldName+" -> "+lenField.toString()+", isConst "+_constElemCount);
}
}
constElemCount = _constElemCount;
+ if( constElemCount ) {
+ ownership = Ownership.Native;
+ } else {
+ ownership = Ownership.Mixed;
+ }
staticElemCount = _staticElemCount;
}
}
if( null == elemCountExpr ) {
- final String msg = "SKIP unsized array in struct: "+returnSizeLookupName+": "+fieldType.getDebugString();
+ final String msg = "SKIP unsized array in struct: "+returnSizeLookupName+": "+fieldType.getSignature(null).toString();
unit.emitln(" // "+msg);
unit.emitln();
LOG.log(WARNING, structCType.getASTLocusTag(), msg);
@@ -1570,7 +1711,15 @@ public class JavaEmitter implements GlueEmitter {
}
maxOneElement = _maxOneElement;
if( GlueGen.debug() ) {
- System.err.printf("SE.ac.%02d: baseCType %s%n", (i+1), baseCElemType.getDebugString());
+ System.err.printf("SE.ac.%02d: baseCType ownership %s, %s%n", (i+1), ownership, baseCElemType.getSignature(null).toString());
+ }
+
+ if( !baseCElemType.hasSize() ) { // like 'void*' -> 'void'
+ final String msg = "SKIP unsized field in struct: "+returnSizeLookupName+": fieldType "+fieldType.getSignature(null).toString()+", baseType "+baseCElemType.getSignature(null).toString();
+ unit.emitln(" // "+msg);
+ unit.emitln();
+ LOG.log(WARNING, structCType.getASTLocusTag(), msg);
+ return;
}
isPrimitive = baseCElemType.isPrimitive();
@@ -1583,16 +1732,8 @@ public class JavaEmitter implements GlueEmitter {
fieldType.getASTLocusTag(), e);
}
baseJElemTypeName = baseJElemType.getName();
- primCElemFixedSize = isPrimitive ? baseCElemType.getSize().hasFixedNativeSize() : true;
+ primCElemFixedSize = isPrimitive ? baseCElemType.getSize().hasFixedNativeSize() : false;
baseCElemSizeDenominator = baseCElemType.isPointer() ? "pointer" : baseJElemTypeName ;
-
- if( !primCElemFixedSize ) {
- final String msg = "SKIP primitive w/ platform dependent sized type in struct: "+returnSizeLookupName+": "+fieldType.getDebugString();
- unit.emitln(" // "+msg);
- unit.emitln();
- LOG.log(WARNING, structCType.getASTLocusTag(), msg);
- return;
- }
}
if( GlueGen.debug() ) {
System.err.printf("SE.ac.%02d: baseJElemType %s%n", (i+1), (null != baseJElemType ? baseJElemType.getDebugString() : null));
@@ -1615,16 +1756,17 @@ public class JavaEmitter implements GlueEmitter {
primJElemTypeBufferName = primJElemTypeBufferClazz.getSimpleName();
primElemSize = Buffers.sizeOfBufferElem(primJElemTypeBufferClazz);
isByteBuffer = null != primJElemTypeBufferClazz ? ByteBuffer.class.isAssignableFrom(primJElemTypeBufferClazz) : false;
+ if( primCElemFixedSize ) {
+ primElemSizeExpr = String.valueOf(primElemSize);
+ } else {
+ primElemSizeExpr = "md."+baseCElemSizeDenominator+"SizeInBytes()";
+ }
} else {
primJElemTypeBufferClazz = null;
primJElemTypeBufferName = null;
primElemSize = 0;
isByteBuffer = false;
- }
- if( primCElemFixedSize ) {
- primElemSizeExpr = String.valueOf(primElemSize);
- } else {
- primElemSizeExpr = "md."+baseCElemSizeDenominator+"SizeInBytes()";
+ primElemSizeExpr = null;
}
final String capitalFieldName = capitalizeString(fieldName);
@@ -1651,10 +1793,10 @@ public class JavaEmitter implements GlueEmitter {
}
if( GlueGen.debug() ) {
System.err.printf("SE.ac.%02d: baseJElemTypeName %s%n", (i+1), baseJElemTypeName);
- System.err.printf("SE.ac.%02d: elemCountExpr: %s (const %b), ownArrayLen %b, maxOneElement %b, "+
+ System.err.printf("SE.ac.%02d: elemCountExpr: %s (const %b, ownership %s), ownArrayLenCpde %b, maxOneElement %b, "+
"Primitive[buffer %s, fixedSize %b, elemSize %d, sizeDenom %s, sizeExpr %s, isByteBuffer %b], "+
"isString[%b, only %b, strnlen %b], isPointer %b, isPrimitive %b, isOpaque %b, constVal %b, immutableAccess %b%n",
- (i+1), elemCountExpr, constElemCount, ownElemCountHandling, maxOneElement,
+ (i+1), elemCountExpr, constElemCount, ownership, ownElemCountHandling, maxOneElement,
primJElemTypeBufferName, primCElemFixedSize, primElemSize, baseCElemSizeDenominator, primElemSizeExpr, isByteBuffer,
isString, isStringOnly, useGetCStringLength,
isPointer, isPrimitive, isOpaque, isConstValue, immutableAccess);
@@ -1665,20 +1807,21 @@ public class JavaEmitter implements GlueEmitter {
//
if( ownElemCountHandling ) {
if( constElemCount ) {
- generateGetterSignature(unit, fieldType, staticElemCount, false, "int", fieldName, capitalFieldName+"ElemCount", null, constElemCount, elemCountExpr);
+ generateGetterSignature(unit, staticElemCount, false, fieldName, fieldType, ownership, "int", capitalFieldName+"ElemCount", null, constElemCount, maxOneElement, elemCountExpr, GetElemCountApiDocTail);
unit.emitln(" { return "+elemCountExpr+"; }");
} else if( useGetCStringLength ) {
- generateGetterSignature(unit, fieldType, staticElemCount, false, "int", fieldName, capitalFieldName+"ElemCount", null, constElemCount, elemCountExpr);
+ generateGetterSignature(unit, staticElemCount, false, fieldName, fieldType, ownership, "int", capitalFieldName+"ElemCount", null, constElemCount, maxOneElement, elemCountExpr, GetElemCountApiDocTail);
unit.emitln(" {");
unit.emitln(" final long pString = PointerBuffer.wrap( accessor.slice(" + fieldName+"_offset[mdIdx], PointerBuffer.POINTER_SIZE) ).get(0);");
unit.emitln(" return 0 != pString ? "+elemCountExpr+" : 0;");
unit.emitln(" }");
} else {
unit.emitln(" private int _"+fieldName+"ArrayLen = "+elemCountExpr+"; // "+(constElemCount ? "const" : "initial")+" array length");
- generateGetterSignature(unit, fieldType, staticElemCount, false, "int", fieldName, capitalFieldName+"ElemCount", null, constElemCount, elemCountExpr);
+ generateGetterSignature(unit, staticElemCount, false, fieldName, fieldType, ownership, "int", capitalFieldName+"ElemCount", null, constElemCount, maxOneElement, elemCountExpr, GetElemCountApiDocTail);
unit.emitln(" { return _"+fieldName+"ArrayLen; }");
if( !immutableAccess ) {
- generateSetterSignature(unit, fieldType, MethodAccess.PRIVATE, staticElemCount, false, "void", fieldName, capitalFieldName+"ElemCount", null, "int", null, constElemCount, elemCountExpr);
+ generateSetterSignature(unit, MethodAccess.PRIVATE, staticElemCount, false, fieldName, fieldType, ownership, "void", capitalFieldName+"ElemCount", null, "int",
+ null, constElemCount, maxOneElement, elemCountExpr, null, null);
unit.emitln(" { _"+fieldName+"ArrayLen = src; }");
}
}
@@ -1687,13 +1830,13 @@ public class JavaEmitter implements GlueEmitter {
// Null query for pointer
if( isPointer ) {
- generateIsNullSignature(unit, fieldType, false, false, fieldName, capitalFieldName, constElemCount, elemCountExpr);
+ generateIsNullSignature(unit, false, fieldName, fieldType, ownership, capitalFieldName, constElemCount, maxOneElement, elemCountExpr);
unit.emitln(" {");
unit.emitln(" return 0 == PointerBuffer.wrap(getBuffer(), "+fieldName+"_offset[mdIdx], 1).get(0);");
unit.emitln(" }");
unit.emitln();
if( !constElemCount && !immutableAccess ) {
- generateReleaseSignature(unit, fieldType, false, containingJTypeName, fieldName, capitalFieldName, constElemCount, elemCountExpr);
+ generateReleaseSignature(unit, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, constElemCount, maxOneElement, elemCountExpr);
unit.emitln(" {");
unit.emitln(" accessor.setLongAt("+fieldName+"_offset[mdIdx], 0, md.pointerSizeInBytes()); // write nullptr");
unit.emitln(" _eb"+capitalFieldName+" = null;");
@@ -1708,22 +1851,26 @@ public class JavaEmitter implements GlueEmitter {
// Setter
if( immutableAccess ) {
- generateSetterAPIDoc(unit, "SKIP setter for immutable", fieldType, fieldName, constElemCount, elemCountExpr);
+ generateArrayFieldNote(unit, " /** SKIP setter for immutable", " */", fieldName, fieldType, ownership, constElemCount, maxOneElement, elemCountExpr, false, false);
unit.emitln();
- } else if( isPointer && isConstValue && constElemCount ) {
- generateSetterAPIDoc(unit, "SKIP setter for constValue constElemCount Pointer w/ native ownership", fieldType, fieldName, constElemCount, elemCountExpr);
+ } else if( isPointer && isConstValue && ( Ownership.Native == ownership || constElemCount ) ) {
+ generateArrayFieldNote(unit, " /** SKIP setter for constValue constElemCount Pointer w/ native ownership", " */", fieldName, fieldType, ownership, constElemCount, maxOneElement, elemCountExpr, false, false);
unit.emitln();
} else if( !isPointer && isConstValue ) {
- generateSetterAPIDoc(unit, "SKIP setter for constValue Array", fieldType, fieldName, constElemCount, elemCountExpr);
+ generateArrayFieldNote(unit, " /** SKIP setter for constValue Array", " */", fieldName, fieldType, ownership, constElemCount, maxOneElement, elemCountExpr, false, false);
unit.emitln();
} else if( isPrimitive ) {
// Setter Primitive
if( maxOneElement ) {
// Setter Primitive Single Pointer + Array
if( isPointer ) {
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, null, baseJElemTypeName, null, constElemCount, elemCountExpr);
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, null, baseJElemTypeName,
+ null, constElemCount, maxOneElement, elemCountExpr, null, null);
if( isConstValue ) {
- // constElemCount excluded: SKIP setter for constValue constElemCount Pointer w/ native ownership
+ // constElemCount/Ownership.Native excluded: SKIP setter for constValue constElemCount Pointer w/ native ownership
+ if( Ownership.Native == ownership ) {
+ throw new InternalError("Native ownership but adding potential memory-replacement for '"+returnSizeLookupName+"': "+fieldType.getSignature(null).toString());
+ }
unit.emitln(" {");
unit.emitln(" final ElementBuffer eb = ElementBuffer.allocateDirect("+primElemSizeExpr+", 1);");
unit.emit (" eb.getByteBuffer()");
@@ -1747,8 +1894,9 @@ public class JavaEmitter implements GlueEmitter {
}
unit.emitln(".put(0, src);");
unit.emitln(" } else {");
- if( constElemCount ) {
- unit.emitln(" throw new RuntimeException(\"Primitive '"+fieldName+"' of constElemCount and maxOneElement has elemCount \"+elemCount);");
+ if( constElemCount || Ownership.Native == ownership ) {
+ unit.emitln(" throw new RuntimeException(\"Primitive '"+fieldName+"' of "+ownership+" ownership and maxOneElement has "
+ +(constElemCount?"const":"")+"elemCount \"+elemCount);");
unit.emitln(" }");
unit.emitln(" return this;");
unit.emitln(" }");
@@ -1768,7 +1916,8 @@ public class JavaEmitter implements GlueEmitter {
}
}
} else { // array && !isConstValue
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, null, baseJElemTypeName, null, constElemCount, elemCountExpr);
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, null, baseJElemTypeName,
+ null, constElemCount, maxOneElement, elemCountExpr, null, null);
unit.emitln(" {");
unit.emitln(" ElementBuffer.wrap("+primElemSizeExpr+", 1, getBuffer(), "+fieldName+"_offset[mdIdx])");
unit.emit (" .getByteBuffer()");
@@ -1785,13 +1934,15 @@ public class JavaEmitter implements GlueEmitter {
boolean doneString = false;
if( isString && isByteBuffer && isPointer ) { // isConst is OK
- // isConst && constElemCount excluded: SKIP setter for constValue constElemCount Pointer w/ native ownership
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, null, "String", null, constElemCount, elemCountExpr);
+ // isConst && constElemCount/Ownership.Native excluded: SKIP setter for constValue constElemCount Pointer w/ native ownership
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, null, "String",
+ null, constElemCount, maxOneElement, elemCountExpr, null, null);
unit.emitln(" {");
unit.emitln(" final byte[] srcBytes = src.getBytes(_charset);");
- if( constElemCount ) {
+ if( constElemCount || Ownership.Native == ownership ) {
unit.emitln(" final int elemCount = "+getElemCountFuncExpr+";");
- unit.emitln(" if( srcBytes.length + 1 != elemCount ) { throw new IllegalArgumentException(\"strlen+1 \"+(srcBytes.length+1)+\" != const elemCount \"+elemCount); };");
+ unit.emitln(" if( srcBytes.length + 1 != elemCount ) { throw new IllegalArgumentException(\"strlen+1 \"+(srcBytes.length+1)+\" != "
+ +(constElemCount?"const":"")+" elemCount \"+elemCount+\" of "+ownership+" ownership\"); };");
unit.emitln(" final ElementBuffer eb = ElementBuffer.derefPointer("+primElemSizeExpr+", elemCount, getBuffer(), "+fieldName+"_offset[mdIdx]);");
} else {
unit.emitln(" final ElementBuffer eb = ElementBuffer.allocateDirect("+primElemSizeExpr+", srcBytes.length + 1);");
@@ -1808,30 +1959,34 @@ public class JavaEmitter implements GlueEmitter {
doneString = true;
}
if( doneString && isStringOnly ) {
- generateSetterAPIDoc(unit, "SKIP setter for String alternative (ByteBuffer)", fieldType, fieldName, constElemCount, elemCountExpr);
+ generateArrayFieldNote(unit, " /** SKIP setter for String alternative (ByteBuffer)", " */", fieldName, fieldType, ownership, constElemCount, maxOneElement, elemCountExpr, false, false);
} else if( isConstValue ) {
if( isPointer ) {
- // constElemCount excluded: SKIP setter for constValue constElemCount Pointer w/ native ownership
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, null, baseJElemTypeName+"[]", SetArrayArgs, constElemCount, elemCountExpr);
+ // constElemCount/Ownership.Native excluded: SKIP setter for constValue constElemCount Pointer w/ native ownership
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, null,
+ baseJElemTypeName+"[]", SetReplaceArrayArgsPost, constElemCount, maxOneElement, elemCountExpr, SetReplaceArrayApiDocDetail, SetReplaceArrayApiDocArgs);
+ if( Ownership.Native == ownership ) {
+ throw new InternalError("Native ownership but adding potential memory-replacement for '"+returnSizeLookupName+"': "+fieldType.getSignature(null).toString());
+ }
unit.emitln(" {");
- unit.emitln(SetArrayArgsCheck);
- unit.emitln(" final int newElemCount = destPos + length;");
- unit.emitln(" final ElementBuffer eb = ElementBuffer.allocateDirect("+primElemSizeExpr+", newElemCount);");
- unit.emit (" ( ( "+primJElemTypeBufferName+")(eb.getByteBuffer()");
+ unit.emitln(SetReplaceArrayArgsCheck);
+ unit.emitln(" final ElementBuffer eb = ElementBuffer.allocateDirect("+primElemSizeExpr+", length);");
+ unit.emit (" eb.getByteBuffer()");
if( !isByteBuffer ) {
unit.emit(".as"+primJElemTypeBufferName+"()");
}
- unit.emitln(".position(destPos) ) ).put(src, srcPos, length).rewind();");
+ unit.emitln(".put(src, srcPos, length).rewind();");
unit.emitln(" eb.storeDirectAddress(getBuffer(), "+fieldName+"_offset[mdIdx]);");
unit.emitln(" _eb"+capitalFieldName+" = eb;");
- emitSetElemCount(unit, setElemCountLengthFunc, "newElemCount", !useGetCStringLength, capitalFieldName, structCType, " ");
+ emitSetElemCount(unit, setElemCountLengthFunc, "length", !useGetCStringLength, capitalFieldName, structCType, " ");
unit.emitln(" return this;");
unit.emitln(" }");
} // else SKIP setter for constValue Array
} else if( constElemCount || !isPointer ) {
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, null, baseJElemTypeName+"[]", SetArrayArgs, constElemCount, elemCountExpr);
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, null,
+ baseJElemTypeName+"[]", SetSubArrayArgsPost, constElemCount, maxOneElement, elemCountExpr, SetSubArrayApiDocDetail, SetSubArrayApiDocArgs);
unit.emitln(" {");
- unit.emitln(SetArrayArgsCheck);
+ unit.emitln(SetSubArrayArgsCheck);
unit.emitln(" final int elemCount = "+getElemCountFuncExpr+";");
unit.emitln(" if( destPos + length > elemCount ) { throw new IndexOutOfBoundsException(\"destPos \"+destPos+\" + length \"+length+\" > elemCount \"+elemCount); };");
if( isPointer ) {
@@ -1839,33 +1994,48 @@ public class JavaEmitter implements GlueEmitter {
} else {
unit.emitln(" final ElementBuffer eb = ElementBuffer.wrap("+primElemSizeExpr+", elemCount, getBuffer(), "+fieldName+"_offset[mdIdx]);");
}
- unit.emit (" ( ( "+primJElemTypeBufferName+")(eb.getByteBuffer()");
+ unit.emit (" ( ("+primJElemTypeBufferName+") eb.getByteBuffer()");
if( !isByteBuffer ) {
unit.emit(".as"+primJElemTypeBufferName+"()");
}
- unit.emitln(".position(destPos) ) ).put(src, srcPos, length).rewind();");
+ unit.emitln(".position(destPos) ).put(src, srcPos, length).rewind();");
unit.emitln(" return this;");
unit.emitln(" }");
} else /* if( !constElemCount && isPointer ) */ {
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, null, baseJElemTypeName+"[]", SetArrayArgs, constElemCount, elemCountExpr);
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, SetArrayArgsPre,
+ baseJElemTypeName+"[]", SetArrayArgsPost, constElemCount, maxOneElement, elemCountExpr, SetArrayApiDocDetail, SetArrayApiDocArgs);
+ if( Ownership.Native == ownership ) {
+ throw new InternalError("Native ownership but adding potential memory-replacement for '"+returnSizeLookupName+"': "+fieldType.getSignature(null).toString());
+ }
unit.emitln(" {");
unit.emitln(SetArrayArgsCheck);
unit.emitln(" final int elemCount = "+getElemCountFuncExpr+";");
- unit.emitln(" if( destPos + length <= elemCount ) {");
+ unit.emitln(" if( subset || destPos + length == elemCount ) {");
+ unit.emitln(" if( destPos + length > elemCount ) { throw new IndexOutOfBoundsException(\"subset \"+subset+\", destPos \"+destPos+\" + length \"+length+\" > elemCount \"+elemCount); };");
unit.emitln(" final ElementBuffer eb = ElementBuffer.derefPointer("+primElemSizeExpr+", elemCount, getBuffer(), "+fieldName+"_offset[mdIdx]);");
- unit.emit (" ( ( "+primJElemTypeBufferName+")(eb.getByteBuffer()");
+ unit.emit (" ( ("+primJElemTypeBufferName+") eb.getByteBuffer()");
if( !isByteBuffer ) {
unit.emit(".as"+primJElemTypeBufferName+"()");
}
- unit.emitln(".position(destPos) ) ).put(src, srcPos, length).rewind();");
+ unit.emitln(".position(destPos) ).put(src, srcPos, length).rewind();");
unit.emitln(" } else {");
unit.emitln(" final int newElemCount = destPos + length;");
unit.emitln(" final ElementBuffer eb = ElementBuffer.allocateDirect("+primElemSizeExpr+", newElemCount);");
- unit.emit (" ( ( "+primJElemTypeBufferName+")(eb.getByteBuffer()");
+ unit.emit (" final "+primJElemTypeBufferName+" ebBB = eb.getByteBuffer()");
if( !isByteBuffer ) {
unit.emit(".as"+primJElemTypeBufferName+"()");
}
- unit.emitln(".position(destPos) ) ).put(src, srcPos, length).rewind();");
+ unit.emitln(";");
+ unit.emitln(" if( 0 < destPos ) {");
+ unit.emitln(" final ElementBuffer pre_eb = ElementBuffer.derefPointer("+primElemSizeExpr+", elemCount, getBuffer(), "+fieldName+"_offset[mdIdx]);");
+ unit.emit (" final "+primJElemTypeBufferName+" pre_ebBB = ("+primJElemTypeBufferName+") pre_eb.getByteBuffer()");
+ if( !isByteBuffer ) {
+ unit.emit(".as"+primJElemTypeBufferName+"()");
+ }
+ unit.emitln(".position(0).limit(destPos);");
+ unit.emitln(" ebBB.put(pre_ebBB);");
+ unit.emitln(" }");
+ unit.emitln(" ebBB.put(src, srcPos, length).rewind();");
unit.emitln(" eb.storeDirectAddress(getBuffer(), "+fieldName+"_offset[mdIdx]);");
unit.emitln(" _eb"+capitalFieldName+" = eb;");
emitSetElemCount(unit, setElemCountLengthFunc, "newElemCount", !useGetCStringLength, capitalFieldName, structCType, " ");
@@ -1880,9 +2050,13 @@ public class JavaEmitter implements GlueEmitter {
if( maxOneElement ) {
// Setter Struct Single Pointer + Array
if( isPointer ) {
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, null, baseJElemTypeName, null, constElemCount, elemCountExpr);
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, null, baseJElemTypeName,
+ null, constElemCount, maxOneElement, elemCountExpr, null, null);
if( isConstValue ) {
- // constElemCount excluded: SKIP setter for constValue constElemCount Pointer w/ native ownership
+ // constElemCount/Ownership.Native excluded: SKIP setter for constValue constElemCount Pointer w/ native ownership
+ if( Ownership.Native == ownership ) {
+ throw new InternalError("Native ownership but adding potential memory-replacement for '"+returnSizeLookupName+"': "+fieldType.getSignature(null).toString());
+ }
unit.emitln(" {");
unit.emitln(" final ElementBuffer eb = ElementBuffer.allocateDirect("+baseJElemTypeName+".size(), 1);");
unit.emitln(" eb.put(0, src.getBuffer());");
@@ -1898,8 +2072,9 @@ public class JavaEmitter implements GlueEmitter {
unit.emitln(" ElementBuffer.derefPointer("+baseJElemTypeName+".size(), 1, getBuffer(), "+fieldName+"_offset[mdIdx])");
unit.emitln(" .put(0, src.getBuffer());");
unit.emitln(" } else {");
- if( constElemCount ) {
- unit.emitln(" throw new RuntimeException(\"Primitive '"+fieldName+"' of constElemCount and maxOneElement has elemCount \"+elemCount);");
+ if( constElemCount || Ownership.Native == ownership ) {
+ unit.emitln(" throw new RuntimeException(\"Primitive '"+fieldName+"' of "+ownership+" ownership and maxOneElement has "
+ +(constElemCount?"const":"")+"elemCount \"+elemCount);");
unit.emitln(" }");
unit.emitln(" return this;");
unit.emitln(" }");
@@ -1915,7 +2090,8 @@ public class JavaEmitter implements GlueEmitter {
}
}
} else if( !isConstValue ) { // array && !isConstValue
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, null, baseJElemTypeName, null, constElemCount, elemCountExpr);
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, null, baseJElemTypeName,
+ null, constElemCount, maxOneElement, elemCountExpr, null, null);
unit.emitln(" {");
unit.emitln(" ElementBuffer.wrap("+baseJElemTypeName+".size(), 1, getBuffer(), "+fieldName+"_offset[mdIdx])");
unit.emitln(" .put(0, src.getBuffer());");
@@ -1927,25 +2103,29 @@ public class JavaEmitter implements GlueEmitter {
// Setter Struct n Pointer + Array
if( isConstValue ) {
if( isPointer ) {
- // constElemCount excluded: SKIP setter for constValue constElemCount Pointer w/ native ownership
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, null, baseJElemTypeName+"[]", SetArrayArgs, constElemCount, elemCountExpr);
+ // constElemCount/Ownership.Native excluded: SKIP setter for constValue constElemCount Pointer w/ native ownership
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, null,
+ baseJElemTypeName+"[]", SetReplaceArrayArgsPost, constElemCount, maxOneElement, elemCountExpr, SetReplaceArrayApiDocDetail, SetReplaceArrayApiDocArgs);
+ if( Ownership.Native == ownership ) {
+ throw new InternalError("Native ownership but adding potential memory-replacement for '"+returnSizeLookupName+"': "+fieldType.getSignature(null).toString());
+ }
unit.emitln(" {");
- unit.emitln(SetArrayArgsCheck);
- unit.emitln(" final int newElemCount = destPos + length;");
- unit.emitln(" final ElementBuffer eb = ElementBuffer.allocateDirect("+baseJElemTypeName+".size(), newElemCount);");
+ unit.emitln(SetReplaceArrayArgsCheck);
+ unit.emitln(" final ElementBuffer eb = ElementBuffer.allocateDirect("+baseJElemTypeName+".size(), length);");
unit.emitln(" for(int i=0; i<length; ++i) {");
- unit.emitln(" eb.put(destPos+i, src[srcPos+i].getBuffer());");
+ unit.emitln(" eb.put(i, src[srcPos+i].getBuffer());");
unit.emitln(" }");
unit.emitln(" eb.storeDirectAddress(getBuffer(), "+fieldName+"_offset[mdIdx]);");
unit.emitln(" _eb"+capitalFieldName+" = eb;");
- emitSetElemCount(unit, setElemCountLengthFunc, "newElemCount", !useGetCStringLength, capitalFieldName, structCType, " ");
+ emitSetElemCount(unit, setElemCountLengthFunc, "length", !useGetCStringLength, capitalFieldName, structCType, " ");
unit.emitln(" return this;");
unit.emitln(" }");
} // else SKIP setter for constValue Array
} else if( constElemCount || !isPointer ) {
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, null, baseJElemTypeName+"[]", SetArrayArgs, constElemCount, elemCountExpr);
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, null,
+ baseJElemTypeName+"[]", SetSubArrayArgsPost, constElemCount, maxOneElement, elemCountExpr, SetSubArrayApiDocDetail, SetSubArrayApiDocArgs);
unit.emitln(" {");
- unit.emitln(SetArrayArgsCheck);
+ unit.emitln(SetSubArrayArgsCheck);
unit.emitln(" final int elemCount = "+getElemCountFuncExpr+";");
unit.emitln(" if( destPos + length > elemCount ) { throw new IndexOutOfBoundsException(\"destPos \"+destPos+\" + length \"+length+\" > elemCount \"+elemCount); };");
if( isPointer ) {
@@ -1959,11 +2139,16 @@ public class JavaEmitter implements GlueEmitter {
unit.emitln(" return this;");
unit.emitln(" }");
} else /* if( !constElemCount && isPointer ) */ {
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, null, baseJElemTypeName+"[]", SetArrayArgs, constElemCount, elemCountExpr);
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, SetArrayArgsPre,
+ baseJElemTypeName+"[]", SetArrayArgsPost, constElemCount, maxOneElement, elemCountExpr, SetArrayApiDocDetail, SetArrayApiDocArgs);
+ if( Ownership.Native == ownership ) {
+ throw new InternalError("Native ownership but adding potential memory-replacement for '"+returnSizeLookupName+"': "+fieldType.getSignature(null).toString());
+ }
unit.emitln(" {");
unit.emitln(SetArrayArgsCheck);
unit.emitln(" final int elemCount = "+getElemCountFuncExpr+";");
- unit.emitln(" if( destPos + length <= elemCount ) {");
+ unit.emitln(" if( subset || destPos + length == elemCount ) {");
+ unit.emitln(" if( destPos + length > elemCount ) { throw new IndexOutOfBoundsException(\"subset \"+subset+\", destPos \"+destPos+\" + length \"+length+\" > elemCount \"+elemCount); };");
unit.emitln(" final ElementBuffer eb = ElementBuffer.derefPointer("+baseJElemTypeName+".size(), elemCount, getBuffer(), "+fieldName+"_offset[mdIdx]);");
unit.emitln(" for(int i=0; i<length; ++i) {");
unit.emitln(" eb.put(destPos+i, src[srcPos+i].getBuffer());");
@@ -1971,6 +2156,11 @@ public class JavaEmitter implements GlueEmitter {
unit.emitln(" } else {");
unit.emitln(" final int newElemCount = destPos + length;");
unit.emitln(" final ElementBuffer eb = ElementBuffer.allocateDirect("+baseJElemTypeName+".size(), newElemCount);");
+
+ unit.emitln(" if( 0 < destPos ) {");
+ unit.emitln(" final ElementBuffer pre_eb = ElementBuffer.derefPointer("+baseJElemTypeName+".size(), elemCount, getBuffer(), "+fieldName+"_offset[mdIdx]);");
+ unit.emitln(" eb.put(pre_eb.getByteBuffer(), 0, 0, destPos);");
+ unit.emitln(" }");
unit.emitln(" for(int i=0; i<length; ++i) {");
unit.emitln(" eb.put(destPos+i, src[srcPos+i].getBuffer());");
unit.emitln(" }");
@@ -1983,7 +2173,8 @@ public class JavaEmitter implements GlueEmitter {
}
unit.emitln();
if( !isConstValue ) {
- generateSetterSignature(unit, fieldType, accessMod, false, false, containingJTypeName, fieldName, capitalFieldName, "final int destPos", baseJElemTypeName, null, constElemCount, elemCountExpr);
+ generateSetterSignature(unit, accessMod, false, false, fieldName, fieldType, ownership, containingJTypeName, capitalFieldName, "final int destPos", baseJElemTypeName,
+ null, constElemCount, maxOneElement, elemCountExpr, null, null);
unit.emitln(" {");
unit.emitln(" final int elemCount = "+getElemCountFuncExpr+";");
unit.emitln(" if( destPos + 1 > elemCount ) { throw new IndexOutOfBoundsException(\"destPos \"+destPos+\" + 1 > elemCount \"+elemCount); };");
@@ -2004,7 +2195,8 @@ public class JavaEmitter implements GlueEmitter {
if( isPrimitive ) {
// Getter Primitive Pointer + Array
if( maxOneElement ) {
- generateGetterSignature(unit, fieldType, false, false, baseJElemTypeName, fieldName, capitalFieldName, null, constElemCount, elemCountExpr);
+ generateGetterSignature(unit, false, false, fieldName, fieldType, ownership, baseJElemTypeName, capitalFieldName,
+ null, constElemCount, maxOneElement, elemCountExpr, GetElemValueApiDocTail);
unit.emitln(" {");
if( isPointer ) {
unit.emitln(" return ElementBuffer.derefPointer("+primElemSizeExpr+", 1, getBuffer(), "+fieldName+"_offset[mdIdx])");
@@ -2021,7 +2213,8 @@ public class JavaEmitter implements GlueEmitter {
} else {
boolean doneString = false;
if( isString && isByteBuffer ) {
- generateGetterSignature(unit, fieldType, false, false, "String", fieldName, capitalFieldName+(isStringOnly?"":"AsString"), null, constElemCount, elemCountExpr);
+ generateGetterSignature(unit, false, false, fieldName, fieldType, ownership, "String", capitalFieldName+(isStringOnly?"":"AsString"),
+ null, constElemCount, maxOneElement, elemCountExpr, GetElemValueApiDocTail);
unit.emitln(" {");
unit.emitln(" final int elemCount = "+getElemCountFuncExpr+";");
if( isPointer ) {
@@ -2041,10 +2234,11 @@ public class JavaEmitter implements GlueEmitter {
doneString = true;
}
if( doneString && isStringOnly ) {
- generateSetterAPIDoc(unit, "SKIP getter for String alternative (ByteBuffer)", fieldType, fieldName, constElemCount, elemCountExpr);
+ generateArrayFieldNote(unit, " /** SKIP getter for String alternative (ByteBuffer)", " */", fieldName, fieldType, ownership, constElemCount, maxOneElement, elemCountExpr, false, false);
unit.emitln();
} else {
- generateGetterSignature(unit, fieldType, false, false, primJElemTypeBufferName, fieldName, capitalFieldName, null, constElemCount, elemCountExpr);
+ generateGetterSignature(unit, false, false, fieldName, fieldType, ownership, primJElemTypeBufferName, capitalFieldName,
+ null, constElemCount, maxOneElement, elemCountExpr, GetElemValueApiDocTail);
unit.emitln(" {");
if( isPointer ) {
unit.emitln(" return ElementBuffer.derefPointer("+primElemSizeExpr+", "+getElemCountFuncExpr+", getBuffer(), "+fieldName+"_offset[mdIdx])");
@@ -2060,7 +2254,8 @@ public class JavaEmitter implements GlueEmitter {
unit.emitln();
}
if( !doneString ) {
- generateGetterSignature(unit, fieldType, false, false, baseJElemTypeName+"[]", fieldName, capitalFieldName, "final int srcPos, "+baseJElemTypeName+" dest[], "+GetArrayArgs, constElemCount, elemCountExpr);
+ generateGetterSignature(unit, false, false, fieldName, fieldType, ownership, baseJElemTypeName+"[]", capitalFieldName,
+ "final int srcPos, "+baseJElemTypeName+" dest[], "+GetArrayArgs, constElemCount, maxOneElement, elemCountExpr, GetElemValueApiDocTail);
unit.emitln(" {");
unit.emitln(GetArrayArgsCheck);
unit.emitln(" final int elemCount = "+getElemCountFuncExpr+";");
@@ -2084,7 +2279,8 @@ public class JavaEmitter implements GlueEmitter {
} else {
// Getter Struct Pointer + Array
if( maxOneElement ) {
- generateGetterSignature(unit, fieldType, false, false, baseJElemTypeName, fieldName, capitalFieldName, null, constElemCount, elemCountExpr);
+ generateGetterSignature(unit, false, false, fieldName, fieldType, ownership, baseJElemTypeName, capitalFieldName,
+ null, constElemCount, maxOneElement, elemCountExpr, GetElemValueApiDocTail);
unit.emitln(" {");
unit.emitln(" return "+baseJElemTypeName+".create(");
if( isPointer ) {
@@ -2095,7 +2291,8 @@ public class JavaEmitter implements GlueEmitter {
unit.emitln(" }");
unit.emitln();
} else {
- generateGetterSignature(unit, fieldType, false, false, baseJElemTypeName+"[]", fieldName, capitalFieldName, "final int srcPos, "+baseJElemTypeName+" dest[], "+GetArrayArgs, constElemCount, elemCountExpr);
+ generateGetterSignature(unit, false, false, fieldName, fieldType, ownership, baseJElemTypeName+"[]", capitalFieldName,
+ "final int srcPos, "+baseJElemTypeName+" dest[], "+GetArrayArgs, constElemCount, maxOneElement, elemCountExpr, GetElemValueApiDocTail);
unit.emitln(" {");
unit.emitln(GetArrayArgsCheck);
unit.emitln(" final int elemCount = "+getElemCountFuncExpr+";");