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:
- patch219184.txt [download] added by msofer on 2001-08-22 21:00:53. [details]