From 14d4977e2ab2409bb7344395ca01d19e49f130f1 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sat, 11 Jul 2026 22:33:03 +0200 Subject: Implement record extension --- boot/symbol.cc | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 7 deletions(-) (limited to 'boot/symbol.cc') diff --git a/boot/symbol.cc b/boot/symbol.cc index 512cf04..b75cdc1 100644 --- a/boot/symbol.cc +++ b/boot/symbol.cc @@ -157,11 +157,6 @@ namespace elna::boot return *this; } - bool type::operator==(const std::nullptr_t&) - { - return empty(); - } - type::~type() { switch (tag) @@ -243,6 +238,57 @@ namespace elna::boot return tag == type_tag::enumeration ? this->enumeration : nullptr; } + bool type::operator==(const std::nullptr_t&) const + { + return empty(); + } + + bool type::operator==(const type& other) const + { + type resolved_this = inner_aliased_type(*this); + type resolved_that = inner_aliased_type(other); + + if (auto left_record = resolved_this.get()) + { + return left_record == resolved_that.get(); + } + if (auto left_primitive = resolved_this.get()) + { + auto right_primitive = resolved_that.get(); + + return right_primitive != nullptr && left_primitive->identifier == right_primitive->identifier; + } + if (auto left_union = resolved_this.get()) + { + return left_union == resolved_that.get(); + } + if (auto left_enumeration = resolved_this.get()) + { + return left_enumeration == resolved_that.get(); + } + if (auto left_pointer = resolved_this.get()) + { + auto right_pointer = resolved_that.get(); + + return right_pointer != nullptr && left_pointer->base == right_pointer->base; + } + if (auto left_array = resolved_this.get()) + { + auto right_array = resolved_that.get(); + + return right_array != nullptr && left_array->size == right_array->size + && left_array->base == right_array->base; + } + if (auto left_procedure = resolved_this.get()) + { + auto right_procedure = resolved_that.get(); + + return right_procedure != nullptr && left_procedure->return_type == right_procedure->return_type + && left_procedure->parameters == right_procedure->parameters; + } + return resolved_this.empty() && resolved_that.empty(); + } + bool type::empty() const { return tag == type_tag::empty; @@ -360,11 +406,19 @@ namespace elna::boot result->enter("Int", std::make_shared(type(std::make_shared("Int")))); result->enter("Word", std::make_shared(type(std::make_shared("Word")))); result->enter("Char", std::make_shared(type(std::make_shared("Char")))); - result->enter("Bool", std::make_shared(type(std::make_shared("Bool")))); result->enter("Pointer", std::make_shared(type(std::make_shared("Pointer")))); result->enter("Float", std::make_shared(type(std::make_shared("Float")))); result->enter("String", std::make_shared(type(std::make_shared("String")))); + type boolean = type(std::make_shared("Bool")); + result->enter("Bool", std::make_shared(boolean)); + + procedure_type assert_symbol{ procedure_type::return_t() }; + assert_symbol.parameters.push_back(boolean); + std::shared_ptr assert_info = std::make_shared(assert_symbol, + std::vector{ "condition" }); + result->enter("assert", assert_info); + return result; } @@ -435,7 +489,7 @@ namespace elna::boot return inner_aliased_type(alias->reference); } - type inner_aliased_type(type alias) + type inner_aliased_type(const type& alias) { if (auto aliased = alias.get()) { -- cgit v1.2.3