diff options
author | Kevin B Kenny <kennykb@acm.org> | 2003-02-03 20:16:52 (GMT) |
---|---|---|
committer | Kevin B Kenny <kennykb@acm.org> | 2003-02-03 20:16:52 (GMT) |
commit | 6c76b17acdfef82d68e6edab9a29210cadc63df3 (patch) | |
tree | 7f4146e4f6fd25e776781cf6c10b506a924eb593 /generic | |
parent | 7bc2d8dd9e518114299f600782715f52bb30b5a5 (diff) | |
download | tcl-6c76b17acdfef82d68e6edab9a29210cadc63df3.zip tcl-6c76b17acdfef82d68e6edab9a29210cadc63df3.tar.gz tcl-6c76b17acdfef82d68e6edab9a29210cadc63df3.tar.bz2 |
* generic/tclBasic.c: Changed [trace add command] so that 'rename'
callbacks get fully qualified names of the command. [Bug
651271]. ***POTENTIAL INCOMPATIBILITY***
* tests/trace.test: Modified the test cases for [trace add
command] to expect fully qualified names on the 'rename'
callbacks. Added a case for renaming a proc within a namespace.
* doc/trace.n: Added language about use of fully qualified names
in trace callbacks.
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclBasic.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 6702240..e7b0aa0 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclBasic.c,v 1.71 2003/01/17 14:19:40 vincentdarley Exp $ + * RCS: @(#) $Id: tclBasic.c,v 1.72 2003/02/03 20:16:52 kennykb Exp $ */ #include "tclInt.h" @@ -1918,6 +1918,8 @@ TclRenameCommand(interp, oldName, newName) Command *cmdPtr; Tcl_HashEntry *hPtr, *oldHPtr; int new, result; + Tcl_Obj* oldFullName; + Tcl_DString newFullName; /* * Find the existing command. An error is returned if cmdName can't @@ -1934,6 +1936,9 @@ TclRenameCommand(interp, oldName, newName) return TCL_ERROR; } cmdNsPtr = cmdPtr->nsPtr; + oldFullName = Tcl_NewObj(); + Tcl_IncrRefCount( oldFullName ); + Tcl_GetCommandFullName( interp, cmd, oldFullName ); /* * If the new command name is NULL or empty, delete the command. Do this @@ -1968,7 +1973,6 @@ TclRenameCommand(interp, oldName, newName) return TCL_ERROR; } - /* * Warning: any changes done in the code here are likely * to be needed in Tcl_HideCommand() code too. @@ -2006,9 +2010,26 @@ TclRenameCommand(interp, oldName, newName) * Therefore increment the reference count for cmdPtr so that * it's Command structure is freed only towards the end of this * function by calling TclCleanupCommand. + * + * The trace procedure needs to get a fully qualified name for + * old and new commands [Tcl bug #651271], or else there's no way + * for the trace procedure to get the namespace from which the old + * command is being renamed! */ + + Tcl_DStringInit( &newFullName ); + Tcl_DStringAppend( &newFullName, newNsPtr->fullName, -1 ); + if ( newNsPtr != iPtr->globalNsPtr ) { + Tcl_DStringAppend( &newFullName, "::", 2 ); + } + Tcl_DStringAppend( &newFullName, newTail, -1 ); cmdPtr->refCount++; - CallCommandTraces(iPtr,cmdPtr,oldName,newName,TCL_TRACE_RENAME); + CallCommandTraces( iPtr, cmdPtr, + Tcl_GetString( oldFullName ), + Tcl_DStringValue( &newFullName ), + TCL_TRACE_RENAME); + Tcl_DecrRefCount( oldFullName ); + Tcl_DStringFree( &newFullName ); /* * The new command name is okay, so remove the command from its @@ -2305,7 +2326,7 @@ Tcl_GetCommandFullName(interp, command, objPtr) if (cmdPtr->hPtr != NULL) { name = Tcl_GetHashKey(cmdPtr->hPtr->tablePtr, cmdPtr->hPtr); Tcl_AppendToObj(objPtr, name, -1); - } + } } } |