Index: TODO =================================================================== diff -u -r21e04cc3b201da5acfc77f7b05308f1ddfa606dc -r0d9049bafe2426251bd7d8e9a36faa68e91ad518 --- TODO (.../TODO) (revision 21e04cc3b201da5acfc77f7b05308f1ddfa606dc) +++ TODO (.../TODO) (revision 0d9049bafe2426251bd7d8e9a36faa68e91ad518) @@ -5519,6 +5519,16 @@ - updated "/cls/ mixins ...", "/obj/ object mixins ...", "/cls/ filteres ...", "/obj/ object filters ..." +nsf.h +- In Tcl 8.6.1 it might be that a Tcl_Obj has length > 0 but bytes == NULL. We have + to relax out tcl_obj-sanity test for this case from assertions. + +nsf.c: +- remove redundant definition +- reduce variable scope +- make sure to follow nonnull assumptions + + ======================================================================== TODO: Index: generic/nsf.c =================================================================== diff -u -rfce5c6b5a1c71088660c2d1335ac9752afb7193c -r0d9049bafe2426251bd7d8e9a36faa68e91ad518 --- generic/nsf.c (.../nsf.c) (revision fce5c6b5a1c71088660c2d1335ac9752afb7193c) +++ generic/nsf.c (.../nsf.c) (revision 0d9049bafe2426251bd7d8e9a36faa68e91ad518) @@ -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) { @@ -18688,13 +18688,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); @@ -25484,6 +25486,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; @@ -25764,17 +25767,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; }