From 6bfe706027f7ec83ace3b0b68de363114b68de08 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 24 Oct 2021 17:08:28 +0200 Subject: Allow our jumps to be positive or negative --- src/bytecode/compiler.h | 20 ++++++++++---------- src/bytecode/debug.h | 2 +- src/bytecode/vm.h | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) (limited to 'src/bytecode') diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index c01f745..27c5ead 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h @@ -46,19 +46,19 @@ emit_constant(Chunk *chunk, Token tok, Object obj) { } size_t -emit_jump(Chunk *chunk, Token tok, Ops op) { +emit_jump(Chunk *chunk, Token tok, Ops op, ssize_t offset) { add_code(chunk, op, tok.line, tok.column); - add_code(chunk, 0xFF, tok.line, tok.column); - add_code(chunk, 0xFF, tok.line, tok.column); + add_code(chunk, ((u16)offset >> 8) & 0xFF, tok.line, tok.column); + add_code(chunk, ((u16)offset) & 0xFF, tok.line, tok.column); return array_size(chunk->code) - 2; } void -patch_jump(Chunk *chunk, size_t offset) { - size_t jump = array_size(chunk->code) - offset - 2; - assert(jump <= UINT16_MAX && "error: jump is too long"); - chunk->code[offset] = (jump >> 8) & 0xFF; - chunk->code[offset + 1] = (jump) & 0xFF; +patch_jump(Chunk *chunk, ssize_t offset) { + ssize_t jump = array_size(chunk->code) - offset - 2; + assert((u16)jump <= UINT16_MAX && "error: jump is too long"); + chunk->code[offset] = ((u16)jump >> 8) & 0xFF; + chunk->code[offset + 1] = ((u16)jump) & 0xFF; } void @@ -271,7 +271,7 @@ compile_if_op(Chunk *chunk, Visitor *vs, Token start) { // Condition. parse_tree(chunk, vs); - size_t jmp_false = emit_jump(chunk, start, OP_JUMP_IF_FALSE); + size_t jmp_false = emit_jump(chunk, start, OP_JUMP_IF_FALSE, 0xFFFF); // True expression. parse_tree(chunk, vs); @@ -284,7 +284,7 @@ compile_if_op(Chunk *chunk, Visitor *vs, Token start) { } // False expression. - size_t jmp_end = emit_jump(chunk, start, OP_JUMP); + size_t jmp_end = emit_jump(chunk, start, OP_JUMP, 0xFFFF); patch_jump(chunk, jmp_false); parse_tree(chunk, vs); patch_jump(chunk, jmp_end); diff --git a/src/bytecode/debug.h b/src/bytecode/debug.h index bc736f9..6703e68 100755 --- a/src/bytecode/debug.h +++ b/src/bytecode/debug.h @@ -80,7 +80,7 @@ disassemble_instruction(Chunk *chunk, size_t offset) { case OP_JUMP_IF_FALSE: { u16 a = chunk->code[offset + 1]; u16 b = chunk->code[offset + 2]; - u16 jmp = (a << 8) | b; + s16 jmp = (a << 8) | b; printf("%-16s %4d\n", ops_str[instruction], jmp); return offset + 3; } break; diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index ba33077..96e36de 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -199,13 +199,13 @@ vm_interpret(VM *vm, Chunk *chunk) { case OP_JUMP: { u16 a = *vm->pc++; u16 b = *vm->pc++; - u16 offset = (a << 8) | b; + s16 offset = (a << 8) | b; vm->pc += offset; } break; case OP_JUMP_IF_FALSE: { u16 a = *vm->pc++; u16 b = *vm->pc++; - u16 offset = (a << 8) | b; + s16 offset = (a << 8) | b; if (IS_FALSE(array_pop(vm->stack))) { vm->pc += offset; } -- cgit v1.2.1