aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java')
-rw-r--r--src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java130
1 files changed, 86 insertions, 44 deletions
diff --git a/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java b/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java
index 6966315..d3fca14 100644
--- a/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java
+++ b/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java
@@ -40,14 +40,17 @@
package com.jogamp.gluegen;
import com.jogamp.gluegen.cgram.HeaderParser;
+import com.jogamp.gluegen.cgram.types.AliasedSymbol;
import com.jogamp.gluegen.cgram.types.ArrayType;
import com.jogamp.gluegen.cgram.types.EnumType;
+import com.jogamp.gluegen.cgram.types.FunctionSymbol;
import com.jogamp.gluegen.cgram.types.Type;
import java.io.PrintWriter;
import java.text.MessageFormat;
import java.util.Iterator;
import java.util.List;
+import java.util.Set;
/**
* An emitter that emits only the interface for a Java<->C JNI binding.
@@ -64,22 +67,22 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
protected final CommentEmitter defaultJavaCommentEmitter = new DefaultCommentEmitter();
protected final CommentEmitter defaultInterfaceCommentEmitter = new InterfaceCommentEmitter();
+ protected final boolean tagNativeBinding;
+ protected final boolean useNIODirectOnly;
+ protected final MethodBinding binding;
// Exception type raised in the generated code if runtime checks fail
private final String runtimeExceptionType;
private final String unsupportedExceptionType;
+ private final boolean useNIOOnly;
+ private final boolean isNativeMethod;
+ private final boolean isUnimplemented;
- protected boolean emitBody;
- protected boolean eraseBufferAndArrayTypes;
- protected boolean useNIOOnly;
- protected boolean useNIODirectOnly;
- protected boolean forImplementingMethodCall;
- protected boolean forDirectBufferImplementation;
- protected boolean forIndirectBufferAndArrayImplementation;
- protected boolean isUnimplemented;
- protected boolean tagNativeBinding;
-
- protected MethodBinding binding;
+ private boolean emitBody;
+ private boolean eraseBufferAndArrayTypes;
+ private boolean isPrivateNativeMethod;
+ private boolean forDirectBufferImplementation;
+ private boolean forIndirectBufferAndArrayImplementation;
// Manually-specified prologue and epilogue code
protected List<String> prologue;
@@ -97,9 +100,6 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
// represent an array of compound type wrappers
private static final String COMPOUND_ARRAY_SUFFIX = "_buf_array_copy";
- // Only present to provide more clear comments
- private final JavaConfiguration cfg;
-
public JavaMethodBindingEmitter(final MethodBinding binding,
final PrintWriter output,
final String runtimeExceptionType,
@@ -109,13 +109,13 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
final boolean eraseBufferAndArrayTypes,
final boolean useNIOOnly,
final boolean useNIODirectOnly,
- final boolean forImplementingMethodCall,
final boolean forDirectBufferImplementation,
final boolean forIndirectBufferAndArrayImplementation,
final boolean isUnimplemented,
final boolean isInterface,
- final JavaConfiguration configuration) {
- super(output, isInterface);
+ final boolean isNativeMethod,
+ final boolean isPrivateNativeMethod, final JavaConfiguration configuration) {
+ super(output, isInterface, configuration);
this.binding = binding;
this.runtimeExceptionType = runtimeExceptionType;
this.unsupportedExceptionType = unsupportedExceptionType;
@@ -124,16 +124,17 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
this.eraseBufferAndArrayTypes = eraseBufferAndArrayTypes;
this.useNIOOnly = useNIOOnly;
this.useNIODirectOnly = useNIODirectOnly;
- this.forImplementingMethodCall = forImplementingMethodCall;
this.forDirectBufferImplementation = forDirectBufferImplementation;
this.forIndirectBufferAndArrayImplementation = forIndirectBufferAndArrayImplementation;
this.isUnimplemented = isUnimplemented;
- if (forImplementingMethodCall) {
+ this.isNativeMethod = isNativeMethod;
+ this.isPrivateNativeMethod = isPrivateNativeMethod;
+ if (isPrivateNativeMethod) {
setCommentEmitter(defaultJavaCommentEmitter);
} else {
setCommentEmitter(defaultInterfaceCommentEmitter);
}
- cfg = configuration;
+ // !forImplementingMethodCall && !isInterface
}
public JavaMethodBindingEmitter(final JavaMethodBindingEmitter arg) {
@@ -146,7 +147,8 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
eraseBufferAndArrayTypes = arg.eraseBufferAndArrayTypes;
useNIOOnly = arg.useNIOOnly;
useNIODirectOnly = arg.useNIODirectOnly;
- forImplementingMethodCall = arg.forImplementingMethodCall;
+ isNativeMethod = arg.isNativeMethod;
+ isPrivateNativeMethod = arg.isPrivateNativeMethod;
forDirectBufferImplementation = arg.forDirectBufferImplementation;
forIndirectBufferAndArrayImplementation = arg.forIndirectBufferAndArrayImplementation;
isUnimplemented = arg.isUnimplemented;
@@ -154,18 +156,31 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
epilogue = arg.epilogue;
returnedArrayLengthExpression = arg.returnedArrayLengthExpression;
returnedArrayLengthExpressionOnlyForComments = arg.returnedArrayLengthExpressionOnlyForComments;
- cfg = arg.cfg;
}
public final MethodBinding getBinding() { return binding; }
- public boolean isForImplementingMethodCall() { return forImplementingMethodCall; }
+ public boolean isNativeMethod() { return isNativeMethod; }
+ public boolean isPrivateNativeMethod() { return isPrivateNativeMethod; }
public boolean isForDirectBufferImplementation() { return forDirectBufferImplementation; }
public boolean isForIndirectBufferAndArrayImplementation() { return forIndirectBufferAndArrayImplementation; }
@Override
- public String getName() {
- return binding.getName();
+ public String getInterfaceName() {
+ return binding.getInterfaceName();
+ }
+ @Override
+ public String getImplName() {
+ return binding.getImplName();
+ }
+ @Override
+ public String getNativeName() {
+ return binding.getNativeName();
+ }
+
+ @Override
+ public FunctionSymbol getCSymbol() {
+ return binding.getCSymbol();
}
protected String getArgumentName(final int i) {
@@ -233,8 +248,8 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
}
/** Accessor for subclasses. */
- public void setForImplementingMethodCall(final boolean impl) {
- this.forImplementingMethodCall = impl;
+ public void setPrivateNativeMethod(final boolean v) {
+ this.isPrivateNativeMethod = v;
}
/** Accessor for subclasses. */
@@ -322,10 +337,12 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
@Override
protected void emitName(final PrintWriter writer) {
- if (forImplementingMethodCall) {
- writer.print(getImplMethodName());
+ if (isPrivateNativeMethod) {
+ writer.print(getNativeImplMethodName());
+ } else if( isInterface()) {
+ writer.print(getInterfaceName());
} else {
- writer.print(getName());
+ writer.print(getImplName());
}
}
@@ -334,7 +351,7 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
boolean needComma = false;
int numEmitted = 0;
- if (forImplementingMethodCall && binding.hasContainingType()) {
+ if (isPrivateNativeMethod && binding.hasContainingType()) {
// Always emit outgoing "this" argument
writer.print("ByteBuffer ");
writer.print(javaThisArgumentName());
@@ -395,8 +412,8 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
}
- protected String getImplMethodName() {
- return binding.getName() + ( useNIODirectOnly ? "0" : "1" );
+ protected String getNativeImplMethodName() {
+ return binding.getImplName() + ( useNIODirectOnly ? "0" : "1" );
}
protected String byteOffsetArgName(final int i) {
@@ -544,7 +561,7 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
}
protected void emitCall(final MethodBinding binding, final PrintWriter writer) {
- writer.print(getImplMethodName());
+ writer.print(getNativeImplMethodName());
writer.print("(");
emitCallArguments(binding, writer);
writer.print(");");
@@ -675,9 +692,10 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
} else if(type.isIntArray()) {
writer.print(", Buffers.SIZEOF_INT * ");
} else {
- throw new RuntimeException("Unsupported type for calculating array offset argument for " +
+ throw new GlueGenException("Unsupported type for calculating array offset argument for " +
getArgumentName(i) +
- " -- error occurred while processing Java glue code for " + getName());
+ " -- error occurred while processing Java glue code for " + getCSymbol().getAliasedString(),
+ getCSymbol().getASTLocusTag());
}
writer.print(offsetArgName(i));
}
@@ -688,7 +706,8 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
}
} else if (type.isPrimitiveArray()) {
if (useNIOOnly) {
- throw new RuntimeException("NIO[Direct]Only "+binding+" is set, but "+getArgumentName(i)+" is a primitive array");
+ throw new GlueGenException("NIO[Direct]Only "+binding+" is set, but "+getArgumentName(i)+" is a primitive array",
+ getCSymbol().getASTLocusTag());
}
writer.print( ", false");
}
@@ -706,7 +725,7 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
// ByteBuffers back into the wrapper types
for (int i = 0; i < binding.getNumArguments(); i++) {
final JavaType javaArgType = binding.getJavaArgumentType(i);
- if ( javaArgType.isArrayOfCompoundTypeWrappers() && !isBaseTypeConst(javaArgType.getElementCType()) ) {
+ if ( javaArgType.isArrayOfCompoundTypeWrappers() && !javaArgType.getElementCType().isBaseTypeConst() ) {
final String argName = binding.getArgumentName(i);
writer.println(" for (int _ctr = 0; _ctr < " + argName + ".length; _ctr++) {");
writer.println(" if ((" + argName + "[_ctr] == null && " + argName + COMPOUND_ARRAY_SUFFIX + "[_ctr] == null) ||");
@@ -743,8 +762,9 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
} else if (returnType.isNIOLongBuffer()) {
writer.println(" return _res.asLongBuffer();");
} else {
- throw new RuntimeException("While emitting glue code for " + getName() +
- ": can not legally make pointers opaque to anything but PointerBuffer or LongBuffer/long");
+ throw new GlueGenException("While emitting glue code for " + getCSymbol().getAliasedString() +
+ ": can not legally make pointers opaque to anything but PointerBuffer or LongBuffer/long",
+ getCSymbol().getASTLocusTag());
}
} else if (getBinding().getCReturnType().pointerDepth() == 1 && returnType.isNIOLongBuffer()) {
writer.println(" return _res.asLongBuffer();");
@@ -812,6 +832,26 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
* emitter java method.
*/
protected class DefaultCommentEmitter implements CommentEmitter {
+ protected void emitAliasedDocNamesComment(final AliasedSymbol sym, final PrintWriter writer) {
+ writer.print(emitAliasedDocNamesComment(sym, new StringBuilder()).toString());
+ }
+ protected StringBuilder emitAliasedDocNamesComment(final AliasedSymbol sym, final StringBuilder sb) {
+ final Set<String> aliases = cfg.getAliasedDocNames(sym);
+ if (aliases != null && aliases.size() > 0 ) {
+ int i=0;
+ sb.append("Alias for: <code>");
+ for (final String alias : aliases) {
+ if(0 < i) {
+ sb.append("</code>, <code>");
+ }
+ sb.append(alias);
+ i++;
+ }
+ sb.append("</code>");
+ }
+ return sb;
+ }
+
@Override
public void emit(final FunctionEmitter emitter, final PrintWriter writer) {
emitBeginning(emitter, writer);
@@ -826,9 +866,11 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
writer.print("Entry point to C language function: ");
}
protected void emitBindingCSignature(final MethodBinding binding, final PrintWriter writer) {
- writer.print("<code> ");
- writer.print(binding.getCSymbol().toString(tagNativeBinding));
- writer.print(" </code> ");
+ final FunctionSymbol funcSym = binding.getCSymbol();
+ writer.print("<code>");
+ writer.print(funcSym.toString(tagNativeBinding));
+ writer.print("</code><br>");
+ emitAliasedDocNamesComment(funcSym, writer);
}
protected void emitEnding(final FunctionEmitter emitter, final PrintWriter writer) {
// If argument type is a named enum, then emit a comment detailing the
@@ -852,7 +894,7 @@ public class JavaMethodBindingEmitter extends FunctionEmitter {
writer.print(" valid values are: <code>");
for (int j = 0; j < enumType.getNumEnumerates(); ++j) {
if (j>0) writer.print(", ");
- writer.print(enumType.getEnumName(j));
+ writer.print(enumType.getEnum(j).getName());
}
writer.println("</code>");
} else if (javaType.isNIOBuffer()) {