diff options
| author | sebres <sebres@users.sourceforge.net> | 2024-07-02 14:38:06 (GMT) |
|---|---|---|
| committer | sebres <sebres@users.sourceforge.net> | 2024-07-02 14:38:06 (GMT) |
| commit | 3b11a2d92875b0a42b1f03af511eb502cff66511 (patch) | |
| tree | 0c0fd294465681eeb56cac442706a4ca6fea37e4 | |
| parent | 144da13d9ebe6734910fe0b8e6d9da89dc8c17b7 (diff) | |
| parent | 0585ff4bcefc85ff5fae9b73d9ce29f58fc8cd45 (diff) | |
| download | tcl-3b11a2d92875b0a42b1f03af511eb502cff66511.zip tcl-3b11a2d92875b0a42b1f03af511eb502cff66511.tar.gz tcl-3b11a2d92875b0a42b1f03af511eb502cff66511.tar.bz2 | |
merge 8.6
| -rw-r--r-- | generic/tclCmdIL.c | 16 | ||||
| -rw-r--r-- | tests/info.test | 8 |
2 files changed, 14 insertions, 10 deletions
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index 7f17e4f..dc4bf93 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -1198,9 +1198,6 @@ InfoFrameCmd( } framePtr = iPtr->cmdFramePtr; - if (!framePtr) { - goto levelError; - } while (++level <= 0) { framePtr = framePtr->nextPtr; if (!framePtr) { @@ -1269,9 +1266,14 @@ TclInfoFrame( static const char *const typeString[TCL_LOCATION_LAST] = { "eval", "eval", "eval", "precompiled", "source", "proc" }; - Proc *procPtr = framePtr->framePtr ? framePtr->framePtr->procPtr : NULL; + Proc *procPtr = NULL; int needsFree = -1; + if (!framePtr) { + goto precompiled; + } + procPtr = framePtr->framePtr ? framePtr->framePtr->procPtr : NULL; + /* * Pull the information and construct the dictionary to return, as list. * Regarding use of the CmdFrame fields see tclInt.h, and its definition. @@ -1299,11 +1301,11 @@ TclInfoFrame( break; case TCL_LOCATION_PREBC: + precompiled: /* * Precompiled. Result contains the type as signal, nothing else. */ - - ADD_PAIR("type", Tcl_NewStringObj(typeString[framePtr->type], -1)); + ADD_PAIR("type", Tcl_NewStringObj(typeString[TCL_LOCATION_PREBC], -1)); break; case TCL_LOCATION_BC: { @@ -1418,7 +1420,7 @@ TclInfoFrame( * _visible_ CallFrame. */ - if ((framePtr->framePtr != NULL) && (iPtr->varFramePtr != NULL)) { + if (framePtr && (framePtr->framePtr != NULL) && (iPtr->varFramePtr != NULL)) { CallFrame *current = framePtr->framePtr; CallFrame *top = iPtr->varFramePtr; CallFrame *idx; diff --git a/tests/info.test b/tests/info.test index ea03f52..600a05a 100644 --- a/tests/info.test +++ b/tests/info.test @@ -2588,12 +2588,14 @@ test info-40.0 {Bug 0de6c1d79c crash} -setup { child hide info } -body { list [child invokehidden info frame] \ - [catch {child invokehidden info frame 0} msg] $msg \ - [catch {child invokehidden info frame 1} msg] $msg + [child invokehidden info frame 0] \ + [child invokehidden info frame 1] \ + [catch {child invokehidden info frame -1} msg] $msg \ + [catch {child invokehidden info frame 2} msg] $msg } -cleanup { interp delete child unset -nocomplain msg -} -result {1 1 {bad level "0"} 1 {bad level "1"}} +} -result {1 {type precompiled} {type precompiled} 1 {bad level "-1"} 1 {bad level "2"}} # cleanup catch {namespace delete test_ns_info1 test_ns_info2} |
