Index: generic/nsf.c =================================================================== diff -u -N -r57e3f532bb855908a3af3ed1fbb81a673de0bd68 -rbf73e549426efeadee4b2b93f0d184c67cb1f3f0 --- generic/nsf.c (.../nsf.c) (revision 57e3f532bb855908a3af3ed1fbb81a673de0bd68) +++ generic/nsf.c (.../nsf.c) (revision bf73e549426efeadee4b2b93f0d184c67cb1f3f0) @@ -32438,7 +32438,6 @@ nonnull_assert(objv != NULL); if (objc < 2) { - wrongArgs: return NsfPrintError(interp, "wrong # args: should be \"%s %s ?level? command ?arg ...?\"", ObjectName_(object), @@ -32449,22 +32448,28 @@ if (objc == 2) { result = 0; } else { + /* TclObjGetFrame returns: + * 0 ... when a syntactically invalid (incl. no) level specifier was provided + * 1 ... when a syntactically valid level specifier with corresp. frame + was found + * -1 ... when a syntactically valid level specifier was provided, + but an error occurred while finding the frame + (error msg in interp, "bad level") + */ result = TclObjGetFrame(interp, objv[1], &requestedFramePtr); if (unlikely(result == -1)) { return TCL_ERROR; } } objc -= result + 1; - if (objc == 0) { - goto wrongArgs; - } objv += result + 1; - + if (result == 0) { /* * 0 is returned from TclObjGetFrame when no (or, an invalid) level - * specifier was provided. + * specifier was provided; objv[0] is interpreted as a command word, + * uplevel defaults to the computed level. */ Tcl_CallFrame *callingFramePtr = NULL; NsfCallStackFindCallingContext(interp, 1, &framePtr, &callingFramePtr);