diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-26 06:34:44 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-26 06:34:44 -0700 |
commit | 5c604c752e878066c7312eba6dd72d550ceb451f (patch) | |
tree | b2aad7078de576c32534b9d28e1f76954f398229 /vm.c | |
parent | 5897492b4cb4c906efe21246facf6f46fbcc8ff9 (diff) | |
download | txr-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.c | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -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; |