Index: generic/xotcl.c =================================================================== diff -u -r84af56591a1cc4ac7a3779ec44f6978203ef016a -ra588ad9e5d66f12c4b2a5baf9153b652932a5912 --- generic/xotcl.c (.../xotcl.c) (revision 84af56591a1cc4ac7a3779ec44f6978203ef016a) +++ generic/xotcl.c (.../xotcl.c) (revision a588ad9e5d66f12c4b2a5baf9153b652932a5912) @@ -1048,6 +1048,10 @@ for (mixinList = object->mixinOrder; mixinList; mixinList = mixinList->nextPtr) { XOTclClass *mixin = XOTclGetClassFromCmdPtr(mixinList->cmdPtr); if (mixin && (*pcl = SearchCMethod(mixin, name, &cmd))) { + if (Tcl_Command_flags(cmd) & XOTCL_CMD_CLASS_ONLY_METHOD && !XOTclObjectIsClass(object)) { + cmd = NULL; + continue; + } break; } } @@ -4030,7 +4034,7 @@ continue; } - if (Tcl_Command_flags(cmd) & XOTCL_CMD_CLASS_SPECIFIC_METHOD) { + if (Tcl_Command_flags(cmd) & XOTCL_CMD_CLASS_ONLY_METHOD) { /*fprintf(stderr, "we found class specific method %s on class %s object %s, isclass %d\n", methodName, className(cls), objectName(object), XOTclObjectIsClass(object));*/ if (!XOTclObjectIsClass(object)) { @@ -10383,6 +10387,10 @@ key = Tcl_GetHashKey(table, hPtr); cmd = (Tcl_Command)Tcl_GetHashValue(hPtr); + if (Tcl_Command_flags(cmd) & XOTCL_CMD_CLASS_ONLY_METHOD && !XOTclObjectIsClass(object)) { + return TCL_OK; + } + if (ProtectionMatches(interp, withCallprotection, cmd) && MethodTypeMatches(interp, methodType, cmd, object, key, withPer_object)) { if (dups) { @@ -10404,6 +10412,7 @@ key = Tcl_GetHashKey(table, hPtr); cmd = (Tcl_Command)Tcl_GetHashValue(hPtr); + if (Tcl_Command_flags(cmd) & XOTCL_CMD_CLASS_ONLY_METHOD && !XOTclObjectIsClass(object)) continue; if (pattern && !Tcl_StringMatch(key, pattern)) continue; if (!ProtectionMatches(interp, withCallprotection, cmd) || !MethodTypeMatches(interp, methodType, cmd, object, key, withPer_object) @@ -10545,6 +10554,8 @@ for (ml = object->mixinOrder; ml; ml = ml->nextPtr) { int guardOk = TCL_OK; mixin = XOTclGetClassFromCmdPtr(ml->cmdPtr); + assert(mixin); + if (inContext) { if (!RUNTIME_STATE(interp)->guardCount) { guardOk = GuardCall(object, 0, 0, interp, ml->clientData, NULL); @@ -11498,7 +11509,7 @@ XOTCL_CMD_PROTECTED_METHOD : methodproperty == MethodpropertyRedefine_protectedIdx ? XOTCL_CMD_REDEFINE_PROTECTED_METHOD - :XOTCL_CMD_CLASS_SPECIFIC_METHOD; + :XOTCL_CMD_CLASS_ONLY_METHOD; if (valueObj) { int bool, result;