Index: generic/nsf.c =================================================================== diff -u -ra237890d15bdf7f68e3d6941a523b337893953ff -r6237fb1d1813b7beb3a20c3bd27fb1d3dbf35d71 --- generic/nsf.c (.../nsf.c) (revision a237890d15bdf7f68e3d6941a523b337893953ff) +++ generic/nsf.c (.../nsf.c) (revision 6237fb1d1813b7beb3a20c3bd27fb1d3dbf35d71) @@ -403,8 +403,6 @@ static NsfClasses ** NsfClassListAdd(NsfClasses **firstPtrPtr, NsfClass *cl, ClientData clientData) nonnull(1) returns_nonnull; -static void NsfClassListFree(NsfClasses *firstPtr); - /* misc prototypes */ static int SetInstVar(Tcl_Interp *interp, NsfObject *object, Tcl_Obj *nameObj, Tcl_Obj *valueObj) nonnull(1) nonnull(2) nonnull(3); @@ -547,14 +545,14 @@ void NsfLog(Tcl_Interp *interp, int requiredLevel, CONST char *fmt, ...) { - va_list ap; assert(interp); assert(fmt); if (RUNTIME_STATE(interp)->debugLevel >= requiredLevel) { Tcl_DString cmdString, ds; CONST char *level; + va_list ap; switch (requiredLevel) { case NSF_LOG_INFO: level = "Info"; break; @@ -3066,11 +3064,13 @@ static int RemoveSuper1(NsfClass *s, NsfClasses **sl) { - NsfClasses *l = *sl; + NsfClasses *l; assert(s != NULL); assert(sl != NULL); + l = *sl; + if (l == NULL) return 0; if (l->cl == s) { *sl = l->nextPtr; @@ -10373,7 +10373,7 @@ * Do not check the class "cl" itself (first entry in * filterCheck class list). */ - if (superClasses) { + if (superClasses != NULL) { superClasses = superClasses->nextPtr; } for (; superClasses; superClasses = superClasses->nextPtr) { @@ -18719,13 +18719,15 @@ cl->opt = 0; } - /* - * On a recreate, it might be possible that the newly created class - * has a different superclass. So we have to flush the precedence - * list on a recreate as well. - */ - FlushPrecedences(subClasses); - NsfClassListFree(subClasses); + if (subClasses) { + /* + * On a recreate, it might be possible that the newly created class + * has a different superclass. So we have to flush the precedence + * list on a recreate as well. + */ + FlushPrecedences(subClasses); + NsfClassListFree(subClasses); + } while (cl->super) { (void)RemoveSuper(cl, cl->super->cl); @@ -21567,11 +21569,7 @@ /* * Set lastObjc as index of the first "unprocessed" parameter. */ - if (processFlags & NSF_ARGPARSE_START_ZERO) { - pcPtr->lastObjc = o; - } else { - pcPtr->lastObjc = o; - } + pcPtr->lastObjc = o; pcPtr->objc = nrParams; assert(ISOBJ(objv[pcPtr->lastObjc-1])); @@ -25515,6 +25513,7 @@ result = NextGetArguments(interp, oc, ov, &cscPtr, &methodName, &nobjc, &nobjv, &freeArgumentVector); if (likely(result == TCL_OK)) { + assert(cscPtr); result = NextSearchAndInvoke(interp, methodName, nobjc, nobjv, cscPtr, freeArgumentVector); } return result; @@ -25795,17 +25794,21 @@ dependentSubClasses = DependentSubClasses(cl); - for (clPtr = dependentSubClasses; clPtr; clPtr = clPtr->nextPtr) { - NsfClass *subClass = clPtr->cl; + if (dependentSubClasses) { - if (subClass->parsedParamPtr) { - ParsedParamFree(subClass->parsedParamPtr); - subClass->parsedParamPtr = NULL; + for (clPtr = dependentSubClasses; clPtr; clPtr = clPtr->nextPtr) { + NsfClass *subClass = clPtr->cl; + + if (subClass->parsedParamPtr) { + ParsedParamFree(subClass->parsedParamPtr); + subClass->parsedParamPtr = NULL; + } + } + NsfClassListFree(dependentSubClasses); } - NsfClassListFree(dependentSubClasses); - } + } return TCL_OK; }