summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2024-05-25 15:18:54 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2024-05-25 15:18:54 (GMT)
commita5d90257c2e0558387e24753ee7bfb86cbf4f353 (patch)
treee0104f8b9288c485d113532e8948559e93c9f649
parent1a46ae83e5dcdceccd87a20aa607b9919340efb4 (diff)
downloadtcl-a5d90257c2e0558387e24753ee7bfb86cbf4f353.zip
tcl-a5d90257c2e0558387e24753ee7bfb86cbf4f353.tar.gz
tcl-a5d90257c2e0558387e24753ee7bfb86cbf4f353.tar.bz2
Check limits immediately when we do [interp eval]. [e3f4a8b78d]
-rw-r--r--generic/tclInterp.c13
-rw-r--r--tests/interp.test18
2 files changed, 29 insertions, 2 deletions
diff --git a/generic/tclInterp.c b/generic/tclInterp.c
index b0f6207..ddca212 100644
--- a/generic/tclInterp.c
+++ b/generic/tclInterp.c
@@ -2795,6 +2795,18 @@ ChildEval(
Tcl_Preserve(childInterp);
Tcl_AllowExceptions(childInterp);
+ /*
+ * If we're transferring to another interpreter, check it's limits first.
+ * It's much more reliable to do that now rather than waiting for the
+ * intermittent checks done during running; the slight performance hit for
+ * a cross-interp call is not a big problem. [Bug e3f4a8b78d]
+ */
+
+ if (interp != childInterp && Tcl_LimitCheck(childInterp) != TCL_OK) {
+ result = TCL_ERROR;
+ goto done;
+ }
+
if (objc == 1) {
/*
* TIP #280: Make actual argument location available to eval'd script.
@@ -2813,6 +2825,7 @@ ChildEval(
result = Tcl_EvalObjEx(childInterp, objPtr, 0);
Tcl_DecrRefCount(objPtr);
}
+ done:
Tcl_TransferResult(childInterp, result, interp);
Tcl_Release(childInterp);
diff --git a/tests/interp.test b/tests/interp.test
index d742484..31c27ac 100644
--- a/tests/interp.test
+++ b/tests/interp.test
@@ -3326,13 +3326,13 @@ test interp-34.9 {time limits trigger in blocking after} {
test interp-34.10 {time limits trigger in vwaits: Bug 1221395} -body {
set i [interp create]
# Assume someone hasn't set the clock to early 1970!
- $i limit time -seconds 1 -granularity 4
+ $i limit time -seconds [expr {[clock seconds] + 1}] -granularity 4
interp alias $i log {} lappend result
set result {}
catch {
$i eval {
log 1
- after 100
+ after 1000
log 2
}
} msg
@@ -3409,6 +3409,20 @@ test interp-34.13 {time limit granularity and vwait: Bug 2891362} -setup {
} -cleanup {
interp delete $i
} -returnCodes error -result {limit exceeded}
+test interp-34.14 {[Bug e3f4a8b78d]: interp limit and interp eval} -setup {
+ set i [interp create]
+ set result {}
+} -body {
+ $i limit command -value [$i eval {info cmdcount}]
+ catch {$i eval [list expr 1+3]} msg
+ lappend result $msg
+ catch {$i eval [list expr 1+3]} msg
+ lappend result $msg
+ catch {interp eval $i [list expr 1+3]} msg
+ lappend result $msg
+} -cleanup {
+ interp delete $i
+} -result {{command count limit exceeded} {command count limit exceeded} {command count limit exceeded}}
test interp-35.1 {interp limit syntax} -body {
interp limit