From 13f795f8f8aa302ee36ca3974fb80dba29240240 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 23 Oct 2021 15:32:40 +0200 Subject: Add more types and access macros --- src/bytecode/compiler.h | 2 +- src/bytecode/debug.h | 2 +- src/bytecode/main.c | 4 +-- src/bytecode/objects.h | 81 ++++++++++++++++++++++++++++++++++++++++++++++--- src/bytecode/vm.h | 70 +++++++++++++++++++++--------------------- 5 files changed, 115 insertions(+), 44 deletions(-) (limited to 'src') diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index ae8fac1..e48a173 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h @@ -52,7 +52,7 @@ parse_fixnum(Chunk *chunk, Token tok) { } num = num * 10 + (c - '0'); } - emit_constant(chunk, tok, num * sign); + emit_constant(chunk, tok, FIXNUM_VAL(num * sign)); } void parse_tree(Chunk *chunk, Visitor *vs); diff --git a/src/bytecode/debug.h b/src/bytecode/debug.h index 25ac693..42b5b93 100755 --- a/src/bytecode/debug.h +++ b/src/bytecode/debug.h @@ -17,7 +17,7 @@ disassemble_chunk(Chunk *chunk, const char *name) { printf("\nconstants:\n"); offset = 0; while (offset < array_size(chunk->constants)) { - printf("\t%04ld -> ", offset); + printf("\t%03ld -> ", offset); display(chunk->constants[offset]); printf("\n"); offset++; diff --git a/src/bytecode/main.c b/src/bytecode/main.c index d6cb5d3..bad150c 100755 --- a/src/bytecode/main.c +++ b/src/bytecode/main.c @@ -49,9 +49,9 @@ process_source(const StringView *source) { } // Interpret chunk. - vm_interpret(vm, chunk); + vm_interpret(&vm, chunk); if (errors_n != 0) { - disassemble_chunk(vm.chunk, "test chunk"); + disassemble_chunk(vm.chunk, "current chunk"); } chunk_free(chunk); diff --git a/src/bytecode/objects.h b/src/bytecode/objects.h index 9bfa2cf..a25b0b1 100755 --- a/src/bytecode/objects.h +++ b/src/bytecode/objects.h @@ -2,26 +2,97 @@ #define BDL_OBJECTS_H typedef enum ObjectType { - OBJ_TYPE_FIXNUM, - OBJ_TYPE_BOOL, OBJ_TYPE_NIL, + OBJ_TYPE_TRUE, + OBJ_TYPE_FALSE, + OBJ_TYPE_FIXNUM, OBJ_TYPE_SYMBOL, OBJ_TYPE_STRING, OBJ_TYPE_PAIR, - OBJ_TYPE_PROCEDURE, OBJ_TYPE_LAMBDA, OBJ_TYPE_ERR, } ObjectType; struct Environment; -typedef s64 Object; +typedef struct Object { + ObjectType type; + bool marked; + union { + // OBJ_TYPE_FIXNUM + ssize_t fixnum; + + // OBJ_TYPE_STRING + // OBJ_TYPE_SYMBOL + // struct { + // char *text; + // }; + + // OBJ_TYPE_PAIR + // struct { + // struct Object *car; + // struct Object *cdr; + // }; + + // OBJ_TYPE_LAMBDA + // struct { + // struct Object *params; + // struct Object *body; + // struct Environment *env; + // }; + }; +} Object; void display(Object obj); +// Value initialization. +#define NIL_VAL ((Object){.type = OBJ_TYPE_NIL}) +#define TRUE_VAL ((Object){.type = OBJ_TYPE_TRUE}) +#define FALSE_VAL ((Object){.type = OBJ_TYPE_FALSE}) +#define FIXNUM_VAL(VAL) ((Object){.type = OBJ_TYPE_FIXNUM, .fixnum = VAL}) + +// Value extraction. +#define AS_FIXNUM(VAL) ((VAL).fixnum) + +// Type checking. +#define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) +#define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) +#define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) + void display(Object obj) { - printf("%ld", obj); + switch (obj.type) { + case OBJ_TYPE_FIXNUM: { + printf("%zd", obj.fixnum); + } break; + case OBJ_TYPE_TRUE: { + printf("true"); + } break; + case OBJ_TYPE_FALSE: { + printf("false"); + } break; + case OBJ_TYPE_NIL: { + printf("()"); + } break; + case OBJ_TYPE_STRING: { + // printf("\"%.*s\"", (int)array_size(obj.string), obj.string); + } break; + case OBJ_TYPE_SYMBOL: { + // printf(":%.*s", (int)array_size(obj.symbol), obj.symbol); + } break; + case OBJ_TYPE_PAIR: { + // printf("("); + // display_pair(obj); + // printf(")"); + } break; + case OBJ_TYPE_LAMBDA: { + printf("#{procedure}"); + } break; + case OBJ_TYPE_ERR: { + printf("#{error}"); + } break; + } + return; } #endif // BDL_OBJECTS_H diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 3a9b5af..581f093 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -21,7 +21,7 @@ typedef struct VM { void vm_init(VM *vm); void vm_free(VM *vm); void vm_reset(VM *vm); -void vm_interpret(VM vm, Chunk *chunk); +void vm_interpret(VM *vm, Chunk *chunk); void vm_init(VM *vm) { @@ -41,11 +41,11 @@ vm_reset(VM *vm) { } void -vm_interpret(VM vm, Chunk *chunk) { - vm.chunk = chunk; - vm.pc = vm.chunk->code; +vm_interpret(VM *vm, Chunk *chunk) { + vm->chunk = chunk; + vm->pc = vm->chunk->code; - if (vm.chunk->code == NULL || array_size(vm.chunk->code) == 0) { + if (vm->chunk->code == NULL || array_size(vm->chunk->code) == 0) { error_push((Error){ .type = ERR_TYPE_RUNTIME, .value = ERR_EMPTY_CHUNK, @@ -53,53 +53,53 @@ vm_interpret(VM vm, Chunk *chunk) { return; } - u8 *last = vm.chunk->code + array_size(vm.chunk->code); - while (vm.pc < last) { + u8 *last = vm->chunk->code + array_size(vm->chunk->code); + while (vm->pc < last) { #ifdef DEBUG_TRACE_EXECUTION printf("stack: [ "); - for (size_t i = 0; i < array_size(vm.stack); i++) { - display(vm.stack[i]); - if (i < array_size(vm.stack) - 1) { + for (size_t i = 0; i < array_size(vm->stack); i++) { + display(vm->stack[i]); + if (i < array_size(vm->stack) - 1) { printf(" | "); } } printf(" ]\nop: "); - disassemble_instruction(vm.chunk, (vm.pc - vm.chunk->code)); + disassemble_instruction(vm->chunk, (vm->pc - vm->chunk->code)); #endif - u8 instruction = *vm.pc++; + u8 instruction = *vm->pc++; switch (instruction) { case OP_CONSTANT: { - u8 constant = *vm.pc++; - Object obj = vm.chunk->constants[constant]; - array_push(vm.stack, obj); + u8 constant = *vm->pc++; + Object obj = vm->chunk->constants[constant]; + array_push(vm->stack, obj); } break; case OP_SUM: { - Object a = array_pop(vm.stack); - Object b = array_pop(vm.stack); - array_push(vm.stack, a + b); + 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: { - Object a = array_pop(vm.stack); - Object b = array_pop(vm.stack); - array_push(vm.stack, b - a); + 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: { - Object a = array_pop(vm.stack); - Object b = array_pop(vm.stack); - array_push(vm.stack, a * b); + 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: { - Object a = array_pop(vm.stack); - Object b = array_pop(vm.stack); - array_push(vm.stack, b / a); + 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: { - Object a = array_pop(vm.stack); - Object b = array_pop(vm.stack); - array_push(vm.stack, a % b); + 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_RETURN: { - display(array_pop(vm.stack)); + display(array_pop(vm->stack)); printf("\n"); return; } break; @@ -107,8 +107,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; @@ -118,8 +118,8 @@ vm_interpret(VM vm, Chunk *chunk) { error_push((Error){ .type = ERR_TYPE_RUNTIME, .value = ERR_PC_OOB, - .line = vm.chunk->lines[0].line, - .col = vm.chunk->lines[0].col, + .line = vm->chunk->lines[0].line, + .col = vm->chunk->lines[0].col, }); } -- cgit v1.2.1