Index: generic/nsf.c =================================================================== diff -u -rd49e60e74c36c563db5ba7095c2f898f1029169b -r264ccfcb835fd341d4fcb5e126d5305e073de0fc --- generic/nsf.c (.../nsf.c) (revision d49e60e74c36c563db5ba7095c2f898f1029169b) +++ generic/nsf.c (.../nsf.c) (revision 264ccfcb835fd341d4fcb5e126d5305e073de0fc) @@ -7441,10 +7441,29 @@ if (*methodName == ':') { cmd = Tcl_GetCommandFromObj(interp, methodObj); if (cmd) { - CONST char *mn = Tcl_GetCommandName(interp, cmd); - if (IsClassNsName(methodName)) { + Tcl_ObjCmdProc *procPtr = Tcl_Command_objProc(cmd); + + if (procPtr == NsfObjDispatch) { + /* + * Don't allow to call objects as methods (for the time being) + * via absolute names. Otherwise, in line {2} below, ::State + * is interpreted as an ensemble object, and the method + * "unknown" won't be called (in the XOTcl tradition) and + * wierd things will happen. + * + * {1} Class ::State + * {2} Class ::State -parameter x + */ + if (RUNTIME_STATE(interp)->debugLevel > 0) { + fprintf(stderr, "Warning: don't invoke object %s this way. Register object via alias...\n", methodName); + } + cmd = NULL; + + } else if (IsClassNsName(methodName)) { CONST char *className = NSCutNsfClasses(methodName); + CONST char *mn = Tcl_GetCommandName(interp, cmd); Tcl_DString ds, *dsPtr = &ds; + DSTRING_INIT(dsPtr); Tcl_DStringAppend(dsPtr, className, strlen(className)-strlen(mn)-2); cl = (NsfClass *)GetObjectFromString(interp, Tcl_DStringValue(dsPtr));