From c3fe9367986520b08a36bf693e6c74eb309377c5 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 23 Oct 2021 16:00:11 +0200 Subject: Cleanup macros for arithmetic ops --- src/bytecode/compiler.h | 16 +++----------- src/bytecode/darray.h | 3 +++ src/bytecode/vm.h | 55 +++++++++++++++++++++++++------------------------ 3 files changed, 34 insertions(+), 40 deletions(-) (limited to 'src/bytecode') diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index e48a173..fd5cdbc 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h @@ -128,11 +128,11 @@ parse_tree(Chunk *chunk, Visitor *vs) { return ; } break; case TOKEN_TRUE: { - // return obj_true; + emit_constant(chunk, tok, TRUE_VAL); return; } break; case TOKEN_FALSE: { - // return obj_false; + emit_constant(chunk, tok, FALSE_VAL); return; } break; case TOKEN_RPAREN: { @@ -158,16 +158,6 @@ parse_tree(Chunk *chunk, Visitor *vs) { } break; case TOKEN_LPAREN: { parse_list(chunk, vs, tok); - // Object *obj = parse_list(vs); - // if (obj == obj_err) { - // error_push((Error){ - // .type = ERR_TYPE_COMPILER, - // .value = ERR_UNBALANCED_PAREN, - // .line = tok.line, - // .col = tok.column, - // }); - // } - // return obj; return; } break; case TOKEN_STRING: { @@ -184,7 +174,7 @@ parse_tree(Chunk *chunk, Visitor *vs) { return; } break; case TOKEN_NIL: { - // return obj_nil; + emit_constant(chunk, tok, NIL_VAL); return; } break; default: { diff --git a/src/bytecode/darray.h b/src/bytecode/darray.h index db6234d..e8cdc36 100755 --- a/src/bytecode/darray.h +++ b/src/bytecode/darray.h @@ -25,6 +25,9 @@ typedef struct ArrayHeader { // Return the last element of the array. Can be used to build stacks. #define array_pop(ARR) (ARR)[--array_head(ARR)->size] +// Return the value stored at the OFFSET position from the tail of the array. +#define array_peek(ARR, OFFSET) (ARR)[array_head(ARR)->size - 1 - (OFFSET)] + // Insert N bytes from the SRC array into the ARR dynamic array. #define array_insert(ARR, SRC, N) \ ((ARR) = _array_insert(ARR, SRC, N, sizeof(*(ARR)))) diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 581f093..9b68fc1 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -40,6 +40,25 @@ vm_reset(VM *vm) { vm_init(vm); } +// Helper macros for a more clear VM switch. +#define FIXNUM_BINARY_OP(OP) \ + do { \ + Object a = array_pop(vm->stack); \ + Object b = array_pop(vm->stack); \ + if (!IS_FIXNUM(a) || !IS_FIXNUM(b)) { \ + error_push((Error){ \ + .type = ERR_TYPE_RUNTIME, \ + .value = ERR_WRONG_ARG_TYPE, \ + .line = vm->chunk->lines[vm->pc - vm->chunk->code - 1].line, \ + .col = vm->chunk->lines[vm->pc - vm->chunk->code - 1].col, \ + }); \ + return; \ + } \ + ssize_t x = AS_FIXNUM(a); \ + ssize_t y = AS_FIXNUM(b); \ + array_push(vm->stack, FIXNUM_VAL(y OP x)); \ + } while (false) + void vm_interpret(VM *vm, Chunk *chunk) { vm->chunk = chunk; @@ -73,31 +92,11 @@ vm_interpret(VM *vm, Chunk *chunk) { Object obj = vm->chunk->constants[constant]; array_push(vm->stack, obj); } break; - case OP_SUM: { - ssize_t a = AS_FIXNUM(array_pop(vm->stack)); - ssize_t b = AS_FIXNUM(array_pop(vm->stack)); - array_push(vm->stack, FIXNUM_VAL(a + b)); - } break; - case OP_SUB: { - ssize_t a = AS_FIXNUM(array_pop(vm->stack)); - ssize_t b = AS_FIXNUM(array_pop(vm->stack)); - array_push(vm->stack, FIXNUM_VAL(b - a)); - } break; - case OP_MUL: { - ssize_t a = AS_FIXNUM(array_pop(vm->stack)); - ssize_t b = AS_FIXNUM(array_pop(vm->stack)); - array_push(vm->stack, FIXNUM_VAL(a * b)); - } break; - case OP_DIV: { - ssize_t a = AS_FIXNUM(array_pop(vm->stack)); - ssize_t b = AS_FIXNUM(array_pop(vm->stack)); - array_push(vm->stack, FIXNUM_VAL(b / a)); - } break; - case OP_MOD: { - ssize_t a = AS_FIXNUM(array_pop(vm->stack)); - ssize_t b = AS_FIXNUM(array_pop(vm->stack)); - array_push(vm->stack, FIXNUM_VAL(a % b)); - } break; + case OP_SUM: { FIXNUM_BINARY_OP(+); } break; + case OP_SUB: { FIXNUM_BINARY_OP(-); } break; + case OP_MUL: { FIXNUM_BINARY_OP(*); } break; + case OP_DIV: { FIXNUM_BINARY_OP(/); } break; + case OP_MOD: { FIXNUM_BINARY_OP(%); } break; case OP_RETURN: { display(array_pop(vm->stack)); printf("\n"); @@ -107,8 +106,8 @@ vm_interpret(VM *vm, Chunk *chunk) { error_push((Error){ .type = ERR_TYPE_RUNTIME, .value = ERR_NOT_IMPLEMENTED, - .line = vm->chunk->lines[(vm->pc - vm->chunk->code) - 1].line, - .col = vm->chunk->lines[(vm->pc - vm->chunk->code) - 1].col, + .line = vm->chunk->lines[vm->pc - vm->chunk->code - 1].line, + .col = vm->chunk->lines[vm->pc - vm->chunk->code - 1].col, }); return; } break; @@ -123,4 +122,6 @@ vm_interpret(VM *vm, Chunk *chunk) { }); } +#undef FIXNUM_BINARY_OP + #endif // BDL_VM_H -- cgit v1.2.1