Index: generic/nsf.c =================================================================== diff -u -N -rdcbf5b0c83304f2064dc5156fa6b48fb13269cb3 -r1919d17fefad9446170fa6d532b439f494189b32 --- generic/nsf.c (.../nsf.c) (revision dcbf5b0c83304f2064dc5156fa6b48fb13269cb3) +++ generic/nsf.c (.../nsf.c) (revision 1919d17fefad9446170fa6d532b439f494189b32) @@ -24892,6 +24892,33 @@ } } +static Tcl_Obj *DisassembleProc(Tcl_Interp *interp, Proc *procPtr, + const char *procName, Namespace *nsPtr) + nonnull(1) nonnull(2) nonnull(3) nonnull(4); + +static Tcl_Obj *DisassembleProc(Tcl_Interp *interp, Proc *procPtr, + const char *procName, Namespace *nsPtr) { + unsigned int dummy = 0; + Tcl_Obj *byteCodeObj = NULL; + + if ((procPtr->bodyPtr->typePtr == Nsf_OT_byteCodeType) || + (ByteCompiled(interp, &dummy, procPtr, nsPtr, procName) == TCL_OK)) { + Tcl_Obj *ov[3]; + + ov[0] = NULL; + ov[1] = NsfGlobalObjs[NSF_SCRIPT]; + ov[2] = procPtr->bodyPtr; + + if ((NsfCallCommand(interp, NSF_DISASSEMBLE, 3, ov) == TCL_OK)) { + byteCodeObj = Tcl_GetObjResult(interp); + } + } + + return byteCodeObj; +} + + + /* *---------------------------------------------------------------------- * ListMethod -- @@ -24937,7 +24964,8 @@ const char *pattern, bool withPer_object) { - Tcl_ObjCmdProc *procPtr; + Tcl_ObjCmdProc *objCmdProc; + Proc *procPtr; bool outputPerObject; Tcl_Obj *resultObj; @@ -24957,8 +24985,6 @@ outputPerObject = withPer_object; } - procPtr = Tcl_Command_objProc(cmd); - switch (subcmd) { case InfomethodsubcmdRegistrationhandleIdx: { @@ -25071,17 +25097,21 @@ case InfomethodsubcmdOriginIdx: /* fall through */ case InfomethodsubcmdTypeIdx: /* fall through */ case InfomethodsubcmdDefinitionIdx: /* fall through */ + case InfomethodsubcmdDisassembleIdx: /* fall through */ case InfomethodsubcmdNULL: break; } + objCmdProc = Tcl_Command_objProc(cmd); + procPtr = GetTclProcFromCommand(cmd); + /* * The subcommands differ per type of method. The converter in * InfoMethods defines the types: * * all|scripted|builtin|alias|forwarder|object|setter|nsfproc */ - if (GetTclProcFromCommand(cmd)) { + if (procPtr != NULL) { /* a scripted method */ switch (subcmd) { @@ -25094,30 +25124,28 @@ break; case InfomethodsubcmdBodyIdx: - ListProcBody(interp, GetTclProcFromCommand(cmd)); + ListProcBody(interp, procPtr); break; -#ifdef HAVE_TCL_DISASSAEMBLE_BYTE_CODE - /* - * In order to get the case label, add |disassemble 3x (to - * infomethodsubcmd and methodgetcmd) in nsfAPI.decls and - * add "info method disassemble" and per-object variant - */ case InfomethodsubcmdDisassembleIdx: - { - Proc *procPtr = GetTclProcFromCommand(cmd); + { + Tcl_Namespace *nsPtr; + NsfParamDefs *paramDefs; + + paramDefs = ParamDefsGet(cmd, NULL, &nsPtr); - if (procPtr == NULL) { - Tcl_SetObjResult(interp, Tcl_NewStringObj("body not available for this kind of method", -1)); - return TCL_ERROR; - } - if (procPtr->bodyPtr->typePtr == Nsf_OT_byteCodeType) { - EXTERN Tcl_Obj *Tcl_DisassembleByteCodeObj(Tcl_Interp *interp, Tcl_Obj *objPtr); - - Tcl_SetObjResult(interp, Tcl_DisassembleByteCodeObj(interp, procPtr->bodyPtr)); + if (paramDefs == NULL || nsPtr == NULL) { + nsPtr = (Tcl_Namespace *)procPtr->cmdPtr->nsPtr; } - break; -#endif + + resultObj = DisassembleProc(interp, procPtr, methodName, + (Namespace *)nsPtr); + + if (resultObj != NULL) { + Tcl_SetObjResult(interp, resultObj); + } + } + break; case InfomethodsubcmdDefinitionIdx: { resultObj = Tcl_NewListObj(0, NULL); @@ -25143,7 +25171,7 @@ AppendReturnsClause(interp, resultObj, cmd); - ListProcBody(interp, GetTclProcFromCommand(cmd)); + ListProcBody(interp, procPtr); Tcl_ListObjAppendElement(interp, resultObj, Tcl_GetObjResult(interp)); #if defined(NSF_WITH_ASSERTIONS) @@ -25186,7 +25214,7 @@ break; } - } else if (procPtr == NsfForwardMethod) { + } else if (objCmdProc == NsfForwardMethod) { /* forwarder */ switch (subcmd) { case InfomethodsubcmdTypeIdx: @@ -25221,11 +25249,12 @@ case InfomethodsubcmdReturnsIdx: /* fall through */ case InfomethodsubcmdSubmethodsIdx: /* fall through */ case InfomethodsubcmdSyntaxIdx: /* fall through */ + case InfomethodsubcmdDisassembleIdx: /* fall through */ case InfomethodsubcmdNULL: break; } - } else if (procPtr == NsfSetterMethod) { + } else if (objCmdProc == NsfSetterMethod) { /* setter methods */ switch (subcmd) { case InfomethodsubcmdTypeIdx: @@ -25255,17 +25284,19 @@ case InfomethodsubcmdReturnsIdx: /* fall through */ case InfomethodsubcmdSubmethodsIdx: /* fall through */ case InfomethodsubcmdSyntaxIdx: /* fall through */ + case InfomethodsubcmdDisassembleIdx: /* fall through */ case InfomethodsubcmdNULL: break; } - } else if (procPtr == NsfProcStub) { + } else if (objCmdProc == NsfProcStub) { /* * Special nsfproc handling: */ NsfProcClientData *tcd = Tcl_Command_objClientData(cmd); if (tcd != NULL && tcd->procName) { Tcl_Command procCmd = Tcl_GetCommandFromObj(interp, tcd->procName); + Proc *tProcPtr = GetTclProcFromCommand(procCmd); Tcl_DString ds, *dsPtr = &ds; switch (subcmd) { @@ -25275,7 +25306,7 @@ break; case InfomethodsubcmdBodyIdx: - ListProcBody(interp, GetTclProcFromCommand(procCmd)); + ListProcBody(interp, tProcPtr); break; case InfomethodsubcmdDefinitionIdx: @@ -25299,12 +25330,20 @@ Tcl_DStringLength(dsPtr))); ListCmdParams(interp, cmd, NULL, NULL, Tcl_DStringValue(dsPtr), NSF_PARAMS_PARAMETER); Tcl_ListObjAppendElement(interp, resultObj, Tcl_GetObjResult(interp)); - ListProcBody(interp, GetTclProcFromCommand(procCmd)); + ListProcBody(interp, tProcPtr); Tcl_ListObjAppendElement(interp, resultObj, Tcl_GetObjResult(interp)); Tcl_SetObjResult(interp, resultObj); Tcl_DStringFree(dsPtr); break; + case InfomethodsubcmdDisassembleIdx: + + resultObj = DisassembleProc(interp, tProcPtr, methodName, + tProcPtr->cmdPtr->nsPtr); + if (resultObj != NULL) { + Tcl_SetObjResult(interp, resultObj); + } + break; case InfomethodsubcmdArgsIdx: /* fall through */ case InfomethodsubcmdDefinitionhandleIdx: /* fall through */ case InfomethodsubcmdExistsIdx: /* fall through */ @@ -25325,7 +25364,7 @@ /* * The cmd must be an alias or object. * - * Note that some aliases come with procPtr == NsfObjDispatch. In order + * Note that some aliases come with objCmdProc == NsfObjDispatch. In order * to distinguish between "object" and alias, we have to do the lookup for * the entryObj to determine whether it is really an alias. */ @@ -25358,7 +25397,7 @@ /* todo: don't hard-code registering command name "alias" / NSF_ALIAS */ AppendMethodRegistration(interp, resultObj, NsfGlobalStrings[NSF_ALIAS], regObject, methodName, cmd, - procPtr == NsfObjscopedMethod, + objCmdProc == NsfObjscopedMethod, outputPerObject, 1); AppendReturnsClause(interp, resultObj, cmd); Tcl_ListObjAppendElement(interp, resultObj, listElements[nrElements-1]); @@ -25386,6 +25425,7 @@ case InfomethodsubcmdReturnsIdx: /* fall through */ case InfomethodsubcmdSubmethodsIdx: /* fall through */ case InfomethodsubcmdSyntaxIdx: /* fall through */ + case InfomethodsubcmdDisassembleIdx: /* fall through */ case InfomethodsubcmdNULL: break; } @@ -25423,6 +25463,7 @@ case InfomethodsubcmdSubmethodsIdx: /* fall through */ case InfomethodsubcmdSyntaxIdx: /* fall through */ case InfomethodsubcmdOriginIdx: /* fall through */ + case InfomethodsubcmdDisassembleIdx: /* fall through */ case InfomethodsubcmdNULL: break; } @@ -25462,6 +25503,7 @@ case InfomethodsubcmdReturnsIdx: /* fall through */ case InfomethodsubcmdSubmethodsIdx: /* fall through */ case InfomethodsubcmdSyntaxIdx: /* fall through */ + case InfomethodsubcmdDisassembleIdx: /* fall through */ case InfomethodsubcmdNULL: break; } Index: generic/nsfAPI.decls =================================================================== diff -u -N -r40299a6ff3b3631f275f5f0ba4f90cbdb675d70b -r1919d17fefad9446170fa6d532b439f494189b32 --- generic/nsfAPI.decls (.../nsfAPI.decls) (revision 40299a6ff3b3631f275f5f0ba4f90cbdb675d70b) +++ generic/nsfAPI.decls (.../nsfAPI.decls) (revision 1919d17fefad9446170fa6d532b439f494189b32) @@ -157,7 +157,7 @@ # cmd "cmd::info" NsfCmdInfoCmd { - {-argName "subcmd" -required 1 -typeName "methodgetcmd" -type "args|body|definition|exists|registrationhandle|definitionhandle|origin|parameter|syntax|type|precondition|postcondition|submethods|returns"} + {-argName "subcmd" -required 1 -typeName "methodgetcmd" -type "args|body|definition|exists|registrationhandle|definitionhandle|origin|parameter|syntax|type|precondition|postcondition|submethods|returns|disassemble"} {-argName "-context" -required 0 -type object} {-argName "methodName" -required 1 -type tclobj} {-argName "pattern" -required 0} @@ -522,7 +522,7 @@ {-argName "pattern" -required 0} } objectInfoMethod method NsfObjInfoMethodMethod { - {-argName "subcmd" -required 1 -typeName "infomethodsubcmd" -type "args|body|definition|exists|registrationhandle|definitionhandle|origin|parameter|syntax|type|precondition|postcondition|submethods|returns"} + {-argName "subcmd" -required 1 -typeName "infomethodsubcmd" -type "args|body|definition|exists|registrationhandle|definitionhandle|origin|parameter|syntax|type|precondition|postcondition|submethods|returns|disassemble"} {-argName "name" -required 1 -type tclobj} } objectInfoMethod methods NsfObjInfoMethodsMethod { @@ -579,7 +579,7 @@ } classInfoMethod method NsfClassInfoMethodMethod { - {-argName "subcmd" -required 1 -typeName "infomethodsubcmd" -type "args|body|definition|exists|registrationhandle|definitionhandle|origin|parameter|syntax|type|precondition|postcondition|submethods|returns"} + {-argName "subcmd" -required 1 -typeName "infomethodsubcmd" -type "args|body|definition|exists|registrationhandle|definitionhandle|origin|parameter|syntax|type|precondition|postcondition|submethods|returns|disassemble"} {-argName "name" -required 1 -type tclobj} } classInfoMethod methods NsfClassInfoMethodsMethod { Index: generic/nsfAPI.h =================================================================== diff -u -N -r40299a6ff3b3631f275f5f0ba4f90cbdb675d70b -r1919d17fefad9446170fa6d532b439f494189b32 --- generic/nsfAPI.h (.../nsfAPI.h) (revision 40299a6ff3b3631f275f5f0ba4f90cbdb675d70b) +++ generic/nsfAPI.h (.../nsfAPI.h) (revision 1919d17fefad9446170fa6d532b439f494189b32) @@ -64,12 +64,12 @@ -typedef enum {InfomethodsubcmdNULL, InfomethodsubcmdArgsIdx, InfomethodsubcmdBodyIdx, InfomethodsubcmdDefinitionIdx, InfomethodsubcmdExistsIdx, InfomethodsubcmdRegistrationhandleIdx, InfomethodsubcmdDefinitionhandleIdx, InfomethodsubcmdOriginIdx, InfomethodsubcmdParameterIdx, InfomethodsubcmdSyntaxIdx, InfomethodsubcmdTypeIdx, InfomethodsubcmdPreconditionIdx, InfomethodsubcmdPostconditionIdx, InfomethodsubcmdSubmethodsIdx, InfomethodsubcmdReturnsIdx} InfomethodsubcmdIdx_t; +typedef enum {InfomethodsubcmdNULL, InfomethodsubcmdArgsIdx, InfomethodsubcmdBodyIdx, InfomethodsubcmdDefinitionIdx, InfomethodsubcmdExistsIdx, InfomethodsubcmdRegistrationhandleIdx, InfomethodsubcmdDefinitionhandleIdx, InfomethodsubcmdOriginIdx, InfomethodsubcmdParameterIdx, InfomethodsubcmdSyntaxIdx, InfomethodsubcmdTypeIdx, InfomethodsubcmdPreconditionIdx, InfomethodsubcmdPostconditionIdx, InfomethodsubcmdSubmethodsIdx, InfomethodsubcmdReturnsIdx, InfomethodsubcmdDisassembleIdx} InfomethodsubcmdIdx_t; static int ConvertToInfomethodsubcmd(Tcl_Interp *interp, Tcl_Obj *objPtr, Nsf_Param const *pPtr, ClientData *clientData, Tcl_Obj **outObjPtr) { int index, result; - static const char *opts[] = {"args", "body", "definition", "exists", "registrationhandle", "definitionhandle", "origin", "parameter", "syntax", "type", "precondition", "postcondition", "submethods", "returns", NULL}; + static const char *opts[] = {"args", "body", "definition", "exists", "registrationhandle", "definitionhandle", "origin", "parameter", "syntax", "type", "precondition", "postcondition", "submethods", "returns", "disassemble", NULL}; (void)pPtr; result = Tcl_GetIndexFromObj(interp, objPtr, opts, "infomethodsubcmd", 0, &index); *clientData = (ClientData) INT2PTR(index + 1); @@ -261,7 +261,7 @@ static Nsf_EnumeratorConverterEntry enumeratorConverterEntries[] = { - {ConvertToInfomethodsubcmd, "args|body|definition|exists|registrationhandle|definitionhandle|origin|parameter|syntax|type|precondition|postcondition|submethods|returns"}, + {ConvertToInfomethodsubcmd, "args|body|definition|exists|registrationhandle|definitionhandle|origin|parameter|syntax|type|precondition|postcondition|submethods|returns|disassemble"}, {ConvertToCallprotection, "all|public|protected|private"}, {ConvertToMethodtype, "all|scripted|builtin|alias|forwarder|object|setter|nsfproc"}, {ConvertToFrame, "method|object|default"}, Index: generic/nsfInt.h =================================================================== diff -u -N -refe655eee129abd5c704299a029e0e39d80d2218 -r1919d17fefad9446170fa6d532b439f494189b32 --- generic/nsfInt.h (.../nsfInt.h) (revision efe655eee129abd5c704299a029e0e39d80d2218) +++ generic/nsfInt.h (.../nsfInt.h) (revision 1919d17fefad9446170fa6d532b439f494189b32) @@ -749,13 +749,13 @@ /* constants */ NSF_ALIAS, NSF_ARGS, NSF_CMD, NSF_FILTER, NSF_FORWARD, NSF_METHOD, NSF_OBJECT, NSF_SETTER, NSF_SETTERNAME, NSF_VALUECHECK, - NSF_GUARD_OPTION, NSF___UNKNOWN__, NSF_ARRAY, NSF_GET, NSF_SET, NSF_OPTION_STRICT, + NSF_GUARD_OPTION, NSF___UNKNOWN__, NSF_ARRAY, NSF_GET, NSF_SET, NSF_OPTION_STRICT, NSF_SCRIPT, NSF_OBJECT_UNKNOWN_HANDLER, NSF_ARGUMENT_UNKNOWN_HANDLER, NSF_PARSE_ARGS, /* Partly redefined Tcl commands; leave them together at the end */ NSF_EXPR, NSF_FORMAT, NSF_INFO_BODY, NSF_INFO_FRAME, NSF_INTERP, - NSF_STRING_IS, NSF_EVAL, - NSF_RENAME + NSF_STRING_IS, NSF_EVAL, NSF_DISASSEMBLE, + NSF_RENAME } NsfGlobalNames; #if !defined(NSF_C) EXTERN const char *NsfGlobalStrings[]; @@ -774,14 +774,14 @@ /* constants */ "alias", "args", "cmd", "filter", "forward", "method", "object", "setter", "settername", "valuecheck", - "-guard", "__unknown__", "::array", "get", "set", "-strict", + "-guard", "__unknown__", "::array", "get", "set", "-strict", "script", /* nsf Tcl commands */ "::nsf::object::unknown", "::nsf::argument::unknown", "::nsf::parseargs", /* Tcl commands */ "expr", "format", "::tcl::info::body", "::tcl::info::frame", "interp", - "::tcl::string::is", "::eval", + "::tcl::string::is", "::eval", "::tcl::unsupported::disassemble", "rename" }; #endif Index: generic/nsfShadow.c =================================================================== diff -u -N -r9d1dfb6417294dbdc13ce4d249931055f7bd5ef8 -r1919d17fefad9446170fa6d532b439f494189b32 --- generic/nsfShadow.c (.../nsfShadow.c) (revision 9d1dfb6417294dbdc13ce4d249931055f7bd5ef8) +++ generic/nsfShadow.c (.../nsfShadow.c) (revision 1919d17fefad9446170fa6d532b439f494189b32) @@ -436,6 +436,7 @@ rc |= NsfReplaceCommand(interp, NsfGlobalObjs[NSF_FORMAT], NULL, NULL, CMD_INFO(rst, NSF_FORMAT)); rc |= NsfReplaceCommand(interp, NsfGlobalObjs[NSF_INTERP], NULL, NULL, CMD_INFO(rst, NSF_INTERP)); rc |= NsfReplaceCommand(interp, NsfGlobalObjs[NSF_STRING_IS], NULL, NULL, CMD_INFO(rst, NSF_STRING_IS)); + rc |= NsfReplaceCommand(interp, NsfGlobalObjs[NSF_DISASSEMBLE], NULL, NULL, CMD_INFO(rst, NSF_DISASSEMBLE)); /* for the following commands, we have to add our own semantics */ rc |= NsfReplaceCommand(interp, NsfGlobalObjs[NSF_INFO_BODY], Nsf_InfoBodyObjCmd, NULL, CMD_INFO(rst, NSF_INFO_BODY)); Index: library/nx/nx.tcl =================================================================== diff -u -N -r6280104bd82ee1e4f3c6bd824d1cc6d0482f43c0 -r1919d17fefad9446170fa6d532b439f494189b32 --- library/nx/nx.tcl (.../nx.tcl) (revision 6280104bd82ee1e4f3c6bd824d1cc6d0482f43c0) +++ library/nx/nx.tcl (.../nx.tcl) (revision 1919d17fefad9446170fa6d532b439f494189b32) @@ -891,7 +891,9 @@ #:alias "info method" ::nsf::methods::class::info::method :method "info method args" {name} {: ::nsf::methods::class::info::method args $name} :method "info method body" {name} {: ::nsf::methods::class::info::method body $name} - #:method "info method disassemble" {name} {: ::nsf::methods::class::info::method disassemble $name} + if {[::nsf::pkgconfig get development]} { + :method "info method disassemble" {name} {: ::nsf::methods::class::info::method disassemble $name} + } :method "info method definition" {name} {: ::nsf::methods::class::info::method definition $name} :method "info method exists" {name} {: ::nsf::methods::class::info::method exists $name} :method "info method handle" {name} {: ::nsf::methods::class::info::method definitionhandle $name} @@ -927,6 +929,9 @@ :method "info object method args" {name} {: ::nsf::methods::object::info::method args $name} :method "info object method body" {name} {: ::nsf::methods::object::info::method body $name} :method "info object method definition" {name} {: ::nsf::methods::object::info::method definition $name} + if {[::nsf::pkgconfig get development]} { + :method "info object method disassemble" {name} {: ::nsf::methods::object::info::method disassemble $name} + } :method "info object method exists" {name} {: ::nsf::methods::object::info::method exists $name} :method "info object method handle" {name} {: ::nsf::methods::object::info::method definitionhandle $name} :method "info object method registrationhandle" {name} {: ::nsf::methods::object::info::method registrationhandle $name} Index: tests/method-parameter.test =================================================================== diff -u -N -r8ac4f64a1364f7a40221a96378f7167322909abc -r1919d17fefad9446170fa6d532b439f494189b32 --- tests/method-parameter.test (.../method-parameter.test) (revision 8ac4f64a1364f7a40221a96378f7167322909abc) +++ tests/method-parameter.test (.../method-parameter.test) (revision 1919d17fefad9446170fa6d532b439f494189b32) @@ -107,8 +107,13 @@ nx::test case flag-in-ensemble { nx::Class create C - set info {info baseclass, info children, info class, info filters, info has mixin, info has namespace, info has type, info heritage, info info, info instances, info lookup filter, info lookup filters, info lookup method, info lookup methods, info lookup mixins, info lookup parameters, info lookup slots, info lookup syntax, info lookup variables, info method args, info method body, info method callprotection, info method debug, info method definition, info method definitionhandle, info method deprecated, info method exists, info method handle, info method origin, info method parameters, info method registrationhandle, info method returns, info method submethods, info method syntax, info method type, info methods, info mixinof, info mixins, info name, info object filters, info object method args, info object method body, info object method callprotection, info object method debug, info object method definition, info object method definitionhandle, info object method deprecated, info object method exists, info object method handle, info object method origin, info object method parameters, info object method registrationhandle, info object method returns, info object method submethods, info object method syntax, info object method type, info object methods, info object mixins, info object slots, info object variables, info parent, info precedence, info slots, info subclasses, info superclasses, info variable definition, info variable name, info variable parameter, info variables, info vars} + if {[::nsf::pkgconfig get development]} { + set info {info baseclass, info children, info class, info filters, info has mixin, info has namespace, info has type, info heritage, info info, info instances, info lookup filter, info lookup filters, info lookup method, info lookup methods, info lookup mixins, info lookup parameters, info lookup slots, info lookup syntax, info lookup variables, info method args, info method body, info method callprotection, info method debug, info method definition, info method definitionhandle, info method deprecated, info method disassemble, info method exists, info method handle, info method origin, info method parameters, info method registrationhandle, info method returns, info method submethods, info method syntax, info method type, info methods, info mixinof, info mixins, info name, info object filters, info object method args, info object method body, info object method callprotection, info object method debug, info object method definition, info object method definitionhandle, info object method deprecated, info object method disassemble, info object method exists, info object method handle, info object method origin, info object method parameters, info object method registrationhandle, info object method returns, info object method submethods, info object method syntax, info object method type, info object methods, info object mixins, info object slots, info object variables, info parent, info precedence, info slots, info subclasses, info superclasses, info variable definition, info variable name, info variable parameter, info variables, info vars} + } else { + set info {info baseclass, info children, info class, info filters, info has mixin, info has namespace, info has type, info heritage, info info, info instances, info lookup filter, info lookup filters, info lookup method, info lookup methods, info lookup mixins, info lookup parameters, info lookup slots, info lookup syntax, info lookup variables, info method args, info method body, info method callprotection, info method debug, info method definition, info method definitionhandle, info method deprecated, info method exists, info method handle, info method origin, info method parameters, info method registrationhandle, info method returns, info method submethods, info method syntax, info method type, info methods, info mixinof, info mixins, info name, info object filters, info object method args, info object method body, info object method callprotection, info object method debug, info object method definition, info object method definitionhandle, info object method deprecated, info object method exists, info object method handle, info object method origin, info object method parameters, info object method registrationhandle, info object method returns, info object method submethods, info object method syntax, info object method type, info object methods, info object mixins, info object slots, info object variables, info parent, info precedence, info slots, info subclasses, info superclasses, info variable definition, info variable name, info variable parameter, info variables, info vars} + } + ? {C info superclasses} "::nx::Object" ? {C info -a superclass} "unable to dispatch sub-method \"-a\" of ::C info; valid are: $info" ? {C info -- superclass} "unable to dispatch sub-method \"--\" of ::C info; valid are: $info" Index: tests/nsf-cmd.test =================================================================== diff -u -N -r462bf8f1d53c0f2bcaa795f542e2f65cdab996b5 -r1919d17fefad9446170fa6d532b439f494189b32 --- tests/nsf-cmd.test (.../nsf-cmd.test) (revision 462bf8f1d53c0f2bcaa795f542e2f65cdab996b5) +++ tests/nsf-cmd.test (.../nsf-cmd.test) (revision 1919d17fefad9446170fa6d532b439f494189b32) @@ -233,7 +233,7 @@ ? {nsf::cmd::info definitionhandle $::handle} "" ? {nsf::cmd::info origin $::handle} "" ? {nsf::cmd::info parameter $::handle} "subcmd -context:object methodName pattern:optional" - ? {nsf::cmd::info syntax $::handle} "args|body|definition|exists|registrationhandle|definitionhandle|origin|parameter|syntax|type|precondition|postcondition|submethods|returns ?-context /object/? /methodName/ ?/pattern/?" + ? {nsf::cmd::info syntax $::handle} "args|body|definition|exists|registrationhandle|definitionhandle|origin|parameter|syntax|type|precondition|postcondition|submethods|returns|disassemble ?-context /object/? /methodName/ ?/pattern/?" ? {nsf::cmd::info type $::handle} "cmd" ? {nsf::cmd::info precondition $::handle} "" ? {nsf::cmd::info postcondition $::handle} ""