diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-24 17:08:28 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-24 17:08:28 +0200 |
commit | 6bfe706027f7ec83ace3b0b68de363114b68de08 (patch) | |
tree | f9e6a6ae090a1097b7c191e5d840cd0e8dab2c82 /src/bytecode/compiler.h | |
parent | abdcae0f839d0bd772c5f7211cb1cb2034355b62 (diff) | |
download | bdl-6bfe706027f7ec83ace3b0b68de363114b68de08.tar.gz bdl-6bfe706027f7ec83ace3b0b68de363114b68de08.zip |
Allow our jumps to be positive or negative
Diffstat (limited to 'src/bytecode/compiler.h')
-rwxr-xr-x | src/bytecode/compiler.h | 20 |
1 files changed, 10 insertions, 10 deletions
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) { | |||
46 | } | 46 | } |
47 | 47 | ||
48 | size_t | 48 | size_t |
49 | emit_jump(Chunk *chunk, Token tok, Ops op) { | 49 | emit_jump(Chunk *chunk, Token tok, Ops op, ssize_t offset) { |
50 | add_code(chunk, op, tok.line, tok.column); | 50 | add_code(chunk, op, tok.line, tok.column); |
51 | add_code(chunk, 0xFF, tok.line, tok.column); | 51 | add_code(chunk, ((u16)offset >> 8) & 0xFF, tok.line, tok.column); |
52 | add_code(chunk, 0xFF, tok.line, tok.column); | 52 | add_code(chunk, ((u16)offset) & 0xFF, tok.line, tok.column); |
53 | return array_size(chunk->code) - 2; | 53 | return array_size(chunk->code) - 2; |
54 | } | 54 | } |
55 | 55 | ||
56 | void | 56 | void |
57 | patch_jump(Chunk *chunk, size_t offset) { | 57 | patch_jump(Chunk *chunk, ssize_t offset) { |
58 | size_t jump = array_size(chunk->code) - offset - 2; | 58 | ssize_t jump = array_size(chunk->code) - offset - 2; |
59 | assert(jump <= UINT16_MAX && "error: jump is too long"); | 59 | assert((u16)jump <= UINT16_MAX && "error: jump is too long"); |
60 | chunk->code[offset] = (jump >> 8) & 0xFF; | 60 | chunk->code[offset] = ((u16)jump >> 8) & 0xFF; |
61 | chunk->code[offset + 1] = (jump) & 0xFF; | 61 | chunk->code[offset + 1] = ((u16)jump) & 0xFF; |
62 | } | 62 | } |
63 | 63 | ||
64 | void | 64 | void |
@@ -271,7 +271,7 @@ compile_if_op(Chunk *chunk, Visitor *vs, Token start) { | |||
271 | 271 | ||
272 | // Condition. | 272 | // Condition. |
273 | parse_tree(chunk, vs); | 273 | parse_tree(chunk, vs); |
274 | size_t jmp_false = emit_jump(chunk, start, OP_JUMP_IF_FALSE); | 274 | size_t jmp_false = emit_jump(chunk, start, OP_JUMP_IF_FALSE, 0xFFFF); |
275 | 275 | ||
276 | // True expression. | 276 | // True expression. |
277 | parse_tree(chunk, vs); | 277 | parse_tree(chunk, vs); |
@@ -284,7 +284,7 @@ compile_if_op(Chunk *chunk, Visitor *vs, Token start) { | |||
284 | } | 284 | } |
285 | 285 | ||
286 | // False expression. | 286 | // False expression. |
287 | size_t jmp_end = emit_jump(chunk, start, OP_JUMP); | 287 | size_t jmp_end = emit_jump(chunk, start, OP_JUMP, 0xFFFF); |
288 | patch_jump(chunk, jmp_false); | 288 | patch_jump(chunk, jmp_false); |
289 | parse_tree(chunk, vs); | 289 | parse_tree(chunk, vs); |
290 | patch_jump(chunk, jmp_end); | 290 | patch_jump(chunk, jmp_end); |