Index: generic/nsf.c =================================================================== diff -u -r2d72d857527127a36f24bae531128070f7cc6088 -r81d38f6298610d80f4397161ec07b0b577576308 --- generic/nsf.c (.../nsf.c) (revision 2d72d857527127a36f24bae531128070f7cc6088) +++ generic/nsf.c (.../nsf.c) (revision 81d38f6298610d80f4397161ec07b0b577576308) @@ -407,6 +407,9 @@ static int SetInstVar(Tcl_Interp *interp, NsfObject *object, Tcl_Obj *nameObj, Tcl_Obj *valueObj, unsigned int flags) nonnull(1) nonnull(2) nonnull(3); +static int UnsetInstVar(Tcl_Interp *interp, int withNocomplain, NsfObject *object, const char *name) + nonnull(1) nonnull(3) nonnull(4); + static int ListDefinedMethods(Tcl_Interp *interp, NsfObject *object, const char *pattern, int withPer_object, int methodType, int withCallproctection, int withPath) @@ -5648,7 +5651,52 @@ } } + /* + *---------------------------------------------------------------------- + * UnsetTracedVars -- + * + * Delete the object variables and the variable table. + * + * Results: + * None. + * + * Side effects: + * Triggers unset traces. + * + *---------------------------------------------------------------------- + */ + +static void UnsetTracedVars(Tcl_Interp *interp, NsfObject *object) nonnull(1) nonnull(2); + +void +UnsetTracedVars( + Tcl_Interp *interp, /* Interpreter to which object belongs. */ + NsfObject *object) /* Object to which variables belong. */ +{ + Tcl_HashSearch search; + Tcl_HashEntry *entryPtr; + TclVarHashTable *varTablePtr; + + varTablePtr = (object->nsPtr != NULL) ? + Tcl_Namespace_varTablePtr(object->nsPtr) : + object->varTablePtr; + + if (varTablePtr != NULL) { + for (entryPtr = Tcl_FirstHashEntry((Tcl_HashTable *)varTablePtr, &search); + entryPtr != NULL; + entryPtr = Tcl_NextHashEntry(&search)) { + Tcl_Obj *nameObj; + Var *varPtr; + GetVarAndNameFromHash(entryPtr, &varPtr, &nameObj); + if ((varPtr->flags & VAR_TRACED_UNSET) != 0u /* TclIsVarTraced(varPtr) */) { + (void)UnsetInstVar(interp, 1 /* no error msg */, object, ObjStr(nameObj)); + } + } + } +} + +/* * delete all vars & procs in a namespace */ static void NSCleanupNamespace(Tcl_Interp *interp, Tcl_Namespace *nsPtr) nonnull(1) nonnull(2); @@ -18483,6 +18531,8 @@ } } + UnsetTracedVars(interp, object); + if (object->nsPtr != NULL) { NSCleanupNamespace(interp, object->nsPtr); NSDeleteChildren(interp, object->nsPtr); @@ -20184,8 +20234,6 @@ * *---------------------------------------------------------------------- */ -static int UnsetInstVar(Tcl_Interp *interp, int withNocomplain, NsfObject *object, const char *name) - nonnull(1) nonnull(3) nonnull(4); static int UnsetInstVar(Tcl_Interp *interp, int withNocomplain, NsfObject *object, const char *name) {