aboutsummaryrefslogtreecommitdiff
path: root/src/runtime.c
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2023-10-21 23:31:48 +0100
committerAryadev Chavali <aryadev@aryadevchavali.com>2023-10-21 23:31:48 +0100
commitd2cdb211b2d15c3a15b15737645f2a68641f34ee (patch)
treef85d83d700e7cdffd57219a345abc3a687419712 /src/runtime.c
parent1c2de9a926924a5eaf5000b695fdb33ad5664da1 (diff)
downloadovm-d2cdb211b2d15c3a15b15737645f2a68641f34ee.tar.gz
ovm-d2cdb211b2d15c3a15b15737645f2a68641f34ee.tar.bz2
ovm-d2cdb211b2d15c3a15b15737645f2a68641f34ee.zip
Added vm_execute_all which executes an entire program
Handles OP_HALT
Diffstat (limited to 'src/runtime.c')
-rw-r--r--src/runtime.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/runtime.c b/src/runtime.c
index 218bba7..57101e0 100644
--- a/src/runtime.c
+++ b/src/runtime.c
@@ -50,6 +50,10 @@ void vm_execute(vm_t *vm)
vm->registers.ret = d.as_word; // will do type punning for me
prog->ptr++;
}
+ else if (instruction.opcode == OP_HALT)
+ {
+ // Do nothing here. Should be caught by callers of vm_execute
+ }
else
{
// TODO: Error (Unknown opcode)
@@ -57,6 +61,13 @@ void vm_execute(vm_t *vm)
}
}
+void vm_execute_all(vm_t *vm)
+{
+ struct Program *program = &vm->program;
+ while (program->instructions[program->ptr].opcode != OP_HALT)
+ vm_execute(vm);
+}
+
void vm_load_stack(vm_t *vm, byte *bytes, size_t size)
{
vm->stack.data = bytes;