Index: generic/nsfObj.c =================================================================== diff -u -N -r24cc5e107fd8d246061a9d4b4fafefc767811c2b -reea18b07ddfc917545d48ab6a272c0bfb9656f07 --- generic/nsfObj.c (.../nsfObj.c) (revision 24cc5e107fd8d246061a9d4b4fafefc767811c2b) +++ generic/nsfObj.c (.../nsfObj.c) (revision eea18b07ddfc917545d48ab6a272c0bfb9656f07) @@ -26,6 +26,8 @@ */ #include "nsfInt.h" +#include "nsfAccessInt.h" + /* *---------------------------------------------------------------------- * @@ -405,7 +407,7 @@ register Tcl_Obj *objPtr) /* The object to convert. */ { NsfClass *mixin = NULL; - Tcl_Obj *guardObj = NULL, *nameObj; + Tcl_Obj *guardObj = NULL, *nameObj = NULL; Mixinreg *mixinRegPtr; int oc; Tcl_Obj **ov; @@ -414,20 +416,20 @@ if (oc == 1) { nameObj = ov[0]; - } else if (oc == 2) { + /*} else if (oc == 2) { nameObj = ov[0]; - guardObj = ov[1]; + guardObj = ov[1];*/ } else if (oc == 3 && !strcmp(ObjStr(ov[1]), NsfGlobalStrings[NSF_GUARD_OPTION])) { nameObj = ov[0]; guardObj = ov[2]; } else { - return TCL_ERROR; + nameObj = objPtr; } } else { - return TCL_ERROR; + return NsfObjErrType(interp, "mixin", nameObj, "a class as mixin", NULL); } /* @@ -484,14 +486,30 @@ */ int -NsfMixinregGet(Tcl_Obj *obj, NsfClass **clPtr, Tcl_Obj **guardObj) { +NsfMixinregGet(Tcl_Interp *interp, Tcl_Obj *obj, NsfClass **clPtr, Tcl_Obj **guardObj) { + assert(interp); assert(obj); assert(clPtr); assert(guardObj); if (obj->typePtr == &NsfMixinregObjType) { Mixinreg *mixinRegPtr = obj->internalRep.twoPtrValue.ptr1; + + /* + * We got a cmd, but this might be already deleted. + */ + if ((Tcl_Command_flags(mixinRegPtr->mixin->object.id) & CMD_IS_DELETED)) { + /* + * The cmd is deleted. retry to refetch it. + */ + if (MixinregSetFromAny(interp, obj) == TCL_OK) { + mixinRegPtr = obj->internalRep.twoPtrValue.ptr1; + } else { + return TCL_ERROR; + } + } + *guardObj = mixinRegPtr->guardObj; *clPtr = mixinRegPtr->mixin; return TCL_OK; @@ -610,9 +628,9 @@ if (oc == 1) { filterObj = ov[0]; - } else if (oc == 2) { + /* } else if (oc == 2) { filterObj = ov[0]; - guardObj = ov[1]; + guardObj = ov[1];*/ } else if (oc == 3 && !strcmp(ObjStr(ov[1]), NsfGlobalStrings[NSF_GUARD_OPTION])) { filterObj = ov[0]; @@ -672,7 +690,7 @@ */ int -NsfFilterregGet(Tcl_Obj *obj, Tcl_Obj **filterObj, Tcl_Obj **guardObj) { +NsfFilterregGet(Tcl_Interp *UNUSED(interp), Tcl_Obj *obj, Tcl_Obj **filterObj, Tcl_Obj **guardObj) { assert(obj); assert(filterObj);