diff options
| author | sebres <sebres@users.sourceforge.net> | 2024-03-05 16:38:57 (GMT) |
|---|---|---|
| committer | sebres <sebres@users.sourceforge.net> | 2024-03-05 16:38:57 (GMT) |
| commit | 0175377f5e1c38829cb31dfa14ee9d28714e9a57 (patch) | |
| tree | 59f068c5bff63228061adf49a4a82becfa264d5b /generic/tclBasic.c | |
| parent | ddc1ae83692c06e3aee0afa158a7ca087994ea6b (diff) | |
| download | tcl-0175377f5e1c38829cb31dfa14ee9d28714e9a57.zip tcl-0175377f5e1c38829cb31dfa14ee9d28714e9a57.tar.gz tcl-0175377f5e1c38829cb31dfa14ee9d28714e9a57.tar.bz2 | |
fix for [910d67a229fe7f65]: search of `namespace unknown` handler fixed: first try to find namespace unknown handler of the namespace of executed command if available;
this elementary fixes following bug (additionally prevents to call slowly global "::unknown" for known/loaded namespaces with registered unknown handler)
Diffstat (limited to 'generic/tclBasic.c')
| -rw-r--r-- | generic/tclBasic.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 8dde621..93c3b43 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -4726,12 +4726,33 @@ TEOV_NotFound( * unknown command handler for the current * namespace (TIP 181). */ Namespace *savedNsPtr = NULL; + + int qualLen; + const char *qualName = TclGetStringFromObj(objv[0], &qualLen); currNsPtr = varFramePtr->nsPtr; - if ((currNsPtr == NULL) || (currNsPtr->unknownHandlerPtr == NULL)) { - currNsPtr = iPtr->globalNsPtr; - if (currNsPtr == NULL) { - Tcl_Panic("Tcl_EvalObjv: NULL global namespace pointer"); + if ((currNsPtr == NULL) || (currNsPtr->unknownHandlerPtr == NULL) || + (qualLen > 2 && (*qualName == ':') && (*(qualName+1) == ':')) + ) { + /* + * first try to find namespace unknown handler of the namespace + * of executed command if available: + */ + Namespace *dummyNsPtr; + const char *simpleName; + + (void) TclGetNamespaceForQualName(interp, qualName, currNsPtr, + TCL_NAMESPACE_ONLY, &currNsPtr, &dummyNsPtr, &dummyNsPtr, + &simpleName); + if ((currNsPtr == NULL) || (simpleName == NULL) || + currNsPtr->unknownHandlerPtr == NULL || + (currNsPtr->flags & (NS_DYING | NS_DEAD)) + ) { + /* fallback to the global unknown */ + currNsPtr = iPtr->globalNsPtr; + if (currNsPtr == NULL) { + Tcl_Panic("TEOV_NotFound: NULL global namespace pointer"); + } } } |
