Index: TODO =================================================================== diff -u -r76fadfb3f603f8f96a6064f4bb5342133923ec53 -r743d16c975ed13a6753d36eee38dc55395fcfed2 --- TODO (.../TODO) (revision 76fadfb3f603f8f96a6064f4bb5342133923ec53) +++ TODO (.../TODO) (revision 743d16c975ed13a6753d36eee38dc55395fcfed2) @@ -1130,13 +1130,23 @@ - use prefix sub= for methods invoked on "object as method" - change further instances of "my connection" to "[self]::connection" in xo*comm* +- implemented "object-methods-only" as alternative for prefix for + invoke "object as a method" +- added option "-returns" to Object.method + TODO: - deeper analysis of "contains" - check feasability of "obj info filter guard name" etc. - unify SubcmdObj() and ParamCheckObj() handling? - provide new tests for "TODO: changed xxxx" +- add incompatiblity to migration guide + Foo slot ints eval { set :incremental 1; :optimize} + should become: + Foo::slot::ints eval { set :incremental 1; :optimize} +- add option "-returns" to Class.method or remove + - interfaces in documentation for slots (see for more details ::nx::Class#superclass in nx.tcl). - nameing Index: generic/gentclAPI.decls =================================================================== diff -u -r513f795175db0329e73b1c7d14fb73255d62235a -r743d16c975ed13a6753d36eee38dc55395fcfed2 --- generic/gentclAPI.decls (.../gentclAPI.decls) (revision 513f795175db0329e73b1c7d14fb73255d62235a) +++ generic/gentclAPI.decls (.../gentclAPI.decls) (revision 743d16c975ed13a6753d36eee38dc55395fcfed2) @@ -558,6 +558,14 @@ {-argName "varname" -required 1} } +# temporary +# TODO: remove me +objectMethod vars XOTclOVarsMethod { + {-argName "pattern" -required 0} +} + + + # # class methods # Index: generic/tclAPI.h =================================================================== diff -u -r513f795175db0329e73b1c7d14fb73255d62235a -r743d16c975ed13a6753d36eee38dc55395fcfed2 --- generic/tclAPI.h (.../tclAPI.h) (revision 513f795175db0329e73b1c7d14fb73255d62235a) +++ generic/tclAPI.h (.../tclAPI.h) (revision 743d16c975ed13a6753d36eee38dc55395fcfed2) @@ -189,6 +189,7 @@ static int XOTclOResidualargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclOUplevelMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclOUpvarMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclOVarsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclOVolatileMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclOVwaitMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclAliasCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -262,6 +263,7 @@ static int XOTclOResidualargsMethod(Tcl_Interp *interp, XOTclObject *obj, int objc, Tcl_Obj *CONST objv[]); static int XOTclOUplevelMethod(Tcl_Interp *interp, XOTclObject *obj, int objc, Tcl_Obj *CONST objv[]); static int XOTclOUpvarMethod(Tcl_Interp *interp, XOTclObject *obj, int objc, Tcl_Obj *CONST objv[]); +static int XOTclOVarsMethod(Tcl_Interp *interp, XOTclObject *obj, CONST char *pattern); static int XOTclOVolatileMethod(Tcl_Interp *interp, XOTclObject *obj); static int XOTclOVwaitMethod(Tcl_Interp *interp, XOTclObject *obj, CONST char *varname); static int XOTclAliasCmd(Tcl_Interp *interp, XOTclObject *object, int withPer_object, CONST char *methodName, int withNonleaf, int withObjscope, Tcl_Obj *cmdName); @@ -336,6 +338,7 @@ XOTclOResidualargsMethodIdx, XOTclOUplevelMethodIdx, XOTclOUpvarMethodIdx, + XOTclOVarsMethodIdx, XOTclOVolatileMethodIdx, XOTclOVwaitMethodIdx, XOTclAliasCmdIdx, @@ -1266,6 +1269,25 @@ } static int +XOTclOVarsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + parseContext pc; + XOTclObject *obj = (XOTclObject *)clientData; + if (!obj) return XOTclObjErrType(interp, objv[0], "Object", ""); + if (ArgumentParse(interp, objc, objv, obj, objv[0], + method_definitions[XOTclOVarsMethodIdx].paramDefs, + method_definitions[XOTclOVarsMethodIdx].nrParameters, + &pc) != TCL_OK) { + return TCL_ERROR; + } else { + CONST char *pattern = (CONST char *)pc.clientData[0]; + + parseContextRelease(&pc); + return XOTclOVarsMethod(interp, obj, pattern); + + } +} + +static int XOTclOVolatileMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; @@ -2012,6 +2034,9 @@ {"::nsf::cmd::Object::upvar", XOTclOUpvarMethodStub, 1, { {"args", 0, 0, convertToNothing}} }, +{"::nsf::cmd::Object::vars", XOTclOVarsMethodStub, 1, { + {"pattern", 0, 0, convertToString}} +}, {"::nsf::cmd::Object::volatile", XOTclOVolatileMethodStub, 0, { } }, Index: generic/xotcl.c =================================================================== diff -u -r76fadfb3f603f8f96a6064f4bb5342133923ec53 -r743d16c975ed13a6753d36eee38dc55395fcfed2 --- generic/xotcl.c (.../xotcl.c) (revision 76fadfb3f603f8f96a6064f4bb5342133923ec53) +++ generic/xotcl.c (.../xotcl.c) (revision 743d16c975ed13a6753d36eee38dc55395fcfed2) @@ -5929,12 +5929,31 @@ if (objc < 2) { result = DispatchDefaultMethod(cp, interp, objc, objv); } else { +#if 0 ALLOC_ON_STACK(Tcl_Obj*, objc, tov); memcpy(tov, objv, sizeof(Tcl_Obj *)*(objc)); tov[1] = SubcmdObj(interp, ObjStr(objv[1]), -1); INCR_REF_COUNT(tov[1]); result = ObjectDispatch(cp, interp, objc, tov, XOTCL_CM_DELGATE); DECR_REF_COUNT(tov[1]); +#else + XOTclObject *self = (XOTclObject *)cp; + char *methodName; + if (self->nsPtr) { + methodName = ObjStr(objv[1]); + cmd = FindMethod(self->nsPtr, methodName); + if (cmd) { + result = MethodDispatch(object, interp, objc-1, objv+1, + cmd, object, NULL, methodName, frameType); + goto obj_dispatch_ok; + } + } + result = XOTclVarErrMsg(interp, objectName(self), + ": unable to dispatch method '", + methodName, "'", (char *) NULL); + obj_dispatch_ok:; + /*result = ObjectDispatch(cp, interp, objc, objv, XOTCL_CM_DELGATE);*/ +#endif } return result; } else if (proc == XOTclForwardMethod || @@ -13395,6 +13414,10 @@ return TCL_OK; } +/* todo temporary, remove me yyy */ +static int XOTclOVarsMethod(Tcl_Interp *interp, XOTclObject *object, CONST char *pattern) { + return XOTclObjInfoVarsMethod(interp, object, pattern); +} /*************************** * End Object Methods Index: library/nx/nx.tcl =================================================================== diff -u -r76fadfb3f603f8f96a6064f4bb5342133923ec53 -r743d16c975ed13a6753d36eee38dc55395fcfed2 --- library/nx/nx.tcl (.../nx.tcl) (revision 76fadfb3f603f8f96a6064f4bb5342133923ec53) +++ library/nx/nx.tcl (.../nx.tcl) (revision 743d16c975ed13a6753d36eee38dc55395fcfed2) @@ -125,12 +125,16 @@ # @param preAssertion Optional assertions that must hold before the proc executes # @param postAssertion Optional assertions that must hold after the proc executes ::nsf::method Object method { - name arguments body -precondition -postcondition + name arguments body -precondition -postcondition -returns } { set conditions [list] if {[info exists precondition]} {lappend conditions -precondition $precondition} if {[info exists postcondition]} {lappend conditions -postcondition $postcondition} - ::nsf::method [::nsf::current object] -per-object $name $arguments $body {*}$conditions + set r [::nsf::method [::nsf::current object] -per-object $name $arguments $body {*}$conditions] + if {[info exists returns]} { + ::nsf::methodproperty [::nsf::current object] $r returns $returns + } + return $r } # define method modifiers "object", "public" and "protected"