summaryrefslogtreecommitdiffstats
path: root/vm.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-26 06:34:44 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-26 06:34:44 -0700
commit5c604c752e878066c7312eba6dd72d550ceb451f (patch)
treeb2aad7078de576c32534b9d28e1f76954f398229 /vm.c
parent5897492b4cb4c906efe21246facf6f46fbcc8ff9 (diff)
downloadtxr-5c604c752e878066c7312eba6dd72d550ceb451f.tar.gz
txr-5c604c752e878066c7312eba6dd72d550ceb451f.tar.bz2
txr-5c604c752e878066c7312eba6dd72d550ceb451f.zip
compiler/vm: implement sys:abscond-from special form.
* share/txr/stdlib/asm.tl (abscsr): New instruction. (op-abscsr): New opcode class, derived from op-retsr. * share/txr/stdlib/compiler.tl: Handle sys:abscond-from via comp-return-from method. (compiler comp-return-from): Handle sys:abscond-from by switching to abscsr opcode instead of ret pseudo-op. * vm.c (vm_abscsr): New static function. (vm_execute): Dispatch ABSCSR opcode. * vmop.h: Regenerated.
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/vm.c b/vm.c
index 3b9c64ca..f36652f0 100644
--- a/vm.c
+++ b/vm.c
@@ -660,6 +660,15 @@ static void vm_retrr(struct vm *vm, vm_word_t insn)
vm_no_block_err(vm, tag);
}
+static void vm_abscsr(struct vm *vm, vm_word_t insn)
+{
+ val res = vm_get(vm->dspl, vm_insn_operand(insn));
+ val tag = vm_get(vm->dspl, vm_insn_extra(insn));
+
+ uw_block_abscond(tag, res);
+ vm_no_block_err(vm, tag);
+}
+
static void vm_catch(struct vm *vm, vm_word_t insn)
{
unsigned catch_ip = vm_insn_bigop(insn);
@@ -852,6 +861,9 @@ static val vm_execute(struct vm *vm)
case RETRR:
vm_retrr(vm, insn);
break;
+ case ABSCSR:
+ vm_abscsr(vm, insn);
+ break;
case CATCH:
vm_catch(vm, insn);
break;