MS This page deals with deep Tcl internals. Not to be perused immediately after lunch. Very few readers will be interested.
Some recent conceptual difficulties with the proper behaviour for command invocations led me to a bit of archeological discovery in search for answers. Why does TCL_EVAL_INVOKE do what it does? Is it really the correct thing? What should it actually be doing?
With the help of 'cvs blame' I reconstructed this history. First the facts, then a section of comments and explanations on the special needs for TCL_EVAL_GLOBAL and TCL_EVAL_INVOKE.
This history looks at Tcl8.4, where it was mainly played. In Tcl8.5 namespace ensemble is a new user of TCL_EVAL_INVOKE. Up to 8.4
Note: revision numbers refer to the file tclBasic.c
1.65 (starting point)
1.66 (2002-07-29) In order to fix [Bug 582522] aliases do not fire exec traces [L1 ] the code for [interp alias] is modified to call through the main Tcl invocator: TclEvalObjvInternal. A new flag bit TCL_EVAL_NO_TRACEBACK is added so that AliasObjCmd keeps control of the generated error messages.
1.67 (2002-07-29) birth of TCL_EVAL_INVOKE in place of TCL_EVAL_NO_TRACEBACK, change in global eval:
1.75.2.1 (2003-04-25)
1.75.2.20 (2006-02-28) Fix for [Bug 1439836] TCL_EVAL_GLOBAL vs. uplevel #0 [L2 ]
1.75.2.21 (2006-03-21) Fix for [Bug 1444291] [::unknown] and alias targets (TCL_EVAL_INVOKE) [L3 ]. TCL_EVAL_INVOKE ceases to set a #0 context; instead, it selectively changes the namespace of the current context to global.