diff options
| author | Mel <mel@rnrd.eu> | 2026-05-26 04:15:12 +0200 |
|---|---|---|
| committer | Mel <mel@rnrd.eu> | 2026-05-26 04:15:12 +0200 |
| commit | bf82cbd2a7d4e234313e253cb6f7dd351b2c5c5a (patch) | |
| tree | 42dcf198deee1dae3c9b3586dc37e6dd23938244 /boot/visit/ir.c | |
| parent | 900b412b052a0f745f0853d6703e4bafbb0a3ce5 (diff) | |
| download | catskill-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/ir.c')
| -rw-r--r-- | boot/visit/ir.c | 51 |
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, |
