diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2015-06-18 19:58:45 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2015-06-18 19:58:45 (GMT) |
| commit | 0ea82c2d43e73fef5481d22ae75c9f71975eb715 (patch) | |
| tree | f7f3ce61553efb1eb9de900ca3c17efb92ee670e /generic/tclOO.c | |
| parent | d7b8af55e7a45674c4feb7b912bf4c7ef214855e (diff) | |
| parent | 7679c0513ced1ce6009d339d8e43afdc3f0ad87a (diff) | |
| download | tcl-0ea82c2d43e73fef5481d22ae75c9f71975eb715.zip tcl-0ea82c2d43e73fef5481d22ae75c9f71975eb715.tar.gz tcl-0ea82c2d43e73fef5481d22ae75c9f71975eb715.tar.bz2 | |
merge novem
Diffstat (limited to 'generic/tclOO.c')
| -rw-r--r-- | generic/tclOO.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/generic/tclOO.c b/generic/tclOO.c index fff2a4b..3864227 100644 --- a/generic/tclOO.c +++ b/generic/tclOO.c @@ -394,6 +394,7 @@ InitFoundation( fPtr->classCls->flags |= ROOT_CLASS; TclOOAddToInstances(fPtr->objectCls->thisPtr, fPtr->classCls); TclOOAddToInstances(fPtr->classCls->thisPtr, fPtr->classCls); + TclOOAddToSubclasses(fPtr->classCls, fPtr->objectCls); AddRef(fPtr->objectCls->thisPtr); AddRef(fPtr->objectCls); @@ -792,7 +793,7 @@ ObjectRenamedTrace( ClientData clientData, /* The object being deleted. */ Tcl_Interp *interp, /* The interpreter containing the object. */ const char *oldName, /* What the object was (last) called. */ - const char *newName, /* Always NULL. */ + const char *newName, /* What it's getting renamed to. (unused) */ int flags) /* Why was the object deleted? */ { Object *oPtr = clientData; @@ -1008,6 +1009,12 @@ ReleaseClassContents( } if (!Deleted(instancePtr)) { Tcl_DeleteCommandFromToken(interp, instancePtr->command); + /* + * Tcl_DeleteCommandFromToken() may have done to whole + * job for us. Roll back and check again. + */ + i--; + continue; } DelRef(instancePtr); } @@ -1280,6 +1287,9 @@ TclOORemoveFromInstances( removeInstance: if (Deleted(clsPtr->thisPtr)) { + if (!IsRootClass(clsPtr)) { + DelRef(clsPtr->instances.list[i]); + } clsPtr->instances.list[i] = NULL; } else { clsPtr->instances.num--; @@ -1665,10 +1675,13 @@ Tcl_NewObjectInstance( /* * Take care to not delete a deleted object; that would be - * bad. [Bug 2903011] + * bad. [Bug 2903011] Also take care to make sure that we have + * the name of the command before we delete it. [Bug + * 9dd1bd7a74] */ if (!Deleted(oPtr)) { + (void) TclOOObjectName(interp, oPtr); Tcl_DeleteCommandFromToken(interp, oPtr->command); } return NULL; @@ -1811,10 +1824,12 @@ FinalizeAlloc( /* * Take care to not delete a deleted object; that would be bad. [Bug - * 2903011] + * 2903011] Also take care to make sure that we have the name of the + * command before we delete it. [Bug 9dd1bd7a74] */ if (!Deleted(oPtr)) { + (void) TclOOObjectName(interp, oPtr); Tcl_DeleteCommandFromToken(interp, oPtr->command); } DelRef(oPtr); |
