diff options
Diffstat (limited to 'boot/visit/ir.c')
| -rw-r--r-- | boot/visit/ir.c | 135 |
1 files changed, 56 insertions, 79 deletions
diff --git a/boot/visit/ir.c b/boot/visit/ir.c index b2239d5..3880b36 100644 --- a/boot/visit/ir.c +++ b/boot/visit/ir.c @@ -82,12 +82,10 @@ walk_unit(struct Visit* visit, struct Unit* unit) FOR_EACH_ARRAY(struct Function*, function, &unit->functions.entries, { VISIT(visit_function, function); }) - for (uint i = 0; i < array_length(&unit->imports); ++i) { - VISIT(visit_import, array_at(struct Import, &unit->imports, i)); - } - for (uint i = 0; i < array_length(&unit->diagnostics); ++i) { - VISIT(visit_diagnostic, array_at(struct Diagnostic, &unit->diagnostics, i)); - } + FOR_EACH_ARRAY(struct Import, import, &unit->imports, { VISIT(visit_import, &import); }) + FOR_EACH_ARRAY(struct Diagnostic, diagnostic, &unit->diagnostics, { + VISIT(visit_diagnostic, &diagnostic); + }) } void @@ -122,40 +120,33 @@ WALK_LEAF_FUNCTION(walk_type_alias, struct Type*); void walk_type_structure(struct Visit* visit, struct Type* type) { - for (uint i = 0; i < array_length(&type->value.structure.fields); ++i) { - struct Field* field = array_at(struct Field, &type->value.structure.fields, i); - VISIT(visit_type_ref, &field->type); - } + FOR_EACH_ARRAY(struct Field, field, &type->value.structure.fields, { + VISIT(visit_type_ref, &field.type); + }) } void walk_type_variant(struct Visit* visit, struct Type* type) { - for (uint i = 0; i < array_length(&type->value.variant.cases); ++i) { - struct Variant_Case* one_case = - array_at(struct Variant_Case, &type->value.variant.cases, i); - if (one_case->has_payload) VISIT(visit_type_ref, &one_case->payload); - } + FOR_EACH_ARRAY(struct Variant_Case, one_case, &type->value.variant.cases, { + if (one_case.has_payload) VISIT(visit_type_ref, &one_case.payload); + }) } void walk_type_function(struct Visit* visit, struct Type* type) { VISIT(visit_type_ref, &type->value.function.return_type); - for (uint i = 0; i < array_length(&type->value.function.params); ++i) { - struct Type_Ref* param = array_at(struct Type_Ref, &type->value.function.params, i); - VISIT(visit_type_ref, param); - } + FOR_EACH_ARRAY(struct Type_Ref, param, &type->value.function.params, { + VISIT(visit_type_ref, ¶m); + }) } void walk_function(struct Visit* visit, struct Function* function) { VISIT(visit_type_ref, &function->return_type); - for (uint i = 0; i < array_length(&function->params); ++i) { - struct Param* param = array_at(struct Param, &function->params, i); - VISIT(visit_type_ref, ¶m->type); - } + FOR_EACH_ARRAY(struct Param, param, &function->params, { VISIT(visit_type_ref, ¶m.type); }) VISIT_MAYBE(visit_block, function->body); } @@ -226,11 +217,10 @@ walk_statement_expression(struct Visit* visit, struct Statement* stmt) void walk_statement_conditional(struct Visit* visit, struct Statement* stmt) { - for (uint i = 0; i < array_length(&stmt->value.conditional.branches); ++i) { - struct If_Branch* branch = array_at(struct If_Branch, &stmt->value.conditional.branches, i); - VISIT_MAYBE(visit_expression, branch->condition); - VISIT(visit_block, branch->body); - } + FOR_EACH_ARRAY(struct If_Branch, branch, &stmt->value.conditional.branches, { + VISIT_MAYBE(visit_expression, branch.condition); + VISIT(visit_block, branch.body); + }) } void @@ -364,11 +354,9 @@ walk_expression_cast(struct Visit* visit, struct Expression* expr) void walk_expression_construct(struct Visit* visit, struct Expression* expr) { - for (uint i = 0; i < array_length(&expr->value.construct.fields); ++i) { - struct Construct_Field* field = - array_at(struct Construct_Field, &expr->value.construct.fields, i); - VISIT(visit_expression, field->value); - } + FOR_EACH_ARRAY(struct Construct_Field, field, &expr->value.construct.fields, { + VISIT(visit_expression, field.value); + }) } void walk_block(struct Visit* visit, struct Block* block){ FOR_EACH_ARRAY( @@ -514,10 +502,10 @@ printer_visit_unit(struct Visit* visit, struct Unit* unit) PRINT("\n"); printer_indent(p); PRINT("(imports"); - for (uint i = 0; i < array_length(&unit->imports); ++i) { + FOR_EACH_ARRAY(struct Import, import, &unit->imports, { PRINT(" "); - VISIT(visit_import, array_at(struct Import, &unit->imports, i)); - } + VISIT(visit_import, &import); + }) PRINT(")"); } @@ -525,9 +513,7 @@ printer_visit_unit(struct Visit* visit, struct Unit* unit) PRINT("\n"); printer_indent(p); PRINT("(emission_order"); - for (uint i = 0; i < array_length(&unit->type_emission_order); ++i) { - PRINT(" %lu", *array_at(Type_Id, &unit->type_emission_order, i)); - } + FOR_EACH_ARRAY(Type_Id, id, &unit->type_emission_order, { PRINT(" %lu", id); }) PRINT(")"); } @@ -536,11 +522,11 @@ printer_visit_unit(struct Visit* visit, struct Unit* unit) printer_indent(p); PRINT("(diagnostics"); p->indentation_level++; - for (uint i = 0; i < array_length(&unit->diagnostics); ++i) { + FOR_EACH_ARRAY(struct Diagnostic, diagnostic, &unit->diagnostics, { PRINT("\n"); printer_indent(p); - VISIT(visit_diagnostic, array_at(struct Diagnostic, &unit->diagnostics, i)); - } + VISIT(visit_diagnostic, &diagnostic); + }) p->indentation_level--; PRINT(")"); } @@ -555,10 +541,9 @@ printer_visit_type_ref(struct Visit* visit, struct Type_Ref* ref) PRINTER_PREAMBLE PRINT("(ref"); - for (uint i = 0; i < array_length(&ref->mods); ++i) { - enum Type_Modifier mod = *array_at(enum Type_Modifier, &ref->mods, i); + FOR_EACH_ARRAY(enum Type_Modifier, mod, &ref->mods, { if (mod == TYPE_MOD_REFERENCE) PRINT(" &"); - } + }) struct Type* target = printer_type_at(p, ref->type_id); if (target) PRINT(" %s", string_c_str(target->name)); @@ -604,12 +589,11 @@ printer_visit_type_structure(struct Visit* visit, struct Type* type) PRINTER_PREAMBLE PRINT(" structure"); - for (uint i = 0; i < array_length(&type->value.structure.fields); ++i) { - struct Field* field = array_at(struct Field, &type->value.structure.fields, i); - PRINT(" (field %s ", string_c_str(field->name)); - VISIT(visit_type_ref, &field->type); + FOR_EACH_ARRAY(struct Field, field, &type->value.structure.fields, { + PRINT(" (field %s ", string_c_str(field.name)); + VISIT(visit_type_ref, &field.type); PRINT(")"); - } + }) } void @@ -618,16 +602,14 @@ printer_visit_type_variant(struct Visit* visit, struct Type* type) PRINTER_PREAMBLE PRINT(" variant"); - for (uint i = 0; i < array_length(&type->value.variant.cases); ++i) { - struct Variant_Case* one_case = - array_at(struct Variant_Case, &type->value.variant.cases, i); - PRINT(" (case %s tag=%u", string_c_str(one_case->name), one_case->tag); - if (one_case->has_payload) { + FOR_EACH_ARRAY(struct Variant_Case, one_case, &type->value.variant.cases, { + PRINT(" (case %s tag=%u", string_c_str(one_case.name), one_case.tag); + if (one_case.has_payload) { PRINT(" "); - VISIT(visit_type_ref, &one_case->payload); + VISIT(visit_type_ref, &one_case.payload); } PRINT(")"); - } + }) } void @@ -638,12 +620,11 @@ printer_visit_type_function(struct Visit* visit, struct Type* type) PRINT(" function (returns "); VISIT(visit_type_ref, &type->value.function.return_type); PRINT(")"); - for (uint i = 0; i < array_length(&type->value.function.params); ++i) { - struct Type_Ref* param = array_at(struct Type_Ref, &type->value.function.params, i); + FOR_EACH_ARRAY(struct Type_Ref, param, &type->value.function.params, { PRINT(" (param "); - VISIT(visit_type_ref, param); + VISIT(visit_type_ref, ¶m); PRINT(")"); - } + }) if (type->value.function.variadic) PRINT(" variadic"); } @@ -658,12 +639,11 @@ printer_visit_function(struct Visit* visit, struct Function* function) PRINT(" (returns "); VISIT(visit_type_ref, &function->return_type); PRINT(")"); - for (uint i = 0; i < array_length(&function->params); ++i) { - struct Param* param = array_at(struct Param, &function->params, i); - PRINT(" (param %s ", string_c_str(param->name)); - VISIT(visit_type_ref, ¶m->type); + FOR_EACH_ARRAY(struct Param, param, &function->params, { + PRINT(" (param %s ", string_c_str(param.name)); + VISIT(visit_type_ref, ¶m.type); PRINT(")"); - } + }) if (function->variadic) PRINT(" variadic"); if (function->body) { @@ -724,18 +704,17 @@ printer_visit_statement_conditional(struct Visit* visit, struct Statement* stmt) PRINTER_PREAMBLE PRINT("(conditional"); - for (uint i = 0; i < array_length(&stmt->value.conditional.branches); ++i) { - struct If_Branch* branch = array_at(struct If_Branch, &stmt->value.conditional.branches, i); + FOR_EACH_ARRAY(struct If_Branch, branch, &stmt->value.conditional.branches, { PRINT(" "); - if (branch->condition) { + if (branch.condition) { PRINT("(when "); - VISIT(visit_expression, branch->condition); + VISIT(visit_expression, branch.condition); PRINT(") "); } else { PRINT("(else) "); } - VISIT(visit_block, branch->body); - } + VISIT(visit_block, branch.body); + }) PRINT(")"); } @@ -927,16 +906,14 @@ printer_visit_expression_construct(struct Visit* visit, struct Expression* expr) PRINT(" %s", string_c_str(type->name)); else PRINT(" #%lu", expr->value.construct.type_id); - for (uint i = 0; i < array_length(&expr->value.construct.fields); ++i) { - struct Construct_Field* field = - array_at(struct Construct_Field, &expr->value.construct.fields, i); - if (field->name.length > 0) - PRINT(" (field %s ", string_c_str(field->name)); + FOR_EACH_ARRAY(struct Construct_Field, field, &expr->value.construct.fields, { + if (field.name.length > 0) + PRINT(" (field %s ", string_c_str(field.name)); else PRINT(" (positional "); - VISIT(visit_expression, field->value); + VISIT(visit_expression, field.value); PRINT(")"); - } + }) PRINT(")"); } |
