diff options
| author | Mustafa Quraish <[email protected]> | 2022-02-05 05:50:27 -0500 |
|---|---|---|
| committer | Mustafa Quraish <[email protected]> | 2022-02-05 08:56:15 -0500 |
| commit | 458b29b9537e1d283d74a74fab3a34113b20f1f2 (patch) | |
| tree | 1b322f2468af5b421bdf68c7fe7077c9d9c76bf0 | |
| parent | Add `lseek` and `mmap` syscall info (diff) | |
| download | cup-458b29b9537e1d283d74a74fab3a34113b20f1f2.tar.xz cup-458b29b9537e1d283d74a74fab3a34113b20f1f2.zip | |
Fix label counts during code generation for `||` and `&&`
| -rw-r--r-- | src/generator.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/src/generator.c b/src/generator.c index d380f36..0b3bc4b 100644 --- a/src/generator.c +++ b/src/generator.c @@ -279,34 +279,34 @@ void generate_expr_into_rax(Node *expr, FILE *out) // Note: These are different because of short-circuit evaluation! } else if (expr->type == OP_OR) { + int cur_label = label_counter++; generate_expr_into_rax(expr->binary.left, out); // If left is true, we can short-circuit fprintf(out, " cmp rax, 0\n"); - fprintf(out, " je .or_right_%d\n", label_counter); + fprintf(out, " je .or_right_%d\n", cur_label); fprintf(out, " mov rax, 1\n"); - fprintf(out, " jmp .or_end_%d\n", label_counter); - fprintf(out, ".or_right_%d:\n", label_counter); + fprintf(out, " jmp .or_end_%d\n", cur_label); + fprintf(out, ".or_right_%d:\n", cur_label); generate_expr_into_rax(expr->binary.right, out); // Booleanize the result fprintf(out, " cmp rax, 0\n"); fprintf(out, " setne al\n"); - fprintf(out, ".or_end_%d:\n", label_counter); - label_counter++; + fprintf(out, ".or_end_%d:\n", cur_label); } else if (expr->type == OP_AND) { + int cur_label = label_counter++; generate_expr_into_rax(expr->binary.left, out); // If left is false, we can short-circuit fprintf(out, " cmp rax, 0\n"); - fprintf(out, " jne .and_right_%d\n", label_counter); + fprintf(out, " jne .and_right_%d\n", cur_label); fprintf(out, " mov rax, 0\n"); - fprintf(out, " jmp .and_end_%d\n", label_counter); - fprintf(out, ".and_right_%d:\n", label_counter); + fprintf(out, " jmp .and_end_%d\n", cur_label); + fprintf(out, ".and_right_%d:\n", cur_label); generate_expr_into_rax(expr->binary.right, out); // Booleanize the result fprintf(out, " cmp rax, 0\n"); fprintf(out, " setne al\n"); - fprintf(out, ".and_end_%d:\n", label_counter); - label_counter++; + fprintf(out, ".and_end_%d:\n", cur_label); } else if (expr->type == AST_CONDITIONAL) { int cur_label = label_counter++; |