summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2024-07-02 12:22:24 (GMT)
committersebres <sebres@users.sourceforge.net>2024-07-02 12:22:24 (GMT)
commitf995a580cf608cb76525d52845f0623dad06d8df (patch)
tree01cf915f5fafa1ec667ab6e8ed04571c76c7ae7e
parent33bf34bf09ade7644015556f2bf0c4c020c5a2e3 (diff)
downloadtcl-f995a580cf608cb76525d52845f0623dad06d8df.zip
tcl-f995a580cf608cb76525d52845f0623dad06d8df.tar.gz
tcl-f995a580cf608cb76525d52845f0623dad06d8df.tar.bz2
Fix for [0de6c1d79c] crash (cherry-picked from trunk)
-rw-r--r--generic/tclCmdIL.c25
-rw-r--r--tests/info.test9
2 files changed, 33 insertions, 1 deletions
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c
index aef0399..3198cc9 100644
--- a/generic/tclCmdIL.c
+++ b/generic/tclCmdIL.c
@@ -1160,8 +1160,31 @@ InfoFrameCmd(
}
corPtr = corPtr->callerEEPtr->corPtr;
}
- topLevel += (*cmdFramePtrPtr)->level;
+ if (iPtr->cmdFramePtr == NULL || *cmdFramePtrPtr == NULL) {
+ if (objc == 1) {
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(1));
+ } else {
+ if (TclGetIntFromObj(interp, objv[1], &level) != TCL_OK) {
+ code = TCL_ERROR;
+ } else {
+ Tcl_Obj *objs[2];
+ /*
+ * TODO - "precompiled" is a lie. Chosen only because as documented
+ * no other fields in the dictionary need be returned. Should
+ * add a new type like "unknown" meaning no further information
+ * available.
+ * TODO - should we check that "level" is 1 ?
+ */
+ TclNewLiteralStringObj(objs[0], "type");
+ TclNewLiteralStringObj(objs[1], "precompiled");
+ Tcl_SetObjResult(interp, Tcl_NewListObj(2, objs));
+ }
+ }
+ return code;
+ }
+
+ topLevel += (*cmdFramePtrPtr)->level;
if (topLevel != iPtr->cmdFramePtr->level) {
framePtr = iPtr->cmdFramePtr;
while (framePtr) {
diff --git a/tests/info.test b/tests/info.test
index 69be6a3..ff3457f 100644
--- a/tests/info.test
+++ b/tests/info.test
@@ -2415,6 +2415,15 @@ test info-39.2 {Bug 4b61afd660} -setup {
rename probe {}
} -result 3
+test info-40.0 {Bug 0de6c1d79c crash} -setup {
+ interp create child
+ child hide info
+} -cleanup {
+ interp delete child
+} -body {
+ child invokehidden info frame
+} -result 1
+
# cleanup
catch {namespace delete test_ns_info1 test_ns_info2}
::tcltest::cleanupTests