Index: TODO =================================================================== diff -u -rdc4e18f42355dbf473140da723940832c3aba2ba -rf80347fbea8fd50ae92c0bd7412cd4af80c78a54 --- TODO (.../TODO) (revision dc4e18f42355dbf473140da723940832c3aba2ba) +++ TODO (.../TODO) (revision f80347fbea8fd50ae92c0bd7412cd4af80c78a54) @@ -3889,6 +3889,10 @@ respect of the method interface for object invocations - doc fixed line-number handling locally +- changed object->flags from "unsigend short" to "unsigned int" +- reintroduced NSF_TCL_DELETE to address bug flagged from memdebug +- extended regression test + ======================================================================== TODO: Index: generic/nsf.c =================================================================== diff -u -r021a681aedece8a8a1f1ae03b51dcadd166333c9 -rf80347fbea8fd50ae92c0bd7412cd4af80c78a54 --- generic/nsf.c (.../nsf.c) (revision 021a681aedece8a8a1f1ae03b51dcadd166333c9) +++ generic/nsf.c (.../nsf.c) (revision f80347fbea8fd50ae92c0bd7412cd4af80c78a54) @@ -5086,8 +5086,8 @@ NsfObjectRefCountIncr(object); PrimitiveDestroy(object); - - if (object->teardown == NULL) /* (object->flags & NSF_TCL_DELETE)*/ { + + if /*(object->teardown == NULL)*/ ((object->flags & NSF_TCL_DELETE) == 0) { Tcl_Obj *savedResultObj = Tcl_GetObjResult(interp); INCR_REF_COUNT(savedResultObj); @@ -6258,16 +6258,17 @@ for (hPtr = Tcl_FirstHashEntry(tablePtr, &search); hPtr; hPtr = Tcl_NextHashEntry(&search)) { NsfObject *inst = (NsfObject *)Tcl_GetHashKey(tablePtr, hPtr); - Command *cmdPtr = likely(inst != NULL) ? (Command *)inst->id : NULL; + Command *cmdPtr; - if (unlikely(cmdPtr == NULL || (Tcl_Command_flags(cmdPtr) & CMD_IS_DELETED))) { + if (unlikely(inst->flags & NSF_TCL_DELETE)) { NsfLog(interp, NSF_LOG_NOTICE, "Object %s is apparently deleted", ObjectName(inst)); continue; } + cmdPtr = (Command *)inst->id; assert(cmdPtr); - if (unlikely(cmdPtr && (cmdPtr->nsPtr->flags & NS_DYING))) { + if (unlikely(cmdPtr->nsPtr->flags & NS_DYING)) { NsfLog(interp, NSF_LOG_WARN, "Namespace of %s is apparently deleted", ObjectName(inst)); continue; } @@ -14002,7 +14003,13 @@ NsfObject *object = (NsfObject *)clientData; Tcl_Interp *interp; - /*object->flags |= NSF_TCL_DELETE;*/ + /* + * TODO: Actually, it seems like a good idea to flag a deletion from Tcl by + * setting object->id to NULL. However, we seem to have some dependencies + * avoiding this currently, so we use the flag. + */ + object->flags |= NSF_TCL_DELETE; + /*fprintf(stderr, "cmd dealloc %p TclDeletesObject (%d)\n", object->id, Tcl_Command_refCount(object->id));*/ @@ -18163,7 +18170,7 @@ *---------------------------------------------------------------------- * SetBooleanFlag -- * - * Set an unsigned short flag based on valueObj + * Set an unsigned int flag based on valueObj * * Results: * Tcl result code @@ -18175,7 +18182,7 @@ */ static int -SetBooleanFlag(Tcl_Interp *interp, unsigned short *flagsPtr, unsigned short flag, Tcl_Obj *valueObj) { +SetBooleanFlag(Tcl_Interp *interp, unsigned int *flagsPtr, unsigned int flag, Tcl_Obj *valueObj) { int bool, result; assert(flagsPtr); @@ -22088,7 +22095,6 @@ newObject ? IsMetaClass(interp, newObject->cl, 1) : 0 );*/ - /* * Provide protection against recreation if base classes. */ Index: generic/nsfInt.h =================================================================== diff -u -rf61ee3dfc17d8cf04a0dc9ada9cb0f939514a511 -rf80347fbea8fd50ae92c0bd7412cd4af80c78a54 --- generic/nsfInt.h (.../nsfInt.h) (revision f61ee3dfc17d8cf04a0dc9ada9cb0f939514a511) +++ generic/nsfInt.h (.../nsfInt.h) (revision f80347fbea8fd50ae92c0bd7412cd4af80c78a54) @@ -387,6 +387,8 @@ #define NSF_DURING_DELETE 0x2000 #define NSF_DELETED 0x4000 #define NSF_RECREATE 0x8000 +#define NSF_RECREATE 0x8000 +#define NSF_TCL_DELETE 0x010000 /* requires flags to be int, not short */ /* flags for NsfParams */ @@ -497,7 +499,7 @@ NsfFilterStack *filterStack; NsfMixinStack *mixinStack; int refCount; - unsigned short flags; + unsigned int flags; short activationCount; } NsfObject; Index: tests/object-system.test =================================================================== diff -u -rfbd7f24c6111a5328c15bb7c47e9a45c9928357f -rf80347fbea8fd50ae92c0bd7412cd4af80c78a54 --- tests/object-system.test (.../object-system.test) (revision fbd7f24c6111a5328c15bb7c47e9a45c9928357f) +++ tests/object-system.test (.../object-system.test) (revision f80347fbea8fd50ae92c0bd7412cd4af80c78a54) @@ -83,6 +83,9 @@ ? {o info class} ::nx::Object ? {nx::Object info instances o} ::o ? {nx::Object info instances ::o} ::o +o destroy +? {nsf::object::exists ::o} 0 +? {nsf::object::exists o} 0 nx::Object create o2 { ? {::nsf::object::exists ::o2} 1 @@ -145,6 +148,8 @@ # destroy class M, reclass class instances to the base class C destroy +? {::nsf::object::exists C} 0 +? {::nsf::object::exists ::C} 0 ? {::nsf::object::exists c1} 1 ? {::nsf::is object c1} 1 ? {::nsf::is class c1} 0