diff options
| author | pooryorick <com.digitalsmarties@pooryorick.com> | 2018-06-24 07:17:46 (GMT) |
|---|---|---|
| committer | pooryorick <com.digitalsmarties@pooryorick.com> | 2018-06-24 07:17:46 (GMT) |
| commit | e2a79c2604e79b36ec065a7bb44ec57eaca5ed8a (patch) | |
| tree | 6707ed6c69109f2645186529a7ef950289d0556a | |
| parent | 6cbfdcc4a338d5b7348ee7e65a7710d13f9bc27e (diff) | |
| download | tcl-e2a79c2604e79b36ec065a7bb44ec57eaca5ed8a.zip tcl-e2a79c2604e79b36ec065a7bb44ec57eaca5ed8a.tar.gz tcl-e2a79c2604e79b36ec065a7bb44ec57eaca5ed8a.tar.bz2 | |
Fix for [3592747]: Let TclNRTailcallEval handle namespace problems.
| -rw-r--r-- | generic/tclBasic.c | 8 | ||||
| -rw-r--r-- | tests/tailcall.test | 20 |
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 |
