Index: generic/xotcl.c =================================================================== diff -u -r652147d4e1a22b381b2ca9e6354f52e1d8050c61 -r108d81ec266a27d011953bdc6b7d8b32eb0afcc7 --- generic/xotcl.c (.../xotcl.c) (revision 652147d4e1a22b381b2ca9e6354f52e1d8050c61) +++ generic/xotcl.c (.../xotcl.c) (revision 108d81ec266a27d011953bdc6b7d8b32eb0afcc7) @@ -10119,6 +10119,32 @@ return TCL_OK; } +static int XOTclMyCmd(Tcl_Interp *interp, int withLocal, Tcl_Obj *method, int nobjc, Tcl_Obj *CONST nobjv[]) { + XOTclObject *self = GetSelfObj(interp); + int result; + + if (!self) + return XOTclVarErrMsg(interp, "Cannot resolve 'self', probably called outside the context of an XOTcl Object", + (char *) NULL); + + if (withLocal) { + XOTclClass *cl = self->cl; + char *methodName = ObjStr(method); + Tcl_Command cmd = FindMethod(methodName, cl->nsPtr); + if (cmd == 0) + return XOTclVarErrMsg(interp, objectName(self), + ": unable to dispatch local method '", + methodName, "' in class ", className(cl), + (char *) NULL); + result = DoCallProcCheck((ClientData)self, interp, nobjc+2, nobjv, cmd, self, cl, + methodName, 0); + } else { + result = callMethod((ClientData)self, interp, method, nobjc+2, nobjv, 0); + } + return result; +} + + static int XOTclRelationCmd(Tcl_Interp *interp, XOTclObject *object, Tcl_Obj *reltype, Tcl_Obj *value) { int oc; Tcl_Obj **ov; XOTclObject *nobj = NULL; @@ -10861,12 +10887,10 @@ int withObjscope, Tcl_Obj *withOnerror, int withVerbose, Tcl_Obj *target, int nobjc, Tcl_Obj *CONST nobjv[]) { forwardCmdClientData *tcd; - int rc; - - rc = forwardProcessOptions(interp, method, - withDefault, withEarlybinding, withMethodprefix, - withObjscope, withOnerror, withVerbose, - target, nobjc, nobjv, &tcd); + int rc = forwardProcessOptions(interp, method, + withDefault, withEarlybinding, withMethodprefix, + withObjscope, withOnerror, withVerbose, + target, nobjc, nobjv, &tcd); if (rc == TCL_OK) { tcd->obj = obj; XOTclAddPMethod(interp, (XOTcl_Object *)obj, NSTail(ObjStr(method)), @@ -12225,50 +12249,7 @@ return rc; } -int -XOTclSelfDispatchCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - XOTclObject *self; - int result, i = 1; - char *arg1; - if (objc < 2) return XOTclObjErrArgCnt(interp, objv[0], NULL, "?-local? method ?args?"); - - if (!(self = GetSelfObj(interp))) { - result = XOTclVarErrMsg(interp, "Cannot resolve 'self', probably called outside the context of an XOTcl Object", - (char *) NULL); - } - - arg1 = ObjStr(objv[1]); - - if (*arg1 == '-' && !strcmp("-local", arg1)) { - XOTclClass *cl = GetSelfClass(interp); - Tcl_Command cmd; - char *method; - if (objc < 3) return XOTclObjErrArgCnt(interp, objv[0], NULL, "?-local? method ?args?"); - - method = ObjStr(objv[2]); - i++; - cmd = FindMethod(method, cl->nsPtr); - if (cmd == 0) - return XOTclVarErrMsg(interp, objectName(self), - ": unable to dispatch local method '", - method, "' in class ", className(cl), - (char *) NULL); - /*fprintf(stderr, "method %s, cmd = %p objc=%d\n", method, cmd, objc); - for (i=0; i