summaryrefslogtreecommitdiffstats
path: root/unwind.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-04-16 06:01:04 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-04-16 06:01:04 -0700
commita9299da438d46958603801ed48d6fe1f637b69ee (patch)
treed0bcec3ef8f61696d7e779ee262f7910c986c5d3 /unwind.c
parentc68d46fb0c8c3693e6d906bbe7dc851999cb554c (diff)
downloadtxr-a9299da438d46958603801ed48d6fe1f637b69ee.tar.gz
txr-a9299da438d46958603801ed48d6fe1f637b69ee.tar.bz2
txr-a9299da438d46958603801ed48d6fe1f637b69ee.zip
Block absconds across foreign frames.
* unwind.c (uw_block_abscond): If a UW_GUARD frame occurs in the search for the abscond point, throw an error.
Diffstat (limited to 'unwind.c')
-rw-r--r--unwind.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/unwind.c b/unwind.c
index 900d614e..a521c732 100644
--- a/unwind.c
+++ b/unwind.c
@@ -435,6 +435,10 @@ val uw_block_abscond(val tag, val result)
for (ex = uw_stack; ex != 0; ex = ex->uw.up) {
if (ex->uw.type == UW_BLOCK && ex->bl.tag == tag)
break;
+ if (ex->uw.type == UW_GUARD)
+ uw_throwf(error_s, lit("~a: cannot abscond via foreign stack frames\n"),
+ prog_string, nao);
+
}
if (ex == 0)