about summary refs log tree commit diff
path: root/boot/visit/ir.c
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2026-05-26 00:50:09 +0200
committerMel <mel@rnrd.eu>2026-05-26 00:50:09 +0200
commit900b412b052a0f745f0853d6703e4bafbb0a3ce5 (patch)
treee04b65b395d4761e5b88fa1e9a792c3996ff3dc1 /boot/visit/ir.c
parente8400cc704eeb74f3c464f7a0822c556cb52e3fd (diff)
downloadcatskill-900b412b052a0f745f0853d6703e4bafbb0a3ce5.tar.zst
catskill-900b412b052a0f745f0853d6703e4bafbb0a3ce5.zip
Lambda function emission, thin/fat calling conventions for (future) closed-over state
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'boot/visit/ir.c')
-rw-r--r--boot/visit/ir.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/boot/visit/ir.c b/boot/visit/ir.c
index 036307f..fa17d9c 100644
--- a/boot/visit/ir.c
+++ b/boot/visit/ir.c
@@ -63,6 +63,7 @@ struct Visit_Table
     void (*visit_expression_cast)(struct Visit* visitor, struct Expression* expr);
     void (*visit_expression_construct)(struct Visit* visitor, struct Expression* expr);
     void (*visit_expression_increment_decrement)(struct Visit* visitor, struct Expression* expr);
+    void (*visit_expression_function_ref)(struct Visit* visitor, struct Expression* expr);
 
     void (*visit_block)(struct Visit* visitor, struct Block* block);
     void (*visit_type_ref)(struct Visit* visitor, struct Type_Ref* ref);
@@ -289,6 +290,9 @@ walk_expression(struct Visit* visit, struct Expression* expr)
     case EXPRESSION_INCREMENT_DECREMENT:
         VISIT(visit_expression_increment_decrement, expr);
         break;
+    case EXPRESSION_FUNCTION_REF:
+        VISIT(visit_expression_function_ref, expr);
+        break;
     case EXPRESSION_NONE:
         break;
     default:
@@ -362,6 +366,8 @@ walk_expression_increment_decrement(struct Visit* visit, struct Expression* expr
     VISIT(visit_expression, expr->value.increment_decrement.subject);
 }
 
+WALK_LEAF_FUNCTION(walk_expression_function_ref, struct Expression*);
+
 void
 walk_block(struct Visit* visit, struct Block* block)
 {
@@ -413,6 +419,7 @@ struct Visit_Table walk_functions = {
     .visit_expression_cast = walk_expression_cast,
     .visit_expression_construct = walk_expression_construct,
     .visit_expression_increment_decrement = walk_expression_increment_decrement,
+    .visit_expression_function_ref = walk_expression_function_ref,
 
     .visit_block = walk_block,
     .visit_type_ref = walk_type_ref,
@@ -943,6 +950,16 @@ printer_visit_expression_increment_decrement(struct Visit* visit, struct Express
 }
 
 void
+printer_visit_expression_function_ref(struct Visit* visit, struct Expression* expr)
+{
+    PRINTER_PREAMBLE
+
+    struct Function* fn = *array_at(
+        struct Function*, &p->unit->functions.entries, expr->value.function_ref.function_id);
+    PRINT("(fn-ref %s)", string_c_str(fn->name));
+}
+
+void
 printer_visit_block(struct Visit* visit, struct Block* block)
 {
     PRINTER_PREAMBLE
@@ -1080,6 +1097,7 @@ struct Visit_Table printer_visit_functions = {
     .visit_expression_cast = printer_visit_expression_cast,
     .visit_expression_construct = printer_visit_expression_construct,
     .visit_expression_increment_decrement = printer_visit_expression_increment_decrement,
+    .visit_expression_function_ref = printer_visit_expression_function_ref,
 
     .visit_block = printer_visit_block,
     .visit_type_ref = printer_visit_type_ref,