Tcl Source Code

View Ticket
Login
Ticket UUID: 760947
Title: trace on command leave changes errorInfo/errorCode
Type: Bug Version: obsolete: 8.4.3
Submitter: yahalom Created on: 2003-06-26 04:02:58
Subsystem: 46. Traces Assigned To: dgp
Priority: 8 Severity:
Status: Closed Last Modified: 2003-10-09 06:18:42
Resolution: Fixed Closed By: dgp
    Closed on: 2003-10-08 23:18:42
Description:
Tcl Version 8.4.3
OS Platform and Version: windows 2000,linux redhat 7.3

when putting a trace on command execution leave the 
errorInfo and errorCode are not being set properly when 
an error happens in the command being called

proc traceLog {cmd info {result ""} {op ""}} {
puts "----- trace -----"
puts "command: $cmd"
puts "info: $info"
puts "result: $result"
puts "op: $op"
puts "----- leave trace -----"
}
proc test {} {
error "testMsg" "testInfo" "testCode"
}
for {set i 0} {$i<2} {incr i} {
catch {test} msg
puts "message: $msg"
puts "errorInfo: $errorInfo"
puts "errorCode: $errorCode"
unset msg
unset errorCode
unset errorInfo
trace add execution test leave {traceLog}
}

result:

message: testMsg
errorInfo: testInfo
    (procedure "test"
    invoked from with
"test"
errorCode: testCode
----- trace -----
command: test
info: 1
result: testMsg
op: leave
----- leave trace ---
message: testMsg
errorInfo: testMsg
    while executing
"test"
errorCode: NONE
User Comments: dgp added on 2003-10-09 06:18:42:
Logged In: YES 
user_id=80530


Fixed for 8.4.5+.

dgp added on 2003-10-09 06:11:18:

File Added - 63818: 760947-HEAD.patch

Logged In: YES 
user_id=80530

Corresponding patch for the HEAD
must also save/restore return
options (TIP 90).

dgp added on 2003-10-09 06:06:11:

File Deleted - 63814:

dgp added on 2003-10-09 06:06:10:

File Added - 63817: 760947.patch

Logged In: YES 
user_id=80530


Revised patch takes more care
to only save/restore the bits
that control error information.
That should ease any safety
concerns (deleted or safe
interps getting modified, etc...)

msofer added on 2003-10-09 05:46:19:
Logged In: YES 
user_id=148712

Second opinion: I'm pretty sure it does no damage, but I do
not claim to really grok traces . Testsuite seems happy too ...

dgp added on 2003-10-09 05:03:42:

File Added - 63814: 760947.patch

Logged In: YES 
user_id=80530


Ha!  Yes, that's it.  Just needed
to get the flags right.  Here's a
patch that makes the demo
script act as expected, and
I think it does no damage.
Passing to another maintainer
for a second opinion.

dgp added on 2003-10-09 03:58:33:
Logged In: YES 
user_id=80530

seems it's even worse that that.
While execution traces are
handled completely within
TclEvalObjvInternal(), the
management of errorCode
and errorInfo is all over the
place, so simple attempt to
fix this do not even work.
The real culprit may be
the Tcl_ResetResult()
embedded inside the execution
of the leave traces, which cause
the errorInfo and errorCode
machinery to get reset,
upsetting the expectations
of the [error] command,
which wants Tcl_LogCommandInfo
to respect the ERR_ALREADY_LOGGED
and ERROR_CODE_SET
flags that it set.

dgp added on 2003-10-09 03:37:06:
Logged In: YES 
user_id=80530


seems the way to fix this is to
save and restore the values
of ::errorCode and ::errorInfo
around the calling of leave traces.

potential problem is that this
will also cause any read
and write traces on those
variables to fire.

Seems it's not a safe enough
change to explore in time
for 8.4.5.  May need more
detailed sorting out and
testing through 8.5a development.

dgp added on 2003-10-09 00:55:30:
Logged In: YES 
user_id=80530

updated the docs to be the
same as TIP 62.

Unfortunately, the documented
behavior isn't completely 
possible, and isn't directly
"on point" for this report.

It's not possible, because multiple
execution traces may be set on
a single command, and if more that
one trace raises an error, it's not
possible for all of those error to become
the error of the traced command.

Generally error management during
execution tracing is way under-specified.

The issue in this report deals with a
simpler situation, where the traces
themselves raise no errors, but corrupt
the extra error information produced
by the traced command.

dgp added on 2003-10-09 00:12:01:
Logged In: YES 
user_id=80530

re-reading this, it seems that comment
in the docs makes either no sense,
or only tautological sense.  In context
"command" refers to the handler command,
not the traced command.  The name of
the traced command is known as "name"
in context.

Ahhh... hold on.  TIP 62 has the correct
specification.  This is a typo in the man page.

vincentdarley added on 2003-07-18 17:33:15:
Logged In: YES 
user_id=32170

Well, the manpage states (for 'leave' and 'leavestep' traces):

"If an error occurs while executing the command body, then 
the command name as a whole will return that same error."

The result above does look a little peculiar, although I don't 
really know enough about error(Code|Info) to be sure what 
the correct result should be.

In some sense if there's a leave trace on 'foo', then the result 
ought to be nearly identical to that obtained by manually 
replacing every occurrence of 'foo' in one's code by 'foo ; 
tracecmd foo ...'. (Obviously this is complicated by additional 
arguments, and by the cases where foo throws an error itself).

dgp added on 2003-07-18 02:53:35:
Logged In: YES 
user_id=80530


Can I get another TIP 62 ruling?

Is this intended behavior?

Attachments: