Index: generic/xotcl.c =================================================================== diff -u -r6ca97641fdc0a1a85b5ec603e44ed84f6b15bf1c -r98003953e8c728b105528e0c2ed7d67ee7135d64 --- generic/xotcl.c (.../xotcl.c) (revision 6ca97641fdc0a1a85b5ec603e44ed84f6b15bf1c) +++ generic/xotcl.c (.../xotcl.c) (revision 98003953e8c728b105528e0c2ed7d67ee7135d64) @@ -773,7 +773,7 @@ fprintf(stderr,"--- %s tcl %p %s (%d %p) xotcl %p (%d) %s \n", string, obj->cmdName, obj->cmdName->typePtr ? obj->cmdName->typePtr->name : "NULL", obj->cmdName->refCount, obj->cmdName->internalRep.twoPtrValue.ptr1, - obj, obj->refCount, ObjStr(obj->cmdName)); + obj, obj->refCount, objectName(obj)); else fprintf(stderr,"--- No object: %s\n", string); } @@ -856,7 +856,7 @@ XOTclObject *obj = (XOTclObject*) objPtr->internalRep.otherValuePtr; /* fprintf(stderr,"FIP objPtr %p obj %p obj->cmd %p '%s', bytes='%s'\n", - objPtr, obj, obj->cmdName, ObjStr(obj->cmdName), objPtr->bytes); + objPtr, obj, obj->cmdName, objectName(obj), objPtr->bytes); */ #if defined(XOTCLOBJ_TRACE) if (obj) @@ -1612,7 +1612,7 @@ return TCL_OK; #if !defined(NDEBUG) - {char *cmdName = ObjStr(obj->cmdName); + {char *cmdName = objectName(obj); assert(cmdName); /*fprintf(stderr,"findCommand %s -> %p obj->id %p\n", cmdName, Tcl_FindCommand(interp, cmdName, NULL, 0), obj->id);*/ @@ -1681,11 +1681,11 @@ static void makeObjNamespace(Tcl_Interp *interp, XOTclObject *obj) { #ifdef NAMESPACE_TRACE - fprintf(stderr, "+++ Make Namespace for %s\n", ObjStr(obj->cmdName)); + fprintf(stderr, "+++ Make Namespace for %s\n", objectName(obj)); #endif if (!obj->nsPtr) { Tcl_Namespace *nsPtr; - char *cmdName = ObjStr(obj->cmdName); + char *cmdName = objectName(obj); obj->nsPtr = NSGetFreshNamespace(interp, (ClientData)obj, cmdName); if (!obj->nsPtr) Tcl_Panic("makeObjNamespace: Unable to make namespace", NULL); @@ -1882,7 +1882,7 @@ obj = XOTclpGetObject(interp, Tcl_DStringValue(&name)); if (obj) { - /* fprintf(stderr, " ... obj= %s\n", ObjStr(obj->cmdName));*/ + /* fprintf(stderr, " ... obj= %s\n", objectName(obj));*/ /* in the exit handler physical destroy --> directly call destroy */ if (RUNTIME_STATE(interp)->exitHandlerDestroyRound @@ -2533,7 +2533,7 @@ csc->filterStackEntry = NULL; /*fprintf(stderr, "PUSH obj %s, self=%p cmd=%p (%s) id=%p (%s) frame=%p\n", - ObjStr(obj->cmdName), obj, + objectName(obj), obj, cmd, (char *) Tcl_GetCommandName(interp, cmd), obj->id, Tcl_GetCommandName(interp, obj->id), csc);*/ @@ -3215,7 +3215,7 @@ int i, found = 0; for (i=0, cls = *checkList; cls; i++, cls = cls->nextPtr) { /* fprintf(stderr,"+++ c%d: %s\n", i, - ObjStr(cls->cl->object.cmdName));*/ + className(cls->cl));*/ if (pl->cl == cls->cl) { found = 1; break; @@ -3245,7 +3245,7 @@ static void MixinResetOrder(XOTclObject *obj) { - /*fprintf(stderr,"removeList %s \n", ObjStr(obj->cmdName));*/ + /*fprintf(stderr,"removeList %s \n", objectName(obj));*/ CmdListRemoveList(&obj->mixinOrder, NULL /*GuardDel*/); obj->mixinOrder = NULL; } @@ -3467,9 +3467,9 @@ XOTclObject *inst = (XOTclObject *)Tcl_GetHashKey(table, hPtr); int new; - Tcl_CreateHashEntry(destTable, ObjStr(inst->cmdName), &new); + Tcl_CreateHashEntry(destTable, objectName(inst), &new); /* - fprintf (stderr, " -- %s (%s)\n", ObjStr(inst->cmdName), ObjStr(startCl->object.cmdName)); + fprintf (stderr, " -- %s (%s)\n", objectName(inst), ObjStr(startCl->object.cmdName)); */ } for (sc = startCl->sub; sc; sc = sc->nextPtr) { @@ -3508,7 +3508,7 @@ Tcl_CreateHashEntry(destTable, (char *)cl, new); if (*new) { if (appendResult) { - if (!pattern || Tcl_StringMatch(ObjStr(cl->object.cmdName), pattern)) { + if (!pattern || Tcl_StringMatch(className(cl), pattern)) { Tcl_Obj *l = Tcl_NewListObj(0, NULL); Tcl_Obj *g = (Tcl_Obj*) clientData; Tcl_ListObjAppendElement(interp, l, cl->object.cmdName); @@ -3560,10 +3560,10 @@ cl = XOTclGetClassFromCmdPtr(m->cmdPtr); assert(cl); /* fprintf(stderr, "check %s mixinof %s\n", - ObjStr(cl->object.cmdName),ObjStr(startCl->object.cmdName));*/ + className(cl),ObjStr(startCl->object.cmdName));*/ rc = getAllObjectMixinsOf(interp, destTable, cl, isMixin, appendResult, pattern, matchObject); /*fprintf(stderr, "check %s mixinof %s done\n", - ObjStr(cl->object.cmdName),ObjStr(startCl->object.cmdName));*/ + className(cl),ObjStr(startCl->object.cmdName));*/ if (rc) {return rc;} } } @@ -3676,19 +3676,19 @@ cl = XOTclGetClassFromCmdPtr(m->cmdPtr); assert(cl); - /* fprintf(stderr,"Instmixin found: %s\n", ObjStr(cl->object.cmdName)); */ + /* fprintf(stderr,"Instmixin found: %s\n", className(cl)); */ if ((withGuards) && (m->clientData)) { - /* fprintf(stderr,"addToResultSetWithGuards: %s\n", ObjStr(cl->object.cmdName)); */ + /* fprintf(stderr,"addToResultSetWithGuards: %s\n", className(cl)); */ rc = addToResultSetWithGuards(interp, destTable, cl, m->clientData, &new, 1, pattern, matchObject); } else { - /* fprintf(stderr,"addToResultSet: %s\n", ObjStr(cl->object.cmdName)); */ + /* fprintf(stderr,"addToResultSet: %s\n", className(cl)); */ rc = addToResultSet(interp, destTable, &cl->object, &new, 1, pattern, matchObject); } if (rc == 1) {return rc;} if (new) { - /* fprintf(stderr,"Instmixin getAllClassMixins for: %s (%s)\n",ObjStr(cl->object.cmdName),ObjStr(startCl->object.cmdName)); */ + /* fprintf(stderr,"Instmixin getAllClassMixins for: %s (%s)\n",className(cl),ObjStr(startCl->object.cmdName)); */ rc = getAllClassMixins(interp, destTable, cl, withGuards, pattern, matchObject); if (rc) {return rc;} } @@ -3718,7 +3718,7 @@ XOTclCmdList *del = CmdListFindCmdInList(cmd, nclopt->isClassMixinOf); if (del) { /* fprintf(stderr,"Removing class %s from isClassMixinOf of class %s\n", - ObjStr(cl->object.cmdName), ObjStr(XOTclGetClassFromCmdPtr(cmdlist->cmdPtr)->object.cmdName)); */ + className(cl), ObjStr(XOTclGetClassFromCmdPtr(cmdlist->cmdPtr)->object.cmdName)); */ del = CmdListRemoveFromList(&nclopt->isClassMixinOf, del); CmdListDeleteCmdListEntry(del, GuardDel); } @@ -3735,11 +3735,11 @@ XOTclCmdList *del = CmdListFindCmdInList(cmd, clopt->isObjectMixinOf); if (del) { /* fprintf(stderr,"Removing object %s from isObjectMixinOf of Class %s\n", - ObjStr(obj->cmdName), ObjStr(XOTclGetClassFromCmdPtr(cmdlist->cmdPtr)->object.cmdName)); */ + objectName(obj), ObjStr(XOTclGetClassFromCmdPtr(cmdlist->cmdPtr)->object.cmdName)); */ del = CmdListRemoveFromList(&clopt->isObjectMixinOf, del); CmdListDeleteCmdListEntry(del, GuardDel); } - } /* else fprintf(stderr,"CleanupDestroyObject %s: NULL pointer in mixins!\n", ObjStr(obj->cmdName)); */ + } /* else fprintf(stderr,"CleanupDestroyObject %s: NULL pointer in mixins!\n", objectName(obj)); */ } } @@ -3752,7 +3752,7 @@ XOTclCmdList *del = CmdListFindCmdInList(cmd, clopt->instmixins); if (del) { /* fprintf(stderr,"Removing class %s from mixins of object %s\n", - ObjStr(cl->object.cmdName), ObjStr(XOTclGetObjectFromCmdPtr(cmdlist->cmdPtr)->cmdName)); */ + className(cl), ObjStr(XOTclGetObjectFromCmdPtr(cmdlist->cmdPtr)->cmdName)); */ del = CmdListRemoveFromList(&clopt->instmixins, del); CmdListDeleteCmdListEntry(del, GuardDel); if (cl->object.mixinOrder) MixinResetOrder(&cl->object); @@ -3770,7 +3770,7 @@ XOTclCmdList *del = CmdListFindCmdInList(cmd, objopt->mixins); if (del) { /* fprintf(stderr,"Removing class %s from mixins of object %s\n", - ObjStr(cl->object.cmdName), ObjStr(XOTclGetObjectFromCmdPtr(cmdlist->cmdPtr)->cmdName)); */ + className(cl), ObjStr(XOTclGetObjectFromCmdPtr(cmdlist->cmdPtr)->cmdName)); */ del = CmdListRemoveFromList(&objopt->mixins, del); CmdListDeleteCmdListEntry(del, GuardDel); if (nobj->mixinOrder) MixinResetOrder(nobj); @@ -3813,7 +3813,7 @@ static void ResetOrderOfClassesUsedAsMixins(XOTclClass *cl) { /*fprintf(stderr,"ResetOrderOfClassesUsedAsMixins %s - %p\n", - ObjStr(cl->object.cmdName), cl->opt);*/ + className(cl), cl->opt);*/ if (cl->opt) { XOTclCmdList *ml; @@ -3960,7 +3960,7 @@ cls = XOTclGetClassFromCmdPtr(cmdList->cmdPtr); /* fprintf(stderr,"+++ MixinSearch %s->%s in %p cmdPtr %p clientData %p\n", - ObjStr(obj->cmdName), methodName, cmdList, + objectName(obj), methodName, cmdList, cmdList->cmdPtr, cmdList->clientData); */ if (cls) { @@ -4371,7 +4371,7 @@ if (!(cmd = FilterSearch(interp, ObjStr(name), startingObj, startingCl, &cl))) { if (startingObj) return XOTclVarErrMsg(interp, "filter: can't find filterproc on: ", - ObjStr(startingObj->cmdName), " - proc: ", + objectName(startingObj), " - proc: ", ObjStr(name), (char *) NULL); else return XOTclVarErrMsg(interp, "instfilter: can't find filterproc on: ", @@ -4485,7 +4485,7 @@ cl->order = NULL; /*fprintf(stderr, "FilterRemoveDependentFilterCmds cl %p %s, removeClass %p %s\n", - cl, ObjStr(cl->object.cmdName), + cl, className(cl), removeClass, ObjStr(removeClass->object.cmdName));*/ for (clPtr = ComputeOrder(cl, cl->order, Sub); clPtr; clPtr = clPtr->nextPtr) { @@ -4672,7 +4672,7 @@ if (obj->filterOrder) FilterResetOrder(obj); /* - fprintf(stderr, " List: ", ObjStr(obj->cmdName)); + fprintf(stderr, " List: ", objectName(obj)); */ /* append instfilters registered for mixins */ @@ -4867,7 +4867,7 @@ cmdList = cmdList->nextPtr; } else if (FilterActiveOnObj(interp, obj, cmdList->cmdPtr)) { /* fprintf(stderr, "Filter <%s> -- Active on: %s\n", - Tcl_GetCommandName(interp, (Tcl_Command)cmdList->cmdPtr), ObjStr(obj->cmdName)); + Tcl_GetCommandName(interp, (Tcl_Command)cmdList->cmdPtr), objectName(obj)); */ obj->filterStack->currentCmdPtr = cmdList->cmdPtr; cmdList = seekCurrent(obj->filterStack->currentCmdPtr, obj->filterOrder); @@ -5107,7 +5107,7 @@ int rc = TCL_OK; int doSubst = 0; char *value = ObjStr(*newValue), *v; - /*fprintf(stderr,"+++++ %s.%s got '%s''\n", ObjStr(obj->cmdName), varName, ObjStr(newValue));*/ + /*fprintf(stderr,"+++++ %s.%s got '%s''\n", objectName(obj), varName, ObjStr(newValue));*/ /* TODO: maybe we can do this more elegantely without the need to parse the vars */ for (v=value; *v; v++) { @@ -5129,7 +5129,7 @@ CallStackPop(interp); /*fprintf(stderr,"+++++ %s.%s subst returned %d OK %d\n", - ObjStr(obj->cmdName), varName, rc, TCL_OK);*/ + objectName(obj), varName, rc, TCL_OK);*/ if (rc == TCL_OK) { *newValue = Tcl_GetObjResult(interp); @@ -5160,7 +5160,7 @@ if (oldValue == NULL) { Tcl_Obj *newValue = XOTcl_GetVar2Ex((XOTcl_Object*)slotObj, interp, "default", NULL, TCL_LEAVE_ERR_MSG|TCL_PARSE_PART1); - /*fprintf(stderr,"+++++ %s.%s undefined'\n", ObjStr(obj->cmdName), varName);*/ + /*fprintf(stderr,"+++++ %s.%s undefined'\n", objectName(obj), varName);*/ if (newValue) { rc = evalValueIfNeeded(interp, obj, varName, &newValue); if (rc != TCL_OK) { @@ -5170,7 +5170,7 @@ /* * just set the variable, checking is happening later */ - /*fprintf(stderr,"+++++ %s.%s := '%s'\n", ObjStr(obj->cmdName), varName, ObjStr(newValue));*/ + /*fprintf(stderr,"+++++ %s.%s := '%s'\n", objectName(obj), varName, ObjStr(newValue));*/ Tcl_SetVar2Ex(interp, varName, NULL, newValue, TCL_LEAVE_ERR_MSG|TCL_PARSE_PART1); @@ -5204,7 +5204,7 @@ } } } else { - /* fprintf(stderr, "+++ value for %s.%s already set\n", ObjStr(obj->cmdName), varName);*/ + /* fprintf(stderr, "+++ value for %s.%s already set\n", objectName(obj), varName);*/ } leavesetdefaultvalue: XOTcl_PopFrame(interp, obj); @@ -5220,7 +5220,7 @@ if (requiredFlag) { rc = Tcl_GetBooleanFromObj(interp, requiredFlag, &bool); if (rc == TCL_OK && bool) { - /*fprintf(stderr,"+++++ %s.%s must check'\n", ObjStr(obj->cmdName), varName);*/ + /*fprintf(stderr,"+++++ %s.%s must check'\n", objectName(obj), varName);*/ if (!varExists(interp, obj, varName, NULL, 0, 1)) { return XOTclVarErrMsg(interp, "required parameter '", varName, "' missing", @@ -5380,7 +5380,7 @@ rst->callIsDestroy = 0; /*fprintf(stderr,"callProcCheck: setting callIsDestroy = 0, m=%s obj=%p (%s) is TclProc %d\n", - methodName, obj, ObjStr(obj->cmdName), isTclProc);*/ + methodName, obj, objectName(obj), isTclProc);*/ /*fprintf(stderr,"*** callProcCheck: cmd = %p objproc = %p\n", cmd, Tcl_Command_objProc(cmd)); fprintf(stderr,"*** callProcCheck: cmd = %p\n", cmd); @@ -5429,8 +5429,8 @@ /* if (obj && obj->teardown && cl && !(obj->flags & XOTCL_DESTROY_CALLED)) { - fprintf(stderr, "Obj= %s ", ObjStr(obj->cmdName)); - fprintf(stderr, "CL= %s ", ObjStr(cl->object.cmdName)); + fprintf(stderr, "Obj= %s ", objectName(obj)); + fprintf(stderr, "CL= %s ", className(cl)); fprintf(stderr, "method=%s\n", methodName); } */ @@ -5622,7 +5622,7 @@ } /*fprintf(stderr,"DoCallProcCheck push=%d (%d), obj=%s fromNext %d\n", - push, forcePush, ObjStr(obj->cmdName), fromNext);*/ + push, forcePush, objectName(obj), fromNext);*/ /*{int i; fprintf(stderr, "\tCALL ");for(i=0; icmdName), objc, ObjStr(objv[0]), methodName);*/ + objectName(obj), objc, ObjStr(objv[0]), methodName);*/ #ifdef AUTOVARS isNext = isNextString(methodName); @@ -5787,7 +5787,7 @@ if (!unknown) { /*fprintf(stderr,"DoDispatch calls DoCallProcCheck with obj = %s frameType %d\n", - ObjStr(obj->cmdName), frameType);*/ + objectName(obj), frameType);*/ if ((result = DoCallProcCheck(clientData, interp, objc-1, objv+1, cmd, obj, cl, methodName, frameType)) == TCL_ERROR) { result = XOTclErrInProc(interp, cmdName, @@ -5816,15 +5816,15 @@ ALLOC_ON_STACK(Tcl_Obj*, objc+1, tov); /* fprintf(stderr,"calling unknown for %s %s, flgs=%02x,%02x isClass=%d %p %s\n", - ObjStr(obj->cmdName), ObjStr(objv[1]), flags, XOTCL_CM_NO_UNKNOWN, - XOTclObjectIsClass(obj), obj, ObjStr(obj->cmdName)); + objectName(obj), ObjStr(objv[1]), flags, XOTCL_CM_NO_UNKNOWN, + XOTclObjectIsClass(obj), obj, objectName(obj)); */ tov[0] = obj->cmdName; tov[1] = XOTclGlobalObjects[XOTE_UNKNOWN]; if (objc>1) memcpy(tov+2, objv+1, sizeof(Tcl_Obj *)*(objc-1)); /* - fprintf(stderr,"?? %s unknown %s\n", ObjStr(obj->cmdName), ObjStr(tov[2])); + fprintf(stderr,"?? %s unknown %s\n", objectName(obj), ObjStr(tov[2])); */ result = DoDispatch(clientData, interp, objc+1, tov, flags | XOTCL_CM_NO_UNKNOWN); FREE_ON_STACK(tov); @@ -6293,7 +6293,7 @@ if (!obj->nsPtr) { makeObjNamespace(interp, obj); } - /*fprintf(stderr,"obj %s\n", ObjStr(obj->cmdName)); + /*fprintf(stderr,"obj %s\n", objectName(obj)); fprintf(stderr,"ns %p obj->ns %p\n", ns, obj->nsPtr); fprintf(stderr,"ns %s obj->ns %s\n", ns->fullName, obj->nsPtr->fullName);*/ procPtr->cmdPtr->nsPtr = (Namespace*) obj->nsPtr; @@ -6512,7 +6512,7 @@ /* hPtr = table ? Tcl_FirstHashEntry(table, &hSrch) : 0; */ /* for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { */ /* XOTclObject *obj = (XOTclObject*)Tcl_GetHashKey(table, hPtr); */ -/* if (!pattern || Tcl_StringMatch(ObjStr(obj->cmdName), pattern)) { */ +/* if (!pattern || Tcl_StringMatch(objectName(obj), pattern)) { */ /* Tcl_ListObjAppendElement(interp, list, obj->cmdName); */ /* } */ /* } */ @@ -6738,8 +6738,8 @@ ListPrecedence(Tcl_Interp *interp, XOTclObject *obj, char *pattern, int intrinsicOnly) { XOTclClasses *pl, *precedenceList; - /*fprintf(stderr, "ListPrecedence %s pattern %s, intrinsic %d\n", - ObjStr(obj->cmdName), pattern, intrinsicOnly);*/ + /*fprintf(stderr, "ListPrecedence %s pattern '%s', intrinsic %d\n", + objectName(obj), pattern, intrinsicOnly);*/ Tcl_ResetResult(interp); precedenceList = ComputePrecedenceList(interp, obj, pattern, !intrinsicOnly); @@ -7011,7 +7011,7 @@ cmd = (Tcl_Command) Tcl_GetHashValue(hPtr); childobj = XOTclGetObjectFromCmdPtr(cmd); /* (childobj->id && Tcl_Command_nsPtr(childobj->id) == obj->nsPtr) true children */ - /*fprintf(stderr,"we have true child obj %s\n", ObjStr(childobj->cmdName));*/ + /*fprintf(stderr,"we have true child obj %s\n", objectName(childobj));*/ npl = XOTclObjectListAdd(npl, childobj); } } @@ -7174,7 +7174,7 @@ * search for a further class method */ *cl = SearchPLMethod(pl, *method, cmd); - /*fprintf(stderr, "no cmd, cl = %p %s\n",*cl, ObjStr((*cl)->object.cmdName));*/ + /*fprintf(stderr, "no cmd, cl = %p %s\n",*cl, className((*cl)));*/ } else { *cl = 0; } @@ -7259,7 +7259,7 @@ *methodName, endOfFilterChain); if (obj) - fprintf(stderr, " obj=%s,", ObjStr(obj->cmdName)); + fprintf(stderr, " obj=%s,", objectName(obj)); if ((*cl)) fprintf(stderr, " cl=%s,", (*cl)->nsPtr->fullName); fprintf(stderr, " mixin=%d, filter=%d, proc=%p\n", @@ -7376,7 +7376,7 @@ } if (csccontent) return XOTclVarErrMsg(interp, "__next: can't find object", - ObjStr(obj->cmdName), (char *) NULL); + objectName(obj), (char *) NULL); methodName = (char *)Tcl_GetCommandName(interp, csc->cmdPtr); /*fprintf(stderr,"******* next for proc %s\n", methodName);*/ return XOTclNextMethod(obj, interp, csc->cl, methodName, objc-1, &objv[1], 0); @@ -7880,7 +7880,7 @@ } /* fprintf(stderr, "cleanupInitObject %s: %p cl = %p\n", - obj->cmdName ? ObjStr(obj->cmdName) : "", obj, obj->cl);*/ + obj->cmdName ? objectName(obj) : "", obj, obj->cl);*/ } /* @@ -7917,7 +7917,7 @@ #ifdef OBJDELETION_TRACE fprintf(stderr," physical delete of %p id=%p destroyCalled=%d '%s'\n", - obj, obj->id, (obj->flags & XOTCL_DESTROY_CALLED), ObjStr(obj->cmdName)); + obj, obj->id, (obj->flags & XOTCL_DESTROY_CALLED), objectName(obj)); #endif CleanupDestroyObject(interp, obj, 0); @@ -7938,7 +7938,7 @@ again in the future, don't use Tcl_GetCommandFromObj() in Tcl 8.4.* versions. */ - Tcl_Command cmd = Tcl_FindCommand(interp, ObjStr(obj->cmdName), 0, 0); + Tcl_Command cmd = Tcl_FindCommand(interp, objectName(obj), 0, 0); if (cmd) Tcl_Command_deleteProc(cmd) = NULL; } @@ -7950,7 +7950,7 @@ obj->nsPtr = NULL; } - /*fprintf(stderr, " +++ OBJ/CLS free: %s\n", ObjStr(obj->cmdName));*/ + /*fprintf(stderr, " +++ OBJ/CLS free: %s\n", objectName(obj));*/ obj->flags |= XOTCL_DESTROYED; objTrace("ODestroy", obj); @@ -8041,7 +8041,7 @@ /*TclNewObj(obj->cmdName);*/ obj->cmdName = Tcl_NewStringObj(name, length); TclSetCmdNameObj(interp, obj->cmdName, (Command*)obj->id); - /*fprintf(stderr, "new command has name '%s'\n", ObjStr(obj->cmdName));*/ + /*fprintf(stderr, "new command has name '%s'\n", objectName(obj));*/ #else obj->cmdName = NewXOTclObjectObjName(obj, name, length); #endif @@ -8058,8 +8058,8 @@ /* fprintf(stderr, "DefaultSuperClass cl %s, mcl %s\n", - ObjStr(cl->object.cmdName), - mcl ? ObjStr(mcl->object.cmdName) : "NULL" + className(cl), + className(mcl) ); */ @@ -8091,7 +8091,7 @@ /* check superclasses of metaclass */ /*fprintf(stderr,"DefaultSuperClass: search in superclasses starting with %p\n",cl->super);*/ for (sc = mcl->super; sc && sc->cl != cl; sc = sc->nextPtr) { - /*fprintf(stderr, " ... check %s\n",ObjStr(sc->cl->object.cmdName));*/ + /*fprintf(stderr, " ... check %s\n",className(sc->cl));*/ result = DefaultSuperClass(interp, cl, sc->cl, topcl, isMeta); if (result != topcl) { return result; @@ -8195,7 +8195,7 @@ */ baseClass = theobj; } - /* fprintf(stderr,"baseclass = %s\n",ObjStr(baseClass->object.cmdName));*/ + /* fprintf(stderr,"baseclass = %s\n",className(baseClass));*/ hPtr = &cl->instances ? Tcl_FirstHashEntry(&cl->instances, &hSrch) : 0; for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { @@ -8299,7 +8299,7 @@ defaultSuperclass = DefaultSuperClass(interp, cl, cl->object.cl, RUNTIME_STATE(interp)->theObject, 0); /* if (defaultSuperclass) { - fprintf(stderr, "default superclass= %s\n", ObjStr(defaultSuperclass->object.cmdName)); + fprintf(stderr, "default superclass= %s\n", className(defaultSuperclass)); } else { fprintf(stderr, "empty super class\n"); }*/ @@ -8346,7 +8346,7 @@ /* * call and latch user destroy with obj->id if we haven't */ - /*fprintf(stderr,"PrimitiveCDestroy %s flags %x\n", ObjStr(obj->cmdName), obj->flags);*/ + /*fprintf(stderr,"PrimitiveCDestroy %s flags %x\n", objectName(obj), obj->flags);*/ if (!(obj->flags & XOTCL_DESTROY_CALLED)) /*fprintf(stderr,"PrimitiveCDestroy call destroy\n");*/ @@ -8446,8 +8446,8 @@ assert(obj); /*fprintf(stderr,"changing %s to class %s ismeta %d\n", - ObjStr(obj->cmdName), - ObjStr(cl->object.cmdName), + objectName(obj), + className(cl), IsMetaClass(interp, cl));*/ if (cl != obj->cl) { @@ -8467,7 +8467,7 @@ but upgrading/downgrading is not allowed */ /*fprintf(stderr,"target class %s not a meta class, am i a class %d\n", - ObjStr(cl->object.cmdName), + className(cl), XOTclObjectIsClass(obj) );*/ if (XOTclObjectIsClass(obj)) { @@ -8706,7 +8706,7 @@ PRINTOBJ("XOTclOCleanupMethod", obj); - fn = ObjStr(obj->cmdName); + fn = objectName(obj); savedNameObj = obj->cmdName; INCR_REF_COUNT(savedNameObj); @@ -8781,7 +8781,7 @@ } for (mc=mixinClasses; mc; mc = mc->nextPtr) { - /*fprintf(stderr,"- got %s\n", ObjStr(mc->cl->object.cmdName));*/ + /*fprintf(stderr,"- got %s\n", className(mc->cl));*/ if (isSubType(mc->cl, RUNTIME_STATE(interp)->theClass)) { hasMCM = 1; break; @@ -9322,6 +9322,10 @@ noprocs, nocmds, nomixins, inContext); } + + + + static int XOTclObjInfoNonposargsMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj; @@ -9474,7 +9478,7 @@ cmd = ObjStr(objv[1]); pattern = (objc > 2) ? ObjStr(objv[2]) : 0; - /*fprintf(stderr, "OInfo cmd=%s, obj=%s, nsp=%p\n", cmd, ObjStr(obj->cmdName), nsp);*/ + /*fprintf(stderr, "OInfo cmd=%s, obj=%s, nsp=%p\n", cmd, objectName(obj), nsp);*/ /* * check for "-" modifiers @@ -9922,7 +9926,7 @@ /* the source variable name contains a namespace path. to locate it, we need a namespace */ requireObjNamespace(interp, obj); } - /*fprintf(stderr,"GetIntoScope obj=%s ns=%p newName=%s\n", ObjStr(obj->cmdName), obj->nsPtr, newName);*/ + /*fprintf(stderr,"GetIntoScope obj=%s ns=%p newName=%s\n", objectName(obj), obj->nsPtr, newName);*/ #endif XOTcl_PushFrame(interp, obj); @@ -9936,7 +9940,7 @@ if (otherPtr == NULL) { return XOTclVarErrMsg(interp, "can't make instvar ", ObjStr(varName), - ": can't find variable on ", ObjStr(obj->cmdName), + ": can't find variable on ", objectName(obj), (char *) NULL); } /* @@ -9950,7 +9954,7 @@ */ if (arrayPtr) { return XOTclVarErrMsg(interp, "can't make instvar ", ObjStr(varName), - " on ", ObjStr(obj->cmdName), + " on ", objectName(obj), ": variable cannot be an element in an array;", " use an alias or objeval.", (char *) NULL); } @@ -10063,7 +10067,7 @@ { Var85 *p = (Var85 *)varPtr; fprintf(stderr,"defining an alias var='%s' in obj %s fwd %d flags %x isLink %d isTraced %d isUndefined %d\n", - ObjStr(newName), ObjStr(obj->cmdName), forwardCompatibleMode, + ObjStr(newName), objectName(obj), forwardCompatibleMode, varFlags(varPtr), TclIsVarLink(varPtr), TclIsVarTraced(varPtr), TclIsVarUndefined(varPtr)); } @@ -10151,7 +10155,7 @@ if (value == NULL) { result = Tcl_ObjGetVar2(interp, name, NULL, flags); } else { - /*fprintf(stderr,"setvar in obj %s: name %s = %s\n",ObjStr(obj->cmdName),ObjStr(name),ObjStr(value));*/ + /*fprintf(stderr,"setvar in obj %s: name %s = %s\n",objectName(obj),ObjStr(name),ObjStr(value));*/ result = Tcl_ObjSetVar2(interp, name, NULL, value, flags); } XOTcl_PopFrame(interp, obj); @@ -10619,7 +10623,7 @@ } if (!Tcl_Interp_varFramePtr(interp)) { CallStackRestoreSavedFrames(interp, &ctx); - return XOTclVarErrMsg(interp, "instvar used on ", ObjStr(obj->cmdName), + return XOTclVarErrMsg(interp, "instvar used on ", objectName(obj), ", but callstack is not in procedure scope", (char *) NULL); } @@ -10685,7 +10689,7 @@ */ if (NSRequireVariableOnObj(interp, obj, nameString, flgs) == 0) return XOTclVarErrMsg(interp, "Can't lookup (and create) variable ", - nameString, " on ", ObjStr(obj->cmdName), + nameString, " on ", objectName(obj), (char *) NULL); XOTcl_PushFrame(interp, obj); @@ -10813,7 +10817,7 @@ } if (opt->checkoptions == CHECK_NONE && ocArgs>0) { return XOTclVarErrMsg(interp, "Unknown check option in command '", - ObjStr(obj->cmdName), " ", ObjStr(objv[0]), + objectName(obj), " ", ObjStr(objv[0]), " ", ObjStr(objv[1]), "', valid: all pre post invar instinvar", (char *) NULL); @@ -11304,7 +11308,7 @@ del = CmdListFindCmdInList(obj->id, clopt->isObjectMixinOf); if (del) { /* fprintf(stderr,"Removing object %s from isObjectMixinOf of class %s\n", - ObjStr(obj->cmdName), ObjStr(XOTclGetClassFromCmdPtr(cmdlist->cmdPtr)->object.cmdName)); */ + objectName(obj), ObjStr(XOTclGetClassFromCmdPtr(cmdlist->cmdPtr)->object.cmdName)); */ del = CmdListRemoveFromList(&clopt->isObjectMixinOf, del); CmdListDeleteCmdListEntry(del, GuardDel); } @@ -11328,16 +11332,16 @@ if (MixinAdd(interp, &objopt->mixins, ov[i], obj->cl->object.cl) != TCL_OK) { return TCL_ERROR; } - /* fprintf(stderr,"Added to mixins of %s: %s\n", ObjStr(obj->cmdName), ObjStr(ov[i])); */ + /* fprintf(stderr,"Added to mixins of %s: %s\n", objectName(obj), ObjStr(ov[i])); */ Tcl_ListObjIndex(interp, ov[i], 0, &ocl); XOTclObjConvertObject(interp, ocl, &nobj); if (nobj) { /* fprintf(stderr,"Registering object %s to isObjectMixinOf of class %s\n", - ObjStr(obj->cmdName), ObjStr(nobj->cmdName)); */ + objectName(obj), objectName(nobj)); */ nclopt = XOTclRequireClassOpt((XOTclClass*) nobj); CmdListAdd(&nclopt->isObjectMixinOf, obj->id, NULL, /*noDuplicates*/ 1); } /* else fprintf(stderr,"Problem registering %s as a mixinof of %s\n", - ObjStr(ov[i]), ObjStr(cl->object.cmdName)); */ + ObjStr(ov[i]), className(cl)); */ } MixinComputeDefined(interp, obj); @@ -11377,17 +11381,17 @@ return TCL_ERROR; } /* fprintf(stderr,"Added to instmixins of %s: %s\n", - ObjStr(cl->object.cmdName), ObjStr(ov[i])); */ + className(cl), ObjStr(ov[i])); */ Tcl_ListObjIndex(interp, ov[i], 0, &ocl); XOTclObjConvertObject(interp, ocl, &nobj); if (nobj) { /* fprintf(stderr,"Registering class %s to isClassMixinOf of class %s\n", - ObjStr(cl->object.cmdName), ObjStr(nobj->cmdName)); */ + className(cl), objectName(nobj)); */ nclopt = XOTclRequireClassOpt((XOTclClass*) nobj); CmdListAdd(&nclopt->isClassMixinOf, cl->object.id, NULL, /*noDuplicates*/ 1); } /* else fprintf(stderr,"Problem registering %s as a instmixinof of %s\n", - ObjStr(ov[i]), ObjStr(cl->object.cmdName)); */ + ObjStr(ov[i]), className(cl)); */ } break; @@ -11438,7 +11442,7 @@ } return XOTclVarErrMsg(interp, "Mixinguard: can't find mixin ", - ObjStr(objv[1]), " on ", ObjStr(obj->cmdName), + ObjStr(objv[1]), " on ", objectName(obj), (char *) NULL); } @@ -11466,7 +11470,7 @@ } return XOTclVarErrMsg(interp, "Filterguard: can't find filter ", - ObjStr(objv[1]), " on ", ObjStr(obj->cmdName), + ObjStr(objv[1]), " on ", objectName(obj), (char *) NULL); } @@ -11624,7 +11628,7 @@ Tcl_Obj *method = Tcl_NewStringObj(methodName,-1); /*fprintf(stderr,"callConfigureMethod method %s->'%s' argc %d\n", - ObjStr(obj->cmdName), methodName, argc);*/ + objectName(obj), methodName, argc);*/ if (isInitString(methodName)) obj->flags |= XOTCL_INIT_CALLED; @@ -11640,7 +11644,7 @@ if (result != TCL_OK) { Tcl_Obj *res = Tcl_DuplicateObj(Tcl_GetObjResult(interp)); /* save the result */ INCR_REF_COUNT(res); - XOTclVarErrMsg(interp, ObjStr(res), " during '", ObjStr(obj->cmdName), " ", + XOTclVarErrMsg(interp, ObjStr(res), " during '", objectName(obj), " ", methodName, "'", (char *) NULL); DECR_REF_COUNT(res); } @@ -11694,7 +11698,7 @@ } default: { - return XOTclVarErrMsg(interp, ObjStr(obj->cmdName), + return XOTclVarErrMsg(interp, objectName(obj), " configure: unexpected argument '", ObjStr(objv[i]), "' between parameters", (char *) NULL); @@ -11778,7 +11782,7 @@ ObjStr(objv[1]), " that does not exist.", (char *) NULL); - /* fprintf(stderr,"instdestroy obj=%s, opt=%p\n", ObjStr(delobj->cmdName), delobj->opt);*/ + /* fprintf(stderr,"instdestroy obj=%s, opt=%p\n", objectName(delobj), delobj->opt);*/ rc = freeUnsetTraceVariable(interp, delobj); if (rc != TCL_OK) { return rc; @@ -11980,7 +11984,7 @@ /*fprintf(stderr,"+++ create objv[1] '%s', specifiedName '%s', newObj=%p ismeta(%s) %d, ismeta(%s) %d\n", specifiedName, objName, newobj, - ObjStr(cl->object.cmdName), IsMetaClass(interp, cl), + className(cl), IsMetaClass(interp, cl), newobj ? ObjStr(newobj->cl->object.cmdName) : "NULL", newobj ? IsMetaClass(interp, newobj->cl) : 0 );*/ @@ -12097,7 +12101,7 @@ Tcl_DStringInit(dsPtr); if (child) { - Tcl_DStringAppend(dsPtr, ObjStr(child->cmdName), -1); + Tcl_DStringAppend(dsPtr, objectName(child), -1); Tcl_DStringAppend(dsPtr, "::__#", 5); } else { Tcl_DStringAppend(dsPtr, "::xotcl::__#", 12); @@ -12448,8 +12452,92 @@ return opt ? GuardList(interp, opt->instmixins, ObjStr(objv[2])) : TCL_OK; } +static int +XOTclClassInfoMixinofMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + XOTclClass *cl; + int modifiers, args, set, withClosure, rc; + char *pattern; + static CONST char *options[] = {"-closure", NULL}; + XOTclObject *matchObject; + Tcl_DString ds, *dsPtr = &ds; + modifiers = getModifiers(objc, 2, objv, options, &set); + args = objc-modifiers; + + if (args < 2 || args > 3) return XOTclObjErrArgCnt(interp, objv[0], NULL, " ?-closure? ?pattern?"); + if (GetXOTclClassFromObj(interp, objv[1], &cl, 0) != TCL_OK) + return XOTclObjErrType(interp, objv[1], "Class"); + + pattern = args == 3 ? ObjStr(objv[objc-modifiers-1]) : NULL; + withClosure = (modifiers>0); + Tcl_ResetResult(interp); + + if (cl->opt && !withClosure) { + DSTRING_INIT(dsPtr); + if (getMatchObject(interp, &pattern, &matchObject, dsPtr) == -1) { + return TCL_OK; + } + + rc = AppendMatchingElementsFromCmdList(interp, cl->opt->isObjectMixinOf, pattern, matchObject); + if (matchObject) { + Tcl_SetObjResult(interp, rc ? matchObject->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); + } + DSTRING_FREE(dsPtr); + } else if (withClosure) { + Tcl_HashTable objTable, *commandTable = &objTable; + MEM_COUNT_ALLOC("Tcl_InitHashTable", commandTable); + Tcl_InitHashTable(commandTable, TCL_ONE_WORD_KEYS); + rc = getAllObjectMixinsOf(interp, commandTable, cl, 0, 1, pattern, matchObject); + MEM_COUNT_FREE("Tcl_InitHashTable", commandTable); + } + return TCL_OK; +} + + static int +XOTclClassInfoInstmixinofMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + XOTclClass *cl; + int modifiers, args, set, withClosure, rc; + char *pattern; + static CONST char *options[] = {"-closure", NULL}; + XOTclObject *matchObject; + Tcl_DString ds, *dsPtr = &ds; + + modifiers = getModifiers(objc, 2, objv, options, &set); + args = objc-modifiers; + + if (args < 2 || args > 3) return XOTclObjErrArgCnt(interp, objv[0], NULL, " ?-closure? ?pattern?"); + if (GetXOTclClassFromObj(interp, objv[1], &cl, 0) != TCL_OK) + return XOTclObjErrType(interp, objv[1], "Class"); + + pattern = args == 3 ? ObjStr(objv[objc-modifiers-1]) : NULL; + withClosure = (modifiers>0); + Tcl_ResetResult(interp); + + if (cl->opt) { + DSTRING_INIT(dsPtr); + if (getMatchObject(interp, &pattern, &matchObject, dsPtr) == -1) { + return TCL_OK; + } + if (withClosure) { + Tcl_HashTable objTable, *commandTable = &objTable; + MEM_COUNT_ALLOC("Tcl_InitHashTable", commandTable); + Tcl_InitHashTable(commandTable, TCL_ONE_WORD_KEYS); + rc = getAllClassMixinsOf(interp, commandTable, cl, 0, 1, pattern, matchObject); + MEM_COUNT_FREE("Tcl_InitHashTable", commandTable); + } else { + rc = AppendMatchingElementsFromCmdList(interp, cl->opt->isClassMixinOf, + pattern, matchObject); + } + if (matchObject) { + Tcl_SetObjResult(interp, rc ? matchObject->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); + } + DSTRING_FREE(dsPtr); + } + return TCL_OK; +} + +static int XOTclClassInfoInstnonposargsMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl; @@ -12553,7 +12641,8 @@ modifiers = getModifiers(objc, 2, objv, options, &set); args = objc-modifiers; - if (args < 2 || args > 3) return XOTclObjErrArgCnt(interp, objv[0], NULL, " ?pattern?"); + if (args < 2 || args > 3) + return XOTclObjErrArgCnt(interp, objv[0], NULL, " ?-closure? ?pattern?"); if (GetXOTclClassFromObj(interp, objv[1], &cl, 0) != TCL_OK) return XOTclObjErrType(interp, objv[1], "Class"); @@ -13431,7 +13520,7 @@ } return XOTclVarErrMsg(interp, "Instfilterguard: can't find filter ", - ObjStr(objv[1]), " on ", ObjStr(cl->object.cmdName), + ObjStr(objv[1]), " on ", className(cl), (char *) NULL); } @@ -13465,7 +13554,7 @@ } return XOTclVarErrMsg(interp, "Instmixinguard: can't find mixin ", - ObjStr(objv[1]), " on ", ObjStr(cl->object.cmdName), + ObjStr(objv[1]), " on ", className(cl), (char *) NULL); } @@ -13492,7 +13581,7 @@ static int XOTclCUnknownMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*) clientData; - char *self = ObjStr(obj->cmdName); + char *self = objectName(obj); int rc; if (objc < 2) return XOTclObjErrArgCnt(interp, obj->cmdName, objv[0], "message ?args .. args?"); @@ -13821,7 +13910,7 @@ if (obj) { /* - fprintf(stderr, "copy in obj %s var %s val '%s'\n",ObjStr(obj->cmdName),ObjStr(varNameObj), + fprintf(stderr, "copy in obj %s var %s val '%s'\n",objectName(obj),ObjStr(varNameObj), ObjStr(valueOfVar(Tcl_Obj, varPtr, objPtr)));*/ #if 1 /* can't rely on "set", if there are multiple object systems */ @@ -13915,17 +14004,17 @@ i++; cmd = FindMethod(method, cl->nsPtr); if (cmd == 0) - return XOTclVarErrMsg(interp, ObjStr(self->cmdName), + return XOTclVarErrMsg(interp, objectName(self), ": unable to dispatch local method '", - method, "' in class ", ObjStr(cl->object.cmdName), + method, "' in class ", className(cl), (char *) NULL); /*fprintf(stderr, "method %s, cmd = %p objc=%d\n", method, cmd, objc); for (i=0; icmdName), objc, ObjStr(objv[1])); + self, objectName(self), objc, ObjStr(objv[1])); {int i; fprintf(stderr, "MY\tCALL ");for(i=0; iobject.refCount>0) { - /*fprintf(stderr,"checkallinstances %d cl=%p '%s'\n", lvl, cl, ObjStr(cl->object.cmdName));*/ + /*fprintf(stderr,"checkallinstances %d cl=%p '%s'\n", lvl, cl, className(cl));*/ for (hPtr = Tcl_FirstHashEntry(&cl->instances, &search); hPtr; hPtr = Tcl_NextHashEntry(&search)) { XOTclObject *interpst = (XOTclObject*) Tcl_GetHashKey(&cl->instances, hPtr); @@ -14457,7 +14546,7 @@ obj = XOTclpGetObject(interp, key); if (obj && !XOTclObjectIsClass(obj) && !ObjectHasChildren(interp, obj)) { /* fprintf(stderr," ... delete object %s %p, class=%s\n", key, obj, - ObjStr(obj->cl->object.cmdName));*/ + className(obj->cl));*/ freeUnsetTraceVariable(interp, obj); Tcl_DeleteCommandFromToken(interp, obj->id); Tcl_DeleteHashEntry(hPtr); @@ -15012,10 +15101,12 @@ {"instinvar", XOTclClassInfoInstinvarMethod}, {"instmixin", XOTclClassInfoInstmixinMethod}, {"instmixinguard", XOTclClassInfoInstmixinguardMethod}, + {"instmixinof", XOTclClassInfoInstmixinofMethod}, {"instprocs", XOTclClassInfoInstprocsMethod}, {"instnonposargs", XOTclClassInfoInstnonposargsMethod}, {"instpre", XOTclClassInfoInstpreMethod}, {"instpost", XOTclClassInfoInstpostMethod}, + {"mixinof", XOTclClassInfoMixinofMethod}, {"parameter", XOTclClassInfoParameterMethod}, {"subclass", XOTclClassInfoSubclassMethod}, {"superclass", XOTclClassInfoSuperclassMethod}, Index: generic/xotclInt.h =================================================================== diff -u -r8cd07ec2847e5ccff9f486950459d72a4d497e8b -r98003953e8c728b105528e0c2ed7d67ee7135d64 --- generic/xotclInt.h (.../xotclInt.h) (revision 8cd07ec2847e5ccff9f486950459d72a4d497e8b) +++ generic/xotclInt.h (.../xotclInt.h) (revision 98003953e8c728b105528e0c2ed7d67ee7135d64) @@ -338,6 +338,7 @@ #endif #define className(cl) (cl ? ObjStr(cl->object.cmdName) : "") +#define objectName(obj) (ObjStr(obj->cmdName)) #define LONG_AS_STRING 32 Index: tests/object-system.xotcl =================================================================== diff -u -r55263740a08228f32691565d74188bd6bc79c153 -r98003953e8c728b105528e0c2ed7d67ee7135d64 --- tests/object-system.xotcl (.../object-system.xotcl) (revision 55263740a08228f32691565d74188bd6bc79c153) +++ tests/object-system.xotcl (.../object-system.xotcl) (revision 98003953e8c728b105528e0c2ed7d67ee7135d64) @@ -13,7 +13,7 @@ puts stderr "$msg returned '$r' ne '$expected'" exit } else { - puts stderr "$msg - passed" + puts -nonewline stderr "." } } @@ -90,5 +90,6 @@ ? {X::slot info vars} __parameter ? {X info parameter} {{x 1} {y 2}} +puts stderr "DONE" #puts stderr ===EXIT Index: tests/speedtest.xotcl =================================================================== diff -u -r4eafc074cdca60b0089c2a950954c83d519b91d3 -r98003953e8c728b105528e0c2ed7d67ee7135d64 --- tests/speedtest.xotcl (.../speedtest.xotcl) (revision 4eafc074cdca60b0089c2a950954c83d519b91d3) +++ tests/speedtest.xotcl (.../speedtest.xotcl) (revision 98003953e8c728b105528e0c2ed7d67ee7135d64) @@ -20,7 +20,7 @@ set x [llength [Object info instances]] set y [set _ [llength [Object info instances]]] set z [llength $startObjects] -puts stderr "x=$x, y=$y, z=$z, ocount=$ocount" +#puts stderr "x=$x, y=$y, z=$z, ocount=$ocount" Class M1; Class M2 Class C -parameter {{p 99} {q 98} r} @@ -177,19 +177,11 @@ return 2 } -puts stderr [set x [llength [Object info instances]]] -puts stderr [llength [Object info instances]] - C c Class D -superclass C D instproc init args {} D d -puts stderr [set x [llength [Object info instances]]] -puts stderr [llength [Object info instances]] - - - #Test new -cmd {llength [c info children]} -count 1 -expected 999 #Test new -cmd {set x [llength [c info children]]} -count 1 -expected 999 Test new -cmd {llength [c info children]} -count 1 -expected $ccount @@ -249,15 +241,9 @@ Test new -cmd {llength [Object info instances]} -count 1 -expected $ocount Test new -cmd {set x [llength [Object info instances]]} -count 1 -expected $ocount -Test new -cmd {puts stderr [llength [Object info instances]]} -count 1 -expected "" Test new -cmd {c childNodeNamespace} -expected ::c::13 -Test new -cmd {puts stderr [llength [Object info instances]]} -count 1 -expected "" Test new -cmd {llength [Object info instances]} -count 1 -expected $ocount -#Test new -cmd {puts stderr [lsort [Object info instances]]} -count 1 -expected "" -Test new -cmd {puts stderr [llength [Object info instances]]} -count 1 -expected "" Test new -cmd {c childNodeNamespaceCreate} -expected ::c::13 -#Test new -cmd {puts stderr [lsort [Object info instances]]} -count 1 -expected "" -Test new -cmd {puts stderr [llength [Object info instances]]} -count 1 -expected "" Test new -cmd {llength [Object info instances]} -expected $ocount Test new -cmd {c createVolatileRc} -expected 2 @@ -295,20 +281,16 @@ # we create another object set ocount [expr {$ocount + 1}] Test new -cmd {Object create x} -expected ::x -#Test new -count 1 -cmd {llength [Object info instances]} -expected $ocount -Test new -count 1 -cmd {puts [lsort [Object info instances]];llength [Object info instances]} -expected $ocount +Test new -count 1 -cmd {llength [Object info instances]} -expected $ocount Test new -cmd {Object create x -set a -1 -set b ,, -set c a--} \ -expected ::x -Test new -count 1 -cmd {puts [lsort [Object info instances]]} -expected "" Test new -count 1 -cmd {llength [Object info instances]} -expected $ocount Test new -cmd {expr {[c array names n 5] ne ""}} -Test new -count 1 -cmd {puts =======[lsort [Object info instances]]} -expected "" Test new -count 1 -cmd {llength [Object info instances]} -expected $ocount Test new -cmd {info exists c::n(5)} -Test new -count 1 -cmd {puts [lsort [Object info instances]]} -expected "" Test new -count 1 -cmd {llength [Object info instances]} -expected $ocount Test new -cmd {c exists n(5)} Index: tests/testx.xotcl =================================================================== diff -u -r6ca97641fdc0a1a85b5ec603e44ed84f6b15bf1c -r98003953e8c728b105528e0c2ed7d67ee7135d64 --- tests/testx.xotcl (.../testx.xotcl) (revision 6ca97641fdc0a1a85b5ec603e44ed84f6b15bf1c) +++ tests/testx.xotcl (.../testx.xotcl) (revision 98003953e8c728b105528e0c2ed7d67ee7135d64) @@ -1264,11 +1264,11 @@ set r [anObject aProc] if {$i > 0} { ::errorCheck $InfoTraceResult \ - "{::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-cleanup aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-setvalues aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-configure aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-init aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::xotcl::Class-::xotcl::classInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, classchildren, classparent, commands, default, filter, filterguard, forward, hasNamespace, heritage, info, instances, instargs, instbody, instcommands, instdefault, instfilter, instfilterguard, instforward, instinvar, instmixin, instmixinguard, instnonposargs, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, nonposargs, parameter, parent, post, pre, precedence, procs, slotobjects, slots, subclass, superclass, vars-class} info-::aClass {::xotcl::Class-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-recreate aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::xotcl::Class-::xotcl::classInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, classchildren, classparent, commands, default, filter, filterguard, forward, hasNamespace, heritage, info, instances, instargs, instbody, instcommands, instdefault, instfilter, instfilterguard, instforward, instinvar, instmixin, instmixinguard, instnonposargs, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, nonposargs, parameter, parent, post, pre, precedence, procs, slotobjects, slots, subclass, superclass, vars-class} info-::aClass {::xotcl::Class-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-create aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::ObjectsClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::anObject-infoTraceFilter-::xotcl::Object ::ObjectsClass-aProc run-::filterInfo {-::xotcl::Object instfilter infoTraceFilter}}" \ + "{::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-cleanup aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-setvalues aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-configure aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-init aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::xotcl::Class-::xotcl::classInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, classchildren, classparent, commands, default, filter, filterguard, forward, hasNamespace, heritage, info, instances, instargs, instbody, instcommands, instdefault, instfilter, instfilterguard, instforward, instinvar, instmixin, instmixinguard, instmixinof, instnonposargs, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, mixinof, nonposargs, parameter, parent, post, pre, precedence, procs, slotobjects, slots, subclass, superclass, vars-class} info-::aClass {::xotcl::Class-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-recreate aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::xotcl::Class-::xotcl::classInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, classchildren, classparent, commands, default, filter, filterguard, forward, hasNamespace, heritage, info, instances, instargs, instbody, instcommands, instdefault, instfilter, instfilterguard, instforward, instinvar, instmixin, instmixinguard, instmixinof, instnonposargs, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, mixinof, nonposargs, parameter, parent, post, pre, precedence, procs, slotobjects, slots, subclass, superclass, vars-class} info-::aClass {::xotcl::Class-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-create aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::ObjectsClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::anObject-infoTraceFilter-::xotcl::Object ::ObjectsClass-aProc run-::filterInfo {-::xotcl::Object instfilter infoTraceFilter}}" \ "FilterInfo InfoTrace: Filter information wrong (b)" } else { ::errorCheck $InfoTraceResult \ - "{::xotcl::Class-::xotcl::classInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, classchildren, classparent, commands, default, filter, filterguard, forward, hasNamespace, heritage, info, instances, instargs, instbody, instcommands, instdefault, instfilter, instfilterguard, instforward, instinvar, instmixin, instmixinguard, instnonposargs, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, nonposargs, parameter, parent, post, pre, precedence, procs, slotobjects, slots, subclass, superclass, vars-class} info-::aClass {::xotcl::Class-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-alloc aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-setvalues aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-configure aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-init aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::xotcl::Class-::xotcl::classInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, classchildren, classparent, commands, default, filter, filterguard, forward, hasNamespace, heritage, info, instances, instargs, instbody, instcommands, instdefault, instfilter, instfilterguard, instforward, instinvar, instmixin, instmixinguard, instnonposargs, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, nonposargs, parameter, parent, post, pre, precedence, procs, slotobjects, slots, subclass, superclass, vars-class} info-::aClass {::xotcl::Class-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-create aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::ObjectsClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::anObject-infoTraceFilter-::xotcl::Object ::ObjectsClass-aProc run-::filterInfo {-::xotcl::Object instfilter infoTraceFilter}}" \ + "{::xotcl::Class-::xotcl::classInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, classchildren, classparent, commands, default, filter, filterguard, forward, hasNamespace, heritage, info, instances, instargs, instbody, instcommands, instdefault, instfilter, instfilterguard, instforward, instinvar, instmixin, instmixinguard, instmixinof, instnonposargs, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, mixinof, nonposargs, parameter, parent, post, pre, precedence, procs, slotobjects, slots, subclass, superclass, vars-class} info-::aClass {::xotcl::Class-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-alloc aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-setvalues aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-configure aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::aClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anotherObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-init aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::xotcl::Class-::xotcl::classInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, classchildren, classparent, commands, default, filter, filterguard, forward, hasNamespace, heritage, info, instances, instargs, instbody, instcommands, instdefault, instfilter, instfilterguard, instforward, instinvar, instmixin, instmixinguard, instmixinof, instnonposargs, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, mixinof, nonposargs, parameter, parent, post, pre, precedence, procs, slotobjects, slots, subclass, superclass, vars-class} info-::aClass {::xotcl::Class-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-create aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::ObjectsClass-::xotcl::objectInfo-infoTraceFilter-::xotcl::Object {valid options are: args, body, check, children, class, commands, default, filter, filterguard, forward, hasNamespace, info, invar, is, methods, mixin, mixinguard, nonposargs, parent, post, pre, precedence, procs, slotobjects, vars-class} info-::anObject {::xotcl::Object-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::anObject-infoTraceFilter-::xotcl::Object ::ObjectsClass-aProc run-::filterInfo {-::xotcl::Object instfilter infoTraceFilter}}" \ "FilterInfo InfoTrace: Filter information wrong" } } @@ -2879,9 +2879,9 @@ ::errorCheck [o2 info mixin] ::C "up/down before 5" ::errorCheck [B info mixinof] ::o1 "up/down before 6" ::errorCheck [C info mixinof] ::o2 "up/down before 7" - ::errorCheck [c1 info precedence] "::C ::B ::xotcl::Object" "up/down before 8" - ::errorCheck [o1 info precedence] "::B ::xotcl::Object" "up/down before 9" - ::errorCheck [o2 info precedence] "::C ::B ::xotcl::Object" "up/down before 10" + ::errorCheck [c1 info precedence] "::C ::B ::xotcl::Object ::oo::object" "up/down before 8" + ::errorCheck [o1 info precedence] "::B ::xotcl::Object ::oo::object" "up/down before 9" + ::errorCheck [o2 info precedence] "::C ::B ::xotcl::Object ::oo::object" "up/down before 10" ::errorCheck [catch {B class Object}] 1 "don't allow downgrading" @@ -2894,9 +2894,9 @@ ::errorCheck [o2 info mixin] ::C "up/down after 5" ::errorCheck [catch {B info mixinof}] 1 "up/down after 6" ::errorCheck [C info mixinof] ::o2 "up/down after 7" - ::errorCheck [c1 info precedence] "::C ::xotcl::Object" "up/down after 8" - ::errorCheck [o1 info precedence] "::xotcl::Object" "up/down after 9" - ::errorCheck [o2 info precedence] "::C ::xotcl::Object" "up/down after 10" + ::errorCheck [c1 info precedence] "::C ::xotcl::Object ::oo::object" "up/down after 8" + ::errorCheck [o1 info precedence] "::xotcl::Object ::oo::object" "up/down after 9" + ::errorCheck [o2 info precedence] "::C ::xotcl::Object ::oo::object" "up/down after 10" ::errorCheck [B info class] "::xotcl::Object" "up/down after 0x" B class Object @@ -2996,11 +2996,11 @@ ::errorCheck [b info procs] objproc "info procs" ::errorCheck [B info instprocs] myProc2 "info instprocs" - ::errorCheck [lsort [b info methods]] "__next abstract append array autoname check class cleanup configure contains copy defaultmethod destroy eval exists extractConfigureArg f filter filterguard filtersearch forward hasclass incr info infoTraceFilter init instvar invar isclass ismetaclass ismixin isobject istype lappend method mixin mixinguard move myProc myProc2 myProcMix1 myProcMix2 noinit objproc parametercmd proc procsearch requireNamespace self set setFilter signature subst trace unset uplevel upvar volatile vwait" "b info methods" + ::errorCheck [lsort [b info methods]] "__next abstract append array autoname check class cleanup configure contains copy defaultmethod destroy eval exists extractConfigureArg f filter filterguard filtersearch forward hasclass incr info infoTraceFilter init instvar invar isclass ismetaclass ismixin isobject istype lappend method mixin mixinguard move myProc myProc2 myProcMix1 myProcMix2 noinit objproc parametercmd proc procsearch requireNamespace self set setFilter setvalues signature subst trace unset uplevel upvar volatile vwait" "b info methods" ::errorCheck [lsort [b info methods -nocmds]] "abstract contains copy defaultmethod extractConfigureArg f hasclass infoTraceFilter init method move myProc myProc2 myProcMix1 myProcMix2 objproc self setFilter signature" "b info methods -nocmds" - ::errorCheck [lsort [b info methods -noprocs]] "__next append array autoname check class cleanup configure destroy eval exists filter filterguard filtersearch forward incr info instvar invar isclass ismetaclass ismixin isobject istype lappend mixin mixinguard noinit parametercmd proc procsearch requireNamespace set subst trace unset uplevel upvar volatile vwait" "b info methods -noprocs" + ::errorCheck [lsort [b info methods -noprocs]] "__next append array autoname check class cleanup configure destroy eval exists filter filterguard filtersearch forward incr info instvar invar isclass ismetaclass ismixin isobject istype lappend mixin mixinguard noinit parametercmd proc procsearch requireNamespace set setvalues subst trace unset uplevel upvar volatile vwait" "b info methods -noprocs" ::errorCheck [lsort [b info methods -nocmds -nomixins]] "abstract contains copy defaultmethod extractConfigureArg f hasclass infoTraceFilter init method move myProc myProc2 objproc self setFilter signature" "b info methods -nocmds -nomixins" ::errorCheck [b info methods -nocmds -noprocs] "" "b info methods -nocmds -noprocs" @@ -3230,7 +3230,7 @@ ::errorCheck [o mixin XY4] ::XY4 " __unknown XY4" } - ::errorCheck [UnknownClass info info] {valid options are: args, body, check, children, class, classchildren, classparent, commands, default, filter, filterguard, forward, hasNamespace, heritage, info, instances, instargs, instbody, instcommands, instdefault, instfilter, instfilterguard, instforward, instinvar, instmixin, instmixinguard, instnonposargs, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, nonposargs, parameter, parent, post, pre, precedence, procs, slotobjects, slots, subclass, superclass, vars} "info info" + ::errorCheck [UnknownClass info info] {valid options are: args, body, check, children, class, classchildren, classparent, commands, default, filter, filterguard, forward, hasNamespace, heritage, info, instances, instargs, instbody, instcommands, instdefault, instfilter, instfilterguard, instforward, instinvar, instmixin, instmixinguard, instmixinof, instnonposargs, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, mixinof, nonposargs, parameter, parent, post, pre, precedence, procs, slotobjects, slots, subclass, superclass, vars} "info info" # clear unknown handler to avoid strange results later Class proc __unknown "" ""