diff options
author | dgp <dgp@users.sourceforge.net> | 2017-06-26 19:22:29 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2017-06-26 19:22:29 (GMT) |
commit | c9a0c6154c53dac75feb2af5e5cacce15bf25b11 (patch) | |
tree | 0a89b0c488355cfedec38b203299ba311e5fee65 /library | |
parent | 6e375012383167dfecb749feba6af252ebcf3692 (diff) | |
parent | 40560f53a7756617375dab14d8499406ba3a92b4 (diff) | |
download | tcl-c9a0c6154c53dac75feb2af5e5cacce15bf25b11.zip tcl-c9a0c6154c53dac75feb2af5e5cacce15bf25b11.tar.gz tcl-c9a0c6154c53dac75feb2af5e5cacce15bf25b11.tar.bz2 |
merge 8.6
Diffstat (limited to 'library')
-rw-r--r-- | library/init.tcl | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/library/init.tcl b/library/init.tcl index 471a9d8..3684258 100644 --- a/library/init.tcl +++ b/library/init.tcl @@ -284,14 +284,9 @@ proc unknown args { } append cinfo ... } - append cinfo "\"\n (\"uplevel\" body line 1)" - append cinfo "\n invoked from within" - append cinfo "\n\"uplevel 1 \$args\"" - # - # Try each possible form of the stack trace - # and trim the extra contribution from the matching case - # - set expect "$msg\n while executing\n\"$cinfo" + set tail "\n (\"uplevel\" body line 1)\n invoked\ + from within\n\"uplevel 1 \$args\"" + set expect "$msg\n while executing\n\"$cinfo\"$tail" if {$errInfo eq $expect} { # # The stack has only the eval from the expanded command @@ -305,21 +300,32 @@ proc unknown args { # Stack trace is nested, trim off just the contribution # from the extra "eval" of $args due to the "catch" above. # - set expect "\n invoked from within\n\"$cinfo" - set exlen [string length $expect] - set eilen [string length $errInfo] - set i [expr {$eilen - $exlen - 1}] - set einfo [string range $errInfo 0 $i] - # - # For now verify that $errInfo consists of what we are about - # to return plus what we expected to trim off. - # - if {$errInfo ne "$einfo$expect"} { - error "Tcl bug: unexpected stack trace in \"unknown\"" {} \ - [list CORE UNKNOWN BADTRACE $einfo $expect $errInfo] + set last [string last $tail $errInfo] + if {$last + [string length $tail] != [string length $errInfo]} { + # Very likely cannot happen + return -options $opts $msg } - return -code error -errorcode $errCode \ - -errorinfo $einfo $msg + set errInfo [string range $errInfo 0 $last-1] + set tail "\"$cinfo\"" + set last [string last $tail $errInfo] + if {$last + [string length $tail] != [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo $errInfo $msg + } + set errInfo [string range $errInfo 0 $last-1] + set tail "\n invoked from within\n" + set last [string last $tail $errInfo] + if {$last + [string length $tail] == [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo [string range $errInfo 0 $last-1] $msg + } + set tail "\n while executing\n" + set last [string last $tail $errInfo] + if {$last + [string length $tail] == [string length $errInfo]} { + return -code error -errorcode $errCode \ + -errorinfo [string range $errInfo 0 $last-1] $msg + } + return -options $opts $msg } else { dict incr opts -level return -options $opts $msg |