aboutsummaryrefslogtreecommitdiff
path: root/src/tilde_expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tilde_expr.cpp')
-rw-r--r--src/tilde_expr.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/tilde_expr.cpp b/src/tilde_expr.cpp
new file mode 100644
index 000000000..3fa084e1a
--- /dev/null
+++ b/src/tilde_expr.cpp
@@ -0,0 +1,68 @@
+gb_internal cgValue cg_build_expr_internal(cgProcedure *p, Ast *expr);
+gb_internal cgValue cg_build_expr(cgProcedure *p, Ast *expr) {
+ u16 prev_state_flags = p->state_flags;
+ defer (p->state_flags = prev_state_flags);
+
+ if (expr->state_flags != 0) {
+ u16 in = expr->state_flags;
+ u16 out = p->state_flags;
+
+ if (in & StateFlag_bounds_check) {
+ out |= StateFlag_bounds_check;
+ out &= ~StateFlag_no_bounds_check;
+ } else if (in & StateFlag_no_bounds_check) {
+ out |= StateFlag_no_bounds_check;
+ out &= ~StateFlag_bounds_check;
+ }
+
+ if (in & StateFlag_type_assert) {
+ out |= StateFlag_type_assert;
+ out &= ~StateFlag_no_type_assert;
+ } else if (in & StateFlag_no_type_assert) {
+ out |= StateFlag_no_type_assert;
+ out &= ~StateFlag_type_assert;
+ }
+
+ p->state_flags = out;
+ }
+
+
+ // IMPORTANT NOTE(bill):
+ // Selector Call Expressions (foo->bar(...))
+ // must only evaluate `foo` once as it gets transformed into
+ // `foo.bar(foo, ...)`
+ // And if `foo` is a procedure call or something more complex, storing the value
+ // once is a very good idea
+ // If a stored value is found, it must be removed from the cache
+ if (expr->state_flags & StateFlag_SelectorCallExpr) {
+ // cgValue *pp = map_get(&p->selector_values, expr);
+ // if (pp != nullptr) {
+ // cgValue res = *pp;
+ // map_remove(&p->selector_values, expr);
+ // return res;
+ // }
+ // cgAddr *pa = map_get(&p->selector_addr, expr);
+ // if (pa != nullptr) {
+ // cgAddr res = *pa;
+ // map_remove(&p->selector_addr, expr);
+ // return cg_addr_load(p, res);
+ // }
+ }
+
+ cgValue res = cg_build_expr_internal(p, expr);
+
+ if (expr->state_flags & StateFlag_SelectorCallExpr) {
+ // map_set(&p->selector_values, expr, res);
+ }
+ return res;
+}
+
+
+gb_internal cgValue cg_build_expr_internal(cgProcedure *p, Ast *expr) {
+ return {};
+}
+
+
+gb_internal cgAddr cg_build_addr(cgProcedure *p, Ast *expr) {
+ return {};
+}