summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpooryorick <com.digitalsmarties@pooryorick.com>2018-06-24 07:17:46 (GMT)
committerpooryorick <com.digitalsmarties@pooryorick.com>2018-06-24 07:17:46 (GMT)
commite2a79c2604e79b36ec065a7bb44ec57eaca5ed8a (patch)
tree6707ed6c69109f2645186529a7ef950289d0556a
parent6cbfdcc4a338d5b7348ee7e65a7710d13f9bc27e (diff)
downloadtcl-e2a79c2604e79b36ec065a7bb44ec57eaca5ed8a.zip
tcl-e2a79c2604e79b36ec065a7bb44ec57eaca5ed8a.tar.gz
tcl-e2a79c2604e79b36ec065a7bb44ec57eaca5ed8a.tar.bz2
Fix for [3592747]: Let TclNRTailcallEval handle namespace problems.
-rw-r--r--generic/tclBasic.c8
-rw-r--r--tests/tailcall.test20
2 files changed, 21 insertions, 7 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 3ac3ffd..07f7e5c 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -8402,18 +8402,12 @@ TclNRTailcallObjCmd(
if (objc > 1) {
Tcl_Obj *listPtr, *nsObjPtr;
Tcl_Namespace *nsPtr = (Tcl_Namespace *) iPtr->varFramePtr->nsPtr;
- Tcl_Namespace *ns1Ptr;
/* The tailcall data is in a Tcl list: the first element is the
* namespace, the rest the command to be tailcalled. */
- listPtr = Tcl_NewListObj(objc, objv);
-
nsObjPtr = Tcl_NewStringObj(nsPtr->fullName, -1);
- if ((TCL_OK != TclGetNamespaceFromObj(interp, nsObjPtr, &ns1Ptr))
- || (nsPtr != ns1Ptr)) {
- Tcl_Panic("Tailcall failed to find the proper namespace");
- }
+ listPtr = Tcl_NewListObj(objc, objv);
TclListObjSetElement(interp, listPtr, 0, nsObjPtr);
iPtr->varFramePtr->tailcallPtr = listPtr;
diff --git a/tests/tailcall.test b/tests/tailcall.test
index 26f3cbf..3751c35 100644
--- a/tests/tailcall.test
+++ b/tests/tailcall.test
@@ -688,6 +688,26 @@ if {[testConstraint testnrelevels]} {
namespace delete testnre
}
+test tailcall-14.1 {in a deleted namespace} -body {
+ namespace eval ns {
+ proc p args {
+ tailcall [namespace current] $args
+ }
+ namespace delete [namespace current]
+ p
+ }
+} -returnCodes 1 -result {namespace "::ns" not found}
+
+test tailcall-14.1-bc {{in a deleted namespace} {byte compiled}} -body {
+ namespace eval ns {
+ proc p args {
+ tailcall [namespace current] {*}$args
+ }
+ namespace delete [namespace current]
+ p
+ }
+} -returnCodes 1 -result {namespace "::ns" not found}
+
# cleanup
::tcltest::cleanupTests