summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-09-08 07:08:14 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-09-08 07:08:14 -0700
commitde13bcb2991b62a3703532cd3a1cc9a8da4df8ac (patch)
treed4788450a917cb457bcc3de2ae8849275d284dfb /lib.c
parent94d029b0f24756b84a94ce2b3f8fd5739166b0c5 (diff)
downloadtxr-de13bcb2991b62a3703532cd3a1cc9a8da4df8ac.tar.gz
txr-de13bcb2991b62a3703532cd3a1cc9a8da4df8ac.tar.bz2
txr-de13bcb2991b62a3703532cd3a1cc9a8da4df8ac.zip
Allow runaway lazy list computation to be interrupted.
* lib.c (car, cdr, car_l, cdr_l): Check for signal before calling forcing function of a lazy cons.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/lib.c b/lib.c
index e93a73fb..d31a06bb 100644
--- a/lib.c
+++ b/lib.c
@@ -284,6 +284,7 @@ val car(val cons)
if (cons->lc.func == nil) {
return cons->lc.car;
} else {
+ sig_check_fast();
funcall1(cons->lc.func, cons);
cons->lc.func = nil;
return cons->lc.car;
@@ -314,6 +315,7 @@ val cdr(val cons)
if (cons->lc.func == nil) {
return cons->lc.cdr;
} else {
+ sig_check_fast();
funcall1(cons->lc.func, cons);
cons->lc.func = nil;
return cons->lc.cdr;
@@ -387,6 +389,7 @@ loc car_l(val cons)
return mkloc(cons->c.car, cons);
case LCONS:
if (cons->lc.func) {
+ sig_check_fast();
funcall1(cons->lc.func, cons);
cons->lc.func = nil;
}
@@ -403,6 +406,7 @@ loc cdr_l(val cons)
return mkloc(cons->c.cdr, cons);
case LCONS:
if (cons->lc.func) {
+ sig_check_fast();
funcall1(cons->lc.func, cons);
cons->lc.func = nil;
}