Index: ChangeLog =================================================================== diff -u -ra2fef74178bcdc1142c4ef01a67c1bbc137f36ab -r43e8ea0de59e32655b41cbd6c8a47acf8ada443a --- ChangeLog (.../ChangeLog) (revision a2fef74178bcdc1142c4ef01a67c1bbc137f36ab) +++ ChangeLog (.../ChangeLog) (revision 43e8ea0de59e32655b41cbd6c8a47acf8ada443a) @@ -16,10 +16,35 @@ # new (must be documented): check, hasNamespace, instargs, instmixinguard, instnonposargs, is, mixinguard, nonposargs, slotobjects, slots - # lost (need to be implemented as separate methods) - mixinof, instmixinof + To evaluate: + - change various commands like + info procs + info commands + info forward + info paramtercmd + or + info instprocs + info instcommands + info instforward + info instparamtercmd + into + info objectmethod ?-commands? ?-forward? ?-parameter? + info method ?-commands? ?-forward? ?-parameter? + old names could be made deprecated + .... also a flag (-perclass or -perobject is possible) + .... maybe turn "instproc" into "method" and "proc" into "objectmethod" + .... maybe end of the "inst" days? +Slot initCmd + - the current (1.6.3) implementation turns initcmd into a trace to be + executed the first time, the slot is read. The conversion to trace + happes in predefined.xotcl. Alternatively, we could execute the + slot directly to have some alternative to defaults, where e.g + commands can be executed at creation time. The current solution for + parseing, whether the default contains [] or $ is rather ugly. + - the old semantic of __initcmd is gone. + incompatible change: ====== Class O -parameter { Index: Makefile.in =================================================================== diff -u -r55263740a08228f32691565d74188bd6bc79c153 -r43e8ea0de59e32655b41cbd6c8a47acf8ada443a --- Makefile.in (.../Makefile.in) (revision 55263740a08228f32691565d74188bd6bc79c153) +++ Makefile.in (.../Makefile.in) (revision 43e8ea0de59e32655b41cbd6c8a47acf8ada443a) @@ -352,12 +352,12 @@ -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/forwardtest.xotcl \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) - $(TCLSH) $(src_test_dir_native)/slottest.xotcl \ - -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/mixinoftest.xotcl \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/varresolutiontest.xotcl \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) + $(TCLSH) $(src_test_dir_native)/slottest.xotcl \ + -libdir $(PLATFORM_DIR) $(TESTFLAGS) test-http: $(TCLSH_PROG) Index: generic/xotcl.c =================================================================== diff -u -r98003953e8c728b105528e0c2ed7d67ee7135d64 -r43e8ea0de59e32655b41cbd6c8a47acf8ada443a --- generic/xotcl.c (.../xotcl.c) (revision 98003953e8c728b105528e0c2ed7d67ee7135d64) +++ generic/xotcl.c (.../xotcl.c) (revision 43e8ea0de59e32655b41cbd6c8a47acf8ada443a) @@ -3537,8 +3537,8 @@ int rc = 0, new = 0; XOTclClasses *sc; - /*fprintf(stderr, "startCl = %s, opt %p, isMixin %d\n", - ObjStr(startCl->object.cmdName),startCl->opt, isMixin);*/ + /*fprintf(stderr, "startCl = %s, opt %p, isMixin %d, pattern '%s', matchObject %p\n", + className(startCl),startCl->opt, isMixin, pattern, matchObject);*/ /* * check all subclasses of startCl for mixins @@ -3559,11 +3559,11 @@ cl = XOTclGetClassFromCmdPtr(m->cmdPtr); assert(cl); - /* fprintf(stderr, "check %s mixinof %s\n", - className(cl),ObjStr(startCl->object.cmdName));*/ + /*fprintf(stderr, "check %s mixinof %s\n", + className(cl),ObjStr(startCl->object.cmdName));*/ rc = getAllObjectMixinsOf(interp, destTable, cl, isMixin, appendResult, pattern, matchObject); - /*fprintf(stderr, "check %s mixinof %s done\n", - className(cl),ObjStr(startCl->object.cmdName));*/ + /* fprintf(stderr, "check %s mixinof %s done\n", + className(cl),ObjStr(startCl->object.cmdName));*/ if (rc) {return rc;} } } @@ -9057,6 +9057,21 @@ } static int +XOTclObjInfoParametercmdMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + XOTclObject *obj; + if (objc < 2 || objc > 3) return XOTclObjErrArgCnt(interp, objv[0], NULL, " ?pattern?"); + if (XOTclObjConvertObject(interp, objv[1], &obj) != TCL_OK) + return XOTclObjErrType(interp, objv[1], "Object"); + + if (obj->nsPtr) { + return ListMethodKeys(interp, Tcl_Namespace_cmdTable(obj->nsPtr), objc == 3 ? ObjStr(objv[2]) : NULL, 1, 0, 0, 0, 1); + } else { + return TCL_OK; + } +} + + +static int XOTclObjInfoSlotObjectsMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj; @@ -9414,6 +9429,7 @@ if (to[0] == '-') { found = 0; for (j=0; options[j]; j++) { + /*fprintf(stderr, "getMod '%s' '%s' => %d\n",to, options[j],strcmp(to,options[j]));*/ if (strcmp(to,options[j]) == 0) { count++; *set |= 1 << j; @@ -12398,45 +12414,47 @@ XOTclClassInfoInstmixinMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl; XOTclClassOpt *opt; - int idx, nobjc, withGuards = 0, rc; - static CONST char *options[] = {"-guards", NULL}; - enum options {guardsIdx}; + int withGuards, withClosure, rc, set, args, modifiers; + static CONST char *options[] = {"-closure", "-guards", NULL}; + enum options {closureIdx, guardsIdx}; char *pattern; XOTclObject *matchObject; Tcl_DString ds, *dsPtr = &ds; + modifiers = getModifiers(objc, 2, objv, options, &set); + args = objc-modifiers; + if (GetXOTclClassFromObj(interp, objv[1], &cl, 0) != TCL_OK) return XOTclObjErrType(interp, objv[1], "Class"); + + if (args < 2 || args > 3) + return XOTclObjErrArgCnt(interp, objv[0], NULL, " ?-closure? ?-guards? ?pattern?"); - for (idx = 2; idx < objc; idx++) { - char *name; - int index; + pattern = args == 3 ? ObjStr(objv[objc-1]) : NULL; + withGuards = set & 1 << guardsIdx; + withClosure = set & 1 << closureIdx; - name = Tcl_GetString(objv[idx]); - if (name[0] != '-') { - break; - } - if (Tcl_GetIndexFromObj(interp, objv[idx], options, "switch", TCL_EXACT, &index) != TCL_OK) { - return TCL_ERROR; - } - switch ((enum options) index) { - case guardsIdx: withGuards = 1; break; - } - } - nobjc = objc-idx; - - if (objc < 2 || nobjc > 1 || objc > 4) - return XOTclObjErrArgCnt(interp, objv[0], NULL, " ?-guards? ?pattern?"); - + /*fprintf(stderr, "XOTclClassInfoInstmixinMethod guard %d clo %d set %.4x pattern '%s'\n",withGuards,withClosure,set,pattern);*/ + opt = cl->opt; - pattern = idx < objc ? ObjStr(objv[idx]) : NULL; DSTRING_INIT(dsPtr); if (getMatchObject(interp, &pattern, &matchObject, dsPtr) == -1) { return TCL_OK; } - rc = opt ? MixinInfo(interp, opt->instmixins, pattern, withGuards, matchObject) : TCL_OK; + if (withClosure) { + Tcl_HashTable objTable, *commandTable = &objTable; + MEM_COUNT_ALLOC("Tcl_InitHashTable", commandTable); + Tcl_InitHashTable(commandTable, TCL_ONE_WORD_KEYS); + rc = getAllClassMixins(interp, commandTable, cl, withGuards, pattern, matchObject); + if (matchObject && rc && !withGuards) { + Tcl_SetObjResult(interp, rc ? matchObject->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); + } + MEM_COUNT_FREE("Tcl_InitHashTable", commandTable); + } else { + rc = opt ? MixinInfo(interp, opt->instmixins, pattern, withGuards, matchObject) : TCL_OK; + } DSTRING_FREE(dsPtr); - return rc; + return TCL_OK; } static int @@ -12464,32 +12482,38 @@ modifiers = getModifiers(objc, 2, objv, options, &set); args = objc-modifiers; - if (args < 2 || args > 3) return XOTclObjErrArgCnt(interp, objv[0], NULL, " ?-closure? ?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"); - pattern = args == 3 ? ObjStr(objv[objc-modifiers-1]) : NULL; + pattern = args == 3 ? ObjStr(objv[objc-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; - } + DSTRING_INIT(dsPtr); + if (getMatchObject(interp, &pattern, &matchObject, dsPtr) == -1) { + return TCL_OK; + } + if (cl->opt && !withClosure) { 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); } + + if (matchObject) { + Tcl_SetObjResult(interp, rc ? matchObject->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); + } + + DSTRING_FREE(dsPtr); return TCL_OK; } @@ -12568,6 +12592,18 @@ } static int +XOTclClassInfoInstparametercmdMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + XOTclClass *cl; + + if (objc < 2 || objc > 3) return XOTclObjErrArgCnt(interp, objv[0], NULL, " ?pattern?"); + if (GetXOTclClassFromObj(interp, objv[1], &cl, 0) != TCL_OK) + return XOTclObjErrType(interp, objv[1], "Class"); + + return ListMethodKeys(interp, Tcl_Namespace_cmdTable(cl->nsPtr), objc == 3 ? ObjStr(objv[2]) : NULL, 1, 0, 0, 0, 1); +} + + +static int XOTclClassInfoInstpreMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl; XOTclClassOpt *opt; @@ -15081,6 +15117,7 @@ {"methods", XOTclObjInfoMethodsMethod}, {"nonposargs", XOTclObjInfoNonposargsMethod}, {"parent", XOTclObjInfoParentMethod}, + {"parametercmd", XOTclObjInfoParametercmdMethod}, {"post", XOTclObjInfoPostMethod}, {"pre", XOTclObjInfoPreMethod}, {"procs", XOTclObjInfoProcsMethod}, @@ -15104,6 +15141,7 @@ {"instmixinof", XOTclClassInfoInstmixinofMethod}, {"instprocs", XOTclClassInfoInstprocsMethod}, {"instnonposargs", XOTclClassInfoInstnonposargsMethod}, + {"instparametercmd",XOTclClassInfoInstparametercmdMethod}, {"instpre", XOTclClassInfoInstpreMethod}, {"instpost", XOTclClassInfoInstpostMethod}, {"mixinof", XOTclClassInfoMixinofMethod}, Index: tests/mixinoftest.xotcl =================================================================== diff -u -r2111020b49da8ce57758e51accf0b6073037f0d2 -r43e8ea0de59e32655b41cbd6c8a47acf8ada443a --- tests/mixinoftest.xotcl (.../mixinoftest.xotcl) (revision 2111020b49da8ce57758e51accf0b6073037f0d2) +++ tests/mixinoftest.xotcl (.../mixinoftest.xotcl) (revision 43e8ea0de59e32655b41cbd6c8a47acf8ada443a) @@ -56,17 +56,17 @@ Object o -mixin M ? {o info mixin} ::M -? {o info precedence} "::M ::xotcl::Object" +? {o info precedence} "::M ::xotcl::Object ::oo::object" ? {o procsearch foo} "::M instproc foo" Class M -instproc foo args next ? {o info mixin} ::M -? {o info precedence} "::M ::xotcl::Object" +? {o info precedence} "::M ::xotcl::Object ::oo::object" ? {o procsearch foo} "::M instproc foo" M destroy ? {o info mixin} "" -? {o info precedence} "::xotcl::Object" +? {o info precedence} "::xotcl::Object ::oo::object" ? {o procsearch foo} "" o destroy @@ -83,11 +83,11 @@ ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B -? {c1 info precedence} "::A ::C ::B ::xotcl::Object" +? {c1 info precedence} "::A ::C ::B ::xotcl::Object ::oo::object" B destroy ? {A info instmixinof} "" -? {c1 info precedence} "::C ::xotcl::Object" +? {c1 info precedence} "::C ::xotcl::Object ::oo::object" A destroy C destroy @@ -135,9 +135,9 @@ ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B -? {a1 info precedence} "::M ::A ::xotcl::Object" -? {b1 info precedence} "::M ::A ::B ::xotcl::Object" -? {c1 info precedence} "::M ::A ::C ::B ::xotcl::Object" +? {a1 info precedence} "::M ::A ::xotcl::Object ::oo::object" +? {b1 info precedence} "::M ::A ::B ::xotcl::Object ::oo::object" +? {c1 info precedence} "::M ::A ::C ::B ::xotcl::Object ::oo::object" ? {M info instmixinof} "::A" # since M is an instmixin of A and A is a instmixin of B, @@ -150,13 +150,13 @@ # and now destroy mixin classes M destroy -? {a1 info precedence} "::A ::xotcl::Object" -? {b1 info precedence} "::A ::B ::xotcl::Object" -? {c1 info precedence} "::A ::C ::B ::xotcl::Object" +? {a1 info precedence} "::A ::xotcl::Object ::oo::object" +? {b1 info precedence} "::A ::B ::xotcl::Object ::oo::object" +? {c1 info precedence} "::A ::C ::B ::xotcl::Object ::oo::object" B destroy ? {A info instmixinof} "" -? {c1 info precedence} "::C ::xotcl::Object" +? {c1 info precedence} "::C ::xotcl::Object ::oo::object" foreach o {A C a1 b1 c1} { $o destroy } @@ -183,9 +183,9 @@ ? {A info instmixinof -closure} "" ? {B info instmixinof -closure} "" ? {X info instmixinof -closure} "::D ::C ::A ::B" -? {b1 info precedence} "::C ::X ::D ::B ::A ::xotcl::Object" +? {b1 info precedence} "::C ::X ::D ::B ::A ::xotcl::Object ::oo::object" B b2 -? {b2 info precedence} "::C ::X ::D ::B ::A ::xotcl::Object" +? {b2 info precedence} "::C ::X ::D ::B ::A ::xotcl::Object ::oo::object" foreach o {X D C A B b1 b2} {$o destroy} @@ -230,23 +230,23 @@ ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B -? {a1 info precedence} "::M ::A ::xotcl::Object" -? {b1 info precedence} "::M ::A ::B ::xotcl::Object" -? {c1 info precedence} "::M ::A ::C ::B ::xotcl::Object" +? {a1 info precedence} "::M ::A ::xotcl::Object ::oo::object" +? {b1 info precedence} "::M ::A ::B ::xotcl::Object ::oo::object" +? {c1 info precedence} "::M ::A ::C ::B ::xotcl::Object ::oo::object" # and now destroy A A destroy -? {a1 info precedence} "::xotcl::Object" -? {b1 info precedence} "::B ::xotcl::Object" -? {c1 info precedence} "::C ::B ::xotcl::Object" +? {a1 info precedence} "::xotcl::Object ::oo::object" +? {b1 info precedence} "::B ::xotcl::Object ::oo::object" +? {c1 info precedence} "::C ::B ::xotcl::Object ::oo::object" ? {M info instmixinof} "" ? {M info instmixinof -closure} "" B destroy ? {M info instmixinof} "" -? {c1 info precedence} "::C ::xotcl::Object" +? {c1 info precedence} "::C ::xotcl::Object ::oo::object" foreach o {M C a1 b1 c1} { $o destroy } @@ -265,14 +265,14 @@ ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B -? {a1 info precedence} "::M ::A ::xotcl::Object" -? {b1 info precedence} "::M ::A ::B ::xotcl::Object" -? {c1 info precedence} "::M ::A ::C ::B ::xotcl::Object" +? {a1 info precedence} "::M ::A ::xotcl::Object ::oo::object" +? {b1 info precedence} "::M ::A ::B ::xotcl::Object ::oo::object" +? {c1 info precedence} "::M ::A ::C ::B ::xotcl::Object ::oo::object" B destroy -? {a1 info precedence} "::M ::A ::xotcl::Object" -? {b1 info precedence} "::xotcl::Object" -? {c1 info precedence} "::C ::xotcl::Object" +? {a1 info precedence} "::M ::A ::xotcl::Object ::oo::object" +? {b1 info precedence} "::xotcl::Object ::oo::object" +? {c1 info precedence} "::C ::xotcl::Object ::oo::object" ? {M info instmixinof} "::A" ? {M info instmixinof -closure} "::A" @@ -294,22 +294,22 @@ ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B -? {c1 info precedence} "::A ::C ::B ::xotcl::Object" -? {B info heritage} "::xotcl::Object" -? {C info heritage} "::B ::xotcl::Object" +? {c1 info precedence} "::A ::C ::B ::xotcl::Object ::oo::object" +? {B info heritage} "::xotcl::Object ::oo::object" +? {C info heritage} "::B ::xotcl::Object ::oo::object" Class B -instmixin A -? {B info heritage} "::xotcl::Object" -? {C info heritage} "::xotcl::Object" +? {B info heritage} "::xotcl::Object ::oo::object" +? {C info heritage} "::xotcl::Object ::oo::object" ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B -? {c1 info precedence} "::C ::xotcl::Object" +? {c1 info precedence} "::C ::xotcl::Object ::oo::object" B destroy ? {A info instmixinof} "" -? {c1 info precedence} "::C ::xotcl::Object" +? {c1 info precedence} "::C ::xotcl::Object ::oo::object" A destroy C destroy @@ -330,20 +330,20 @@ ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B -? {c1 info precedence} "::A ::C ::B ::xotcl::Object" -? {C info heritage} "::B ::xotcl::Object" -? {B info heritage} "::xotcl::Object" +? {c1 info precedence} "::A ::C ::B ::xotcl::Object ::oo::object" +? {C info heritage} "::B ::xotcl::Object ::oo::object" +? {B info heritage} "::xotcl::Object ::oo::object" Class B -instmixin A -? {C info heritage} "::B ::xotcl::Object" -? {B info heritage} "::xotcl::Object" +? {C info heritage} "::B ::xotcl::Object ::oo::object" +? {B info heritage} "::xotcl::Object ::oo::object" ? {B info instmixin} ::A ? {A info instmixinof} ::B -? {c1 info precedence} "::A ::C ::B ::xotcl::Object" +? {c1 info precedence} "::A ::C ::B ::xotcl::Object ::oo::object" B destroy ? {A info instmixinof} "" -? {c1 info precedence} "::C ::xotcl::Object" +? {c1 info precedence} "::C ::xotcl::Object ::oo::object" A destroy C destroy @@ -363,23 +363,23 @@ A a1 O o1 ? {A info superclass} "::O" -? {B info heritage} "::A ::O ::xotcl::Object" +? {B info heritage} "::A ::O ::xotcl::Object ::oo::object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" -? {o1 info precedence} "::O ::xotcl::Object" -? {a1 info precedence} "::A ::O ::xotcl::Object" -? {b1 info precedence} "::B ::A ::O ::xotcl::Object" +? {o1 info precedence} "::O ::xotcl::Object ::oo::object" +? {a1 info precedence} "::A ::O ::xotcl::Object ::oo::object" +? {b1 info precedence} "::B ::A ::O ::xotcl::Object ::oo::object" # we recreate the class new, with the same superclass Class A -superclass O ? {A info superclass} "::O" -? {B info heritage} "::xotcl::Object" +? {B info heritage} "::xotcl::Object ::oo::object" ? {list [A info subclass] [B info subclass] [O info subclass]} "{} {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::xotcl::Object ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::xotcl::Object ::B ::O" -? {o1 info precedence} "::O ::xotcl::Object" -? {a1 info precedence} "::xotcl::Object" -? {b1 info precedence} "::B ::xotcl::Object" +? {o1 info precedence} "::O ::xotcl::Object ::oo::object" +? {a1 info precedence} "::xotcl::Object ::oo::object" +? {b1 info precedence} "::B ::xotcl::Object ::oo::object" foreach o {A O B a1 b1 o1} {$o destroy} ########################################### @@ -395,23 +395,23 @@ A a1 O o1 ? {A info superclass} "::O" -? {B info heritage} "::A ::O ::xotcl::Object" +? {B info heritage} "::A ::O ::xotcl::Object ::oo::object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" -? {o1 info precedence} "::O ::xotcl::Object" -? {a1 info precedence} "::A ::O ::xotcl::Object" -? {b1 info precedence} "::B ::A ::O ::xotcl::Object" +? {o1 info precedence} "::O ::xotcl::Object ::oo::object" +? {a1 info precedence} "::A ::O ::xotcl::Object ::oo::object" +? {b1 info precedence} "::B ::A ::O ::xotcl::Object ::oo::object" # we recreate the class new, with a different superclass Class A ? {A info superclass} "::xotcl::Object" -? {B info heritage} "::xotcl::Object" +? {B info heritage} "::xotcl::Object ::oo::object" ? {list [A info subclass] [B info subclass] [O info subclass]} "{} {} {}" ? {list [A info superclass] [B info superclass] [O info superclass]} "::xotcl::Object ::xotcl::Object ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::xotcl::Object ::B ::O" -? {o1 info precedence} "::O ::xotcl::Object" -? {a1 info precedence} "::xotcl::Object" -? {b1 info precedence} "::B ::xotcl::Object" +? {o1 info precedence} "::O ::xotcl::Object ::oo::object" +? {a1 info precedence} "::xotcl::Object ::oo::object" +? {b1 info precedence} "::B ::xotcl::Object ::oo::object" foreach o {A O B a1 b1 o1} {$o destroy} @@ -428,23 +428,23 @@ A a1 O o1 ? {A info superclass} "::O" -? {B info heritage} "::A ::O ::xotcl::Object" +? {B info heritage} "::A ::O ::xotcl::Object ::oo::object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" -? {o1 info precedence} "::O ::xotcl::Object" -? {a1 info precedence} "::A ::O ::xotcl::Object" -? {b1 info precedence} "::B ::A ::O ::xotcl::Object" +? {o1 info precedence} "::O ::xotcl::Object ::oo::object" +? {a1 info precedence} "::A ::O ::xotcl::Object ::oo::object" +? {b1 info precedence} "::B ::A ::O ::xotcl::Object ::oo::object" # we recreate the class new, with the same superclass Class A -superclass O ? {A info superclass} "::O" -? {B info heritage} "::A ::O ::xotcl::Object" +? {B info heritage} "::A ::O ::xotcl::Object ::oo::object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" -? {o1 info precedence} "::O ::xotcl::Object" -? {a1 info precedence} "::A ::O ::xotcl::Object" -? {b1 info precedence} "::B ::A ::O ::xotcl::Object" +? {o1 info precedence} "::O ::xotcl::Object ::oo::object" +? {a1 info precedence} "::A ::O ::xotcl::Object ::oo::object" +? {b1 info precedence} "::B ::A ::O ::xotcl::Object ::oo::object" foreach o {A O B a1 b1 o1} {$o destroy} ########################################### @@ -459,29 +459,27 @@ B b1 A a1 O o1 -? {B info heritage} "::A ::O ::xotcl::Object" +? {B info heritage} "::A ::O ::xotcl::Object ::oo::object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" -? {o1 info precedence} "::O ::xotcl::Object" -? {a1 info precedence} "::A ::O ::xotcl::Object" -? {b1 info precedence} "::B ::A ::O ::xotcl::Object" +? {o1 info precedence} "::O ::xotcl::Object ::oo::object" +? {a1 info precedence} "::A ::O ::xotcl::Object ::oo::object" +? {b1 info precedence} "::B ::A ::O ::xotcl::Object ::oo::object" # we recreate the class new, with a different superclass Class A ? {A info superclass} "::xotcl::Object" -? {B info heritage} "::A ::xotcl::Object" -? {B info heritage} "::A ::xotcl::Object" +? {B info heritage} "::A ::xotcl::Object ::oo::object" +? {B info heritage} "::A ::xotcl::Object ::oo::object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} {}" ? {list [A info superclass] [B info superclass] [O info superclass]} "::xotcl::Object ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" -? {o1 info precedence} "::O ::xotcl::Object" -? {a1 info precedence} "::A ::xotcl::Object" -? {b1 info precedence} "::B ::A ::xotcl::Object" +? {o1 info precedence} "::O ::xotcl::Object ::oo::object" +? {a1 info precedence} "::A ::xotcl::Object ::oo::object" +? {b1 info precedence} "::B ::A ::xotcl::Object ::oo::object" foreach o {A O B a1 b1 o1} {$o destroy} - - #foreach o [::xotcl::test::Test info instances] {$o destroy} #::xotcl::test::Test destroy #puts [lsort [::xotcl::Object allinstances]] Index: tests/slottest.xotcl =================================================================== diff -u -rc72f9f638677608fab1502cd696c8f2d6b2952f9 -r43e8ea0de59e32655b41cbd6c8a47acf8ada443a --- tests/slottest.xotcl (.../slottest.xotcl) (revision c72f9f638677608fab1502cd696c8f2d6b2952f9) +++ tests/slottest.xotcl (.../slottest.xotcl) (revision 43e8ea0de59e32655b41cbd6c8a47acf8ada443a) @@ -1,4 +1,3 @@ -# $Id: slottest.xotcl,v 1.5 2007/08/14 16:38:27 neumann Exp $ package require XOTcl namespace import -force xotcl::* package require xotcl::test @@ -53,22 +52,33 @@ set ::hu 0 proc T1 {var sub op} {c1 set $var t1} proc T2 {var sub op} {c1 set $var t2} -Class C -array set __initcmds { - x {set x 1} - y {incr ::hu} - z {my trace add variable z read T1}} +#Class C -array set __initcmds { +# x {set x 1} +# y {incr ::hu} +# z {my trace add variable z read T1}} +Class C -slots { + Attribute x -initcmd {set x 1} + Attribute y -initcmd {incr ::hu} + Attribute z -initcmd {my trace add variable z read T1} +} C create c1 -? {c1 info vars x} x +? {c1 info vars x} "" +? {c1 x} "1" +? {c1 info vars x} "x" ? {c1 info vars y} "" +? {c1 y} 1 ? {c1 set x} 1 ? {set ::hu} 1 -Class D -array set __initcmds { - x {set x 2} - z {my trace add variable z read T2}} -superclass C +Class D -slots { + Attribute x -initcmd {set x 2} + Attribute z -initcmd {my trace add variable z read T2} +} -superclass C D create c1 ? {c1 set x} 2 -? {c1 set z} t2 +? {c1 z} "" +? {c1 z} t2 +? {c1 y} 2 ? {set ::hu} 2 ####################################################### @@ -261,7 +271,8 @@ # } -::xotcl::Slot instmixin delete ::xotcl::Slot::Optimizer +#::xotcl::Slot instmixin delete ::xotcl::Slot::Optimizer +::xotcl::Attribute instmixin delete ::xotcl::Slot::Optimizer Class C1 -parameter {a {b 10} {c "Hello World"}} C1 c1 -a 1 Index: tests/testx.xotcl =================================================================== diff -u -r98003953e8c728b105528e0c2ed7d67ee7135d64 -r43e8ea0de59e32655b41cbd6c8a47acf8ada443a --- tests/testx.xotcl (.../testx.xotcl) (revision 98003953e8c728b105528e0c2ed7d67ee7135d64) +++ tests/testx.xotcl (.../testx.xotcl) (revision 43e8ea0de59e32655b41cbd6c8a47acf8ada443a) @@ -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, 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}}" \ + "{::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, parametercmd, 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, parametercmd, 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, parametercmd, 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, parametercmd, 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, instparametercmd, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, mixinof, nonposargs, parameter, parametercmd, 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, instparametercmd, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, mixinof, nonposargs, parameter, parametercmd, 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, parametercmd, 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, 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}}" \ + "{::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, instparametercmd, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, mixinof, nonposargs, parameter, parametercmd, 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, parametercmd, 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, parametercmd, 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, parametercmd, 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, instparametercmd, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, mixinof, nonposargs, parameter, parametercmd, 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, parametercmd, 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" } } @@ -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, 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" + ::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, instparametercmd, instpost, instpre, instprocs, invar, is, methods, mixin, mixinguard, mixinof, nonposargs, parameter, parametercmd, parent, post, pre, precedence, procs, slotobjects, slots, subclass, superclass, vars} "info info" # clear unknown handler to avoid strange results later Class proc __unknown "" ""