Index: generic/nsf.c =================================================================== diff -u -N -r08bf8cbe57576cf94b4cc5b1425b845c0fa82a9b -recda5a1673eafccf09e7d53cfbab976922c398ec --- generic/nsf.c (.../nsf.c) (revision 08bf8cbe57576cf94b4cc5b1425b845c0fa82a9b) +++ generic/nsf.c (.../nsf.c) (revision ecda5a1673eafccf09e7d53cfbab976922c398ec) @@ -20722,7 +20722,7 @@ } else { /* * If not called from an NSF frame, return #0 as default. - * + * * TODO: With NsfCallStackFindCallingContext in place, this cannot (should * not) be reachable. Need to check NsfCallStackFindActiveFrame. When in * the "clear", provide for a warning here? @@ -32381,7 +32381,7 @@ } assert(framePtr != NULL); - + savedVarFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); Tcl_Interp_varFramePtr(interp) = (CallFrame *)framePtr; @@ -32437,17 +32437,19 @@ ObjectName_(object), NsfMethodName(objv[0])); } - + if (objc % 2 == 0) { - /* even number of arguments (incl. method) - * -> level specifier considered present + /* + * Even number of arguments (including method), therefore the level + * specifier is considered to be the first argument. */ frameInfoObj = NULL; frameInfo = ObjStr(objv[1]); i = 2; } else { - /* odd number of arguments (incl. method) - * -> level specififer considered absent, compute jump level + /* + * Odd number of arguments (including method), therefore the level + * specifier considered absent and the level has to be computed. */ frameInfoObj = ComputeLevelObj(interp, CALLING_LEVEL); INCR_REF_COUNT(frameInfoObj); @@ -32458,7 +32460,7 @@ if ((object->filterStack != NULL) || (object->mixinStack != NULL)) { CallStackUseActiveFrame(interp, &ctx); } - + for ( ; i < objc; i += 2) { result = Tcl_UpVar2(interp, frameInfo, ObjStr(objv[i]), NULL, ObjStr(objv[i+1]), 0 /*flags*/); @@ -32472,7 +32474,7 @@ } CallStackRestoreSavedFrames(interp, &ctx); return result; - + } /* @@ -32908,7 +32910,7 @@ ObjTrace("CREATE", newObject); if (autoNameCreate) { - newObject->flags |= NSF_IS_AUTONAMED; + NsfObjectRefCountIncr(newObject); } /* @@ -32921,6 +32923,13 @@ } create_method_exit: + if (newObject != NULL && autoNameCreate) { + if (result == TCL_OK) { + newObject->flags |= NSF_IS_AUTONAMED; + } + NsfObjectRefCountDecr(newObject); + } + if (tmpObj != NULL) { DECR_REF_COUNT(tmpObj); }