aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-24 17:08:28 +0200
committerBad Diode <bd@badd10de.dev>2021-10-24 17:08:28 +0200
commit6bfe706027f7ec83ace3b0b68de363114b68de08 (patch)
treef9e6a6ae090a1097b7c191e5d840cd0e8dab2c82
parentabdcae0f839d0bd772c5f7211cb1cb2034355b62 (diff)
downloadbdl-6bfe706027f7ec83ace3b0b68de363114b68de08.tar.gz
bdl-6bfe706027f7ec83ace3b0b68de363114b68de08.zip
Allow our jumps to be positive or negative
-rwxr-xr-xsrc/bytecode/compiler.h20
-rwxr-xr-xsrc/bytecode/debug.h2
-rwxr-xr-xsrc/bytecode/vm.h4
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
48size_t 48size_t
49emit_jump(Chunk *chunk, Token tok, Ops op) { 49emit_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
56void 56void
57patch_jump(Chunk *chunk, size_t offset) { 57patch_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
64void 64void
@@ -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 }