@@ -55,14 +55,18 @@ }] return $handle } - proc _linktclcommand {handle cSymbol tclCommand} { + proc _linktclcommand {handle cSymbol args} { upvar #0 $handle state + set argc [llength $args] + if {$argc != 1 && $argc != 2} { + return -code error "_linktclcommand handle cSymbol tclCommand ?clientData?" + } - lappend state(procs) $cSymbol $tclCommand + lappend state(procs) $cSymbol $args } proc _add_include_path {handle args} { upvar #0 $handle state @@ -91,11 +95,11 @@ set tclname [lindex $wrap 2] append state(code) $wrapped "\n" append state(code) $wrapper "\n" - lappend state(procs) $name $tclname + lappend state(procs) $name [list $tclname] } proc _cproc {handle name adefs rtype {body "#"}} { upvar #0 $handle state @@ -106,11 +110,11 @@ set tclname [lindex $wrap 2] append state(code) $wrapped "\n" append state(code) $wrapper "\n" - lappend state(procs) $name $tclname + lappend state(procs) $name [list $tclname] } proc _ccode {handle code} { upvar #0 $handle state @@ -404,21 +408,35 @@ switch -- $state(type) { "memory" { # No additional code needed if {$outputOnly} { if {[info exists state(procs)] && [llength $state(procs)] > 0} { - foreach {procname cname} $state(procs) { - append code "/* Immediate: Tcl_CreateObjCommand(interp, \"$procname\", $cname, NULL, NULL); */\n" + foreach {procname cname_obj} $state(procs) { + set cname [lindex $cname_obj 0] + + if {[llength $cname_obj] > 1} { + set obj [lindex $cname_obj 1] + } else { + set obj "NULL" + } + + append code "/* Immediate: Tcl_CreateObjCommand(interp, \"$procname\", $cname, $obj, Tcc4tclDeleteClientData); */\n" } } } } "exe" - "dll" { if {[info exists state(procs)] && [llength $state(procs)] > 0} { append code "int _initProcs(Tcl_Interp *interp) \{\n" - foreach {procname cname} $state(procs) { + foreach {procname cname_obj} $state(procs) { + set cname [lindex $cname_obj 0] + + if {[llength $cname_obj] != 1} { + error "ClientData not supported in exe / dll mode" + } + append code " Tcl_CreateObjCommand(interp, \"$procname\", $cname, NULL, NULL);\n" } append code "\}" } @@ -436,11 +454,17 @@ append code " return TCL_ERROR;\n" append code " \}\n" append code "#endif\n" if {[info exists state(procs)] && [llength $state(procs)] > 0} { - foreach {procname cname} $state(procs) { + foreach {procname cname_obj} $state(procs) { + set cname [lindex $cname_obj 0] + + if {[llength $cname_obj] != 1} { + error "ClientData not supported in exe / dll mode" + } + append code " Tcl_CreateObjCommand(interp, \"$procname\", $cname, NULL, NULL);\n" } } append code " Tcl_PkgProvide(interp, \"$packageName\", \"$packageVersion\");\n" @@ -484,12 +508,12 @@ switch -- $state(type) { "memory" { tcc compile $code if {[info exists state(procs)] && [llength $state(procs)] > 0} { - foreach {procname cname} $state(procs) { - tcc command $procname $cname + foreach {procname cname_obj} $state(procs) { + tcc command $procname {*}$cname_obj } } } "package" - "dll" - "exe" {