From: cassowarii <2374677+cassowarii@users.noreply.github.com> Date: Wed, 22 Jul 2026 23:45:08 +0000 (-0700) Subject: minor changes to compile/ir X-Git-Url: https://www.git.cassowary.me/gitweb.cgi?a=commitdiff_plain;h=377e1746c9041aea291defeeb0ac1f66bdb99f8e;p=sarabande.git minor changes to compile/ir --- diff --git a/src/compile/analyze.c b/src/compile/analyze.c index 7eac78a..e3785f8 100644 --- a/src/compile/analyze.c +++ b/src/compile/analyze.c @@ -2,6 +2,7 @@ #include "parse/ast.h" #include "data/symbol.h" +#include "data/integer.h" i32 sbAst_count_pipe_underscores(sbAst node) { if (node == NULL) return 0; @@ -70,3 +71,30 @@ i32 sbAst_count_pipe_underscores(sbAst node) { PANIC("aah! (%lld)", (long long)node->type); } } + +flag sbIr_constant_fold(sbAstOp op, hInteger left, hInteger right, hInteger *result) { + switch (op) { + case AST_OP_ADD: + *result = sbInteger_sum(left, right); + break; + case AST_OP_SUB: + *result = sbInteger_diff(left, right); + break; + case AST_OP_MUL: + *result = sbInteger_mul(left, right); + break; + case AST_OP_FLDIV: + *result = sbInteger_floordiv(left, right); + break; + case AST_OP_MOD: + *result = left % right; + break; + case AST_OP_UNMINUS: + *result = -left; + break; + default: + return FALSE; + } + return TRUE; +} + diff --git a/src/compile/analyze.h b/src/compile/analyze.h index 6978779..bf3baff 100644 --- a/src/compile/analyze.h +++ b/src/compile/analyze.h @@ -2,3 +2,6 @@ struct sbAstNode; i32 sbAst_count_pipe_underscores(struct sbAstNode *node); + +enum sbAstOp; +flag sbIr_constant_fold(enum sbAstOp op, hInteger left, hInteger right, hInteger *result); diff --git a/src/compile/ir.c b/src/compile/ir.c index 232610d..8f5fc27 100644 --- a/src/compile/ir.c +++ b/src/compile/ir.c @@ -331,38 +331,12 @@ static sbIrExpr *expr_func(hIrChunk ck, sbIrChunk *func) { return e; } -static flag int_constant_fold(sbAstOp op, hInteger left, hInteger right, hInteger *result) { - switch (op) { - case AST_OP_ADD: - *result = sbInteger_sum(left, right); - break; - case AST_OP_SUB: - *result = sbInteger_diff(left, right); - break; - case AST_OP_MUL: - *result = sbInteger_mul(left, right); - break; - case AST_OP_FLDIV: - *result = sbInteger_floordiv(left, right); - break; - case AST_OP_MOD: - *result = left % right; - break; - case AST_OP_UNMINUS: - *result = -left; - break; - default: - return FALSE; - } - return TRUE; -} - static sbIrExpr *expr_op(hIrChunk ck, sbAstOp op, sbIrExpr *left, sbIrExpr *right) { if (left->type == IR_E_VALUE && left->value.type == IT_INTEGER && (!right || (right->type == IR_E_VALUE && right->value.type == IT_INTEGER))) { /* Try constant folding */ hInteger result; - flag folded = int_constant_fold(op, left->value.integer, right ? right->value.integer : 0, &result); + flag folded = sbIr_constant_fold(op, left->value.integer, right ? right->value.integer : 0, &result); if (folded) { return new_expr(ck, &(sbIrExpr) { .type = IR_E_VALUE, @@ -966,7 +940,7 @@ static sbIrExpr *compile_ast_binding(hIrChunk ck, sbAst node, flag should_create return expr_op(ck, AST_OP_REF, ref_to, NULL); } else { chunk_error(ck, "cannot destructure into a `&<...>`"); - return NULL; + return NIL_EXPR; } } else if (node->type == AST_NODE_OP) { sbIrExpr *left = NULL, *right = NULL;