diff options
| author | Mel <mel@rnrd.eu> | 2026-05-26 00:50:09 +0200 |
|---|---|---|
| committer | Mel <mel@rnrd.eu> | 2026-05-26 00:50:09 +0200 |
| commit | 900b412b052a0f745f0853d6703e4bafbb0a3ce5 (patch) | |
| tree | e04b65b395d4761e5b88fa1e9a792c3996ff3dc1 /boot/visit | |
| parent | e8400cc704eeb74f3c464f7a0822c556cb52e3fd (diff) | |
| download | catskill-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')
| -rw-r--r-- | boot/visit/ir.c | 18 |
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, |
