Index: generic/gentclAPI.tcl =================================================================== diff -u -rcaba76f5ac2943f5a3dfd33550cb578132f40c80 -r872d1371a257c8a20383ae70efa83bbf3ff78f96 --- generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision caba76f5ac2943f5a3dfd33550cb578132f40c80) +++ generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision 872d1371a257c8a20383ae70efa83bbf3ff78f96) @@ -30,7 +30,7 @@ # set ::converter "" -set ::objCmdProc "(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv \[\]);" +set ::objCmdProc "(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv \[\])" proc convertername {type typename} { return [string totitle [string trimleft $typename -]] @@ -125,9 +125,10 @@ } proc gencall {methodName fn parameterDefinitions clientData - cDefsVar ifDefVar arglistVar preVar postVar introVar} { + cDefsVar ifDefVar arglistVar preVar postVar introVar nnVar + } { upvar $cDefsVar cDefs $ifDefVar ifDef $arglistVar arglist $preVar pre $postVar post \ - $introVar intro + $introVar intro $nnVar nn set c [list] set i 0 set pre ""; set post "" @@ -137,23 +138,26 @@ class { set a [list cl] set if [list "NsfClass *cl"] + set argNum 3 append intro \ - " NsfClass *cl = NsfObjectToClass(clientData);" \n \ + " NsfClass *cl = NsfObjectToClass(clientData);" \n\n \ " assert(objc > 0);" \n \ " if (unlikely(cl == NULL)) return NsfDispatchClientDataError(interp, clientData, \"class\", ObjStr(objv\[0\]));" } object { set a [list obj] set if [list "NsfObject *obj"] + set argNum 3 append intro \ - " NsfObject *obj = (NsfObject *)clientData;" \n \ + " NsfObject *obj = (NsfObject *)clientData;" \n\n \ " assert(objc > 0);" \n \ " if (unlikely(obj == NULL)) return NsfDispatchClientDataError(interp, clientData, \"object\", ObjStr(objv\[0\]));" } "" { append intro " (void)clientData;\n" set a [list] set if [list] + set argNum 2 array set cd {arglist "" ifDefs ""} } } @@ -241,6 +245,10 @@ } } } + + if {[string match {*[*]*} $type] && $(-required)} { + append nn " NSF_nonnull($argNum)" + } if {!$ifSet} {lappend if "$type$varName"} if {$cVar} { if {$type eq "int "} { @@ -251,6 +259,7 @@ } lappend a $calledArg incr i + incr argNum } set ifDef [join $if ", "] set cDefs [join $c "\n "] @@ -317,11 +326,23 @@ array set d $::definitions($key) lappend enums $d(idx) set nrParams [llength $d(parameterDefinitions)] - set stubDecl "static int $d(stub)$::objCmdProc\n" + set nn "" + + gencall $d(methodName) $d(stub) $d(parameterDefinitions) $d(clientData) \ + cDefs ifDef arglist pre post intro nn + + if {[dict get $::definitions($key) clientData] ne ""} { + set stubNN "NSF_nonnull(1) " + set NN " NSF_nonnull(2)" + regsub \n\n $intro "\n\n assert(clientData);\n" intro + } else { + set stubNN "" + set NN "" + } + set stubDecl "static int $d(stub)$::objCmdProc\n ${stubNN}NSF_nonnull(2) NSF_nonnull(4);\n" set ifd "{\"$d(ns)::$d(methodName)\", $d(stub), $nrParams, {\n [genifd $d(parameterDefinitions)]}\n}" - - gencall $d(methodName) $d(stub) $d(parameterDefinitions) $d(clientData) cDefs ifDef arglist pre post intro - append decls "static int [implArgList $d(implementation) {Tcl_Interp *} $ifDef];\n" + + append decls "static int [implArgList $d(implementation) {Tcl_Interp *} $ifDef]\n NSF_nonnull(1)${NN}${nn};\n" if {$post ne ""} { append cDefs "\n int returnCode;" set call "returnCode = [implArgList $d(implementation) {} $arglist];" @@ -335,7 +356,6 @@ if {$nrParams == 1 && $arglist eq "objc, objv"} { # TODO we would not need to generate a stub at all.... #set ifd "{\"$d(ns)::$d(methodName)\", $d(implementation), $nrParams, {\n [genifd $d(parameterDefinitions)]}\n}" - #set stubDecl "static int $d(implementation)$::objCmdProc\n" append fns [genSimpleStub $d(stub) $intro $d(idx) $cDefs $pre $call $post] } elseif {$nrParams == 1 && $arglist eq "obj, objc, objv"} { # no need to call objv parser @@ -357,8 +377,10 @@ if {$defs(-required)} { set op "objc != 2" + set newArg {objv[1]} } else { set op "objc < 1 || objc > 2" + set newArg {objc == 2 ? objv[1] : NULL} } append pre [subst -nocommands { if ($op) { @@ -368,7 +390,6 @@ } }] - set newArg {objc == 2 ? objv[1] : NULL} if {[regexp {^(.*),(.*)$} $arglist _ arg1]} { set newArglist "$arg1, $newArg" } else {