From e29e808f57505a56193de6e0717c7abe95755b03 Mon Sep 17 00:00:00 2001 From: pooryorick Date: Mon, 10 Aug 2020 18:05:10 +0000 Subject: Fix for [29e8848eb976], imported alias in a deletion trace. --- generic/tclBasic.c | 3 ++- generic/tclInt.h | 1 + tests/namespace.test | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/generic/tclBasic.c b/generic/tclBasic.c index fe64f18..f52ecf5 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -3268,6 +3268,7 @@ Tcl_DeleteCommandFromToken( * TclNRExecuteByteCode looks up the command in the command hashtable). */ + cmdPtr->flags |= CMD_IS_DELETED; TclCleanupCommandMacro(cmdPtr); return 0; } @@ -4331,7 +4332,7 @@ EvalObjvCore( * Caller gave it to us. */ - if (!(preCmdPtr->flags & CMD_IS_DELETED)) { + if (!(preCmdPtr->flags & CMD_DEAD)) { /* * So long as it exists, use it. */ diff --git a/generic/tclInt.h b/generic/tclInt.h index 31108c7..1e90b70 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -1682,6 +1682,7 @@ typedef struct Command { #define CMD_COMPILES_EXPANDED 0x08 #define CMD_REDEF_IN_PROGRESS 0x10 #define CMD_VIA_RESOLVER 0x20 +#define CMD_DEAD 0x30 /* diff --git a/tests/namespace.test b/tests/namespace.test index dd71697..796b46b 100644 --- a/tests/namespace.test +++ b/tests/namespace.test @@ -3337,6 +3337,49 @@ test namespace-56.5 {Bug 8b9854c3d8} -setup { namespace delete namespace-56.5 } -result 1 + + +test namespace-57.0 { + an imported alias should be usable in the deletion trace for the alias + + see 29e8848eb976 +} -body { + variable res {} + namespace eval ns2 { + namespace export * + proc p1 {oldname newname op} { + return success + } + + interp alias {} [namespace current]::p2 {} [namespace which p1] + } + + + namespace eval ns3 { + namespace import ::ns2::p2 + } + + + set ondelete [list apply [list {oldname newname op} { + variable res + catch { + ns3::p2 $oldname $newname $op + } cres + lappend res $cres + } [namespace current]]] + + + trace add command ::ns2::p2 delete $ondelete + rename ns2::p2 {} + return $res +} -cleanup { + unset res + namespace delete ns2 + namespace delete ns3 +} -result success + + + # cleanup catch {rename cmd1 {}} -- cgit v0.12