summaryrefslogtreecommitdiffstats
path: root/library/init.tcl
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2017-06-26 20:00:35 (GMT)
committerdgp <dgp@users.sourceforge.net>2017-06-26 20:00:35 (GMT)
commit45cf14ed033166ae5e6bdd6e2e7fcc949a0d70da (patch)
tree499bc23992e77c2b4e9237a4b37df842dd2358e0 /library/init.tcl
parent2bd7095b873e14982c860118b27caeeb0af6085e (diff)
parentf242dd36bd7e44e4832fc43082c9b608573020bb (diff)
downloadtcl-45cf14ed033166ae5e6bdd6e2e7fcc949a0d70da.zip
tcl-45cf14ed033166ae5e6bdd6e2e7fcc949a0d70da.tar.gz
tcl-45cf14ed033166ae5e6bdd6e2e7fcc949a0d70da.tar.bz2
Merge 8.6; Bump to TclOO 1.2.0.
Diffstat (limited to 'library/init.tcl')
-rw-r--r--library/init.tcl50
1 files changed, 28 insertions, 22 deletions
diff --git a/library/init.tcl b/library/init.tcl
index 5cedd14..ece1e44 100644
--- a/library/init.tcl
+++ b/library/init.tcl
@@ -286,14 +286,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
@@ -307,21 +302,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