summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2024-07-02 14:38:06 (GMT)
committersebres <sebres@users.sourceforge.net>2024-07-02 14:38:06 (GMT)
commit3b11a2d92875b0a42b1f03af511eb502cff66511 (patch)
tree0c0fd294465681eeb56cac442706a4ca6fea37e4
parent144da13d9ebe6734910fe0b8e6d9da89dc8c17b7 (diff)
parent0585ff4bcefc85ff5fae9b73d9ce29f58fc8cd45 (diff)
downloadtcl-3b11a2d92875b0a42b1f03af511eb502cff66511.zip
tcl-3b11a2d92875b0a42b1f03af511eb502cff66511.tar.gz
tcl-3b11a2d92875b0a42b1f03af511eb502cff66511.tar.bz2
merge 8.6
-rw-r--r--generic/tclCmdIL.c16
-rw-r--r--tests/info.test8
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}