about summary refs log tree commit diff
path: root/boot/visit
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2026-05-26 04:15:12 +0200
committerMel <mel@rnrd.eu>2026-05-26 04:15:12 +0200
commitbf82cbd2a7d4e234313e253cb6f7dd351b2c5c5a (patch)
tree42dcf198deee1dae3c9b3586dc37e6dd23938244 /boot/visit
parent900b412b052a0f745f0853d6703e4bafbb0a3ce5 (diff)
downloadcatskill-bf82cbd2a7d4e234313e253cb6f7dd351b2c5c5a.tar.zst
catskill-bf82cbd2a7d4e234313e253cb6f7dd351b2c5c5a.zip
Locate and pass through captured locals to stateful closures
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'boot/visit')
-rw-r--r--boot/visit/ir.c51
1 files changed, 25 insertions, 26 deletions
diff --git a/boot/visit/ir.c b/boot/visit/ir.c
index fa17d9c..ca32a1e 100644
--- a/boot/visit/ir.c
+++ b/boot/visit/ir.c
@@ -53,7 +53,7 @@ struct Visit_Table
     void (*visit_expression_float_literal)(struct Visit* visitor, struct Expression* expr);
     void (*visit_expression_string_literal)(struct Visit* visitor, struct Expression* expr);
     void (*visit_expression_boolean_literal)(struct Visit* visitor, struct Expression* expr);
-    void (*visit_expression_name)(struct Visit* visitor, struct Expression* expr);
+    void (*visit_expression_reference)(struct Visit* visitor, struct Expression* expr);
     void (*visit_expression_unary_operation)(struct Visit* visitor, struct Expression* expr);
     void (*visit_expression_binary_operation)(struct Visit* visitor, struct Expression* expr);
     void (*visit_expression_sizeof_operation)(struct Visit* visitor, struct Expression* expr);
@@ -63,7 +63,6 @@ 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);
@@ -260,8 +259,8 @@ walk_expression(struct Visit* visit, struct Expression* expr)
     case EXPRESSION_BOOLEAN_LITERAL:
         VISIT(visit_expression_boolean_literal, expr);
         break;
-    case EXPRESSION_NAME:
-        VISIT(visit_expression_name, expr);
+    case EXPRESSION_REFERENCE:
+        VISIT(visit_expression_reference, expr);
         break;
     case EXPRESSION_UNARY_OPERATION:
         VISIT(visit_expression_unary_operation, expr);
@@ -290,9 +289,6 @@ 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:
@@ -304,7 +300,7 @@ WALK_LEAF_FUNCTION(walk_expression_integer_literal, struct Expression*);
 WALK_LEAF_FUNCTION(walk_expression_float_literal, struct Expression*);
 WALK_LEAF_FUNCTION(walk_expression_string_literal, struct Expression*);
 WALK_LEAF_FUNCTION(walk_expression_boolean_literal, struct Expression*);
-WALK_LEAF_FUNCTION(walk_expression_name, struct Expression*);
+WALK_LEAF_FUNCTION(walk_expression_reference, struct Expression*);
 
 void
 walk_expression_unary_operation(struct Visit* visit, struct Expression* expr)
@@ -366,8 +362,6 @@ 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)
 {
@@ -409,7 +403,7 @@ struct Visit_Table walk_functions = {
     .visit_expression_float_literal = walk_expression_float_literal,
     .visit_expression_string_literal = walk_expression_string_literal,
     .visit_expression_boolean_literal = walk_expression_boolean_literal,
-    .visit_expression_name = walk_expression_name,
+    .visit_expression_reference = walk_expression_reference,
     .visit_expression_unary_operation = walk_expression_unary_operation,
     .visit_expression_binary_operation = walk_expression_binary_operation,
     .visit_expression_sizeof_operation = walk_expression_sizeof_operation,
@@ -419,7 +413,6 @@ 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,
@@ -836,10 +829,27 @@ printer_visit_expression_boolean_literal(struct Visit* visit, struct Expression*
 }
 
 void
-printer_visit_expression_name(struct Visit* visit, struct Expression* expr)
+printer_visit_expression_reference(struct Visit* visit, struct Expression* expr)
 {
     PRINTER_PREAMBLE
-    PRINT("(name %s)", string_c_str(expr->value.name.name));
+    struct Expression_Reference* ref = &expr->value.reference;
+    switch (ref->kind) {
+    case REFERENCE_NAME:
+        PRINT("(name %s)", string_c_str(ref->value.name.name));
+        break;
+    case REFERENCE_FUNCTION: {
+        struct Function* fn = *array_at(
+            struct Function*, &p->unit->functions.entries, ref->value.function.function_id);
+        PRINT("(fn-ref %s)", string_c_str(fn->name));
+        break;
+    }
+    case REFERENCE_CAPTURE:
+        PRINT("(capture %s)", string_c_str(ref->value.capture.name));
+        break;
+    case REFERENCE_NONE:
+        PRINT("(reference none)");
+        break;
+    }
 }
 
 void
@@ -950,16 +960,6 @@ 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
@@ -1087,7 +1087,7 @@ struct Visit_Table printer_visit_functions = {
     .visit_expression_float_literal = printer_visit_expression_float_literal,
     .visit_expression_string_literal = printer_visit_expression_string_literal,
     .visit_expression_boolean_literal = printer_visit_expression_boolean_literal,
-    .visit_expression_name = printer_visit_expression_name,
+    .visit_expression_reference = printer_visit_expression_reference,
     .visit_expression_unary_operation = printer_visit_expression_unary_operation,
     .visit_expression_binary_operation = printer_visit_expression_binary_operation,
     .visit_expression_sizeof_operation = printer_visit_expression_sizeof_operation,
@@ -1097,7 +1097,6 @@ 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,