Tcl Source Code

View Ticket
Login
Ticket UUID: 219184
Title: Tcl bytecode interpreter catches errors at inappropriate tim
Type: Bug Version: None
Submitter: nobody Created on: 2000-10-26 05:03:05
Subsystem: 10. Objects Assigned To: msofer
Priority: 7 High Severity:
Status: Closed Last Modified: 2001-08-22 21:00:53
Resolution: Fixed Closed By: msofer
    Closed on: 2001-08-22 14:00:52
Description:
OriginalBugID: 2248 Bug
Version: 8.0.5
SubmitDate: '1999-06-16'
LastModified: '2000-05-19'
Severity: LOW
Status: Assigned
Submitter: techsupp
ChangedBy: hobbs
RelatedBugIDs: 1149
OS: Linux-Red Hat
OSVersion: Red Hat 5.1
Machine: Other
FixedDate: '2000-10-25'
ClosedDate: '2000-10-25'


Extensions:
None

CustomShell:
None

ReproducibleScript:
$ tclsh
    % catch [error foo]
    1
    % set catch catch; $catch [error foo]
    foo

ObservedBehavior:
'catch [error foo]' should not have caught the error, since that
    error was raised before catch would have been invoked.  Disabling
    the bytecode compiler by calculating the command name at run time
    gives correct behaviour: the error propagates to the top level.

DesiredBehavior:
The bytecode-compiled version of the code should behave in the same
    way as the non-bytecode-compiled version.



Same behavior exists still in 8.2.0. 
-- 08/21/1999 hobbs

if (cmdTokenPtr->type != TCL_TOKEN_SIMPLE_WORD) {
    return TCL_OUT_LINE_COMPILE;
}

in TclCompileCatchCmd would fix this, but ruin other opts. 
-- 12/03/1999 hobbs
Make sure to put the catch in a proc to see the effect
when compiled. 
-- 05/19/2000 hobbs
User Comments: msofer added on 2001-08-22 21:00:53:

File Added - 9842: patch219184.txt

msofer added on 2001-08-22 21:00:52:
Logged In: YES 
user_id=148712

New complete patch (with test); commited

msofer added on 2001-08-21 23:36:11:

File Added - 9792: patch219184.txt

msofer added on 2001-08-21 23:36:10:
Logged In: YES 
user_id=148712

New and improved patch; [catch] is bytecompiled correctly
also when the script is not a simple word.

msofer added on 2001-08-15 22:39:10:

File Added - 9570: patch219184.txt

Logged In: YES 
user_id=148712

Enclosing a patch for review. Two tests fail, but due to
bugs in the test suite:
  - ioUtil.test: 3.7 (see bug #451200)
  - interp.test: 29.1 and 29.2 (outline compiling adds one
execution level; it can be corrected by putting the command
in braces *or* correcting the expected result. But the test
seems badly specified if it depends on this ...)

Note: the same approach (if valuable) can be used to fix bug
#219166 and relatives ...

msofer added on 2001-08-15 20:10:15:
Logged In: YES 
user_id=148712

The problem can also be fixed with

 if (*(cmdTokenPtr->start) != '{') {
    return TCL_OUT_LINE_COMPILE;
 }

in TclCompileCatchCmd. This would insure that only braced
bodies get compiled; does it ruin any other optimisation?

msofer added on 2001-08-15 00:07:15:
Logged In: YES 
user_id=148712

dkf's test proc overeagerCatch behaves correctly only as a
side effect of the fact that [return] is now bytecompiled;
the behaviour is still incorrect as demonstrated by

 proc overeagerCatch {} {catch [error GOOD]; error BAD}

msofer added on 2001-05-05 05:08:27:
Logged In: YES 
user_id=148712

Still occurs in tcl8.4a3 (partially):

(a) the originally reported behaviour still exists
% info patchlevel
8.4a3
% set c catch; $c [error foo]
foo
% catch [error foo]
1

(b) dkf's test-script now behaves as in Tcl7.6:
% proc overeagerCatch {} {catch [return 0]; return 1}
% puts [overeagerCatch]
0

dkf added on 2001-01-09 22:01:34:
Alternate way of demonstrating the error:
  proc overeagerCatch {} {catch [return 0]; return 1}
  puts [overeagerCatch]
This prints 0 in Tcl7.6, and 1 in Tcl8.0 and Tcl8.3 (which are what it happens to be convenient for me to test right now...)

dkf added on 2000-11-08 18:58:34:
Problem still exists.  :^(

Attachments: