about summary refs log tree commit diff
path: root/boot/visit
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2026-05-24 20:14:29 +0200
committerMel <mel@rnrd.eu>2026-05-24 20:14:29 +0200
commit2a893246711442dd8407264c05991b44d1d1f66f (patch)
treea0d4a621994ebb259331b7082a977e4ae2861bde /boot/visit
parentf028bc7ef3101facfa004c21f3aa5feb3dc6f107 (diff)
downloadcatskill-2a893246711442dd8407264c05991b44d1d1f66f.tar.zst
catskill-2a893246711442dd8407264c05991b44d1d1f66f.zip
Emit IR/C increment/decrement in expression position
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'boot/visit')
-rw-r--r--boot/visit/ir.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/boot/visit/ir.c b/boot/visit/ir.c
index 6748384..036307f 100644
--- a/boot/visit/ir.c
+++ b/boot/visit/ir.c
@@ -62,6 +62,7 @@ struct Visit_Table
     void (*visit_expression_subscript)(struct Visit* visitor, struct Expression* expr);
     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_block)(struct Visit* visitor, struct Block* block);
     void (*visit_type_ref)(struct Visit* visitor, struct Type_Ref* ref);
@@ -285,6 +286,9 @@ walk_expression(struct Visit* visit, struct Expression* expr)
     case EXPRESSION_CONSTRUCT:
         VISIT(visit_expression_construct, expr);
         break;
+    case EXPRESSION_INCREMENT_DECREMENT:
+        VISIT(visit_expression_increment_decrement, expr);
+        break;
     case EXPRESSION_NONE:
         break;
     default:
@@ -353,6 +357,12 @@ walk_expression_construct(struct Visit* visit, struct Expression* expr)
 }
 
 void
+walk_expression_increment_decrement(struct Visit* visit, struct Expression* expr)
+{
+    VISIT(visit_expression, expr->value.increment_decrement.subject);
+}
+
+void
 walk_block(struct Visit* visit, struct Block* block)
 {
     FOR_EACH_ARRAY (struct Statement*, statement, &block->statements)
@@ -402,6 +412,7 @@ struct Visit_Table walk_functions = {
     .visit_expression_subscript = walk_expression_subscript,
     .visit_expression_cast = walk_expression_cast,
     .visit_expression_construct = walk_expression_construct,
+    .visit_expression_increment_decrement = walk_expression_increment_decrement,
 
     .visit_block = walk_block,
     .visit_type_ref = walk_type_ref,
@@ -921,6 +932,17 @@ printer_visit_expression_construct(struct Visit* visit, struct Expression* expr)
 }
 
 void
+printer_visit_expression_increment_decrement(struct Visit* visit, struct Expression* expr)
+{
+    PRINTER_PREAMBLE
+
+    PRINT("(%s-%s ", expr->value.increment_decrement.prefix ? "prefix" : "postfix",
+          increment_decrement_operation_to_string(expr->value.increment_decrement.operation));
+    VISIT(visit_expression, expr->value.increment_decrement.subject);
+    PRINT(")");
+}
+
+void
 printer_visit_block(struct Visit* visit, struct Block* block)
 {
     PRINTER_PREAMBLE
@@ -1057,6 +1079,7 @@ struct Visit_Table printer_visit_functions = {
     .visit_expression_subscript = printer_visit_expression_subscript,
     .visit_expression_cast = printer_visit_expression_cast,
     .visit_expression_construct = printer_visit_expression_construct,
+    .visit_expression_increment_decrement = printer_visit_expression_increment_decrement,
 
     .visit_block = printer_visit_block,
     .visit_type_ref = printer_visit_type_ref,