summaryrefslogtreecommitdiffstats
path: root/generic/tclBasic.c
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2024-03-05 16:38:57 (GMT)
committersebres <sebres@users.sourceforge.net>2024-03-05 16:38:57 (GMT)
commit0175377f5e1c38829cb31dfa14ee9d28714e9a57 (patch)
tree59f068c5bff63228061adf49a4a82becfa264d5b /generic/tclBasic.c
parentddc1ae83692c06e3aee0afa158a7ca087994ea6b (diff)
downloadtcl-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.c29
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");
+ }
}
}