Index: generic/gentclAPI.decls =================================================================== diff -u -r2c0baf4a8ccba0820da0b4f318be18d2051e00ae -r1f1067f1a36bee1c928bb28c5284f53bf422c6dd --- generic/gentclAPI.decls (.../gentclAPI.decls) (revision 2c0baf4a8ccba0820da0b4f318be18d2051e00ae) +++ generic/gentclAPI.decls (.../gentclAPI.decls) (revision 1f1067f1a36bee1c928bb28c5284f53bf422c6dd) @@ -134,9 +134,12 @@ {-argName "relationtype" -required 1 -type "object-mixin|class-mixin|object-filter|class-filter|class|superclass|rootclass"} {-argName "value" -required 0 -type tclobj} } -xotclCmd self XOTclGetSelfObjCmd { - {-argName "selfoption" -required 0 -type "proc|class|activelevel|args|activemixin|calledproc|calledmethod|calledclass|callingproc|callingclass|callinglevel|callingobject|filterreg|isnextcall|next"} +xotclCmd current XOTclCurrentCmd { + {-argName "currentoption" -required 0 -type "proc|method|object|class|activelevel|args|activemixin|calledproc|calledmethod|calledclass|callingproc|callingmethod|callingclass|callinglevel|callingobject|filterreg|isnextcall|next"} } +xotclCmd self XOTclSelfCmd { + {-argName "selfoption" -required 0 -type "proc|method|object|class|activelevel|args|activemixin|calledproc|calledmethod|calledclass|callingproc|callingmethod|callingclass|callinglevel|callingobject|filterreg|isnextcall|next"} +} xotclCmd setvar XOTclSetVarCmd { {-argName "object" -required 1 -type object} {-argName "variable" -required 1 -type tclobj} Index: generic/predefined.h =================================================================== diff -u -r2c0baf4a8ccba0820da0b4f318be18d2051e00ae -r1f1067f1a36bee1c928bb28c5284f53bf422c6dd --- generic/predefined.h (.../predefined.h) (revision 2c0baf4a8ccba0820da0b4f318be18d2051e00ae) +++ generic/predefined.h (.../predefined.h) (revision 1f1067f1a36bee1c928bb28c5284f53bf422c6dd) @@ -558,7 +558,7 @@ "::xotcl2::Object create ::xotcl::@ {\n" ":method unknown args {}}\n" "namespace eval ::xotcl {\n" -"namespace export @ Attribute\n" +"namespace export @ Attribute current\n" "if {![info exists ::env(HOME)]} {set ::env(HOME) /root}\n" "set ::xotcl::confdir ~/.xotcl\n" "set ::xotcl::logdir $::xotcl::confdir/log\n" Index: generic/predefined.xotcl =================================================================== diff -u -r2c0baf4a8ccba0820da0b4f318be18d2051e00ae -r1f1067f1a36bee1c928bb28c5284f53bf422c6dd --- generic/predefined.xotcl (.../predefined.xotcl) (revision 2c0baf4a8ccba0820da0b4f318be18d2051e00ae) +++ generic/predefined.xotcl (.../predefined.xotcl) (revision 1f1067f1a36bee1c928bb28c5284f53bf422c6dd) @@ -1084,7 +1084,7 @@ namespace eval ::xotcl { # export the contents for all xotcl versions - namespace export @ Attribute + namespace export @ Attribute current # if HOME is not set, and ~ is resolved, Tcl chokes on that if {![info exists ::env(HOME)]} {set ::env(HOME) /root} Index: generic/tclAPI.h =================================================================== diff -u -r2c0baf4a8ccba0820da0b4f318be18d2051e00ae -r1f1067f1a36bee1c928bb28c5284f53bf422c6dd --- generic/tclAPI.h (.../tclAPI.h) (revision 2c0baf4a8ccba0820da0b4f318be18d2051e00ae) +++ generic/tclAPI.h (.../tclAPI.h) (revision 1f1067f1a36bee1c928bb28c5284f53bf422c6dd) @@ -65,16 +65,16 @@ } enum ConfigureoptionIdx {ConfigureoptionNULL, ConfigureoptionFilterIdx, ConfigureoptionSoftrecreateIdx, ConfigureoptionObjectsystemsIdx}; -static int convertToSelfoption(Tcl_Interp *interp, Tcl_Obj *objPtr, XOTclParam CONST *pPtr, +static int convertToCurrentoption(Tcl_Interp *interp, Tcl_Obj *objPtr, XOTclParam CONST *pPtr, ClientData *clientData, Tcl_Obj **outObjPtr) { int index, result; - static CONST char *opts[] = {"proc", "class", "activelevel", "args", "activemixin", "calledproc", "calledmethod", "calledclass", "callingproc", "callingclass", "callinglevel", "callingobject", "filterreg", "isnextcall", "next", NULL}; - result = Tcl_GetIndexFromObj(interp, objPtr, opts, "selfoption", 0, &index); + static CONST char *opts[] = {"proc", "method", "object", "class", "activelevel", "args", "activemixin", "calledproc", "calledmethod", "calledclass", "callingproc", "callingmethod", "callingclass", "callinglevel", "callingobject", "filterreg", "isnextcall", "next", NULL}; + result = Tcl_GetIndexFromObj(interp, objPtr, opts, "currentoption", 0, &index); *clientData = (ClientData) INT2PTR(index + 1); *outObjPtr = objPtr; return result; } -enum SelfoptionIdx {SelfoptionNULL, SelfoptionProcIdx, SelfoptionClassIdx, SelfoptionActivelevelIdx, SelfoptionArgsIdx, SelfoptionActivemixinIdx, SelfoptionCalledprocIdx, SelfoptionCalledmethodIdx, SelfoptionCalledclassIdx, SelfoptionCallingprocIdx, SelfoptionCallingclassIdx, SelfoptionCallinglevelIdx, SelfoptionCallingobjectIdx, SelfoptionFilterregIdx, SelfoptionIsnextcallIdx, SelfoptionNextIdx}; +enum CurrentoptionIdx {CurrentoptionNULL, CurrentoptionProcIdx, CurrentoptionMethodIdx, CurrentoptionObjectIdx, CurrentoptionClassIdx, CurrentoptionActivelevelIdx, CurrentoptionArgsIdx, CurrentoptionActivemixinIdx, CurrentoptionCalledprocIdx, CurrentoptionCalledmethodIdx, CurrentoptionCalledclassIdx, CurrentoptionCallingprocIdx, CurrentoptionCallingmethodIdx, CurrentoptionCallingclassIdx, CurrentoptionCallinglevelIdx, CurrentoptionCallingobjectIdx, CurrentoptionFilterregIdx, CurrentoptionIsnextcallIdx, CurrentoptionNextIdx}; static int convertToMethodproperty(Tcl_Interp *interp, Tcl_Obj *objPtr, XOTclParam CONST *pPtr, ClientData *clientData, Tcl_Obj **outObjPtr) { @@ -109,6 +109,17 @@ } enum RelationtypeIdx {RelationtypeNULL, RelationtypeObject_mixinIdx, RelationtypeClass_mixinIdx, RelationtypeObject_filterIdx, RelationtypeClass_filterIdx, RelationtypeClassIdx, RelationtypeSuperclassIdx, RelationtypeRootclassIdx}; +static int convertToSelfoption(Tcl_Interp *interp, Tcl_Obj *objPtr, XOTclParam CONST *pPtr, + ClientData *clientData, Tcl_Obj **outObjPtr) { + int index, result; + static CONST char *opts[] = {"proc", "method", "object", "class", "activelevel", "args", "activemixin", "calledproc", "calledmethod", "calledclass", "callingproc", "callingmethod", "callingclass", "callinglevel", "callingobject", "filterreg", "isnextcall", "next", NULL}; + result = Tcl_GetIndexFromObj(interp, objPtr, opts, "selfoption", 0, &index); + *clientData = (ClientData) INT2PTR(index + 1); + *outObjPtr = objPtr; + return result; +} +enum SelfoptionIdx {SelfoptionNULL, SelfoptionProcIdx, SelfoptionMethodIdx, SelfoptionObjectIdx, SelfoptionClassIdx, SelfoptionActivelevelIdx, SelfoptionArgsIdx, SelfoptionActivemixinIdx, SelfoptionCalledprocIdx, SelfoptionCalledmethodIdx, SelfoptionCalledclassIdx, SelfoptionCallingprocIdx, SelfoptionCallingmethodIdx, SelfoptionCallingclassIdx, SelfoptionCallinglevelIdx, SelfoptionCallingobjectIdx, SelfoptionFilterregIdx, SelfoptionIsnextcallIdx, SelfoptionNextIdx}; + typedef struct { char *methodName; @@ -193,12 +204,12 @@ static int XOTclColonCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclConfigureCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCreateObjectSystemCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclCurrentCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclDeprecatedCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclDispatchCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclExistsVarCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclFinalizeObjCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclForwardCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); -static int XOTclGetSelfObjCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclImportvarCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclInterpObjCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclIsCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -211,6 +222,7 @@ static int XOTclParametercheckCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclQualifyObjCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclRelationCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclSelfCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclSetVarCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclSetterCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -273,12 +285,12 @@ static int XOTclColonCmd(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); static int XOTclConfigureCmd(Tcl_Interp *interp, int configureoption, Tcl_Obj *value); static int XOTclCreateObjectSystemCmd(Tcl_Interp *interp, Tcl_Obj *rootClass, Tcl_Obj *rootMetaClass); +static int XOTclCurrentCmd(Tcl_Interp *interp, int currentoption); static int XOTclDeprecatedCmd(Tcl_Interp *interp, char *what, char *oldCmd, char *newCmd); static int XOTclDispatchCmd(Tcl_Interp *interp, XOTclObject *object, int withObjscope, Tcl_Obj *command, int nobjc, Tcl_Obj *CONST nobjv[]); static int XOTclExistsVarCmd(Tcl_Interp *interp, XOTclObject *object, char *var); static int XOTclFinalizeObjCmd(Tcl_Interp *interp); static int XOTclForwardCmd(Tcl_Interp *interp, XOTclObject *object, int withPer_object, Tcl_Obj *method, Tcl_Obj *withDefault, int withEarlybinding, Tcl_Obj *withMethodprefix, int withObjscope, Tcl_Obj *withOnerror, int withVerbose, Tcl_Obj *target, int nobjc, Tcl_Obj *CONST nobjv[]); -static int XOTclGetSelfObjCmd(Tcl_Interp *interp, int selfoption); static int XOTclImportvarCmd(Tcl_Interp *interp, XOTclObject *object, int nobjc, Tcl_Obj *CONST nobjv[]); static int XOTclInterpObjCmd(Tcl_Interp *interp, char *name, int objc, Tcl_Obj *CONST objv[]); static int XOTclIsCmd(Tcl_Interp *interp, Tcl_Obj *value, Tcl_Obj *constraint, Tcl_Obj *withHasmixin, Tcl_Obj *withType, Tcl_Obj *arg); @@ -291,6 +303,7 @@ static int XOTclParametercheckCmd(Tcl_Interp *interp, int withNocomplain, Tcl_Obj *param, Tcl_Obj *value); static int XOTclQualifyObjCmd(Tcl_Interp *interp, Tcl_Obj *name); static int XOTclRelationCmd(Tcl_Interp *interp, XOTclObject *object, int relationtype, Tcl_Obj *value); +static int XOTclSelfCmd(Tcl_Interp *interp, int selfoption); static int XOTclSetVarCmd(Tcl_Interp *interp, XOTclObject *object, Tcl_Obj *variable, Tcl_Obj *value); static int XOTclSetterCmd(Tcl_Interp *interp, XOTclObject *object, int withPer_object, Tcl_Obj *parameter); @@ -354,12 +367,12 @@ XOTclColonCmdIdx, XOTclConfigureCmdIdx, XOTclCreateObjectSystemCmdIdx, + XOTclCurrentCmdIdx, XOTclDeprecatedCmdIdx, XOTclDispatchCmdIdx, XOTclExistsVarCmdIdx, XOTclFinalizeObjCmdIdx, XOTclForwardCmdIdx, - XOTclGetSelfObjCmdIdx, XOTclImportvarCmdIdx, XOTclInterpObjCmdIdx, XOTclIsCmdIdx, @@ -372,6 +385,7 @@ XOTclParametercheckCmdIdx, XOTclQualifyObjCmdIdx, XOTclRelationCmdIdx, + XOTclSelfCmdIdx, XOTclSetVarCmdIdx, XOTclSetterCmdIdx } XOTclMethods; @@ -1542,6 +1556,24 @@ } static int +XOTclCurrentCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + parseContext pc; + + if (ArgumentParse(interp, objc, objv, NULL, objv[0], + method_definitions[XOTclCurrentCmdIdx].paramDefs, + method_definitions[XOTclCurrentCmdIdx].nrParameters, + &pc) != TCL_OK) { + return TCL_ERROR; + } else { + int currentoption = (int )PTR2INT(pc.clientData[0]); + + parseContextRelease(&pc); + return XOTclCurrentCmd(interp, currentoption); + + } +} + +static int XOTclDeprecatedCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -1646,24 +1678,6 @@ } static int -XOTclGetSelfObjCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - - if (ArgumentParse(interp, objc, objv, NULL, objv[0], - method_definitions[XOTclGetSelfObjCmdIdx].paramDefs, - method_definitions[XOTclGetSelfObjCmdIdx].nrParameters, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - int selfoption = (int )PTR2INT(pc.clientData[0]); - - parseContextRelease(&pc); - return XOTclGetSelfObjCmd(interp, selfoption); - - } -} - -static int XOTclImportvarCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -1905,6 +1919,24 @@ } static int +XOTclSelfCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + parseContext pc; + + if (ArgumentParse(interp, objc, objv, NULL, objv[0], + method_definitions[XOTclSelfCmdIdx].paramDefs, + method_definitions[XOTclSelfCmdIdx].nrParameters, + &pc) != TCL_OK) { + return TCL_ERROR; + } else { + int selfoption = (int )PTR2INT(pc.clientData[0]); + + parseContextRelease(&pc); + return XOTclSelfCmd(interp, selfoption); + + } +} + +static int XOTclSetVarCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -2195,6 +2227,9 @@ {"rootClass", 1, 0, convertToTclobj}, {"rootMetaClass", 1, 0, convertToTclobj}} }, +{"::xotcl::current", XOTclCurrentCmdStub, 1, { + {"currentoption", 0, 0, convertToCurrentoption}} +}, {"::xotcl::deprecated", XOTclDeprecatedCmdStub, 3, { {"what", 1, 0, convertToString}, {"oldCmd", 1, 0, convertToString}, @@ -2226,9 +2261,6 @@ {"target", 0, 0, convertToTclobj}, {"args", 0, 0, convertToNothing}} }, -{"::xotcl::self", XOTclGetSelfObjCmdStub, 1, { - {"selfoption", 0, 0, convertToSelfoption}} -}, {"::xotcl::importvar", XOTclImportvarCmdStub, 2, { {"object", 0, 0, convertToObject}, {"args", 0, 0, convertToNothing}} @@ -2293,6 +2325,9 @@ {"relationtype", 1, 0, convertToRelationtype}, {"value", 0, 0, convertToTclobj}} }, +{"::xotcl::self", XOTclSelfCmdStub, 1, { + {"selfoption", 0, 0, convertToSelfoption}} +}, {"::xotcl::setvar", XOTclSetVarCmdStub, 3, { {"object", 1, 0, convertToObject}, {"variable", 1, 0, convertToTclobj}, Index: generic/xotcl.c =================================================================== diff -u -r02aed4cae11ab394396aaff86d08ee22d1e2c910 -r1f1067f1a36bee1c928bb28c5284f53bf422c6dd --- generic/xotcl.c (.../xotcl.c) (revision 02aed4cae11ab394396aaff86d08ee22d1e2c910) +++ generic/xotcl.c (.../xotcl.c) (revision 1f1067f1a36bee1c928bb28c5284f53bf422c6dd) @@ -12185,28 +12185,32 @@ {-argName "selfoption" -required 0 -type "proc|class|activelevel|args|activemixin|calledproc|calledmethod|calledclass|callingproc|callingclass|callinglevel|callingobject|filterreg|isnextcall|next"} } */ -static int XOTclGetSelfObjCmd(Tcl_Interp *interp, int selfoption) { +static int XOTclSelfCmd(Tcl_Interp *interp, int selfoption) { + return XOTclCurrentCmd(interp, selfoption); +} +static int XOTclCurrentCmd(Tcl_Interp *interp, int selfoption) { XOTclObject *object = GetSelfObj(interp); XOTclCallStackContent *cscPtr; int result = TCL_OK; /*fprintf(stderr, "getSelfObj returns %p\n", obj); tcl85showStack(interp);*/ - if (selfoption == 0) { + if (selfoption == 0 || selfoption == SelfoptionObjectIdx) { if (object) { Tcl_SetObjResult(interp, object->cmdName); return TCL_OK; } else { - return XOTclVarErrMsg(interp, "self: no current object", (char *) NULL); + return XOTclVarErrMsg(interp, "No current object", (char *) NULL); } } if (!object && selfoption != SelfoptionCallinglevelIdx) { - return XOTclVarErrMsg(interp, "self: no current object", (char *) NULL); + return XOTclVarErrMsg(interp, "No current object", (char *) NULL); } switch (selfoption) { - case SelfoptionProcIdx: { /* proc subcommand */ + case SelfoptionMethodIdx: /* fall through */ + case SelfoptionProcIdx: cscPtr = CallStackGetTopFrame(interp, NULL); if (cscPtr) { CONST char *procName = Tcl_GetCommandName(interp, cscPtr->cmdPtr); @@ -12215,18 +12219,15 @@ return XOTclVarErrMsg(interp, "Can't find proc", (char *) NULL); } break; - } - case SelfoptionClassIdx: { /* class subcommand */ + case SelfoptionClassIdx: /* class subcommand */ cscPtr = CallStackGetTopFrame(interp, NULL); Tcl_SetObjResult(interp, cscPtr->cl ? cscPtr->cl->object.cmdName : XOTclGlobalObjects[XOTE_EMPTY]); break; - } - case SelfoptionActivelevelIdx: { + case SelfoptionActivelevelIdx: Tcl_SetObjResult(interp, computeLevelObj(interp, ACTIVE_LEVEL)); break; - } case SelfoptionArgsIdx: { int nobjc; @@ -12255,7 +12256,7 @@ } case SelfoptionCalledprocIdx: - case SelfoptionCalledmethodIdx: { + case SelfoptionCalledmethodIdx: cscPtr = CallStackFindActiveFilter(interp); if (cscPtr) { Tcl_SetObjResult(interp, cscPtr->filterStackEntry->calledProc); @@ -12264,12 +12265,12 @@ (char *) NULL); } break; - } - + case SelfoptionCalledclassIdx: Tcl_SetResult(interp, className(FindCalledClass(interp, object)), TCL_VOLATILE); break; + case SelfoptionCallingmethodIdx: case SelfoptionCallingprocIdx: cscPtr = XOTclCallStackFindLastInvocation(interp, 1, NULL); Tcl_SetResult(interp, cscPtr ? (char *)Tcl_GetCommandName(interp, cscPtr->cmdPtr) : "", @@ -12301,7 +12302,7 @@ Tcl_SetObjResult(interp, FilterFindReg(interp, object, cscPtr->cmdPtr)); } else { result = XOTclVarErrMsg(interp, - "self filterreg called from outside of a filter", + "called from outside of a filter", (char *) NULL); } break;