diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-22 06:26:16 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-22 06:26:16 -0700 |
commit | 81e921e4089138589e317169a4e034bea4e219f5 (patch) | |
tree | 0be1c1102a22f9a2dba7bace59a95fd9e98a8ea9 /vm.c | |
parent | df91114e4eb29e70c982bffa3526a857b0577a64 (diff) | |
download | txr-81e921e4089138589e317169a4e034bea4e219f5.tar.gz txr-81e921e4089138589e317169a4e034bea4e219f5.tar.bz2 txr-81e921e4089138589e317169a4e034bea4e219f5.zip |
vm: ret instructions: throw error if block not found.
* vm.c (vm_no_block_err): New static function.
(vm_retsr, vm_retrs, vm_retrr): Call vm_no_block_err if
uw_block_return returns.
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 14 |
1 files changed, 14 insertions, 0 deletions
@@ -617,6 +617,17 @@ static void vm_block(struct vm *vm, vm_word_t insn) vm->lev = saved_lev; } +static void vm_no_block_err(struct vm *vm, val name) +{ + if (name) + eval_error(vm->vd->bytecode, + lit("return-from: no block named ~s is visible"), + name, nao); + else + eval_error(vm->vd->bytecode, + lit("return: no anonymous block is visible"), + name, nao); +} static void vm_retsr(struct vm *vm, vm_word_t insn) { @@ -624,6 +635,7 @@ static void vm_retsr(struct vm *vm, vm_word_t insn) val tag = vm_get(vm->dspl, vm_insn_extra(insn)); uw_block_return(tag, res); + vm_no_block_err(vm, tag); } static void vm_retrs(struct vm *vm, vm_word_t insn) @@ -632,6 +644,7 @@ static void vm_retrs(struct vm *vm, vm_word_t insn) val tag = vm_get(vm->dspl, vm_insn_operand(insn)); uw_block_return(tag, res); + vm_no_block_err(vm, tag); } static void vm_retrr(struct vm *vm, vm_word_t insn) @@ -641,6 +654,7 @@ static void vm_retrr(struct vm *vm, vm_word_t insn) val tag = vm_get(vm->dspl, vm_arg_operand_lo(arg)); uw_block_return(tag, res); + vm_no_block_err(vm, tag); } static void vm_catch(struct vm *vm, vm_word_t insn) |