Index: generic/nsf.c =================================================================== diff -u -rdc4e227d31df104be7df072ee78f2779ff387b9e -r546f8ddb033b81b5a4f9836d4f5541c9f68ac306 --- generic/nsf.c (.../nsf.c) (revision dc4e227d31df104be7df072ee78f2779ff387b9e) +++ generic/nsf.c (.../nsf.c) (revision 546f8ddb033b81b5a4f9836d4f5541c9f68ac306) @@ -862,7 +862,7 @@ } #endif - if (unlikely(status)) { + if (unlikely(status != 0)) { if (status & NSF_PC_STATUS_MUST_DECR) { int i; /*fprintf(stderr, "ParseContextRelease %p loop from 0 to %d\n", pcPtr, pcPtr->objc-1);*/ @@ -21027,7 +21027,7 @@ object = tcd->object; tcd->object = NULL; - + Nsf_PushFrameObj(interp, object, framePtr); result = Tcl_NRCallObjProc(interp, tcd->objProc, tcd->clientData, objc, objv); Nsf_PopFrameObj(interp, framePtr); @@ -21716,7 +21716,7 @@ * ArgumentParse -- * * Parse the provided ist of argument against the given definition. The - * result is returned in the parameter context structure. + * result is returned in the parse context structure. * * Results: * Standard Tcl result. @@ -25138,6 +25138,62 @@ } /* +cmd parseargs NsfParseArgsCmd { + {-argName "argspec" -required 1 -type tclobj} + {-argName "arglist" -required 1 -type tclobj} +} {-nxdoc 0} +*/ +static int +NsfParseArgsCmd(Tcl_Interp *interp, Tcl_Obj *argspecObj, Tcl_Obj *arglistObj) { + NsfParsedParam parsedParam; + unsigned int processFlags = 0u; + Tcl_Obj **objv; + int result, objc; + + result = ParamDefsParse(interp, NsfGlobalObjs[NSF_PARSE_ARGS], argspecObj, + NSF_DISALLOWED_ARG_METHOD_PARAMETER, 0, + &parsedParam); + + if (unlikely(result != TCL_OK)) { + return result; + } + + result = Tcl_ListObjGetElements(interp, arglistObj, &objc, &objv); + if (likely(result == TCL_OK)) { + ParseContext pc; + NsfParamDefs *paramDefs = parsedParam.paramDefs; + + result = ArgumentParse(interp, objc, objv, NULL, NsfGlobalObjs[NSF_PARSE_ARGS], + paramDefs->paramsPtr, paramDefs->nrParams, paramDefs->serial, + processFlags|NSF_ARGPARSE_START_ZERO|RUNTIME_STATE(interp)->doCheckArguments, + &pc); + + if (result == TCL_OK) { + Nsf_Param *paramPtr; + Tcl_Obj *resultObj; + int i; + + for (i = 0, paramPtr = paramDefs->paramsPtr; paramPtr->name; paramPtr++, i++) { + Tcl_Obj *valueObj = pc.objv[i]; + + if (valueObj != NsfGlobalObjs[NSF___UNKNOWN__]) { + /*fprintf(stderr, "param %s -> <%s>\n", paramPtr->name, ObjStr(valueObj));*/ + resultObj = Tcl_ObjSetVar2(interp, paramPtr->nameObj, NULL, valueObj, TCL_LEAVE_ERR_MSG|TCL_PARSE_PART1); + if (resultObj == NULL) { + result = TCL_ERROR; + break; + } + } + } + + ParseContextRelease(&pc); + } + + } + return result; +} + +/* cmd method::alias NsfMethodAliasCmd { {-argName "object" -type object} {-argName "-per-object"} @@ -25667,7 +25723,7 @@ cl = withPer_object == 0 && NsfObjectIsClass(object) ? (NsfClass *)object : NULL; fromClassNS = (cl != NULL); - + cmd = ResolveMethodName(interp, (cl != NULL) ? cl->nsPtr : object->nsPtr, methodObj, NULL, NULL, &defObject, NULL, &fromClassNS); /*fprintf(stderr, "methodProperty for method '%s' prop %d value %s => cl %p cmd %p\n",