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 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src/bytecode/compiler.h') 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); -- cgit v1.2.1