diff options
| author | sebres <sebres@users.sourceforge.net> | 2024-03-06 19:22:10 (GMT) |
|---|---|---|
| committer | sebres <sebres@users.sourceforge.net> | 2024-03-06 19:22:10 (GMT) |
| commit | ea30fa77faf70296eb26e071f149f8a935a8bc30 (patch) | |
| tree | b5ba4a3c203f42933f688d27fc3626c1493614a7 /generic/tclBasic.c | |
| parent | 5a74f345ac466a0a61b8c46bdcb3576848e6f987 (diff) | |
| download | tcl-ea30fa77faf70296eb26e071f149f8a935a8bc30.zip tcl-ea30fa77faf70296eb26e071f149f8a935a8bc30.tar.gz tcl-ea30fa77faf70296eb26e071f149f8a935a8bc30.tar.bz2 | |
better variant of fix for [910d67a229fe7f65] with improved search for NS::command (find NS even if command is not simple name), additionally
it'd invoke handler of parent NS if child NS doesn't have unknown handler (see test namespace-52.14)
Diffstat (limited to 'generic/tclBasic.c')
| -rw-r--r-- | generic/tclBasic.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c index ffd69c4..78685f0 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -4741,13 +4741,23 @@ TEOV_NotFound( Namespace *dummyNsPtr; const char *simpleName; + tryParentNS: (void) TclGetNamespaceForQualName(interp, qualName, currNsPtr, - TCL_NAMESPACE_ONLY, &currNsPtr, &dummyNsPtr, &dummyNsPtr, - &simpleName); + TCL_NAMESPACE_ONLY | TCL_FIND_IF_NOT_SIMPLE, &currNsPtr, + &dummyNsPtr, &dummyNsPtr, &simpleName); if ((currNsPtr == NULL) || (simpleName == NULL) || currNsPtr->unknownHandlerPtr == NULL || (currNsPtr->flags & (NS_DYING | NS_DEAD)) ) { + /* traverse to alive parent namespace containing handler */ + if (currNsPtr) { + qualName = currNsPtr->fullName; + qualLen = strlen(qualName); + if (qualLen > 2 && memchr(qualName, ':', qualLen)) { + currNsPtr = iPtr->globalNsPtr; + goto tryParentNS; + } + } /* fallback to the global unknown */ currNsPtr = iPtr->globalNsPtr; if (currNsPtr == NULL) { |
