Index: generic/nsf.c =================================================================== diff -u -r32b1b0210fbe6c5794d9bfe6def1fda904254ea6 -r1c4cb273089674161189c6d19deae17fc56334b3 --- generic/nsf.c (.../nsf.c) (revision 32b1b0210fbe6c5794d9bfe6def1fda904254ea6) +++ generic/nsf.c (.../nsf.c) (revision 1c4cb273089674161189c6d19deae17fc56334b3) @@ -1006,16 +1006,25 @@ static void NsfCleanupObject_(NsfObject *object) { + NsfObjectRefCountDecr(object); - /*fprintf(stderr, "NsfCleanupObject obj refCount of %p after decr %d\n", object, object->refCount);*/ + /*fprintf(stderr, "NsfCleanupObject obj refCount of %p after decr %d id %p interp %p flags %.6x\n", + object, object->refCount, object->id, object->teardown, object->flags);*/ if (object->refCount <= 0) { /*fprintf(stderr, "NsfCleanupObject %p refcount %d\n", object, object->refCount);*/ assert(object->refCount == 0); assert(object->flags & NSF_DELETED); - MEM_COUNT_FREE("NsfObject/NsfClass", object); + /* + * During FinalObjectDeletion(), object->teardown is NULL, we cannot access + * the object and class names anymore. + */ + if (object->teardown && NSF_DTRACE_OBJECT_FREE_ENABLED()) { + NSF_DTRACE_OBJECT_FREE(ObjectName(object), ClassName(object->cl)); + } + MEM_COUNT_FREE("NsfObject/NsfClass", object); #if defined(NSFOBJ_TRACE) fprintf(stderr, "CKFREE Object %p refcount=%d\n", object, object->refCount); #endif @@ -17413,6 +17422,10 @@ "(possibly parent namespace does not exist)", nameString); } + + if (NSF_DTRACE_OBJECT_CREATE_ENABLED()) { + NSF_DTRACE_OBJECT_CREATE(ObjectName(newObj), ClassName(cl)); + } Tcl_SetObjResult(interp, nameObj); return TCL_OK; @@ -18854,8 +18867,13 @@ assert(object->activationCount == 0); if (object->id) { - /*fprintf(stderr, "cmd dealloc %p final delete refCount %d\n", + /*fprintf(stderr, " ... cmd dealloc %p final delete refCount %d\n", object->id, Tcl_Command_refCount(object->id));*/ + + if (NSF_DTRACE_OBJECT_FREE_ENABLED()) { + NSF_DTRACE_OBJECT_FREE(ObjectName(object), ClassName(object->cl)); + } + Tcl_DeleteCommandFromToken(interp, object->id); } } @@ -18937,9 +18955,10 @@ object = GetObjectFromString(interp, key); if (object && !NsfObjectIsClass(object) && !ObjectHasChildren(object)) { - /*fprintf(stderr, " ... delete object %s %p, class=%s id %p\n", key, object, - ClassName(object->cl), object->id);*/ - + /*if (object->id) { + fprintf(stderr, " ... delete object %s %p, class=%s id %p\n", key, object, + ClassName(object->cl), object->id); + }*/ FreeUnsetTraceVariable(interp, object); if (object->id) FinalObjectDeletion(interp, object); Tcl_DeleteHashEntry(hPtr);