aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com')
-rw-r--r--src/java/com/sun/gluegen/CMethodBindingEmitter.java93
1 files changed, 46 insertions, 47 deletions
diff --git a/src/java/com/sun/gluegen/CMethodBindingEmitter.java b/src/java/com/sun/gluegen/CMethodBindingEmitter.java
index 784b2f9..91e3f99 100644
--- a/src/java/com/sun/gluegen/CMethodBindingEmitter.java
+++ b/src/java/com/sun/gluegen/CMethodBindingEmitter.java
@@ -380,6 +380,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
protected void emitBody(PrintWriter writer) {
writer.println(" {");
+// writer.println("printf(\" - - - - "+ getName() + getImplSuffix() +" - - - -\\n\");");
emitBodyVariableDeclarations(writer);
emitBodyUserVariableDeclarations(writer);
emitBodyVariablePreCallSetup(writer, false);
@@ -411,14 +412,14 @@ public class CMethodBindingEmitter extends FunctionEmitter
}
if (type.isArray() || type.isNIOBuffer() || type.isCompoundTypeWrapper() || type.isArrayOfCompoundTypeWrappers()) {
- String convName = pointerConversionArgumentName(i);
+ String javaArgName = binding.getArgumentName(i);
+ String convName = pointerConversionArgumentName(javaArgName);
// handle array/buffer argument types
boolean needsDataCopy =
emitPointerDeclaration(writer,
- binding.getJavaArgumentType(i),
+ type,
binding.getCArgumentType(i),
- convName,
- binding.getArgumentName(i));
+ convName, javaArgName);
if (needsDataCopy && !emittedDataCopyTemps) {
// emit loop counter and array length variables used during data
// copy
@@ -570,10 +571,10 @@ public class CMethodBindingEmitter extends FunctionEmitter
if (type.isCompoundTypeWrapper() ||
(type.isNIOBuffer() && !forIndirectBufferAndArrayImplementation)) {
+ String javaArgName = binding.getArgumentName(i);
emitPointerConversion(writer, binding, type,
- binding.getCArgumentType(i),
- binding.getArgumentName(i),
- pointerConversionArgumentName(i),
+ binding.getCArgumentType(i), javaArgName,
+ pointerConversionArgumentName(javaArgName),
byteOffsetArgName(i));
}
}
@@ -586,6 +587,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
if (javaArgType.isJNIEnv() || binding.isArgumentThisPointer(i)) {
continue;
}
+ String javaArgName = binding.getArgumentName(i);
if (javaArgType.isArray() ||
(javaArgType.isNIOBuffer() && forIndirectBufferAndArrayImplementation) ||
@@ -602,14 +604,14 @@ public class CMethodBindingEmitter extends FunctionEmitter
if (EMIT_NULL_CHECKS) {
writer.print(" if (");
- writer.print(binding.getArgumentName(i));
+ writer.print(javaArgName);
writer.println(" != NULL) {");
}
Type cArgType = binding.getCArgumentType(i);
String cArgTypeName = cArgType.getName();
- String convName = pointerConversionArgumentName(i);
+ String convName = pointerConversionArgumentName(javaArgName);
if (!needsDataCopy) {
writer.print(" ");
@@ -621,7 +623,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
}
writer.print(cArgTypeName);
writer.print(") (((char*) (*env)->GetPrimitiveArrayCritical(env, ");
- writer.print(binding.getArgumentName(i));
+ writer.print(javaArgName);
writer.println(", NULL)) + " + byteOffsetArgName(i) + ");");
//if(cargtypename is void*)
// _ptrX = ((char*)convName + index1*sizeof(thisArgsJavaType));
@@ -647,15 +649,14 @@ public class CMethodBindingEmitter extends FunctionEmitter
}
writer.println();
- writer.println(" /* Copy contents of " + binding.getArgumentName(i) +
- " into " + convName + "_copy */");
+ writer.println(" /* Copy contents of " + javaArgName + " into " + convName + "_copy */");
// get length of array being copied
String arrayLenName = "_tmpArrayLen";
writer.print(" ");
writer.print(arrayLenName);
writer.print(" = (*env)->GetArrayLength(env, ");
- writer.print(binding.getArgumentName(i));
+ writer.print(javaArgName);
writer.println(");");
// allocate an array to hold each element
@@ -678,7 +679,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
cArgElementType.getName(),
isConstPtrPtr(cArgPtrType),
arrayLenName,
- "Could not allocate buffer for copying data in argument \\\""+binding.getArgumentName(i)+"\\\"");
+ "Could not allocate buffer for copying data in argument \\\""+javaArgName+"\\\"");
// Get the handle for the byte offset array sent down for Buffers
// FIXME: not 100% sure this is correct with respect to the
@@ -696,9 +697,9 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer.println(" for (_copyIndex = 0; _copyIndex < "+arrayLenName+"; ++_copyIndex) {");
// get each array element
- writer.println(" /* get each element of the array argument \"" + binding.getArgumentName(i) + "\" */");
+ writer.println(" /* get each element of the array argument \"" + javaArgName + "\" */");
writer.print(" _tmpObj = (*env)->GetObjectArrayElement(env, ");
- writer.print(binding.getArgumentName(i));
+ writer.print(javaArgName);
writer.println(", _copyIndex);");
if (javaArgType.isStringArray()) {
@@ -740,12 +741,12 @@ public class CMethodBindingEmitter extends FunctionEmitter
cArgElementType.getTargetType().getName(), // assumes cArgPtrType is ptr-to-ptr-to-primitive !!
isConstPtrPtr(cArgPtrType),
"(*env)->GetArrayLength(env, _tmpObj)",
- "Could not allocate buffer during copying of data in argument \\\""+binding.getArgumentName(i)+"\\\"");
+ "Could not allocate buffer during copying of data in argument \\\""+javaArgName+"\\\"");
// FIXME: copy the data (use matched Get/ReleasePrimitiveArrayCritical() calls)
- if (true) throw new RuntimeException(
- "Cannot yet handle type \"" + cArgType.getName() +
- "\"; need to add support for copying ptr-to-ptr-to-primitiveType subarrays");
-
+ if (true) {
+ throw new RuntimeException("Cannot yet handle type \"" + cArgType.getName() +
+ "\"; need to add support for copying ptr-to-ptr-to-primitiveType subarrays");
+ }
}
writer.println(" }");
@@ -768,9 +769,8 @@ public class CMethodBindingEmitter extends FunctionEmitter
continue;
}
- emitGetStringChars(writer,
- binding.getArgumentName(i),
- STRING_CHARS_PREFIX + binding.getArgumentName(i),
+ emitGetStringChars(writer, javaArgName,
+ STRING_CHARS_PREFIX + javaArgName,
isUTF8Type(binding.getCArgumentType(i)),
false);
}
@@ -782,16 +782,17 @@ public class CMethodBindingEmitter extends FunctionEmitter
* Code to clean up any variables that were declared in
* emitBodyVariableDeclarations(), AFTER calling the actual C function.
*/
- protected void emitBodyVariablePostCallCleanup(PrintWriter writer,
- boolean emittingPrimitiveArrayCritical)
- {
+ protected void emitBodyVariablePostCallCleanup(PrintWriter writer, boolean emittingPrimitiveArrayCritical) {
+
// Release primitive arrays and temporary UTF8 strings if necessary
for (int i = 0; i < binding.getNumArguments(); i++) {
JavaType javaArgType = binding.getJavaArgumentType(i);
if (javaArgType.isJNIEnv() || binding.isArgumentThisPointer(i)) {
continue;
}
+
Type cArgType = binding.getCArgumentType(i);
+ String javaArgName = binding.getArgumentName(i);
if (javaArgType.isArray() ||
(javaArgType.isNIOBuffer() && forIndirectBufferAndArrayImplementation) ||
@@ -805,16 +806,16 @@ public class CMethodBindingEmitter extends FunctionEmitter
if (EMIT_NULL_CHECKS) {
writer.print(" if (");
- writer.print(binding.getArgumentName(i));
+ writer.print(javaArgName);
writer.println(" != NULL) {");
}
- String convName = pointerConversionArgumentName(i);
+ String convName = pointerConversionArgumentName(javaArgName);
if (!needsDataCopy) {
// Release array
writer.print(" (*env)->ReleasePrimitiveArrayCritical(env, ");
- writer.print(binding.getArgumentName(i));
+ writer.print(javaArgName);
writer.print(", ");
writer.print(convName);
writer.println(", 0);");
@@ -832,22 +833,21 @@ public class CMethodBindingEmitter extends FunctionEmitter
// method for details).
if (javaArgType.isArrayOfCompoundTypeWrappers()) {
// This is the only form of cleanup we handle right now
- String argName = binding.getArgumentName(i);
- writer.println(" _tmpArrayLen = (*env)->GetArrayLength(env, " + argName + ");");
+ writer.println(" _tmpArrayLen = (*env)->GetArrayLength(env, " + javaArgName + ");");
writer.println(" for (_copyIndex = 0; _copyIndex < _tmpArrayLen; ++_copyIndex) {");
- writer.println(" _tmpObj = (*env)->GetObjectArrayElement(env, " + argName + ", _copyIndex);");
+ writer.println(" _tmpObj = (*env)->GetObjectArrayElement(env, " + javaArgName + ", _copyIndex);");
// We only skip the copy back in limited situations
- String copyName = pointerConversionArgumentName(i) + "_copy";
+ String copyName = pointerConversionArgumentName(javaArgName) + "_copy";
writer.println(" if ((" + copyName + "[_copyIndex] == NULL && _tmpObj == NULL) ||");
writer.println(" (" + copyName + "[_copyIndex] != NULL && _tmpObj != NULL &&");
writer.println(" (*env)->GetDirectBufferAddress(env, _tmpObj) == " + copyName + "[_copyIndex])) {");
writer.println(" /* No copy back needed */");
writer.println(" } else {");
writer.println(" if (" + copyName + "[_copyIndex] == NULL) {");
- writer.println(" (*env)->SetObjectArrayElement(env, " + argName + ", _copyIndex, NULL);");
+ writer.println(" (*env)->SetObjectArrayElement(env, " + javaArgName + ", _copyIndex, NULL);");
writer.println(" } else {");
writer.println(" _tmpObj = (*env)->NewDirectByteBuffer(env, " + copyName + "[_copyIndex], sizeof(" + cArgType.getName() + "));");
- writer.println(" (*env)->SetObjectArrayElement(env, " + argName + ", _copyIndex, _tmpObj);");
+ writer.println(" (*env)->SetObjectArrayElement(env, " + javaArgName + ", _copyIndex, _tmpObj);");
writer.println(" }");
writer.println(" }");
writer.println(" }");
@@ -869,7 +869,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
writer.print(" ");
writer.print(arrayLenName);
writer.print(" = (*env)->GetArrayLength(env, ");
- writer.print(binding.getArgumentName(i));
+ writer.print(javaArgName);
writer.println(");");
// free each element
@@ -879,7 +879,6 @@ public class CMethodBindingEmitter extends FunctionEmitter
"Could not copy data for type \"" + cArgType +
"\"; currently only pointer types supported.");
}
- PointerType cArgElementType = cArgPtrType.getTargetType().asPointer();
// process each element in the array
writer.println(" for (_copyIndex = 0; _copyIndex < " + arrayLenName +"; ++_copyIndex) {");
@@ -887,7 +886,7 @@ public class CMethodBindingEmitter extends FunctionEmitter
// get each array element
writer.println(" /* free each element of " +convName +"_copy */");
writer.print(" _tmpObj = (*env)->GetObjectArrayElement(env, ");
- writer.print(binding.getArgumentName(i));
+ writer.print(javaArgName);
writer.println(", _copyIndex);");
if (javaArgType.isStringArray()) {
@@ -920,18 +919,18 @@ public class CMethodBindingEmitter extends FunctionEmitter
if (EMIT_NULL_CHECKS) {
writer.print(" if (");
- writer.print(binding.getArgumentName(i));
+ writer.print(javaArgName);
writer.println(" != NULL) {");
}
if (isUTF8Type(cArgType)) {
writer.print(" (*env)->ReleaseStringUTFChars(env, ");
- writer.print(binding.getArgumentName(i));
+ writer.print(javaArgName);
writer.print(", " + STRING_CHARS_PREFIX);
- writer.print(binding.getArgumentName(i));
+ writer.print(javaArgName);
writer.println(");");
} else {
- writer.println(" free((void*) " + STRING_CHARS_PREFIX + binding.getArgumentName(i) + ");");
+ writer.println(" free((void*) " + STRING_CHARS_PREFIX + javaArgName + ");");
}
if (EMIT_NULL_CHECKS) {
@@ -969,12 +968,12 @@ public class CMethodBindingEmitter extends FunctionEmitter
}
writer.print(cArgType.getName());
writer.print(") ");
- if (binding.getCArgumentType(i).isPointer() && binding.getJavaArgumentType(i).isPrimitive()) {
+ if (binding.getCArgumentType(i).isPointer() && javaArgType.isPrimitive()) {
writer.print("(intptr_t) ");
}
if (javaArgType.isArray() || javaArgType.isNIOBuffer() ||
javaArgType.isCompoundTypeWrapper() || javaArgType.isArrayOfCompoundTypeWrappers()) {
- writer.print(pointerConversionArgumentName(i));
+ writer.print(pointerConversionArgumentName(binding.getArgumentName(i)));
if (javaArgTypeNeedsDataCopy(javaArgType)) {
writer.print("_copy");
}
@@ -1521,8 +1520,8 @@ public class CMethodBindingEmitter extends FunctionEmitter
return argumentNames;
}
- protected String pointerConversionArgumentName(int i) {
- return "_ptr" + i;
+ protected String pointerConversionArgumentName(String argName) {
+ return "_" + argName + "_ptr";
}
/**