summaryrefslogtreecommitdiffstats
path: root/vm.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-22 06:26:16 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-22 06:26:16 -0700
commit81e921e4089138589e317169a4e034bea4e219f5 (patch)
tree0be1c1102a22f9a2dba7bace59a95fd9e98a8ea9 /vm.c
parentdf91114e4eb29e70c982bffa3526a857b0577a64 (diff)
downloadtxr-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.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/vm.c b/vm.c
index 960dd833..b8eb2fed 100644
--- a/vm.c
+++ b/vm.c
@@ -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)