Index: generic/gentclAPI.decls =================================================================== diff -u -rbfa35f91317151147869ce0f97f6c89f1ffc7fbe -rf11b03a9a764254c5a1ba45480ebf5eb19e2bf8d --- generic/gentclAPI.decls (.../gentclAPI.decls) (revision bfa35f91317151147869ce0f97f6c89f1ffc7fbe) +++ generic/gentclAPI.decls (.../gentclAPI.decls) (revision f11b03a9a764254c5a1ba45480ebf5eb19e2bf8d) @@ -250,10 +250,6 @@ # # info object methods # -infoObjectMethod args XOTclObjInfoArgsMethod { - {-argName "object" -required 1 -type object} - {-argName "methodName" -required 1} -} infoObjectMethod body XOTclObjInfoBodyMethod { {-argName "object" -required 1 -type object} {-argName "methodName" -required 1} @@ -272,12 +268,6 @@ {-argName "object" -required 1 -type object} {-argName "pattern" -required 0} } -infoObjectMethod default XOTclObjInfoDefaultMethod { - {-argName "object" -required 1 -type object} - {-argName "methodName" -required 1} - {-argName "arg" -required 1} - {-argName "var" -required 1 -type tclobj} -} infoObjectMethod filter XOTclObjInfoFilterMethod { {-argName "object" -required 1 -type object} {-argName "-order"} @@ -317,10 +307,6 @@ {-argName "object" -required 1 -type object} {-argName "mixin" -required 1} } -infoObjectMethod nonposargs XOTclObjInfoNonposargsMethod { - {-argName "object" -required 1 -type object} - {-argName "methodName" -required 1} -} infoObjectMethod parent XOTclObjInfoParentMethod { {-argName "object" -required 1 -type object} } @@ -372,10 +358,6 @@ {-argName "-closure"} {-argName "pattern" -type objpattern} } -infoClassMethod instargs XOTclClassInfoInstargsMethod { - {-argName "class" -required 1 -type class} - {-argName "methodName" -required 1} -} infoClassMethod instbody XOTclClassInfoInstbodyMethod { {-argName "class" -required 1 -type class} {-argName "methodName" -required 1} @@ -384,12 +366,6 @@ {-argName "class" -required 1 -type class} {-argName "pattern"} } -infoClassMethod instdefault XOTclClassInfoInstdefaultMethod { - {-argName "class" -required 1 -type class} - {-argName "methodName" -required 1} - {-argName "arg" -required 1} - {-argName "var" -required 1 -type tclobj} -} infoClassMethod instfilter XOTclClassInfoInstfilterMethod { {-argName "class" -required 1 -type class} {-argName "-guards"} @@ -422,10 +398,6 @@ {-argName "-closure"} {-argName "pattern" -type objpattern} } -infoClassMethod instnonposargs XOTclClassInfoInstnonposargsMethod { - {-argName "class" -required 1 -type class} - {-argName "methodName" -required 1} -} infoClassMethod instparametercmd XOTclClassInfoInstparametercmdMethod { {-argName "class" -required 1 -type class} {-argName "pattern"} Index: generic/predefined.h =================================================================== diff -u -rf4471765bb7aec8c793b5e365499726619119f63 -rf11b03a9a764254c5a1ba45480ebf5eb19e2bf8d --- generic/predefined.h (.../predefined.h) (revision f4471765bb7aec8c793b5e365499726619119f63) +++ generic/predefined.h (.../predefined.h) (revision f11b03a9a764254c5a1ba45480ebf5eb19e2bf8d) @@ -31,11 +31,11 @@ "::xotcl::alias ::xotcl::classInfo [namespace tail $cmd] $cmd}\n" "foreach cmd [info command ::xotcl::cmd::ClassInfo::*] {\n" "::xotcl::alias ::xotcl::classInfo [namespace tail $cmd] $cmd}\n" +"unset cmd\n" "::xotcl::alias ::xotcl::objectInfo is ::xotcl::is\n" "::xotcl::alias ::xotcl::classInfo is ::xotcl::is\n" "::xotcl::alias ::xotcl::classInfo classparent ::xotcl::cmd::ObjectInfo::parent\n" "::xotcl::alias ::xotcl::classInfo classchildren ::xotcl::cmd::ObjectInfo::children\n" -"unset cmd\n" "::xotcl::Object instforward info -onerror ::xotcl::infoError ::xotcl::objectInfo %1 {%@2 %self}\n" "::xotcl::Class instforward info -onerror ::xotcl::infoError ::xotcl::classInfo %1 {%@2 %self}\n" "proc ::xotcl::infoError msg {\n" @@ -61,6 +61,41 @@ "return \"valid options are: [join [lsort $methods] {, }]\"}\n" "::xotcl::classInfo proc unknown {method args} {\n" "error \"unknown info option \\\"$method\\\"; [my info info]\"}\n" +"proc ::xotcl::info_args {inst o method} {\n" +"set result [list]\n" +"foreach \\\n" +"argName [::xotcl::classInfo ${inst}params $o $method -varNames] \\\n" +"flag [::xotcl::classInfo ${inst}params $o $method] {\n" +"if {[string match -* $flag]} continue\n" +"lappend result $argName}\n" +"return $result}\n" +"proc ::xotcl::info_nonposargs {inst o method} {\n" +"set result [list]\n" +"foreach flag [::xotcl::classInfo ${inst}params $o $method] {\n" +"if {![string match -* $flag]} continue\n" +"lappend result $flag}\n" +"return $result}\n" +"proc ::xotcl::info_default {inst o method arg varName} {\n" +"foreach \\\n" +"argName [::xotcl::classInfo ${inst}params $o $method -varNames] \\\n" +"flag [::xotcl::classInfo ${inst}params $o $method] {\n" +"if {$argName eq $arg} {\n" +"upvar 3 $varName default\n" +"if {[llength $flag] == 2} {\n" +"set default [lindex $flag 1]\n" +"return 1}\n" +"set default \"\"\n" +"return 0}}\n" +"error \"procedure \\\"$method\\\" doesn't have an argument \\\"$varName\\\"\"}\n" +"::xotcl::classInfo proc instargs {o method} {::xotcl::info_args inst $o $method}\n" +"::xotcl::classInfo proc args {o method} {::xotcl::info_args \"\" $o $method}\n" +"::xotcl::objectInfo proc args {o method} {::xotcl::info_args \"\" $o $method}\n" +"::xotcl::classInfo proc instnonposargs {o method} {::xotcl::info_nonposargs inst $o $method}\n" +"::xotcl::classInfo proc nonposargs {o method} {::xotcl::info_nonposargs \"\" $o $method}\n" +"::xotcl::objectInfo proc nonposargs {o method} {::xotcl::info_nonposargs \"\" $o $method}\n" +"::xotcl::classInfo proc instdefault {o method arg var} {::xotcl::info_default inst $o $method $arg $var}\n" +"::xotcl::classInfo proc default {o method arg var} {::xotcl::info_default \"\" $o $method $arg $var}\n" +"::xotcl::objectInfo proc default {o method arg var} {::xotcl::info_default \"\" $o $method $arg $var}\n" "::xotcl::Object create ::xotcl::@\n" "::xotcl::@ proc unknown args {}\n" "proc ::xotcl::myproc {args} {linsert $args 0 [::xotcl::self]}\n" Index: generic/predefined.xotcl =================================================================== diff -u -rf4471765bb7aec8c793b5e365499726619119f63 -rf11b03a9a764254c5a1ba45480ebf5eb19e2bf8d --- generic/predefined.xotcl (.../predefined.xotcl) (revision f4471765bb7aec8c793b5e365499726619119f63) +++ generic/predefined.xotcl (.../predefined.xotcl) (revision f11b03a9a764254c5a1ba45480ebf5eb19e2bf8d) @@ -108,15 +108,15 @@ foreach cmd [info command ::xotcl::cmd::ClassInfo::*] { ::xotcl::alias ::xotcl::classInfo [namespace tail $cmd] $cmd } + unset cmd ::xotcl::alias ::xotcl::objectInfo is ::xotcl::is ::xotcl::alias ::xotcl::classInfo is ::xotcl::is ::xotcl::alias ::xotcl::classInfo classparent ::xotcl::cmd::ObjectInfo::parent ::xotcl::alias ::xotcl::classInfo classchildren ::xotcl::cmd::ObjectInfo::children - unset cmd ::xotcl::Object instforward info -onerror ::xotcl::infoError ::xotcl::objectInfo %1 {%@2 %self} ::xotcl::Class instforward info -onerror ::xotcl::infoError ::xotcl::classInfo %1 {%@2 %self} - + proc ::xotcl::infoError msg { #puts stderr "INFO ERROR: <$msg>\n$::errorInfo" regsub -all " " $msg "" msg @@ -150,6 +150,60 @@ error "unknown info option \"$method\"; [my info info]" } + # + # Backward compatibility info subcommands; TODO: should go finally into a library. + # + proc ::xotcl::info_args {inst o method} { + set result [list] + foreach \ + argName [::xotcl::classInfo ${inst}params $o $method -varNames] \ + flag [::xotcl::classInfo ${inst}params $o $method] { + if {[string match -* $flag]} continue + lappend result $argName + } + #puts stderr "+++ get ${inst}args for $o $method => $result" + return $result + } + proc ::xotcl::info_nonposargs {inst o method} { + set result [list] + foreach flag [::xotcl::classInfo ${inst}params $o $method] { + if {![string match -* $flag]} continue + lappend result $flag + } + #puts stderr "+++ get ${inst}nonposargs for $o $method => $result" + return $result + } + proc ::xotcl::info_default {inst o method arg varName} { + foreach \ + argName [::xotcl::classInfo ${inst}params $o $method -varNames] \ + flag [::xotcl::classInfo ${inst}params $o $method] { + if {$argName eq $arg} { + upvar 3 $varName default + if {[llength $flag] == 2} { + set default [lindex $flag 1] + #puts stderr "--- get ${inst}default for $o $method $arg => $default" + return 1 + } + #puts stderr "--- get ${inst}default for $o $method $arg fails" + set default "" + return 0 + } + } + error "procedure \"$method\" doesn't have an argument \"$varName\"" + } + + ::xotcl::classInfo proc instargs {o method} {::xotcl::info_args inst $o $method} + ::xotcl::classInfo proc args {o method} {::xotcl::info_args "" $o $method} + ::xotcl::objectInfo proc args {o method} {::xotcl::info_args "" $o $method} + + ::xotcl::classInfo proc instnonposargs {o method} {::xotcl::info_nonposargs inst $o $method} + ::xotcl::classInfo proc nonposargs {o method} {::xotcl::info_nonposargs "" $o $method} + ::xotcl::objectInfo proc nonposargs {o method} {::xotcl::info_nonposargs "" $o $method} + + ::xotcl::classInfo proc instdefault {o method arg var} {::xotcl::info_default inst $o $method $arg $var} + ::xotcl::classInfo proc default {o method arg var} {::xotcl::info_default "" $o $method $arg $var} + ::xotcl::objectInfo proc default {o method arg var} {::xotcl::info_default "" $o $method $arg $var} + # documentation stub object -> just ignore per default. # if xoDoc is loaded, documentation will be activated ::xotcl::Object create ::xotcl::@ @@ -799,12 +853,10 @@ # class object set obj $cl $cl superclass [$origin info superclass] - #$cl parameterclass [$origin info parameterclass] $cl instinvar [$origin info instinvar] $cl instfilter [$origin info instfilter -guards] $cl instmixin [$origin info instmixin] my copyNSVarsAndCmds ::xotcl::classes$origin ::xotcl::classes$dest - #$cl parameter [$origin info parameter] } else { # create obj set obj [[$origin info class] create $dest -noinit] @@ -814,9 +866,6 @@ $obj check [$origin info check] $obj mixin [$origin info mixin] $obj filter [$origin info filter -guards] - # set md [$origin info metadata] - # $obj metadata add $md - # foreach m $md { $obj metadata $m [$origin metadata $m] } if {[$origin info hasnamespace]} { $obj requireNamespace } Index: generic/tclAPI.h =================================================================== diff -u -rbfa35f91317151147869ce0f97f6c89f1ffc7fbe -rf11b03a9a764254c5a1ba45480ebf5eb19e2bf8d --- generic/tclAPI.h (.../tclAPI.h) (revision bfa35f91317151147869ce0f97f6c89f1ffc7fbe) +++ generic/tclAPI.h (.../tclAPI.h) (revision f11b03a9a764254c5a1ba45480ebf5eb19e2bf8d) @@ -60,18 +60,15 @@ static int XOTclCUnknownMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoHeritageMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstancesMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); -static int XOTclClassInfoInstargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstbodyMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstcommandsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); -static int XOTclClassInfoInstdefaultMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstfilterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstfilterguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstforwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstinvarMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstmixinMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstmixinguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstmixinofMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); -static int XOTclClassInfoInstnonposargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstparametercmdMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstparamsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstpostMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -82,13 +79,11 @@ static int XOTclClassInfoSlotsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoSubclassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoSuperclassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); -static int XOTclObjInfoArgsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoBodyMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoCheckMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoChildrenMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoClassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoCommandsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); -static int XOTclObjInfoDefaultMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoFilterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoFilterguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoForwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -97,7 +92,6 @@ static int XOTclObjInfoMethodsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoMixinMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoMixinguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); -static int XOTclObjInfoNonposargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoParametercmdMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoParamsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclObjInfoParentMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -165,18 +159,15 @@ static int XOTclCUnknownMethod(Tcl_Interp *interp, XOTclClass *cl, char *name, int objc, Tcl_Obj *CONST objv[]); static int XOTclClassInfoHeritageMethod(Tcl_Interp *interp, XOTclClass *class, char *pattern); static int XOTclClassInfoInstancesMethod(Tcl_Interp *interp, XOTclClass *class, int withClosure, char *patternString, XOTclObject *patternObj); -static int XOTclClassInfoInstargsMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName); static int XOTclClassInfoInstbodyMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName); static int XOTclClassInfoInstcommandsMethod(Tcl_Interp *interp, XOTclClass *class, char *pattern); -static int XOTclClassInfoInstdefaultMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName, char *arg, Tcl_Obj *var); static int XOTclClassInfoInstfilterMethod(Tcl_Interp *interp, XOTclClass *class, int withGuards, char *pattern); static int XOTclClassInfoInstfilterguardMethod(Tcl_Interp *interp, XOTclClass *class, char *filter); static int XOTclClassInfoInstforwardMethod(Tcl_Interp *interp, XOTclClass *class, int withDefinition, char *pattern); static int XOTclClassInfoInstinvarMethod(Tcl_Interp *interp, XOTclClass *class); static int XOTclClassInfoInstmixinMethod(Tcl_Interp *interp, XOTclClass *class, int withClosure, int withGuards, char *patternString, XOTclObject *patternObj); static int XOTclClassInfoInstmixinguardMethod(Tcl_Interp *interp, XOTclClass *class, char *mixin); static int XOTclClassInfoInstmixinofMethod(Tcl_Interp *interp, XOTclClass *class, int withClosure, char *patternString, XOTclObject *patternObj); -static int XOTclClassInfoInstnonposargsMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName); static int XOTclClassInfoInstparametercmdMethod(Tcl_Interp *interp, XOTclClass *class, char *pattern); static int XOTclClassInfoInstparamsMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName, int withVarnames); static int XOTclClassInfoInstpostMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName); @@ -187,13 +178,11 @@ static int XOTclClassInfoSlotsMethod(Tcl_Interp *interp, XOTclClass *class); static int XOTclClassInfoSubclassMethod(Tcl_Interp *interp, XOTclClass *class, int withClosure, char *patternString, XOTclObject *patternObj); static int XOTclClassInfoSuperclassMethod(Tcl_Interp *interp, XOTclClass *class, int withClosure, Tcl_Obj *pattern); -static int XOTclObjInfoArgsMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName); static int XOTclObjInfoBodyMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName); static int XOTclObjInfoCheckMethod(Tcl_Interp *interp, XOTclObject *object); static int XOTclObjInfoChildrenMethod(Tcl_Interp *interp, XOTclObject *object, char *pattern); static int XOTclObjInfoClassMethod(Tcl_Interp *interp, XOTclObject *object); static int XOTclObjInfoCommandsMethod(Tcl_Interp *interp, XOTclObject *object, char *pattern); -static int XOTclObjInfoDefaultMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName, char *arg, Tcl_Obj *var); static int XOTclObjInfoFilterMethod(Tcl_Interp *interp, XOTclObject *object, int withOrder, int withGuards, char *pattern); static int XOTclObjInfoFilterguardMethod(Tcl_Interp *interp, XOTclObject *object, char *filter); static int XOTclObjInfoForwardMethod(Tcl_Interp *interp, XOTclObject *object, int withDefinition, char *pattern); @@ -202,7 +191,6 @@ static int XOTclObjInfoMethodsMethod(Tcl_Interp *interp, XOTclObject *object, int withNoprocs, int withNocmds, int withNomixins, int withIncontext, char *pattern); static int XOTclObjInfoMixinMethod(Tcl_Interp *interp, XOTclObject *object, int withGuards, int withOrder, char *patternString, XOTclObject *patternObj); static int XOTclObjInfoMixinguardMethod(Tcl_Interp *interp, XOTclObject *object, char *mixin); -static int XOTclObjInfoNonposargsMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName); static int XOTclObjInfoParametercmdMethod(Tcl_Interp *interp, XOTclObject *object, char *pattern); static int XOTclObjInfoParamsMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName, int withVarnames); static int XOTclObjInfoParentMethod(Tcl_Interp *interp, XOTclObject *object); @@ -271,18 +259,15 @@ XOTclCUnknownMethodIdx, XOTclClassInfoHeritageMethodIdx, XOTclClassInfoInstancesMethodIdx, - XOTclClassInfoInstargsMethodIdx, XOTclClassInfoInstbodyMethodIdx, XOTclClassInfoInstcommandsMethodIdx, - XOTclClassInfoInstdefaultMethodIdx, XOTclClassInfoInstfilterMethodIdx, XOTclClassInfoInstfilterguardMethodIdx, XOTclClassInfoInstforwardMethodIdx, XOTclClassInfoInstinvarMethodIdx, XOTclClassInfoInstmixinMethodIdx, XOTclClassInfoInstmixinguardMethodIdx, XOTclClassInfoInstmixinofMethodIdx, - XOTclClassInfoInstnonposargsMethodIdx, XOTclClassInfoInstparametercmdMethodIdx, XOTclClassInfoInstparamsMethodIdx, XOTclClassInfoInstpostMethodIdx, @@ -293,13 +278,11 @@ XOTclClassInfoSlotsMethodIdx, XOTclClassInfoSubclassMethodIdx, XOTclClassInfoSuperclassMethodIdx, - XOTclObjInfoArgsMethodIdx, XOTclObjInfoBodyMethodIdx, XOTclObjInfoCheckMethodIdx, XOTclObjInfoChildrenMethodIdx, XOTclObjInfoClassMethodIdx, XOTclObjInfoCommandsMethodIdx, - XOTclObjInfoDefaultMethodIdx, XOTclObjInfoFilterMethodIdx, XOTclObjInfoFilterguardMethodIdx, XOTclObjInfoForwardMethodIdx, @@ -308,7 +291,6 @@ XOTclObjInfoMethodsMethodIdx, XOTclObjInfoMixinMethodIdx, XOTclObjInfoMixinguardMethodIdx, - XOTclObjInfoNonposargsMethodIdx, XOTclObjInfoParametercmdMethodIdx, XOTclObjInfoParamsMethodIdx, XOTclObjInfoParentMethodIdx, @@ -735,25 +717,6 @@ } static int -XOTclClassInfoInstargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - - if (ArgumentParse(interp, objc, objv, NULL, objv[0], - method_definitions[XOTclClassInfoInstargsMethodIdx].paramDefs, - method_definitions[XOTclClassInfoInstargsMethodIdx].nrParameters, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - XOTclClass *class = (XOTclClass *)pc.clientData[0]; - char *methodName = (char *)pc.clientData[1]; - - parseContextRelease(&pc); - return XOTclClassInfoInstargsMethod(interp, class, methodName); - - } -} - -static int XOTclClassInfoInstbodyMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -792,27 +755,6 @@ } static int -XOTclClassInfoInstdefaultMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - - if (ArgumentParse(interp, objc, objv, NULL, objv[0], - method_definitions[XOTclClassInfoInstdefaultMethodIdx].paramDefs, - method_definitions[XOTclClassInfoInstdefaultMethodIdx].nrParameters, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - XOTclClass *class = (XOTclClass *)pc.clientData[0]; - char *methodName = (char *)pc.clientData[1]; - char *arg = (char *)pc.clientData[2]; - Tcl_Obj *var = (Tcl_Obj *)pc.clientData[3]; - - parseContextRelease(&pc); - return XOTclClassInfoInstdefaultMethod(interp, class, methodName, arg, var); - - } -} - -static int XOTclClassInfoInstfilterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -978,25 +920,6 @@ } static int -XOTclClassInfoInstnonposargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - - if (ArgumentParse(interp, objc, objv, NULL, objv[0], - method_definitions[XOTclClassInfoInstnonposargsMethodIdx].paramDefs, - method_definitions[XOTclClassInfoInstnonposargsMethodIdx].nrParameters, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - XOTclClass *class = (XOTclClass *)pc.clientData[0]; - char *methodName = (char *)pc.clientData[1]; - - parseContextRelease(&pc); - return XOTclClassInfoInstnonposargsMethod(interp, class, methodName); - - } -} - -static int XOTclClassInfoInstparametercmdMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -1217,25 +1140,6 @@ } static int -XOTclObjInfoArgsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - - if (ArgumentParse(interp, objc, objv, NULL, objv[0], - method_definitions[XOTclObjInfoArgsMethodIdx].paramDefs, - method_definitions[XOTclObjInfoArgsMethodIdx].nrParameters, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - XOTclObject *object = (XOTclObject *)pc.clientData[0]; - char *methodName = (char *)pc.clientData[1]; - - parseContextRelease(&pc); - return XOTclObjInfoArgsMethod(interp, object, methodName); - - } -} - -static int XOTclObjInfoBodyMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -1329,27 +1233,6 @@ } static int -XOTclObjInfoDefaultMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - - if (ArgumentParse(interp, objc, objv, NULL, objv[0], - method_definitions[XOTclObjInfoDefaultMethodIdx].paramDefs, - method_definitions[XOTclObjInfoDefaultMethodIdx].nrParameters, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - XOTclObject *object = (XOTclObject *)pc.clientData[0]; - char *methodName = (char *)pc.clientData[1]; - char *arg = (char *)pc.clientData[2]; - Tcl_Obj *var = (Tcl_Obj *)pc.clientData[3]; - - parseContextRelease(&pc); - return XOTclObjInfoDefaultMethod(interp, object, methodName, arg, var); - - } -} - -static int XOTclObjInfoFilterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -1523,25 +1406,6 @@ } static int -XOTclObjInfoNonposargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - - if (ArgumentParse(interp, objc, objv, NULL, objv[0], - method_definitions[XOTclObjInfoNonposargsMethodIdx].paramDefs, - method_definitions[XOTclObjInfoNonposargsMethodIdx].nrParameters, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - XOTclObject *object = (XOTclObject *)pc.clientData[0]; - char *methodName = (char *)pc.clientData[1]; - - parseContextRelease(&pc); - return XOTclObjInfoNonposargsMethod(interp, object, methodName); - - } -} - -static int XOTclObjInfoParametercmdMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -2496,10 +2360,6 @@ {"-closure", 0, 0, convertToString}, {"pattern", 0, 0, convertToObjpattern}} }, -{"::xotcl::cmd::ClassInfo::instargs", XOTclClassInfoInstargsMethodStub, 2, { - {"class", 1, 0, convertToClass}, - {"methodName", 1, 0, convertToString}} -}, {"::xotcl::cmd::ClassInfo::instbody", XOTclClassInfoInstbodyMethodStub, 2, { {"class", 1, 0, convertToClass}, {"methodName", 1, 0, convertToString}} @@ -2508,12 +2368,6 @@ {"class", 1, 0, convertToClass}, {"pattern", 0, 0, convertToString}} }, -{"::xotcl::cmd::ClassInfo::instdefault", XOTclClassInfoInstdefaultMethodStub, 4, { - {"class", 1, 0, convertToClass}, - {"methodName", 1, 0, convertToString}, - {"arg", 1, 0, convertToString}, - {"var", 1, 0, convertToTclobj}} -}, {"::xotcl::cmd::ClassInfo::instfilter", XOTclClassInfoInstfilterMethodStub, 3, { {"class", 1, 0, convertToClass}, {"-guards", 0, 0, convertToString}, @@ -2546,10 +2400,6 @@ {"-closure", 0, 0, convertToString}, {"pattern", 0, 0, convertToObjpattern}} }, -{"::xotcl::cmd::ClassInfo::instnonposargs", XOTclClassInfoInstnonposargsMethodStub, 2, { - {"class", 1, 0, convertToClass}, - {"methodName", 1, 0, convertToString}} -}, {"::xotcl::cmd::ClassInfo::instparametercmd", XOTclClassInfoInstparametercmdMethodStub, 2, { {"class", 1, 0, convertToClass}, {"pattern", 0, 0, convertToString}} @@ -2592,10 +2442,6 @@ {"-closure", 0, 0, convertToString}, {"pattern", 0, 0, convertToTclobj}} }, -{"::xotcl::cmd::ObjectInfo::args", XOTclObjInfoArgsMethodStub, 2, { - {"object", 1, 0, convertToObject}, - {"methodName", 1, 0, convertToString}} -}, {"::xotcl::cmd::ObjectInfo::body", XOTclObjInfoBodyMethodStub, 2, { {"object", 1, 0, convertToObject}, {"methodName", 1, 0, convertToString}} @@ -2614,12 +2460,6 @@ {"object", 1, 0, convertToObject}, {"pattern", 0, 0, convertToString}} }, -{"::xotcl::cmd::ObjectInfo::default", XOTclObjInfoDefaultMethodStub, 4, { - {"object", 1, 0, convertToObject}, - {"methodName", 1, 0, convertToString}, - {"arg", 1, 0, convertToString}, - {"var", 1, 0, convertToTclobj}} -}, {"::xotcl::cmd::ObjectInfo::filter", XOTclObjInfoFilterMethodStub, 4, { {"object", 1, 0, convertToObject}, {"-order", 0, 0, convertToString}, @@ -2659,10 +2499,6 @@ {"object", 1, 0, convertToObject}, {"mixin", 1, 0, convertToString}} }, -{"::xotcl::cmd::ObjectInfo::nonposargs", XOTclObjInfoNonposargsMethodStub, 2, { - {"object", 1, 0, convertToObject}, - {"methodName", 1, 0, convertToString}} -}, {"::xotcl::cmd::ObjectInfo::parametercmd", XOTclObjInfoParametercmdMethodStub, 2, { {"object", 1, 0, convertToObject}, {"pattern", 0, 0, convertToString}} Index: generic/xotcl.c =================================================================== diff -u -rbfa35f91317151147869ce0f97f6c89f1ffc7fbe -rf11b03a9a764254c5a1ba45480ebf5eb19e2bf8d --- generic/xotcl.c (.../xotcl.c) (revision bfa35f91317151147869ce0f97f6c89f1ffc7fbe) +++ generic/xotcl.c (.../xotcl.c) (revision f11b03a9a764254c5a1ba45480ebf5eb19e2bf8d) @@ -162,7 +162,7 @@ #if defined(CANONICAL_ARGS) int ProcessMethodArguments(parseContext *pcPtr, Tcl_Interp *interp, XOTclObject *obj, int pushFrame, XOTclParamDefs *paramDefs, - char *methodName, int objc, Tcl_Obj *CONST objv[]); + char *methodName, int objc, Tcl_Obj *CONST objv[]); #endif void parseContextInit(parseContext *pc, int objc, XOTclObject *obj, Tcl_Obj *procName) { @@ -3623,7 +3623,7 @@ rc = checkConditionInScope(interp, guard); rst->guardCount--; - /*fprintf(stderr, "checking guard **%s** returned rc=%d\n", ObjStr(guard), rc);*/ + /*fprintf(stderr, "checking guard **%s** returned rc=%d\n", ObjStr(guard), rc);*/ if (rc == TCL_OK) { /* fprintf(stderr, " +++ OK\n"); */ @@ -4592,124 +4592,6 @@ return rc; } -static int -evalValueIfNeeded(Tcl_Interp *interp, XOTclObject *obj, CONST char *varName, Tcl_Obj **newValue) { - int rc = TCL_OK; - int doSubst = 0; - char *value = ObjStr(*newValue), *v; - /*fprintf(stderr,"+++++ evalValueIfNeeded %s.%s got '%s''\n", objectName(obj), varName, ObjStr(*newValue));*/ - - /* TODO: maybe we can do this more elegantely without the need to parse the vars */ - for (v=value; *v; v++) { - if (*v == '[' && doSubst == 0) - doSubst = 1; - else if ((doSubst == 1 && *v == ']') || *v == '$') { - doSubst = 2; - break; - } - } - - if (doSubst == 2) { /* we have to subst, we overwrite newValue */ - rc = SubstValue(interp, obj, newValue); - } - return rc; -} - -static int -setDefaultValue(Tcl_Interp *interp, XOTclObject *obj, XOTclObject *slotObj) { - CONST char *varName = Tcl_GetCommandName(interp, slotObj->id); - Tcl_Obj *oldValue; - int rc = TCL_OK; - - XOTcl_FrameDecls; - XOTcl_PushFrame(interp, obj); /* make instvars of obj accessible */ - - /* - * caller did a XOTcl_PushFrame(interp, obj), - * so we have the instvars already accessible; - */ - oldValue = Tcl_GetVar2Ex(interp, varName, NULL, - TCL_LEAVE_ERR_MSG|TCL_PARSE_PART1); - - /* Check whether the variable is already set. - * If yes, we do not set it again. - */ - if (oldValue == NULL) { - Tcl_Obj *newValue = XOTcl_GetVar2Ex((XOTcl_Object*)slotObj, interp, "default", NULL, - TCL_LEAVE_ERR_MSG|TCL_PARSE_PART1); - /*fprintf(stderr,"+++++ %s.%s undefined'\n", objectName(obj), varName);*/ - if (newValue) { - rc = evalValueIfNeeded(interp, obj, varName, &newValue); - if (rc != TCL_OK) { - goto leavesetdefaultvalue; - } - - /* - * just set the variable, checking is happening later - */ - /*fprintf(stderr,"+++++ %s.%s := '%s'\n", objectName(obj), varName, ObjStr(newValue));*/ - - Tcl_SetVar2Ex(interp, varName, NULL, newValue, - TCL_LEAVE_ERR_MSG|TCL_PARSE_PART1); - - } else { - /*fprintf(stderr, "----- we have no new value %s\n", varName);*/ - } - /* - * we set the initCmd for the time being unconditionally, if it is available - */ - { - /* try to get initcmd - */ - Tcl_Obj *initCmd = XOTcl_GetVar2Ex((XOTcl_Object*)slotObj, interp, "initcmd", NULL, - TCL_LEAVE_ERR_MSG|TCL_PARSE_PART1); - if (initCmd) { - char *cmd = ObjStr(initCmd); - /*fprintf(stderr, "----- we have an initcmd %s\n", cmd);*/ - if (*cmd) { -#if !defined(TCL85STACK) - CallStackPush(interp, obj, NULL, 0, XOTCL_CSC_TYPE_PLAIN); /*allow to call self*/ -#endif - - /*fprintf(stderr,"!!!! evaluating '%s'\n", cmd);*/ - rc = Tcl_EvalObjEx(interp, initCmd, TCL_EVAL_DIRECT); -#if !defined(TCL85STACK) - CallStackPop(interp, NULL); -#endif - - if (rc != TCL_OK) { - goto leavesetdefaultvalue; - } - } - } - } - } else { - /* fprintf(stderr, "+++ value for %s.%s already set\n", objectName(obj), varName);*/ - } - leavesetdefaultvalue: - XOTcl_PopFrame(interp, obj); - return rc; -} - -static int -checkRequiredValue(Tcl_Interp *interp, XOTclObject *obj, XOTclObject *slotObj) { - CONST char *varName = Tcl_GetCommandName(interp, slotObj->id); - int rc = TCL_OK, bool; - Tcl_Obj *requiredFlag = XOTcl_GetVar2Ex((XOTcl_Object*)slotObj, interp, "required", NULL, - TCL_LEAVE_ERR_MSG|TCL_PARSE_PART1); - if (requiredFlag) { - rc = Tcl_GetBooleanFromObj(interp, requiredFlag, &bool); - if (rc == TCL_OK && bool) { - /*fprintf(stderr,"+++++ %s.%s must check'\n", objectName(obj), varName);*/ - if (!varExists(interp, obj, varName, NULL, 0, 1)) { - return XOTclVarErrMsg(interp, "required parameter '", varName, "' missing", - (char *) NULL); - } - } - } - return rc; -} - #if !defined(PRE85) # if defined(WITH_TCL_COMPILE) # include @@ -4993,6 +4875,17 @@ return list; } +static Tcl_Obj * +ParamDefsList(Tcl_Interp *interp, XOTclParamDefs *paramDefs) { + Tcl_Obj *list = Tcl_NewListObj(0, NULL); + XOTclParam CONST *pPtr; + + for (pPtr = paramDefs->paramsPtr; pPtr->name; pPtr++) { + Tcl_ListObjAppendElement(interp, list, pPtr->nameObj); + } + return list; +} + static void ParsedParamFree(XOTclParsedParam *parsedParamPtr) { /*fprintf(stderr, "ParsedParamFree %p, npargs %p\n",parsedParamPtr,parsedParamPtr->paramDefs);*/ if (parsedParamPtr->paramDefs) { @@ -5486,7 +5379,7 @@ ALLOC_ON_STACK(Tcl_Obj*, objc+1, tov); /* fprintf(stderr,"calling unknown for %s %s, flgs=%02x,%02x isClass=%d %p %s\n", - objectName(obj), ObjStr(objv[1]), flags, XOTCL_CM_NO_UNKNOWN, + objectName(obj), ObjStr(objv[1]), flags, XOTCL_CM_NO_UNKNOWN, XOTclObjectIsClass(obj), obj, objectName(obj)); */ tov[0] = obj->cmdName; @@ -6040,7 +5933,7 @@ } static int -getMatchObject(Tcl_Interp *interp, Tcl_Obj *patternObj, Tcl_Obj *origObj, +getMatchObject(Tcl_Interp *interp, Tcl_Obj *patternObj, Tcl_Obj *origObj, XOTclObject **matchObject, char **pattern) { if (patternObj) { *pattern = ObjStr(patternObj); @@ -6216,72 +6109,6 @@ return 0; } -static void -AppendOrdinaryArgsFromNonposArgs(Tcl_Interp *interp, XOTclParamDefs *paramDefs, - int varsOnly, Tcl_Obj *argList) { - XOTclParam CONST *pPtr; - - for (pPtr = paramDefs->paramsPtr; pPtr->name; pPtr++) { - if (*pPtr->name == '-') continue; - if (varsOnly || pPtr->defaultValue == NULL) { - Tcl_ListObjAppendElement(interp, argList, Tcl_NewStringObj(pPtr->name,-1)); - } else { - Tcl_Obj *pair = Tcl_NewListObj(0,NULL); - Tcl_ListObjAppendElement(interp, pair, Tcl_NewStringObj(pPtr->name,-1)); - Tcl_ListObjAppendElement(interp, pair, pPtr->defaultValue); - Tcl_ListObjAppendElement(interp, argList, pair); - } - } -} - -static int -GetProcDefault(Tcl_Interp *interp, Proc *proc, char *arg, Tcl_Obj **resultObj) { - *resultObj = NULL; - if (proc) { - CompiledLocal *ap; - for (ap = proc->firstLocalPtr; ap; ap = ap->nextPtr) { - if (!TclIsCompiledLocalArgument(ap)) continue; - if (strcmp(arg, ap->name) != 0) continue; - - if (ap->defValuePtr) { - *resultObj = ap->defValuePtr; - return TCL_OK; - } - return TCL_OK; - } - } - return TCL_ERROR; -} - -static int -SetProcDefault(Tcl_Interp *interp, Tcl_Obj *var, Tcl_Obj *defVal) { - int result = TCL_OK; - callFrameContext ctx = {0}; - CallStackUseActiveFrames(interp, &ctx); - - if (defVal) { - if (Tcl_ObjSetVar2(interp, var, NULL, defVal, 0)) { - Tcl_SetIntObj(Tcl_GetObjResult(interp), 1); - } else { - result = TCL_ERROR; - } - } else { - if (Tcl_ObjSetVar2(interp, var, NULL, - XOTclGlobalObjects[XOTE_EMPTY], 0)) { - Tcl_SetIntObj(Tcl_GetObjResult(interp), 0); - } else { - result = TCL_ERROR; - } - } - CallStackRestoreSavedFrames(interp, &ctx); - - if (result == TCL_ERROR) { - XOTclVarErrMsg(interp, "couldn't store default value in variable '", - var, "'", (char *) NULL); - } - return result; -} - static char * StripBodyPrefix(char *body) { #if defined(PRE85) @@ -6430,7 +6257,7 @@ /* otherwise: MixinComputeDefined(interp, obj); */ /*fprintf(stderr,"nextsearch: mixinorder valid %d stack=%p\n", - obj->flags & XOTCL_MIXIN_ORDER_VALID, obj->mixinStack);*/ + obj->flags & XOTCL_MIXIN_ORDER_VALID, obj->mixinStack);*/ if ((obj->flags & XOTCL_MIXIN_ORDER_VALID) && obj->mixinStack) { *cmd = MixinSearchProc(interp, obj, *method, cl, currentCmd); @@ -8399,7 +8226,7 @@ return XOTclVarErrMsg(interp, "forward: invalid index specified in argument ", ObjStr(o), (char *) NULL); } if (!remainder || *remainder != ' ') { - return XOTclVarErrMsg(interp, "forward: invaild syntax in '", ObjStr(o), + return XOTclVarErrMsg(interp, "forward: invaild syntax in '", ObjStr(o), "' use: %@ ",(char *) NULL); } @@ -8950,7 +8777,7 @@ if (!isAbsolutePath(objName)) { tmpObj = NameInNamespaceObj(interp, objName, callingNameSpace(interp)); objName = ObjStr(tmpObj); - /*fprintf(stderr," **** fixed name is '%s'\n", objName);*/ + /*fprintf(stderr," **** fixed name is '%s'\n", objName);*/ INCR_REF_COUNT(tmpObj); tov[1] = tmpObj; @@ -9054,7 +8881,7 @@ Tcl_AppendToObj(argStringObj, "?", 1); } } - XOTclObjWrongArgs(interp, errorMsg, cmdNameObj, methodNameObj, ObjStr(argStringObj)); + XOTclObjWrongArgs(interp, errorMsg, cmdNameObj, methodNameObj, ObjStr(argStringObj)); DECR_REF_COUNT(argStringObj); return TCL_ERROR; } @@ -9076,7 +8903,7 @@ /*fprintf(stderr, "setting passed value for %s to '%s'\n",pPtr->name,ObjStr(pcPtr->objv[i]));*/ if (pPtr->converter == convertToSwitch) { int bool; - Tcl_GetBooleanFromObj(interp, pPtr->defaultValue, &bool); + Tcl_GetBooleanFromObj(interp, pPtr->defaultValue, &bool); pcPtr->objv[i] = Tcl_NewBooleanObj(!bool); } } else { @@ -9567,67 +9394,47 @@ return XOTclErrBadVal(interp, "info body", "a tcl method name", methodName); } -static int -ListArgsFromOrdinaryArgs(Tcl_Interp *interp, XOTclParamDefs *paramDefs) { - Tcl_Obj *argList = argList = Tcl_NewListObj(0, NULL); - AppendOrdinaryArgsFromNonposArgs(interp, paramDefs, 1, argList); - Tcl_SetObjResult(interp, argList); - return TCL_OK; -} +static int +ListParams(Tcl_Interp *interp, Proc *procPtr, char *methodName, int withVarnames) { + if (procPtr) { + XOTclParamDefs *paramDefs = procPtr ? ParamDefsGet((Tcl_Command)procPtr->cmdPtr) : NULL; + Tcl_Obj *list; + + if (paramDefs) { + /* + * Obtain parameter info from paramDefs + */ + list = withVarnames ? ParamDefsList(interp, paramDefs) : ParamDefsFormat(interp, paramDefs); -static int -ListProcDefault(Tcl_Interp *interp, Proc *procPtr, - char *name, char *arg, Tcl_Obj *var) { - Tcl_Obj *defVal; + } else { + /* + * Obtain parameter info from compiled locals + */ + CompiledLocal *args = procPtr->firstLocalPtr; - if (GetProcDefault(interp, procPtr, arg, &defVal) == TCL_OK) { - return SetProcDefault(interp, var, defVal); - } else { - return XOTclVarErrMsg(interp, "method '", name, - "' doesn't exist or doesn't have an argument '", - arg, "'", (char *) NULL); - } -} + list = Tcl_NewListObj(0, NULL); + for ( ; args; args = args->nextPtr) { + Tcl_Obj *innerlist; -static int -ListDefaultFromOrdinaryArgs(Tcl_Interp *interp, char *procName, - XOTclParamDefs *paramDefs, char *arg, Tcl_Obj *var) { - XOTclParam CONST *pPtr; - - for (pPtr = paramDefs->paramsPtr; pPtr->name; pPtr++) { - if (*pPtr->name == '-') continue; - if (strcmp(pPtr->name,arg) == 0) { - return SetProcDefault(interp, var, pPtr->defaultValue); + if (!TclIsCompiledLocalArgument(args)) { + continue; + } + + innerlist = Tcl_NewListObj(0, NULL); + Tcl_ListObjAppendElement(interp, innerlist, Tcl_NewStringObj(args->name, -1)); + if (!withVarnames && args->defValuePtr) { + Tcl_ListObjAppendElement(interp, innerlist, args->defValuePtr); + } + Tcl_ListObjAppendElement(interp, list, innerlist); + } } - } - return XOTclVarErrMsg(interp, "method '", procName, "' doesn't have an argument '", - arg, "'", (char *) NULL); -} -static int -ListProcArgs(Tcl_Interp *interp, Proc *proc, char *name) { - if (proc) { - CompiledLocal *args = proc->firstLocalPtr; - Tcl_ResetResult(interp); - for ( ; args; args = args->nextPtr) { - if (TclIsCompiledLocalArgument(args)) - Tcl_AppendElement(interp, args->name); - } + Tcl_SetObjResult(interp, list); return TCL_OK; - } - return XOTclErrBadVal(interp, "info args", "a tcl method name", name); -} -static int -ListParameter(Tcl_Interp *interp, Proc *procPtr, char *methodName, int withVarnames) { - XOTclParamDefs *paramDefs = procPtr ? ParamDefsGet((Tcl_Command)procPtr->cmdPtr) : NULL; - - if (paramDefs) { - Tcl_Obj *arglistObj = ParamDefsFormat(interp, paramDefs); - Tcl_SetObjResult(interp, arglistObj); - return TCL_OK; + } else { + return XOTclErrBadVal(interp, "info parameter", "a tcl method name", methodName); } - return ListProcArgs(interp, procPtr, methodName); } /******************************** * End result setting commands @@ -10147,7 +9954,7 @@ } static int -GetObjectParameterDefinition(Tcl_Interp *interp, char *methodName, XOTclObject *obj, +GetObjectParameterDefinition(Tcl_Interp *interp, char *methodName, XOTclObject *obj, XOTclParsedParam *parsedParamPtr) { int result; Tcl_Obj *rawConfArgs; @@ -10293,7 +10100,7 @@ #if defined(CONFIGURE_ARGS_TRACE) fprintf(stderr, "*** %s SET %s '%s'\n",objectName(obj), ObjStr(paramPtr->nameObj), ObjStr(newValue)); #endif - Tcl_ObjSetVar2(interp, paramPtr->nameObj, NULL, newValue, TCL_LEAVE_ERR_MSG|TCL_PARSE_PART1); + Tcl_ObjSetVar2(interp, paramPtr->nameObj, NULL, newValue, TCL_LEAVE_ERR_MSG|TCL_PARSE_PART1); } XOTcl_PopFrame(interp, obj); @@ -11231,16 +11038,6 @@ * Begin Object Info Methods ***************************/ -static int XOTclObjInfoArgsMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName) { - Proc *proc = getObjectProc(interp, object, methodName); - XOTclParamDefs *paramDefs = proc ? ParamDefsGet((Tcl_Command)proc->cmdPtr) : NULL; - - if (paramDefs) { - return ListArgsFromOrdinaryArgs(interp, paramDefs); - } - return ListProcArgs(interp, proc, methodName); -} - static int XOTclObjInfoBodyMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName) { Proc *proc = getObjectProc(interp, object, methodName); return ListProcBody(interp, proc, methodName); @@ -11263,17 +11060,6 @@ return ListKeys(interp, Tcl_Namespace_cmdTable(object->nsPtr), pattern); } -static int XOTclObjInfoDefaultMethod(Tcl_Interp *interp, XOTclObject *object, - char *methodName, char *arg, Tcl_Obj *var) { - Proc *procPtr = getObjectProc(interp, object, methodName); - XOTclParamDefs *paramDefs = procPtr ? ParamDefsGet((Tcl_Command)procPtr->cmdPtr) : NULL; - - if (paramDefs) { - return ListDefaultFromOrdinaryArgs(interp, methodName, paramDefs, arg, var); - } - return ListProcDefault(interp, procPtr, methodName, arg, var); -} - static int XOTclObjInfoFilterMethod(Tcl_Interp *interp, XOTclObject *object, int withOrder, int withGuards, char *pattern) { XOTclObjectOpt *opt = object->opt; @@ -11327,18 +11113,8 @@ return object->opt ? GuardList(interp, object->opt->mixins, mixin) : TCL_OK; } -static int XOTclObjInfoNonposargsMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName) { - Proc *procPtr = getObjectProc(interp, object, methodName); - XOTclParamDefs *paramDefs = procPtr ? ParamDefsGet((Tcl_Command)procPtr->cmdPtr) : NULL; - - if (paramDefs) { - Tcl_SetObjResult(interp, ParamDefsFormat(interp, paramDefs)); - } - return TCL_OK; -} - static int XOTclObjInfoParamsMethod(Tcl_Interp *interp, XOTclObject *object, char *methodName, int withVarnames) { - return ListParameter(interp, getObjectProc(interp, object, methodName), methodName, withVarnames); + return ListParams(interp, getObjectProc(interp, object, methodName), methodName, withVarnames); } static int XOTclObjInfoParametercmdMethod(Tcl_Interp *interp, XOTclObject *object, char *pattern) { @@ -11495,16 +11271,6 @@ return TCL_OK; } -static int XOTclClassInfoInstargsMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName) { - Proc *proc = getClassProc(interp, class, methodName); - XOTclParamDefs *paramDefs = proc ? ParamDefsGet((Tcl_Command)proc->cmdPtr) : NULL; - - if (paramDefs) { - return ListArgsFromOrdinaryArgs(interp, paramDefs); - } - return ListProcArgs(interp, proc, methodName); -} - static int XOTclClassInfoInstbodyMethod(Tcl_Interp *interp, XOTclClass *class, char * methodName) { Proc *proc = getClassProc(interp, class, methodName); return ListProcBody(interp, proc, methodName); @@ -11514,17 +11280,6 @@ return ListKeys(interp, Tcl_Namespace_cmdTable(class->nsPtr), pattern); } -static int XOTclClassInfoInstdefaultMethod(Tcl_Interp *interp, XOTclClass *class, - char *methodName, char *arg, Tcl_Obj *var) { - Proc *procPtr = getClassProc(interp, class, methodName); - XOTclParamDefs *paramDefs = procPtr ? ParamDefsGet((Tcl_Command)procPtr->cmdPtr) : NULL; - - if (paramDefs) { - return ListDefaultFromOrdinaryArgs(interp, methodName, paramDefs, arg, var); - } - return ListProcDefault(interp, procPtr, methodName, arg, var); -} - static int XOTclClassInfoInstfilterMethod(Tcl_Interp *interp, XOTclClass * class, int withGuards, char * pattern) { return class->opt ? FilterInfo(interp, class->opt->instfilters, pattern, withGuards, 0) : TCL_OK; } @@ -11598,23 +11353,12 @@ return TCL_OK; } -static int XOTclClassInfoInstnonposargsMethod(Tcl_Interp *interp, XOTclClass * class, - char * methodName) { - Proc *procPtr = getClassProc(interp, class, methodName); - XOTclParamDefs *paramDefs = procPtr ? ParamDefsGet((Tcl_Command)procPtr->cmdPtr) : NULL; - - if (paramDefs) { - Tcl_SetObjResult(interp, ParamDefsFormat(interp, paramDefs)); - } - return TCL_OK; -} - static int XOTclClassInfoInstparametercmdMethod(Tcl_Interp *interp, XOTclClass * class, char * pattern) { return ListMethodKeys(interp, Tcl_Namespace_cmdTable(class->nsPtr), pattern, 1, 0, 0, 0, 1); } static int XOTclClassInfoInstparamsMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName, int withVarnames) { - return ListParameter(interp, getClassProc(interp, class, methodName), methodName, withVarnames); + return ListParams(interp, getClassProc(interp, class, methodName), methodName, withVarnames); } static int XOTclClassInfoInstpostMethod(Tcl_Interp *interp, XOTclClass * class, char * methodName) { @@ -11832,43 +11576,20 @@ if (!XOTclpGetObject(interp, oldName)) { if (TclIsProc((Command*)cmd)) { Proc *procPtr = (Proc*) Tcl_Command_objClientData(cmd); - Tcl_Obj *arglistObj = NULL; - CompiledLocal *localPtr; - XOTclParamDefs *paramDefs = NULL; + Tcl_Obj *arglistObj; + int result; /* * Build a list containing the arguments of the proc */ - - paramDefs = ParamDefsGet(cmd); - if (paramDefs) { - arglistObj = ParamDefsFormat(interp, paramDefs); - INCR_REF_COUNT(arglistObj); - AppendOrdinaryArgsFromNonposArgs(interp, paramDefs, 0, arglistObj); + result = ListParams(interp, procPtr, oldName, 0); + if (result != TCL_OK) { + return result; } - if (!arglistObj) { - arglistObj = Tcl_NewListObj(0, NULL); - INCR_REF_COUNT(arglistObj); + arglistObj = Tcl_GetObjResult(interp); + INCR_REF_COUNT(arglistObj); - for (localPtr = procPtr->firstLocalPtr; localPtr; - localPtr = localPtr->nextPtr) { - - if (TclIsCompiledLocalArgument(localPtr)) { - Tcl_Obj *defVal, *defStringObj = Tcl_NewStringObj(localPtr->name, -1); - INCR_REF_COUNT(defStringObj); - - /* check for default values */ - if ((GetProcDefault(interp, procPtr, localPtr->name, &defVal) == TCL_OK) && defVal) { - Tcl_AppendStringsToObj(defStringObj, " ", ObjStr(defVal), - (char *) NULL); - } - Tcl_ListObjAppendElement(interp, arglistObj, defStringObj); - DECR_REF_COUNT(defStringObj); - } - } - } - if (Tcl_Command_objProc(cmd) == RUNTIME_STATE(interp)->objInterpProc) { Tcl_DString ds, *dsPtr = &ds; @@ -12106,7 +11827,7 @@ ProcessMethodArguments(parseContext *pcPtr, Tcl_Interp *interp, XOTclObject *obj, int pushFrame, XOTclParamDefs *paramDefs, - char *methodName, int objc, Tcl_Obj *CONST objv[]) { + char *methodName, int objc, Tcl_Obj *CONST objv[]) { int rc; XOTcl_FrameDecls; @@ -12233,7 +11954,7 @@ /*fprintf(stderr, "setting passed value for %s to '%s'\n",argName,ObjStr(pc.objv[i]));*/ if (pPtr->converter == convertToSwitch) { int bool; - Tcl_GetBooleanFromObj(interp, pPtr->defaultValue, &bool); + Tcl_GetBooleanFromObj(interp, pPtr->defaultValue, &bool); /*fprintf(stderr, "setting passed value for %s to '%d'\n",argName,!pc.clientData[i]);*/ Tcl_SetVar2Ex(interp, argName, NULL, Tcl_NewBooleanObj(!bool), 0); } else { Index: tests/objparametertest.xotcl =================================================================== diff -u -rbfa35f91317151147869ce0f97f6c89f1ffc7fbe -rf11b03a9a764254c5a1ba45480ebf5eb19e2bf8d --- tests/objparametertest.xotcl (.../objparametertest.xotcl) (revision bfa35f91317151147869ce0f97f6c89f1ffc7fbe) +++ tests/objparametertest.xotcl (.../objparametertest.xotcl) (revision f11b03a9a764254c5a1ba45480ebf5eb19e2bf8d) @@ -201,13 +201,33 @@ "query instparams" D instproc foo {a b {-c 1} {-d} x {-end 100}} { - foreach v [list a b c d x end] { - puts stderr $v?[info exists $v] + set result [list] + foreach v [[self class] info instparams [self proc] -varNames] { + lappend result $v [info exists $v] } + return $result } -d1 foo 1 2 3 +? {d1 foo 1 2 3} \ + "a 1 b 1 c 1 d 0 x 1 end 1" \ + "parse multiple groups of nonpos args" +D instproc foo {a b c {end 100}} { + set result [list] + foreach v [[self class] info instparams [self proc] -varNames] { + lappend result $v [info exists $v] + } + return $result +} +? {d1 foo 1 2 3} \ + "a 1 b 1 c 1 end 1" \ + "query arguments with default, no paramdefs needed" + +? {D info instparams foo} \ + "a b c {end 100}" \ + "query instparams with default, no paramdefs needed" + + ## TODO regression test for type checking, parameter options (initcmd, ## substdefault, combinations with defaults, ...), etc. -puts stderr =====END \ No newline at end of file +puts stderr =====END