Index: generic/nsf.c =================================================================== diff -u -rdd2352511413900de40068dafb06731b23e14891 -r7a3ce03f8d70724a621e75469908f0d3aa57ba3e --- generic/nsf.c (.../nsf.c) (revision dd2352511413900de40068dafb06731b23e14891) +++ generic/nsf.c (.../nsf.c) (revision 7a3ce03f8d70724a621e75469908f0d3aa57ba3e) @@ -12007,7 +12007,7 @@ static int ParamParse(Tcl_Interp *interp, Tcl_Obj *procNameObj, Tcl_Obj *arg, int disallowedFlags, Nsf_Param *paramPtr, int *possibleUnknowns, int *plainParams, int *nrNonposArgs) { - int result, npac, isNonposArgument; + int result, npac, isNonposArgument, parensCount; size_t length, j; CONST char *argString, *argName; Tcl_Obj **npav; @@ -12044,9 +12044,23 @@ /*fprintf(stderr, "... parsing '%s', name '%s' argString '%s' \n", ObjStr(arg), argName, argString);*/ - /* find the first ':' */ + /* + * Find the first ':' outside of parens; the name of the parameter might be + * in array syntax, the array index might contain ":", "," etc. + */ + parensCount = 0; for (j=0; j 0 && argString[j] == ')') { + parensCount --; + continue; + } + if (argString[j] == '(') { + parensCount ++; + continue; + } + if (parensCount == 0 && argString[j] == ':') { + break; + } } if (argString[j] == ':') { @@ -23285,6 +23299,17 @@ } /* +objectInfoMethod name NsfObjInfoNameMethod { +} +*/ +static int +NsfObjInfoNameMethod(Tcl_Interp *interp, NsfObject *object) { + + Tcl_SetObjResult(interp, Tcl_NewStringObj(Tcl_GetCommandName(interp, object->id), -1)); + return TCL_OK; +} + +/* objectInfoMethod parent NsfObjInfoParentMethod { } */ Index: generic/nsfAPI.decls =================================================================== diff -u -rf61ee3dfc17d8cf04a0dc9ada9cb0f939514a511 -r7a3ce03f8d70724a621e75469908f0d3aa57ba3e --- generic/nsfAPI.decls (.../nsfAPI.decls) (revision f61ee3dfc17d8cf04a0dc9ada9cb0f939514a511) +++ generic/nsfAPI.decls (.../nsfAPI.decls) (revision 7a3ce03f8d70724a621e75469908f0d3aa57ba3e) @@ -403,6 +403,8 @@ objectInfoMethod mixinguard NsfObjInfoMixinguardMethod { {-argName "mixin" -required 1} } +objectInfoMethod name NsfObjInfoNameMethod { +} objectInfoMethod parent NsfObjInfoParentMethod { } objectInfoMethod precedence NsfObjInfoPrecedenceMethod { Index: generic/nsfAPI.h =================================================================== diff -u -r1f5f538eb5d3a30d1f616b9c7badfd7da90ba3a7 -r7a3ce03f8d70724a621e75469908f0d3aa57ba3e --- generic/nsfAPI.h (.../nsfAPI.h) (revision 1f5f538eb5d3a30d1f616b9c7badfd7da90ba3a7) +++ generic/nsfAPI.h (.../nsfAPI.h) (revision 7a3ce03f8d70724a621e75469908f0d3aa57ba3e) @@ -208,7 +208,7 @@ /* just to define the symbol */ -static Nsf_methodDefinition method_definitions[100]; +static Nsf_methodDefinition method_definitions[101]; static CONST char *method_command_namespace_names[] = { "::nsf::methods::object::info", @@ -311,6 +311,7 @@ static int NsfObjInfoMethodsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfObjInfoMixinclassesMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfObjInfoMixinguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int NsfObjInfoNameMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfObjInfoParentMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfObjInfoPrecedenceMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int NsfObjInfoSlotobjectsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -411,6 +412,7 @@ static int NsfObjInfoMethodsMethod(Tcl_Interp *interp, NsfObject *obj, int withCallprotection, int withMethodtype, int withPath, CONST char *pattern); static int NsfObjInfoMixinclassesMethod(Tcl_Interp *interp, NsfObject *obj, int withGuards, int withHeritage, CONST char *patternString, NsfObject *patternObject); static int NsfObjInfoMixinguardMethod(Tcl_Interp *interp, NsfObject *obj, CONST char *mixin); +static int NsfObjInfoNameMethod(Tcl_Interp *interp, NsfObject *obj); static int NsfObjInfoParentMethod(Tcl_Interp *interp, NsfObject *obj); static int NsfObjInfoPrecedenceMethod(Tcl_Interp *interp, NsfObject *obj, int withIntrinsic, CONST char *pattern); static int NsfObjInfoSlotobjectsMethod(Tcl_Interp *interp, NsfObject *obj, NsfClass *withType, CONST char *pattern); @@ -512,6 +514,7 @@ NsfObjInfoMethodsMethodIdx, NsfObjInfoMixinclassesMethodIdx, NsfObjInfoMixinguardMethodIdx, + NsfObjInfoNameMethodIdx, NsfObjInfoParentMethodIdx, NsfObjInfoPrecedenceMethodIdx, NsfObjInfoSlotobjectsMethodIdx, @@ -2382,6 +2385,22 @@ } static int +NsfObjInfoNameMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + NsfObject *obj = (NsfObject *)clientData; + if (unlikely(obj == NULL)) return NsfDispatchClientDataError(interp, clientData, "object", "name"); + + + if (unlikely(objc != 1)) { + return NsfArgumentError(interp, "too many arguments:", + method_definitions[NsfObjInfoNameMethodIdx].paramDefs, + NULL, objv[0]); + } + + return NsfObjInfoNameMethod(interp, obj); + +} + +static int NsfObjInfoParentMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { NsfObject *obj = (NsfObject *)clientData; if (unlikely(obj == NULL)) return NsfDispatchClientDataError(interp, clientData, "object", "parent"); @@ -2456,7 +2475,7 @@ } } -static Nsf_methodDefinition method_definitions[100] = { +static Nsf_methodDefinition method_definitions[101] = { {"::nsf::methods::class::alloc", NsfCAllocMethodStub, 1, { {"objectName", NSF_ARG_REQUIRED, 1, Nsf_ConvertToTclobj, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}} }, @@ -2864,6 +2883,9 @@ {"::nsf::methods::object::info::mixinguard", NsfObjInfoMixinguardMethodStub, 1, { {"mixin", NSF_ARG_REQUIRED, 1, Nsf_ConvertToString, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}} }, +{"::nsf::methods::object::info::name", NsfObjInfoNameMethodStub, 0, { + {NULL, 0, 0, NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}} +}, {"::nsf::methods::object::info::parent", NsfObjInfoParentMethodStub, 0, { {NULL, 0, 0, NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}} }, Index: generic/nsfAPI.nxdocindex =================================================================== diff -u -r8040970d348ab537d9e3fefbc7f15d262ca52870 -r7a3ce03f8d70724a621e75469908f0d3aa57ba3e --- generic/nsfAPI.nxdocindex (.../nsfAPI.nxdocindex) (revision 8040970d348ab537d9e3fefbc7f15d262ca52870) +++ generic/nsfAPI.nxdocindex (.../nsfAPI.nxdocindex) (revision 7a3ce03f8d70724a621e75469908f0d3aa57ba3e) @@ -79,6 +79,7 @@ set ::nxdoc::include(::nsf::methods::object::info::methods) 0 set ::nxdoc::include(::nsf::methods::object::info::mixinclasses) 0 set ::nxdoc::include(::nsf::methods::object::info::mixinguard) 0 +set ::nxdoc::include(::nsf::methods::object::info::name) 0 set ::nxdoc::include(::nsf::methods::object::info::parent) 0 set ::nxdoc::include(::nsf::methods::object::info::precedence) 0 set ::nxdoc::include(::nsf::methods::object::info::slotobjects) 0