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 | |
parent | abdcae0f839d0bd772c5f7211cb1cb2034355b62 (diff) | |
download | bdl-6bfe706027f7ec83ace3b0b68de363114b68de08.tar.gz bdl-6bfe706027f7ec83ace3b0b68de363114b68de08.zip |
Allow our jumps to be positive or negative
-rwxr-xr-x | src/bytecode/compiler.h | 20 | ||||
-rwxr-xr-x | src/bytecode/debug.h | 2 | ||||
-rwxr-xr-x | src/bytecode/vm.h | 4 |
3 files changed, 13 insertions, 13 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); |
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) { | |||
80 | case OP_JUMP_IF_FALSE: { | 80 | case OP_JUMP_IF_FALSE: { |
81 | u16 a = chunk->code[offset + 1]; | 81 | u16 a = chunk->code[offset + 1]; |
82 | u16 b = chunk->code[offset + 2]; | 82 | u16 b = chunk->code[offset + 2]; |
83 | u16 jmp = (a << 8) | b; | 83 | s16 jmp = (a << 8) | b; |
84 | printf("%-16s %4d\n", ops_str[instruction], jmp); | 84 | printf("%-16s %4d\n", ops_str[instruction], jmp); |
85 | return offset + 3; | 85 | return offset + 3; |
86 | } break; | 86 | } 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) { | |||
199 | case OP_JUMP: { | 199 | case OP_JUMP: { |
200 | u16 a = *vm->pc++; | 200 | u16 a = *vm->pc++; |
201 | u16 b = *vm->pc++; | 201 | u16 b = *vm->pc++; |
202 | u16 offset = (a << 8) | b; | 202 | s16 offset = (a << 8) | b; |
203 | vm->pc += offset; | 203 | vm->pc += offset; |
204 | } break; | 204 | } break; |
205 | case OP_JUMP_IF_FALSE: { | 205 | case OP_JUMP_IF_FALSE: { |
206 | u16 a = *vm->pc++; | 206 | u16 a = *vm->pc++; |
207 | u16 b = *vm->pc++; | 207 | u16 b = *vm->pc++; |
208 | u16 offset = (a << 8) | b; | 208 | s16 offset = (a << 8) | b; |
209 | if (IS_FALSE(array_pop(vm->stack))) { | 209 | if (IS_FALSE(array_pop(vm->stack))) { |
210 | vm->pc += offset; | 210 | vm->pc += offset; |
211 | } | 211 | } |