Index: TODO =================================================================== diff -u -r433dab40ed472f0bcddf9c2afd176e3a2ff4de0b -r409cc953ea5440ccaeb252ff1932ab448dccd1e8 --- TODO (.../TODO) (revision 433dab40ed472f0bcddf9c2afd176e3a2ff4de0b) +++ TODO (.../TODO) (revision 409cc953ea5440ccaeb252ff1932ab448dccd1e8) @@ -1970,6 +1970,8 @@ - Fixed switching between INACTIVE_MIXIN frames to ACTIVE_MIXIN frames - Extended regression test +- make handling of redefinitions in system methods more robust + TODO: - "-returns" Index: generic/nsf.c =================================================================== diff -u -r41e9eeaee026cfb812202269fa27f623d4ec67e1 -r409cc953ea5440ccaeb252ff1932ab448dccd1e8 --- generic/nsf.c (.../nsf.c) (revision 41e9eeaee026cfb812202269fa27f623d4ec67e1) +++ generic/nsf.c (.../nsf.c) (revision 409cc953ea5440ccaeb252ff1932ab448dccd1e8) @@ -1617,6 +1617,28 @@ return cmd; } +/* + *---------------------------------------------------------------------- + * GetObjectSystem -- + * + * Return the object system for which the object was defined + * + * Results: + * Object system pointer + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ +static NsfObjectSystem * +GetObjectSystem(NsfObject *object) { + assert(object); + if (NsfObjectIsClass(object)) { + return ((NsfClass *)object)->osPtr; + } + return object->cl->osPtr; +} /* *---------------------------------------------------------------------- @@ -1679,6 +1701,7 @@ RUNTIME_STATE(interp)->objectSystems = osPtr; } + /* *---------------------------------------------------------------------- * ObjectSystemsCheckSystemMethod -- @@ -1696,8 +1719,8 @@ *---------------------------------------------------------------------- */ static void -ObjectSystemsCheckSystemMethod(Tcl_Interp *interp, CONST char *methodName, NsfObjectSystem *defOsPtr) { - NsfObjectSystem *osPtr; +ObjectSystemsCheckSystemMethod(Tcl_Interp *interp, CONST char *methodName, NsfObject *object) { + NsfObjectSystem *osPtr, *defOsPtr = GetObjectSystem(object); int i; for (osPtr = RUNTIME_STATE(interp)->objectSystems; osPtr; osPtr = osPtr->nextPtr) { @@ -1706,14 +1729,30 @@ if (methodObj && !strcmp(methodName, ObjStr(methodObj))) { int flag = 1<definedMethods & flag) { - osPtr->overloadedMethods |= flag; - /*fprintf(stderr, "+++ %s %.6x overloading %s\n", className(defOsPtr->rootClass), - osPtr->overloadedMethods, methodName);*/ + /* + * If for some reason (e.g. reload) we redefine the base + * methods, these never count as overloads. + */ + if ((*(Nsf_SytemMethodOpts[i]+1) == 'o' && object == &defOsPtr->rootClass->object) + || (*(Nsf_SytemMethodOpts[i]+1) == 'c' && object == &defOsPtr->rootMetaClass->object) ) { + /*fprintf(stderr, "+++ %s %.6x NOT overloading %s.%s %s (is root %d, is meta %d)\n", + className(defOsPtr->rootClass), + osPtr->overloadedMethods, objectName(object), methodName, Nsf_SytemMethodOpts[i], + object == &defOsPtr->rootClass->object, + object == &defOsPtr->rootMetaClass->object);*/ + } else { + osPtr->overloadedMethods |= flag; + /*fprintf(stderr, "+++ %s %.6x overloading %s.%s %s (is root %d, is meta %d)\n", + className(defOsPtr->rootClass), + osPtr->overloadedMethods, objectName(object), methodName, Nsf_SytemMethodOpts[i], + object == &defOsPtr->rootClass->object, + object == &defOsPtr->rootMetaClass->object);*/ + } } if (osPtr == defOsPtr && ((osPtr->definedMethods & flag) == 0)) { osPtr->definedMethods |= flag; - /*fprintf(stderr, "+++ %s %.6x defining %s\n", className(defOsPtr->rootClass), - osPtr->definedMethods, methodName);*/ + /*fprintf(stderr, "+++ %s %.6x defining %s.%s %s\n", className(defOsPtr->rootClass), + osPtr->definedMethods, objectName(object), methodName, Nsf_SytemMethodOpts[i]);*/ } } } @@ -1813,28 +1852,6 @@ return TCL_OK; } -/* - *---------------------------------------------------------------------- - * GetObjectSystem -- - * - * Return the object system for which the object was defined - * - * Results: - * Object system pointer - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ -static NsfObjectSystem * -GetObjectSystem(NsfObject *object) { - assert(object); - if (NsfObjectIsClass(object)) { - return ((NsfClass *)object)->osPtr; - } - return object->cl->osPtr; -} /* *---------------------------------------------------------------------- @@ -3245,8 +3262,10 @@ result = TCL_OK; } } - ObjectSystemsCheckSystemMethod(interp, methodName, GetObjectSystem(object)); + if (result == TCL_OK) { + ObjectSystemsCheckSystemMethod(interp, methodName, object); + } return result; }