Index: ChangeLog =================================================================== diff -u -rc1c92aa376ad06be608cfdf852d9e531449bc753 -rba364529cbe05cbf9acf64aa728bf7316c8b4af7 --- ChangeLog (.../ChangeLog) (revision c1c92aa376ad06be608cfdf852d9e531449bc753) +++ ChangeLog (.../ChangeLog) (revision ba364529cbe05cbf9acf64aa728bf7316c8b4af7) @@ -1,3 +1,7 @@ +2007-10-29: + * return mixins before procs in procsearch + * added regression test + 2007-10-28: * some code refactoring * making new code more robust Index: generic/xotcl.c =================================================================== diff -u -rcb4fe6a2164a97304c4c3d0c9d12b1f7b3f9538f -rba364529cbe05cbf9acf64aa728bf7316c8b4af7 --- generic/xotcl.c (.../xotcl.c) (revision cb4fe6a2164a97304c4c3d0c9d12b1f7b3f9538f) +++ generic/xotcl.c (.../xotcl.c) (revision ba364529cbe05cbf9acf64aa728bf7316c8b4af7) @@ -9795,7 +9795,7 @@ XOTclOProcSearchMethod(ClientData cd, Tcl_Interp *in, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; XOTclClass *pcl = NULL; - Tcl_Command cmd = 0; + Tcl_Command cmd = NULL; char *simpleName, *methodName; if (!obj) return XOTclObjErrType(in, objv[0], "Object"); @@ -9805,25 +9805,24 @@ methodName = ObjStr(objv[1]); - if (obj->nsPtr) - cmd = FindMethod(methodName, obj->nsPtr); + if (!(obj->flags & XOTCL_MIXIN_ORDER_VALID)) + MixinComputeDefined(in, obj); - if (!cmd) { - if (!(obj->flags & XOTCL_MIXIN_ORDER_VALID)) - MixinComputeDefined(in, obj); - - if (obj->flags & XOTCL_MIXIN_ORDER_DEFINED_AND_VALID) { - XOTclCmdList* mixinList = obj->mixinOrder; - while (mixinList) { - XOTclClass *mcl = XOTclpGetClass(in, (char *)Tcl_GetCommandName(in, mixinList->cmdPtr)); - if (mcl && (pcl = SearchCMethod(mcl, methodName, &cmd))) { - break; - } - mixinList = mixinList->next; + if (obj->flags & XOTCL_MIXIN_ORDER_DEFINED_AND_VALID) { + XOTclCmdList* mixinList = obj->mixinOrder; + while (mixinList) { + XOTclClass *mcl = XOTclpGetClass(in, (char *)Tcl_GetCommandName(in, mixinList->cmdPtr)); + if (mcl && (pcl = SearchCMethod(mcl, methodName, &cmd))) { + break; } + mixinList = mixinList->next; } } + if (!cmd && obj->nsPtr) { + cmd = FindMethod(methodName, obj->nsPtr); + } + if (!cmd && obj->cl) pcl = SearchCMethod(obj->cl, methodName, &cmd); Index: tests/testx.xotcl =================================================================== diff -u -rad43de1007d040a9860eac2445a8c7781dcb4d06 -rba364529cbe05cbf9acf64aa728bf7316c8b4af7 --- tests/testx.xotcl (.../testx.xotcl) (revision ad43de1007d040a9860eac2445a8c7781dcb4d06) +++ tests/testx.xotcl (.../testx.xotcl) (revision ba364529cbe05cbf9acf64aa728bf7316c8b4af7) @@ -2050,7 +2050,27 @@ o destroy } +@ TestX procsearchTest { + description { + Regression test for procsearch + } +} +TestX procsearchTest -proc run {{n 10}} { + Class M -instproc foo args {puts m;next} + Object o -mixin M -proc foo args {puts o;next} + ::errorCheck [o procsearch foo] "::M instproc foo" "mixin before proc in procsearch" + M destroy + o destroy + + Class CC -instproc foo args {puts CC;next} + CC create c -proc foo args {puts c;next} + ::errorCheck [c procsearch foo] "::c proc foo" "proc before instproc in procsearch" + CC destroy + c destroy +} + + @ TestX mixinInheritanceTest { description { Regression test object testing per-object mixin inheritance.