Index: TODO =================================================================== diff -u -r230a73476eda997dc54df3072f29e752f2ffa38e -rfc36bf33edd6f5b3f273cb2abdcb30f2ececdff4 --- TODO (.../TODO) (revision 230a73476eda997dc54df3072f29e752f2ffa38e) +++ TODO (.../TODO) (revision fc36bf33edd6f5b3f273cb2abdcb30f2ececdff4) @@ -2322,11 +2322,14 @@ - added flushing of bytecode on alias registration - added regression test +- update slot uml diagram +- fixed incorrect (unwanted) call to unknown that caused creation + of objects names __unknown when classes could not be resolved + TODO: - document value added replacements of Tcl functions - - object parameter type forward: - regression test - reduce verbosity @@ -2335,14 +2338,12 @@ - slotmachinerie 2 - naming "incremental", "reconfigure" - check: - slottest/t.023: 3.40 mms, o1 class - Warning: Arguments '{::M ::xotcl::Object}' to constructor of object ::__unknown are most likely not processed + ? {o1 class add M} {class: expected a class but got "::o1"} - should we deactivate add/delete for non-multivalued cases? - allow noarg+default/initcmd ? - default/initcmd/subsdefault: can we simplify these? or add messages for conflicting usages. - - doc: NextScriptingLanguage/index.html: Index: generic/nsf.c =================================================================== diff -u -r230a73476eda997dc54df3072f29e752f2ffa38e -rfc36bf33edd6f5b3f273cb2abdcb30f2ececdff4 --- generic/nsf.c (.../nsf.c) (revision 230a73476eda997dc54df3072f29e752f2ffa38e) +++ generic/nsf.c (.../nsf.c) (revision fc36bf33edd6f5b3f273cb2abdcb30f2ececdff4) @@ -1145,7 +1145,7 @@ } } - /*fprintf(stderr, "try __unknown for %s, result so far is %d\n", objName, result);*/ + /*fprintf(stderr, "try __unknown for '%s', result so far is %d\n", objName, result);*/ if (baseClass) { Tcl_Obj *methodObj, *nameObj = isAbsolutePath(objName) ? objPtr : NameInNamespaceObj(interp, objName, CallingNameSpace(interp)); @@ -1154,11 +1154,10 @@ methodObj = NsfMethodObj(&baseClass->object, NSF_c_requireobject_idx); if (methodObj) { - /*fprintf(stderr, "+++ calling __unknown for %s name=%s\n", + /*fprintf(stderr, "+++ calling __unknown for %s name '%s'\n", ClassName(baseClass), ObjStr(nameObj));*/ - result = CallMethod((ClientData) baseClass, interp, methodObj, - 3, &nameObj, NSF_CM_NO_PROTECT|NSF_CSC_IMMEDIATE); + 3, &nameObj, NSF_CM_NO_UNKNOWN|NSF_CM_NO_PROTECT|NSF_CSC_IMMEDIATE); if (result == TCL_OK) { result = GetClassFromObj(interp, objPtr, cl, NULL); } @@ -7893,7 +7892,7 @@ * we pass the object as first argument of the unknown * handler. */ - + fprintf(stderr, "next calls DispatchUnknownMethod\n"); result = DispatchUnknownMethod(self, interp, objc, objv, object, objv[1], NSF_CM_NO_OBJECT_METHOD|NSF_CSC_IMMEDIATE); } @@ -8024,15 +8023,12 @@ assert(object); assert(object->id); - /*fprintf(stderr, "ObjectDispatchFinalize %p %s.%s flags %.6x (%d) frame %.6x rst %d %s\n", - cscPtr, ObjectName(object), methodName, flags, - result, cscPtr->frameType, RUNTIME_STATE(interp)->unknown, - msg);*/ + /*fprintf(stderr, "ObjectDispatchFinalize %p %s flags %.6x (%d) frame %.6x rst %d\n", + cscPtr, ObjectName(object), flags, + result, cscPtr->frameType, RUNTIME_STATE(interp)->unknown);*/ /* - * When the active command is deleted, the cmdPtr in the call stack - * content structure is set to NULL. We are not able to check - * parameter in such situations. + * Check the return value if wanted */ if (result == TCL_OK && cscPtr->cmdPtr) { NsfParamDefs *paramDefs = ParamDefsGet(cscPtr->cmdPtr); @@ -8043,23 +8039,22 @@ rst->doCheckResults, NULL); } } else { - /*fprintf(stderr, "We have no cmdPtr in cscPtr %p %s.%s", cscPtr, ObjectName(object), methodName); - fprintf(stderr, "... cannot check return values!\n");*/ + /*fprintf(stderr, "We have no cmdPtr in cscPtr %p %s", cscPtr, ObjectName(object)); + fprintf(stderr, "... cannot check return values!\n");*/ } /* * On success (no error occured) check for unknown cases. */ if (result == TCL_OK) { - - if ((flags & NSF_CSC_UNKNOWN) + + if ((flags & NSF_CSC_METHOD_IS_UNKNOWN) || ((cscPtr->frameType == NSF_CSC_TYPE_ACTIVE_FILTER) && rst->unknown) ) { result = DispatchUnknownMethod(object, interp, cscPtr->objc, cscPtr->objv, NULL, cscPtr->objv[0], - NSF_CSC_IMMEDIATE - /*flags&NSF_CSC_IMMEDIATE*/); + (cscPtr->flags & NSF_CSC_CALL_NO_UNKNOWN)|NSF_CSC_IMMEDIATE); /* * Final reset of unknown flag */ @@ -8332,8 +8327,10 @@ cscPtr = CscAlloc(interp, &csc, cmd); CscInit(cscPtr, object, cl, cmd, frameType, flags); - flags |= NSF_CSC_UNKNOWN; - cscPtr->flags |= NSF_CSC_UNKNOWN; + cscPtr->flags |= NSF_CSC_METHOD_IS_UNKNOWN; + if ((flags & NSF_CM_NO_UNKNOWN)) { + cscPtr->flags |= NSF_CSC_CALL_NO_UNKNOWN; + } cscPtr->objc = objc-shift; cscPtr->objv = objv+shift; } @@ -8489,15 +8486,15 @@ delegator?objv[1]:NULL, delegator?ObjStr(objv[1]) : NULL );*/ - if (unknownObj && methodObj != unknownObj && (flags & NSF_CM_NO_UNKNOWN) == 0) { + if (unknownObj && methodObj != unknownObj && (flags & NSF_CSC_CALL_NO_UNKNOWN) == 0) { /* * back off and try unknown; */ int offset; ALLOC_ON_STACK(Tcl_Obj*, objc+3, tov); - /*fprintf(stderr, "calling unknown for %s %s, flgs=%02x,%02x isClass=%d %p %s objc %d\n", - ObjectName(object), ObjStr(methodObj), flags, NSF_CM_NO_UNKNOWN, + /*fprintf(stderr, "calling unknown for %s %s, flgs=%.6x,%.6x/%.6x isClass=%d %p %s objc %d\n", + ObjectName(object), ObjStr(methodObj), flags, NSF_CM_NO_UNKNOWN,NSF_CSC_CALL_NO_UNKNOWN, NsfObjectIsClass(object), object, ObjectName(object), objc);*/ tov[0] = object->cmdName; @@ -8517,8 +8514,8 @@ FREE_ON_STACK(Tcl_Obj*, tov); } else { /* no unknown called, this is the built-in unknown handler */ - /*fprintf(stderr, "--- No unknown method Name %s objv[%d] %s\n", - ObjStr(methodObj), 1, ObjStr(objv[1]));*/ + fprintf(stderr, "--- No unknown method Name %s objv[%d] %s\n", + ObjStr(methodObj), 1, ObjStr(objv[1])); result = NsfPrintError(interp, "%s: unable to dispatch method '%s'", ObjectName(object), MethodName(objv[1])); } Index: generic/nsfInt.h =================================================================== diff -u -rf7e7dd532f08b253e4b81e73074e216674685d60 -rfc36bf33edd6f5b3f273cb2abdcb30f2ececdff4 --- generic/nsfInt.h (.../nsfInt.h) (revision f7e7dd532f08b253e4b81e73074e216674685d60) +++ generic/nsfInt.h (.../nsfInt.h) (revision fc36bf33edd6f5b3f273cb2abdcb30f2ececdff4) @@ -668,10 +668,11 @@ #define NSF_CSC_CALL_IS_COMPILE 8 #define NSF_CSC_IMMEDIATE 0x0020 #define NSF_CSC_FORCE_FRAME 0x0040 +#define NSF_CSC_CALL_NO_UNKNOWN 0x0080 #define NSF_CSC_CALL_IS_NRE 0x0100 #define NSF_CSC_MIXIN_STACK_PUSHED 0x0400 #define NSF_CSC_FILTER_STACK_PUSHED 0x0800 -#define NSF_CSC_UNKNOWN 0x1000 +#define NSF_CSC_METHOD_IS_UNKNOWN 0x1000 #define NSF_CSC_CALL_IS_TRANSPARENT 0x2000 #define NSF_CSC_COPY_FLAGS (NSF_CSC_MIXIN_STACK_PUSHED|NSF_CSC_FILTER_STACK_PUSHED|NSF_CSC_IMMEDIATE|NSF_CSC_CALL_IS_TRANSPARENT|NSF_CSC_FORCE_FRAME) Index: library/nx/nx.tcl =================================================================== diff -u -r84ca9b390e213541f4cd2d3515398710c221cdb1 -rfc36bf33edd6f5b3f273cb2abdcb30f2ececdff4 --- library/nx/nx.tcl (.../nx.tcl) (revision 84ca9b390e213541f4cd2d3515398710c221cdb1) +++ library/nx/nx.tcl (.../nx.tcl) (revision fc36bf33edd6f5b3f273cb2abdcb30f2ececdff4) @@ -1009,6 +1009,7 @@ RelationSlot public method add {obj prop value {pos 0}} { set oldSetting [::nsf::relation $obj $prop] + #puts stderr [list ::nsf::relation $obj $prop [linsert $oldSetting $pos $value]] # use uplevel to avoid namespace surprises uplevel [list ::nsf::relation $obj $prop [linsert $oldSetting $pos $value]] } Index: library/xotcl/tests/slottest.xotcl =================================================================== diff -u -rbd1cce484140aaf66113cf647f060ae48d32b24f -rfc36bf33edd6f5b3f273cb2abdcb30f2ececdff4 --- library/xotcl/tests/slottest.xotcl (.../slottest.xotcl) (revision bd1cce484140aaf66113cf647f060ae48d32b24f) +++ library/xotcl/tests/slottest.xotcl (.../slottest.xotcl) (revision fc36bf33edd6f5b3f273cb2abdcb30f2ececdff4) @@ -1,5 +1,5 @@ # -*- Tcl -*- -package require XOTcl; namespace import ::xotcl::* +package require XOTcl; namespace import -force ::xotcl::* package require nx::test Test parameter count 1000 @@ -112,7 +112,8 @@ ? {o1 class} "::O" o1 class Object ? {o1 class} "::xotcl::Object" -? {catch {o1 class add M}} 1 +? {o1 objectparameter} "-mixin:alias -filter:alias -class:alias args" +? {o1 class add M} {class: expected a class but got "::o1"} ? {O superclass} "::xotcl::Object"