diff options
Diffstat (limited to 'src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java')
-rw-r--r-- | src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java | 437 |
1 files changed, 50 insertions, 387 deletions
diff --git a/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java b/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java index 6a93973..fe4f82a 100644 --- a/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java +++ b/src/java/com/jogamp/gluegen/JavaMethodBindingEmitter.java @@ -95,7 +95,7 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { private String returnedArrayLengthExpression; private boolean returnedArrayLengthExpressionOnlyForComments = false; - private final JavaCallbackInfo javaCallback; + private final JavaCallbackEmitter javaCallbackEmitter; // A suffix used to create a temporary outgoing array of Buffers to // represent an array of compound type wrappers @@ -134,7 +134,12 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { } else { setCommentEmitter(defaultInterfaceCommentEmitter); } - javaCallback = cfg.setFuncToJavaCallbackMap.get(binding.getName()); + final JavaCallbackInfo javaCallback = cfg.setFuncToJavaCallbackMap.get(binding.getName()); + if( null != javaCallback ) { + javaCallbackEmitter = new JavaCallbackEmitter(cfg, binding, javaCallback, appendSignature(new StringBuilder()).toString()); + } else { + javaCallbackEmitter = null; + } // !forImplementingMethodCall && !isInterface } @@ -156,7 +161,7 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { epilogue = arg.epilogue; returnedArrayLengthExpression = arg.returnedArrayLengthExpression; returnedArrayLengthExpressionOnlyForComments = arg.returnedArrayLengthExpressionOnlyForComments; - javaCallback = arg.javaCallback; + javaCallbackEmitter = arg.javaCallbackEmitter; } public boolean isNativeMethod() { return isNativeMethod; } @@ -262,8 +267,8 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { } @Override - protected void emitReturnType() { - unit.emit(getReturnTypeString(false)); + protected StringBuilder appendReturnType(final StringBuilder buf) { + return buf.append(getReturnTypeString(false)); } protected String erasedTypeString(final JavaType type, final boolean skipBuffers) { @@ -335,33 +340,34 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { } @Override - protected void emitName() { + protected StringBuilder appendName(final StringBuilder buf) { if (isPrivateNativeMethod) { - unit.emit(getNativeImplMethodName()); + buf.append(getNativeImplMethodName()); } else if( isInterface()) { - unit.emit(getInterfaceName()); + buf.append(getInterfaceName()); } else { - unit.emit(getImplName()); + buf.append(getImplName()); } + return buf; } @Override - protected int emitArguments() { + protected int appendArguments(final StringBuilder buf) { boolean needComma = false; int numEmitted = 0; if( hasModifier(JavaMethodBindingEmitter.NATIVE) && binding.isReturnCompoundByValue() ) { - unit.emit("final Class<?> _clazzBuffers"); + buf.append("final Class<?> _clazzBuffers"); ++numEmitted; needComma = true; } if (isPrivateNativeMethod && binding.hasContainingType()) { // Always emit outgoing "this" argument if (needComma) { - unit.emit(", "); + buf.append(", "); } - unit.emit("ByteBuffer "); - unit.emit(javaThisArgumentName()); + buf.append("ByteBuffer "); + buf.append(javaThisArgumentName()); ++numEmitted; needComma = true; } @@ -385,12 +391,12 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { } if (needComma) { - unit.emit(", "); + buf.append(", "); } - unit.emit(erasedTypeString(type, false)); - unit.emit(" "); - unit.emit(getArgumentName(i)); + buf.append(erasedTypeString(type, false)); + buf.append(" "); + buf.append(getArgumentName(i)); ++numEmitted; needComma = true; @@ -398,12 +404,12 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { // Add Buffer and array index offset arguments after each associated argument if (forDirectBufferImplementation || forIndirectBufferAndArrayImplementation) { if (type.isNIOBuffer()) { - unit.emit(", int " + byteOffsetArgName(i)); + buf.append(", int " + byteOffsetArgName(i)); if(!useNIODirectOnly) { - unit.emit(", boolean " + isNIOArgName(i)); + buf.append(", boolean " + isNIOArgName(i)); } } else if (type.isNIOBufferArray()) { - unit.emit(", int[] " + byteOffsetArrayArgName(i)); + buf.append(", int[] " + byteOffsetArrayArgName(i)); } } @@ -412,17 +418,16 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { if(useNIOOnly) { throw new RuntimeException("NIO[Direct]Only "+binding+" is set, but "+getArgumentName(i)+" is a primitive array"); } - unit.emit(", int " + offsetArgName(i)); + buf.append(", int " + offsetArgName(i)); } } if( hasModifier(JavaMethodBindingEmitter.NATIVE) && - null != javaCallback ) + null != javaCallbackEmitter ) { if (needComma) { - unit.emit(", "); + buf.append(", "); } - unit.emit("String callbackSignature, Object lockObj, long[/*1*/] nativeUserParam"); - ++numEmitted; + numEmitted += javaCallbackEmitter.appendJavaAdditionalJNIParameter(buf); } return numEmitted; } @@ -455,125 +460,11 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { return getArgumentName(i) + "_offset"; } - private static final boolean DEBUG_JAVACALLBACK = false; - - private final void emitJavaCallbackBirefAPIDoc(final String actionText, final String relationToKey, final String noKeyText, final String relationToFunc) { - unit.emit(" /** "+actionText); - if( javaCallback.setFuncKeyIndices.size() > 0 ) { - unit.emit(relationToKey); - unit.emit("Key { "+binding.getJavaSelectParameter(new StringBuilder(), javaCallback.setFuncKeyIndices, false).toString()+" } "); - } else { - unit.emit(noKeyText); - } - unit.emit(relationToFunc); - unit.emit("<br> <code>"); - emitSignature(); - unit.emitln("</code> **/"); - } - private final void emitJavaCallbackKeyClass(final String capIfaceName, final String keyClassName) { - emitJavaCallbackBirefAPIDoc("", "", "", "for "); - unit.emitln(" public static class "+keyClassName+" {"); - binding.forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> { - if( !cType.isVoid() && javaCallback.setFuncKeyIndices.contains(idx) ) { - unit.emitln(" public final "+jType+" "+name+";"); - return true; - } else { - return false; - } - } ); - unit.emitln(" public "+keyClassName+"("+binding.getJavaSelectParameter(new StringBuilder(), javaCallback.setFuncKeyIndices, false).toString()+") {"); - binding.forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> { - if( !cType.isVoid() && javaCallback.setFuncKeyIndices.contains(idx) ) { - unit.emitln(" this."+name+" = "+name+";"); - return true; - } else { - return false; - } - } ); - unit.emitln(" }"); - unit.emitln(" @Override"); - unit.emitln(" public boolean equals(final Object o) {"); - unit.emitln(" if( this == o ) {"); - unit.emitln(" return true;"); - unit.emitln(" }"); - unit.emitln(" if( !(o instanceof "+keyClassName+") ) {"); - unit.emitln(" return false;"); - unit.emitln(" }"); - { - final int count = binding.forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> { - if( !cType.isVoid() && javaCallback.setFuncKeyIndices.contains(idx) ) { - if( 0 == consumedCount ) { - unit.emitln(" final "+keyClassName+" o2 = ("+keyClassName+")o;"); - unit.emit (" return "); - } else { - unit.emitln(" &&"); - unit.emit (" "); - } - if( jType.isPrimitive() || idx == javaCallback.setFuncUserParamIdx ) { - unit.emit(name+" == o2."+name); - } else { - unit.emit(name+".equals( o2."+name+" )"); - } - return true; - } else { - return false; - } - } ); - if( 0 == count ) { - unit.emit(" return true"); - } - unit.emitln(";"); - } - unit.emitln(" }"); - unit.emitln(" @Override"); - unit.emitln(" public int hashCode() {"); - { - final int count = binding.forEachParameter( ( final int idx, final int consumedCount, final Type cType, final JavaType jType, final String name ) -> { - if( !cType.isVoid() && javaCallback.setFuncKeyIndices.contains(idx) ) { - if( 0 == consumedCount ) { - unit.emitln(" // 31 * x == (x << 5) - x"); - unit.emit (" int hash = "); - } else { - unit.emit (" hash = ((hash << 5) - hash) + "); - } - if( jType.isPrimitive() ) { - if( jType.isLong() ) { - unit.emitln("HashUtil.getAddrHash32_EqualDist( "+name+" );"); - } else { - unit.emitln(name+";"); - } - } else { - if( idx == javaCallback.setFuncUserParamIdx ) { - unit.emitln("System.identityHashCode( "+name+" );"); - } else { - unit.emitln(name+".hashCode();"); - } - } - return true; - } else { - return false; - } - } ); - if( 0 == count ) { - unit.emitln(" return 0;"); - } else { - unit.emitln(" return hash;"); - } - } - unit.emitln(" }"); - unit.emitln(" }"); - } - private final void emitJavaCallbackDataClass(final String capIfaceName, final String dataClassName) { - unit.emitln(" private static class "+dataClassName+" {"); - unit.emitln(" final "+javaCallback.cbFuncTypeName+" func;"); - unit.emitln(" final Object param;"); - unit.emitln(" final long nativeParam;"); - unit.emitln(" "+dataClassName+"("+javaCallback.cbFuncTypeName+" func, Object param, long nativeParam) {"); - unit.emitln(" this.func = func;"); - unit.emitln(" this.param = param;"); - unit.emitln(" this.nativeParam = nativeParam;"); - unit.emitln(" }"); - unit.emitln(" }"); + @Override + protected void emitAdditionalCode() { + if( null != javaCallbackEmitter && !isPrivateNativeMethod ) { + javaCallbackEmitter.emitJavaAdditionalCode(unit, isInterface()); + } } @Override @@ -594,201 +485,6 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { } unit.emitln(" }"); } - if( null != javaCallback && !isPrivateNativeMethod ) { - final String capIfaceName = CodeGenUtils.capitalizeString( getInterfaceName() ); - final String lowIfaceName = CodeGenUtils.decapitalizeString( getInterfaceName() ); - final String lockInstanceName = lowIfaceName+"Lock"; - final String dataMapInstanceName = lowIfaceName+"DataMap"; - final String dataInstanceName = lowIfaceName+"Data"; - final boolean customKeyClass; - final String KeyClassName; - final boolean useDataMap; - if( null != javaCallback.setFuncKeyClassName ) { - customKeyClass = true;; - KeyClassName = javaCallback.setFuncKeyClassName; - useDataMap = true; - } else { - customKeyClass = false; - KeyClassName = CodeGenUtils.capitalizeString(capIfaceName+"Key"); - useDataMap = javaCallback.setFuncKeyIndices.size() > 0; - } - final String DataClassName = CodeGenUtils.capitalizeString( javaCallback.cbFuncTypeName+"Data" ); - final String fqUsrParamClassName = cfg.packageName()+"."+cfg.className()+"."+DataClassName; - unit.emitln(); - if( isInterface() ) { - if( useDataMap ) { - if( !customKeyClass && !javaCallback.keyClassEmitted ) { - emitJavaCallbackKeyClass(capIfaceName, KeyClassName); - unit.emitln(); - javaCallback.keyClassEmitted = true; - } - emitJavaCallbackBirefAPIDoc("Returns ", "set of ", "", "for "); - unit.emitln(" public Set<"+KeyClassName+"> get"+capIfaceName+"Keys();"); - unit.emitln(); - emitJavaCallbackBirefAPIDoc("Returns ", "whether callback ", "if callback ", "is mapped for "); - unit.emitln(" public boolean is"+capIfaceName+"Mapped("+KeyClassName+" key);"); - unit.emitln(); - emitJavaCallbackBirefAPIDoc("Returns "+javaCallback.cbFuncTypeName+" callback ", "mapped to ", "", "for "); - unit.emitln(" public "+javaCallback.cbFuncTypeName+" get"+capIfaceName+"("+KeyClassName+" key);"); - unit.emitln(); - emitJavaCallbackBirefAPIDoc("Returns user-param ", "mapped to ", "", "for "); - unit.emitln(" public Object get"+capIfaceName+"UserParam("+KeyClassName+" key);"); - unit.emitln(); - emitJavaCallbackBirefAPIDoc("Releases all callback data ", "mapped via ", "", "skipping toolkit API. Favor passing `null` callback ref to "); - unit.emitln(" public int releaseAll"+capIfaceName+"();"); - unit.emitln(); - emitJavaCallbackBirefAPIDoc("Releases callback data ", "mapped to ", "", "skipping toolkit API. Favor passing `null` callback ref to "); - unit.emitln(" public void release"+capIfaceName+"("+KeyClassName+" key);"); - unit.emitln(); - } else { - emitJavaCallbackBirefAPIDoc("Returns ", "whether callback ", "if callback ", "is mapped for "); - unit.emitln(" public boolean is"+capIfaceName+"Mapped();"); - unit.emitln(); - emitJavaCallbackBirefAPIDoc("Returns "+javaCallback.cbFuncTypeName+" callback ", "mapped to ", "", "for "); - unit.emitln(" public "+javaCallback.cbFuncTypeName+" get"+capIfaceName+"();"); - unit.emitln(); - emitJavaCallbackBirefAPIDoc("Returns user-param ", "mapped to ", "", "for "); - unit.emitln(" public Object get"+capIfaceName+"UserParam();"); - unit.emitln(); - emitJavaCallbackBirefAPIDoc("Releases callback data ", "", "", "skipping toolkit API. Favor passing `null` callback ref to "); - unit.emitln(" public void release"+capIfaceName+"();"); - unit.emitln(); - } - } else { - if( useDataMap ) { - if( !customKeyClass && !javaCallback.keyClassEmitted ) { - emitJavaCallbackKeyClass(capIfaceName, KeyClassName); - unit.emitln(); - javaCallback.keyClassEmitted = true; - } - emitJavaCallbackBirefAPIDoc("Returns ", "set of ", "", "for "); - unit.emitln(" public final Set<"+KeyClassName+"> get"+capIfaceName+"Keys() {"); - unit.emitln(" synchronized( "+lockInstanceName+" ) {"); - unit.emitln(" return "+dataMapInstanceName+".keySet();"); - unit.emitln(" }"); - unit.emitln(" }"); - unit.emitln(); - emitJavaCallbackBirefAPIDoc("Returns ", "whether callback ", "if callback ", "is mapped for "); - unit.emitln(" public final boolean is"+capIfaceName+"Mapped("+KeyClassName+" key) {"); - unit.emitln(" synchronized( "+lockInstanceName+" ) {"); - unit.emitln(" return null != "+dataMapInstanceName+".get(key);"); - unit.emitln(" }"); - unit.emitln(" }"); - unit.emitln(); - - emitJavaCallbackBirefAPIDoc("Returns "+javaCallback.cbFuncTypeName+" callback ", "mapped to ", "", "for "); - unit.emitln(" public final "+javaCallback.cbFuncTypeName+" get"+capIfaceName+"("+KeyClassName+" key) {"); - unit.emitln(" synchronized( "+lockInstanceName+" ) {"); - unit.emitln(" final "+DataClassName+" value = "+dataMapInstanceName+".get(key);"); - unit.emitln(" return null != value ? value.func : null;"); - unit.emitln(" }"); - unit.emitln(" }"); - unit.emitln(); - - emitJavaCallbackBirefAPIDoc("Returns user-param ", "mapped to ", "", "for "); - unit.emitln(" public final Object get"+capIfaceName+"UserParam("+KeyClassName+" key) {"); - unit.emitln(" synchronized( "+lockInstanceName+" ) {"); - unit.emitln(" final "+DataClassName+" value = "+dataMapInstanceName+".get(key);"); - unit.emitln(" return null != value ? value.param : null;"); - unit.emitln(" }"); - unit.emitln(" }"); - unit.emitln(); - emitJavaCallbackBirefAPIDoc("Releases all callback data ", "mapped via ", "", "skipping toolkit API. Favor passing `null` callback ref to "); - unit.emitln(" public final int releaseAll"+capIfaceName+"() {"); - unit.emitln(" synchronized( "+lockInstanceName+" ) {"); - unit.emitln(" final Set<"+KeyClassName+"> keySet = "+dataMapInstanceName+".keySet();"); - unit.emitln(" final "+KeyClassName+"[] keys = keySet.toArray(new "+KeyClassName+"[keySet.size()]);"); - unit.emitln(" for(int i=0; i<keys.length; ++i) {"); - unit.emitln(" final "+KeyClassName+" key = keys[i];"); - unit.emitln(" release"+capIfaceName+"(key);"); - unit.emitln(" }"); - unit.emitln(" return keys.length;"); - unit.emitln(" }"); - unit.emitln(" }"); - unit.emitln(); - emitJavaCallbackBirefAPIDoc("Releases callback data ", "mapped to ", "", "skipping toolkit API. Favor passing `null` callback ref to "); - unit.emitln(" public final void release"+capIfaceName+"("+KeyClassName+" key) {"); - unit.emitln(" synchronized( "+lockInstanceName+" ) {"); - unit.emitln(" final "+DataClassName+" value = "+dataMapInstanceName+".remove(key);"); - if( DEBUG_JAVACALLBACK ) { - unit.emitln(" System.err.println(\"ZZZ Release \"+key+\" -> value.nativeParam 0x\"+Long.toHexString(null!=value?value.nativeParam:0));"); - } - unit.emitln(" if( null != value ) {"); - unit.emitln(" release"+capIfaceName+"Impl(value.nativeParam);"); - unit.emitln(" }"); - unit.emitln(" }"); - unit.emitln(" }"); - } else { - emitJavaCallbackBirefAPIDoc("Returns ", "whether callback ", "if callback ", "is mapped for "); - unit.emitln(" public final boolean is"+capIfaceName+"Mapped() {"); - unit.emitln(" synchronized( "+lockInstanceName+" ) {"); - unit.emitln(" return null != "+dataInstanceName+";"); - unit.emitln(" }"); - unit.emitln(" }"); - unit.emitln(); - - emitJavaCallbackBirefAPIDoc("Returns "+javaCallback.cbFuncTypeName+" callback ", "mapped to ", "", "for "); - unit.emitln(" public final "+javaCallback.cbFuncTypeName+" get"+capIfaceName+"() {"); - unit.emitln(" synchronized( "+lockInstanceName+" ) {"); - unit.emitln(" final "+DataClassName+" value = "+dataInstanceName+";"); - unit.emitln(" return null != value ? value.func : null;"); - unit.emitln(" }"); - unit.emitln(" }"); - unit.emitln(); - - emitJavaCallbackBirefAPIDoc("Returns user-param ", "mapped to ", "", "for "); - unit.emitln(" public final Object get"+capIfaceName+"UserParam() {"); - unit.emitln(" synchronized( "+lockInstanceName+" ) {"); - unit.emitln(" final "+DataClassName+" value = "+dataInstanceName+";"); - unit.emitln(" return null != value ? value.param : null;"); - unit.emitln(" }"); - unit.emitln(" }"); - unit.emitln(); - - emitJavaCallbackBirefAPIDoc("Releases callback data ", "", "", "skipping toolkit API. Favor passing `null` callback ref to "); - unit.emitln(" public final void release"+capIfaceName+"() {"); - unit.emitln(" synchronized( "+lockInstanceName+" ) {"); - unit.emitln(" final "+DataClassName+" value = "+dataInstanceName+";"); - unit.emitln(" "+dataInstanceName+" = null;"); - if( DEBUG_JAVACALLBACK ) { - unit.emitln(" System.err.println(\"ZZZ Release \"+key+\" -> value.nativeParam 0x\"+Long.toHexString(null!=value?value.nativeParam:0));"); - } - unit.emitln(" if( null != value ) {"); - unit.emitln(" release"+capIfaceName+"Impl(value.nativeParam);"); - unit.emitln(" }"); - unit.emitln(" }"); - unit.emitln(" }"); - } - unit.emitln(" private native void release"+capIfaceName+"Impl(long nativeUserParam);"); - unit.emitln(); - unit.emitln(" private final void add"+capIfaceName+"("+binding.getJavaSelectParameter(new StringBuilder(), javaCallback.setFuncKeyIndices, true).toString()+DataClassName+" value) {"); - if( useDataMap ) { - unit.emitln(" final "+KeyClassName+" key = new "+KeyClassName+"("+binding.getJavaCallSelectArguments(new StringBuilder(), javaCallback.setFuncKeyIndices, false).toString()+");"); - unit.emitln(" final "+DataClassName+" old = "+dataMapInstanceName+".put(key, value);"); - } else { - unit.emitln(" final "+DataClassName+" old = "+dataInstanceName+";"); - unit.emitln(" "+dataInstanceName+" = value;"); - } - if( DEBUG_JAVACALLBACK ) { - unit.emitln(" System.err.println(\"ZZZ Map \"+key+\" -> value.nativeParam 0x\"+Long.toHexString(null!=value?value.nativeParam:0));"); - } - unit.emitln(" if( null != old ) {"); - unit.emitln(" release"+capIfaceName+"Impl(old.nativeParam);"); - unit.emitln(" }"); - unit.emitln(" }"); - if( !cfg.emittedJavaCallbackUserParamClasses.contains(fqUsrParamClassName) ) { - emitJavaCallbackDataClass(capIfaceName, DataClassName); - cfg.emittedJavaCallbackUserParamClasses.add(fqUsrParamClassName); - } - if( useDataMap ) { - unit.emitln(" private final Map<"+KeyClassName+", "+DataClassName+"> "+dataMapInstanceName+" = new HashMap<"+KeyClassName+", "+DataClassName+">();"); - } else { - unit.emitln(" private "+DataClassName+" "+dataInstanceName+" = null;"); - } - unit.emitln(" private final Object "+lockInstanceName+" = new Object();"); - unit.emitln(); - } - } } protected void emitPrologueOrEpilogue(final List<String> code) { @@ -901,15 +597,11 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { protected void emitReturnVariableSetupAndCall(final MethodBinding binding) { final JavaType returnType = binding.getJavaReturnType(); + boolean needsResultAssignment = false; - final String capIfaceName = CodeGenUtils.capitalizeString( getInterfaceName() ); - if( null != javaCallback ) { - final String lowIfaceName = CodeGenUtils.decapitalizeString( getInterfaceName() ); - final String lockInstanceName = lowIfaceName+"Lock"; - unit.emitln(" synchronized( "+lockInstanceName+" ) {"); - unit.emitln(" final long[] nativeUserParam = { 0 };"); - unit.emitln(); + if( null != javaCallbackEmitter ) { + javaCallbackEmitter.emitJavaSetFuncPreCall(unit); } if (!returnType.isVoid()) { unit.emit(" "); @@ -941,36 +633,9 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { emitCall(binding); unit.emitln(); - if( null != javaCallback ) { - final String funcArgName = binding.getArgumentName(javaCallback.setFuncCBParamIdx); - final String userParamArgName = binding.getArgumentName(javaCallback.setFuncUserParamIdx); - final String DataClassName = CodeGenUtils.capitalizeString( javaCallback.cbFuncTypeName+"Data" ); - final String KeyClassName; - final boolean useDataMap; - if( null != javaCallback.setFuncKeyClassName ) { - KeyClassName = javaCallback.setFuncKeyClassName; - useDataMap = true; - } else { - KeyClassName = CodeGenUtils.capitalizeString(capIfaceName+"Key"); - useDataMap = javaCallback.setFuncKeyIndices.size() > 0; - } - if( DEBUG_JAVACALLBACK ) { - unit.emitln(" System.err.println(\"ZZZ returned nativeUserParam 0x\"+Long.toHexString(nativeUserParam[0]));"); - } + if( null != javaCallbackEmitter ) { unit.emitln(); - unit.emitln(" if( 0 != nativeUserParam[0] ) {"); - unit.emitln(" // callback registrated -> add will release a previously mapped instance "); - unit.emitln(" add"+capIfaceName+"("+binding.getJavaCallSelectArguments(new StringBuilder(), javaCallback.setFuncKeyIndices, true).toString()+ - "new "+DataClassName+"("+funcArgName+", "+userParamArgName+", nativeUserParam[0]));"); - unit.emitln(" } else {"); - unit.emitln(" // callback released (null func) -> release a previously mapped instance "); - if( useDataMap ) { - unit.emitln(" release"+capIfaceName+"( new "+KeyClassName+"( "+binding.getJavaCallSelectArguments(new StringBuilder(), javaCallback.setFuncKeyIndices, false).toString()+" ) );"); - } else { - unit.emitln(" release"+capIfaceName+"();"); - } - unit.emitln(" }"); - unit.emitln(" } // synchronized "); + javaCallbackEmitter.emitJavaSetFuncPostCall(unit); } emitPostCallCleanup(binding); @@ -1094,14 +759,13 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { needComma = true; ++numArgsEmitted; } - if( null != javaCallback ) { - final String lowIfaceName = CodeGenUtils.decapitalizeString( getInterfaceName() ); - final String lockInstanceName = lowIfaceName+"Lock"; + if( null != javaCallbackEmitter ) { if (needComma) { unit.emit(", "); } - unit.emit("\"" + javaCallback.cbMethodSignature + "\", "+lockInstanceName+", nativeUserParam"); - ++numArgsEmitted; + final StringBuilder buf = new StringBuilder(); + numArgsEmitted += javaCallbackEmitter.appendJavaAdditionalJNIArguments(buf); + unit.emit(buf.toString()); } return numArgsEmitted; } @@ -1301,12 +965,11 @@ public class JavaMethodBindingEmitter extends FunctionEmitter { } } - protected class InterfaceCommentEmitter extends JavaMethodBindingEmitter.DefaultCommentEmitter { - - @Override - protected void emitBeginning(final FunctionEmitter emitter, final PrintWriter writer) { - writer.print("Interface to C language function: <br> "); - } + protected class InterfaceCommentEmitter extends JavaMethodBindingEmitter.DefaultCommentEmitter { + @Override + protected void emitBeginning(final FunctionEmitter emitter, final PrintWriter writer) { + writer.print("Interface to C language function: <br> "); } + } } |