From e85418b3b63d3bb4884155170d4dfc376620ca6c Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sun, 1 Jun 2025 05:12:20 +1000 Subject: [PATCH 01/51] issue-2282: PL changes --- lib/include/pl/patterns/pattern.hpp | 12 ++++----- .../pl/patterns/pattern_array_dynamic.hpp | 4 +-- .../pl/patterns/pattern_array_static.hpp | 4 +-- lib/include/pl/patterns/pattern_bitfield.hpp | 25 +++++++++++-------- lib/include/pl/patterns/pattern_boolean.hpp | 2 +- lib/include/pl/patterns/pattern_enum.hpp | 2 +- lib/include/pl/patterns/pattern_error.hpp | 2 +- lib/include/pl/patterns/pattern_float.hpp | 2 +- lib/include/pl/patterns/pattern_padding.hpp | 2 +- lib/include/pl/patterns/pattern_pointer.hpp | 2 +- lib/include/pl/patterns/pattern_signed.hpp | 2 +- lib/include/pl/patterns/pattern_string.hpp | 2 +- lib/include/pl/patterns/pattern_struct.hpp | 6 ++--- lib/include/pl/patterns/pattern_union.hpp | 4 +-- lib/include/pl/patterns/pattern_unsigned.hpp | 2 +- .../pl/patterns/pattern_wide_character.hpp | 2 +- .../pl/patterns/pattern_wide_string.hpp | 2 +- .../core/ast/ast_node_array_variable_decl.cpp | 16 ++++++------ lib/source/pl/core/ast/ast_node_bitfield.cpp | 4 +-- .../ast_node_bitfield_array_variable_decl.cpp | 6 ++--- .../pl/core/ast/ast_node_bitfield_field.cpp | 2 +- .../pl/core/ast/ast_node_builtin_type.cpp | 18 ++++++------- lib/source/pl/pattern_language.cpp | 2 +- 23 files changed, 64 insertions(+), 61 deletions(-) diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index e0cd35da..000f58f8 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -282,9 +282,7 @@ namespace pl::ptrn { } [[nodiscard]] virtual core::Token::Literal getValue() const { - auto clone = this->clone(); - - return this->transformValue(std::move(clone)); + return this->transformValue(const_cast(this)->reference()); } [[nodiscard]] virtual std::vector> getChildren() { @@ -537,15 +535,15 @@ namespace pl::ptrn { this->m_initialized = initialized; } - [[nodiscard]] const Pattern* getParent() const { + [[nodiscard]] std::shared_ptr getParent() const { return m_parent; } - [[nodiscard]] Pattern* getParent() { + [[nodiscard]] std::shared_ptr getParent() { return m_parent; } - void setParent(Pattern *parent) { + void setParent(std::shared_ptr parent) { m_parent = parent; } @@ -623,7 +621,7 @@ namespace pl::ptrn { core::Evaluator *m_evaluator; std::unique_ptr>> m_attributes; - Pattern *m_parent = nullptr; + std::shared_ptr m_parent; u32 m_line = 0; std::set::const_iterator m_variableName; diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index 7334f1eb..ab214949 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -20,7 +20,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternArrayDynamic(*this)); + return std::shared_ptr(new PatternArrayDynamic(*this)); } void setColor(u32 color) override { @@ -133,7 +133,7 @@ namespace pl::ptrn { if (!entry->hasOverriddenColor()) entry->setBaseColor(this->getColor()); - entry->setParent(this); + entry->setParent(this->reference()); this->m_entries.emplace_back(entry); } diff --git a/lib/include/pl/patterns/pattern_array_static.hpp b/lib/include/pl/patterns/pattern_array_static.hpp index 36de9798..d5f573a9 100644 --- a/lib/include/pl/patterns/pattern_array_static.hpp +++ b/lib/include/pl/patterns/pattern_array_static.hpp @@ -16,7 +16,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternArrayStatic(*this)); + return std::shared_ptr(new PatternArrayStatic(*this)); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { @@ -153,7 +153,7 @@ namespace pl::ptrn { void setEntries(std::shared_ptr &&templatePattern, size_t count) { this->m_template = std::move(templatePattern); - this->m_template->setParent(this); + this->m_template->setParent(this->reference()); this->m_highlightTemplates.push_back(this->m_template->clone()); this->m_entryCount = count; diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index de64a087..4f747965 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -9,10 +9,15 @@ namespace pl::ptrn { public: using Pattern::Pattern; + /*virtual void setParent(Pattern *parent) + { + Pattern::setParent(parent); + }*/ + [[nodiscard]] const PatternBitfieldMember& getTopmostBitfield() const { const PatternBitfieldMember* topBitfield = this; while (auto parent = topBitfield->getParent()) { - auto parentBitfield = dynamic_cast(parent); + auto parentBitfield = dynamic_cast(parent.get()); if (parentBitfield == nullptr) break; @@ -53,7 +58,7 @@ namespace pl::ptrn { class PatternBitfieldField : public PatternBitfieldMember { public: - PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, PatternBitfieldMember *parentBitfield = nullptr) + PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) : PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) { this->setParent(parentBitfield); } @@ -65,7 +70,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfieldField(*this)); + return std::shared_ptr(new PatternBitfieldField(*this)); } [[nodiscard]] u128 readValue() const { @@ -162,7 +167,7 @@ namespace pl::ptrn { using PatternBitfieldField::PatternBitfieldField; [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfieldFieldSigned(*this)); + return std::shared_ptr(new PatternBitfieldFieldSigned(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -186,7 +191,7 @@ namespace pl::ptrn { using PatternBitfieldField::PatternBitfieldField; [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfieldFieldBoolean(*this)); + return std::shared_ptr(new PatternBitfieldFieldBoolean(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -245,7 +250,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfieldFieldEnum(*this)); + return std::shared_ptr(new PatternBitfieldFieldEnum(*this)); } std::string formatDisplayValue() override { @@ -282,7 +287,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfieldArray(*this)); + return std::shared_ptr(new PatternBitfieldArray(*this)); } [[nodiscard]] u8 getBitOffset() const override { @@ -422,7 +427,7 @@ namespace pl::ptrn { if (!entry->hasOverriddenColor()) entry->setBaseColor(this->getColor()); - entry->setParent(this); + entry->setParent(this->reference()); this->m_sortedEntries.push_back(entry.get()); } @@ -554,7 +559,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfield(*this)); + return std::shared_ptr(new PatternBitfield(*this)); } [[nodiscard]] u8 getBitOffset() const override { @@ -643,7 +648,7 @@ namespace pl::ptrn { this->setBaseColor(this->m_fields.front()->getColor()); for (const auto &field : this->m_fields) { - field->setParent(this); + field->setParent(this->reference()); this->m_sortedFields.push_back(field.get()); } } diff --git a/lib/include/pl/patterns/pattern_boolean.hpp b/lib/include/pl/patterns/pattern_boolean.hpp index af9bf441..c983b2ea 100644 --- a/lib/include/pl/patterns/pattern_boolean.hpp +++ b/lib/include/pl/patterns/pattern_boolean.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, 1, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBoolean(*this)); + return std::shared_ptr(new PatternBoolean(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_enum.hpp b/lib/include/pl/patterns/pattern_enum.hpp index b5462397..5bbfd295 100644 --- a/lib/include/pl/patterns/pattern_enum.hpp +++ b/lib/include/pl/patterns/pattern_enum.hpp @@ -18,7 +18,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternEnum(*this)); + return std::shared_ptr(new PatternEnum(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_error.hpp b/lib/include/pl/patterns/pattern_error.hpp index fc9e52be..e6b2e817 100644 --- a/lib/include/pl/patterns/pattern_error.hpp +++ b/lib/include/pl/patterns/pattern_error.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line), m_errorMessage(std::move(errorMessage)) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternError(*this)); + return std::shared_ptr(new PatternError(*this)); } [[nodiscard]] std::string getFormattedName() const override { diff --git a/lib/include/pl/patterns/pattern_float.hpp b/lib/include/pl/patterns/pattern_float.hpp index 96dbe4a9..df2bf7c8 100644 --- a/lib/include/pl/patterns/pattern_float.hpp +++ b/lib/include/pl/patterns/pattern_float.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternFloat(*this)); + return std::shared_ptr(new PatternFloat(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_padding.hpp b/lib/include/pl/patterns/pattern_padding.hpp index d3a95128..f0caf166 100644 --- a/lib/include/pl/patterns/pattern_padding.hpp +++ b/lib/include/pl/patterns/pattern_padding.hpp @@ -9,7 +9,7 @@ namespace pl::ptrn { PatternPadding(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternPadding(*this)); + return std::shared_ptr(new PatternPadding(*this)); } [[nodiscard]] std::string getFormattedName() const override { diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index 787d3c00..75c6d580 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -21,7 +21,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternPointer(*this)); + return std::shared_ptr(new PatternPointer(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_signed.hpp b/lib/include/pl/patterns/pattern_signed.hpp index 94ad4b59..5a2f0318 100644 --- a/lib/include/pl/patterns/pattern_signed.hpp +++ b/lib/include/pl/patterns/pattern_signed.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternSigned(*this)); + return std::shared_ptr(new PatternSigned(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index de726c9e..10f80c73 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -13,7 +13,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternString(*this)); + return std::shared_ptr(new PatternString(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_struct.hpp b/lib/include/pl/patterns/pattern_struct.hpp index 3bd42bbd..02b5d4a3 100644 --- a/lib/include/pl/patterns/pattern_struct.hpp +++ b/lib/include/pl/patterns/pattern_struct.hpp @@ -15,14 +15,14 @@ namespace pl::ptrn { for (const auto &member : other.m_members) { auto copy = member->clone(); - copy->setParent(this); + copy->setParent(this->reference()); this->m_sortedMembers.push_back(copy.get()); this->m_members.push_back(std::move(copy)); } } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternStruct(*this)); + return std::shared_ptr(new PatternStruct(*this)); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { @@ -36,7 +36,7 @@ namespace pl::ptrn { void addEntry(const std::shared_ptr &entry) override { if (entry == nullptr) return; - entry->setParent(this); + entry->setParent(this->reference()); this->m_sortedMembers.push_back(entry.get()); this->m_members.push_back(entry); } diff --git a/lib/include/pl/patterns/pattern_union.hpp b/lib/include/pl/patterns/pattern_union.hpp index fa2939e3..8eeeb7e8 100644 --- a/lib/include/pl/patterns/pattern_union.hpp +++ b/lib/include/pl/patterns/pattern_union.hpp @@ -21,7 +21,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternUnion(*this)); + return std::shared_ptr(new PatternUnion(*this)); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { @@ -35,7 +35,7 @@ namespace pl::ptrn { void addEntry(const std::shared_ptr &entry) override { if (entry == nullptr) return; - entry->setParent(this); + entry->setParent(this->reference()); this->m_sortedMembers.push_back(entry.get()); this->m_members.push_back(entry); } diff --git a/lib/include/pl/patterns/pattern_unsigned.hpp b/lib/include/pl/patterns/pattern_unsigned.hpp index 6cb650de..806b7167 100644 --- a/lib/include/pl/patterns/pattern_unsigned.hpp +++ b/lib/include/pl/patterns/pattern_unsigned.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternUnsigned(*this)); + return std::shared_ptr(new PatternUnsigned(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_wide_character.hpp b/lib/include/pl/patterns/pattern_wide_character.hpp index 1bc28b7c..ffee2b9a 100644 --- a/lib/include/pl/patterns/pattern_wide_character.hpp +++ b/lib/include/pl/patterns/pattern_wide_character.hpp @@ -12,7 +12,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, 2, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternWideCharacter(*this)); + return std::shared_ptr(new PatternWideCharacter(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_wide_string.hpp b/lib/include/pl/patterns/pattern_wide_string.hpp index 5b033492..e533baef 100644 --- a/lib/include/pl/patterns/pattern_wide_string.hpp +++ b/lib/include/pl/patterns/pattern_wide_string.hpp @@ -13,7 +13,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternWideString(*this)); + return std::shared_ptr(new PatternWideString(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp index b10309de..f3068731 100644 --- a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp @@ -217,14 +217,14 @@ namespace pl::core::ast { } } - if (dynamic_cast(templatePattern.get())) { - outputPattern = std::make_unique(evaluator, startOffset, 0, getLocation().line); - } else if (dynamic_cast(templatePattern.get())) { - outputPattern = std::make_unique(evaluator, startOffset, 0, getLocation().line); - } else if (dynamic_cast(templatePattern.get())) { - outputPattern = std::make_unique(evaluator, startOffset, 0, getLocation().line); + if (std::dynamic_pointer_cast(templatePattern)) { + outputPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); + } else if (std::dynamic_pointer_cast(templatePattern)) { + outputPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); + } else if (std::dynamic_pointer_cast(templatePattern)) { + outputPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); } else { - auto arrayPattern = std::make_unique(evaluator, startOffset, 0, getLocation().line); + auto arrayPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); arrayPattern->setEntries(templatePattern->clone(), size_t(entryCount)); arrayPattern->setSection(templatePattern->getSection()); outputPattern = std::move(arrayPattern); @@ -256,7 +256,7 @@ namespace pl::core::ast { }; evaluator->alignToByte(); - auto arrayPattern = std::make_unique(evaluator, evaluator->getReadOffset(), 0, getLocation().line); + auto arrayPattern = std::make_shared(evaluator, evaluator->getReadOffset(), 0, getLocation().line); arrayPattern->setVariableName(this->m_name); arrayPattern->setSection(evaluator->getSectionId()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield.cpp b/lib/source/pl/core/ast/ast_node_bitfield.cpp index fde1deca..874da959 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield.cpp @@ -138,8 +138,8 @@ namespace pl::core::ast { } for (auto &pattern : potentialPatterns) { - if (auto bitfieldMember = dynamic_cast(pattern.get()); bitfieldMember != nullptr) { - bitfieldMember->setParent(bitfieldPattern.get()); + if (auto bitfieldMember = std::dynamic_pointer_cast(pattern); bitfieldMember != nullptr) { + bitfieldMember->setParent(bitfieldPattern); if (!bitfieldMember->isPadding()) fields.push_back(pattern); } else { diff --git a/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp index 7a87c518..34dfd04b 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp @@ -53,7 +53,7 @@ namespace pl::core::ast { }; auto position = evaluator->getBitwiseReadOffset(); - auto arrayPattern = std::make_unique(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); + auto arrayPattern = std::make_shared(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); arrayPattern->setVariableName(this->m_name); arrayPattern->setSection(evaluator->getSectionId()); arrayPattern->setReversed(evaluator->isReadOrderReversed()); @@ -132,8 +132,8 @@ namespace pl::core::ast { } for (auto &pattern : entries) { - if (auto bitfieldMember = dynamic_cast(pattern.get()); bitfieldMember != nullptr) - bitfieldMember->setParent(arrayPattern.get()); + if (auto bitfieldMember = std::dynamic_pointer_cast(pattern); bitfieldMember != nullptr) + bitfieldMember->setParent(arrayPattern); } arrayPattern->setEntries(entries); diff --git a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp index e887bfec..42832f6f 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp @@ -79,7 +79,7 @@ namespace pl::core::ast { evaluator->setBitwiseReadOffset(originalPosition); if (auto *patternEnum = dynamic_cast(pattern.get()); patternEnum != nullptr) { - auto bitfieldEnum = std::make_unique(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + auto bitfieldEnum = std::make_shared(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); bitfieldEnum->setTypeName(patternEnum->getTypeName()); bitfieldEnum->setEnumValues(patternEnum->getEnumValues()); result = std::move(bitfieldEnum); diff --git a/lib/source/pl/core/ast/ast_node_builtin_type.cpp b/lib/source/pl/core/ast/ast_node_builtin_type.cpp index 9f0b2a29..fbac27f8 100644 --- a/lib/source/pl/core/ast/ast_node_builtin_type.cpp +++ b/lib/source/pl/core/ast/ast_node_builtin_type.cpp @@ -23,23 +23,23 @@ namespace pl::core::ast { auto size = Token::getTypeSize(this->m_type); auto offset = evaluator->getReadOffsetAndIncrement(size); - std::unique_ptr pattern; + std::shared_ptr pattern; if (Token::isUnsigned(this->m_type)) - pattern = std::make_unique(evaluator, offset, size, getLocation().line); + pattern = std::make_shared(evaluator, offset, size, getLocation().line); else if (Token::isSigned(this->m_type)) - pattern = std::make_unique(evaluator, offset, size, getLocation().line); + pattern = std::make_shared(evaluator, offset, size, getLocation().line); else if (Token::isFloatingPoint(this->m_type)) - pattern = std::make_unique(evaluator, offset, size, getLocation().line); + pattern = std::make_shared(evaluator, offset, size, getLocation().line); else if (this->m_type == Token::ValueType::Boolean) - pattern = std::make_unique(evaluator, offset, getLocation().line); + pattern = std::make_shared(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character) - pattern = std::make_unique(evaluator, offset, getLocation().line); + pattern = std::make_shared(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character16) - pattern = std::make_unique(evaluator, offset, getLocation().line); + pattern = std::make_shared(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Padding) - pattern = std::make_unique(evaluator, offset, 1, getLocation().line); + pattern = std::make_shared(evaluator, offset, 1, getLocation().line); else if (this->m_type == Token::ValueType::String) - pattern = std::make_unique(evaluator, offset, 0, getLocation().line); + pattern = std::make_shared(evaluator, offset, 0, getLocation().line); else if (this->m_type == Token::ValueType::CustomType) { std::vector params; diff --git a/lib/source/pl/pattern_language.cpp b/lib/source/pl/pattern_language.cpp index 945cf7b1..0c6dbccd 100644 --- a/lib/source/pl/pattern_language.cpp +++ b/lib/source/pl/pattern_language.cpp @@ -552,7 +552,7 @@ namespace pl { ptrn::Pattern* value = interval.value; auto parent = value->getParent(); - while (parent != nullptr && dynamic_cast(parent->getParent()) == nullptr) { + while (parent != nullptr && std::dynamic_pointer_cast(parent->getParent()) == nullptr) { parent = parent->getParent(); } From bbace8d82726aea4cb48ef35648473906b516460 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sun, 1 Jun 2025 05:26:42 +1000 Subject: [PATCH 02/51] Remove debugging code --- lib/include/pl/patterns/pattern_bitfield.hpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index 4f747965..21da9599 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -9,11 +9,6 @@ namespace pl::ptrn { public: using Pattern::Pattern; - /*virtual void setParent(Pattern *parent) - { - Pattern::setParent(parent); - }*/ - [[nodiscard]] const PatternBitfieldMember& getTopmostBitfield() const { const PatternBitfieldMember* topBitfield = this; while (auto parent = topBitfield->getParent()) { From 9d630549eedb5f1659848eb96184d26c6c9bfabe Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sun, 1 Jun 2025 07:09:48 +1000 Subject: [PATCH 03/51] Hard to get every one. time... --- lib/source/pl/core/evaluator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index 4467c362..2978df9a 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -225,7 +225,7 @@ namespace pl::core { this->setBitwiseReadOffset(startOffset); - auto pattern = new ptrn::PatternArrayDynamic(this, 0, typePattern->getSize() * entryCount, 0); + auto pattern = std::make_shared(this, 0, typePattern->getSize() * entryCount, 0); if (section == ptrn::Pattern::PatternLocalSectionId) { typePattern->setSection(section); @@ -277,7 +277,7 @@ namespace pl::core { this->getConsole().log(LogConsole::Level::Debug, fmt::format("Creating local array variable '{} {}[{}]' at heap address 0x{:X}.", pattern->getTypeName(), pattern->getVariableName(), entryCount, pattern->getOffset())); pattern->setConstant(constant); - variables.push_back(std::unique_ptr(pattern)); + variables.push_back(pattern); } std::optional Evaluator::findTypeName(const ast::ASTNodeTypeDecl *type) { From db3c9475149edf93031e33a0b959e2087ca98092 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sun, 1 Jun 2025 08:47:37 +1000 Subject: [PATCH 04/51] Hard to get every one --- lib/include/pl/patterns/pattern_array_dynamic.hpp | 2 +- lib/include/pl/patterns/pattern_union.hpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index ab214949..240490f6 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -14,7 +14,7 @@ namespace pl::ptrn { PatternArrayDynamic(const PatternArrayDynamic &other) : Pattern(other) { std::vector> entries; for (const auto &entry : other.m_entries) - entries.push_back(entry->clone()); + entries.push_back(entry); this->setEntries(entries); } diff --git a/lib/include/pl/patterns/pattern_union.hpp b/lib/include/pl/patterns/pattern_union.hpp index 8eeeb7e8..eb1c9c95 100644 --- a/lib/include/pl/patterns/pattern_union.hpp +++ b/lib/include/pl/patterns/pattern_union.hpp @@ -13,10 +13,10 @@ namespace pl::ptrn { PatternUnion(const PatternUnion &other) : Pattern(other) { for (const auto &member : other.m_members) { - auto copy = member->clone(); + //auto copy = member->clone(); - this->m_sortedMembers.push_back(copy.get()); - this->m_members.push_back(std::move(copy)); + this->m_sortedMembers.push_back(member.get()); + this->m_members.push_back(member); } } From 1b5c8f64d793b1781c262645b0dcac76d13f8d4a Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 00:41:33 +1000 Subject: [PATCH 05/51] WIP --- lib/include/pl/patterns/pattern.hpp | 35 ++++++-- .../pl/patterns/pattern_array_dynamic.hpp | 31 +++++-- .../pl/patterns/pattern_array_static.hpp | 29 ++++++- lib/include/pl/patterns/pattern_bitfield.hpp | 87 +++++++++++++++++-- 4 files changed, 158 insertions(+), 24 deletions(-) diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index 000f58f8..53b4e60b 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -68,21 +68,21 @@ namespace pl::ptrn { constexpr static u64 PatternLocalSectionId = 0xFFFF'FFFF'FFFF'FFFE; constexpr static u64 InstantiationSectionId = 0xFFFF'FFFF'FFFF'FFFD; - Pattern(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) - : m_evaluator(evaluator), m_line(line), m_offset(offset), m_size(size) { + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + (void)evaluator; (void)offset; (void)size; (void)line; - if (evaluator != nullptr) { - this->m_color = evaluator->getNextPatternColor(); + if (m_evaluator != nullptr) { + this->m_color = m_evaluator->getNextPatternColor(); this->m_manualColor = false; this->m_variableName = m_evaluator->getStringPool().end(); this->m_typeName = m_evaluator->getStringPool().end(); - evaluator->patternCreated(this); + m_evaluator->patternCreated(this); } - } - Pattern(const Pattern &other) : std::enable_shared_from_this(other) { + void initialise(const Pattern &other) { this->m_evaluator = other.m_evaluator; this->m_offset = other.m_offset; this->m_endian = other.m_endian; @@ -109,6 +109,27 @@ namespace pl::ptrn { } } + Pattern(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) + : m_evaluator(evaluator), m_line(line), m_offset(offset), m_size(size) { + } + + Pattern(const Pattern &other) : std::enable_shared_from_this(other) { + } + + /*public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + auto p = std::make_shared(evaluator, offset, size, line); + p->initialise(); + return p; + } + + static std::shared_ptr create(const Pattern &other) { + auto p = std::make_shared(other); + p->initialise(other); + return p; + }*/ + + public: virtual ~Pattern() { if (this->m_evaluator != nullptr) { this->m_evaluator->patternDestroyed(this); diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index 240490f6..6a0721c5 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -7,20 +7,41 @@ namespace pl::ptrn { class PatternArrayDynamic : public Pattern, public IInlinable, public IIndexable { - public: - PatternArrayDynamic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) - : Pattern(evaluator, offset, size, line) { } + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + Pattern::initialise(evaluator, offset, size, line); + } + + void initialise(const PatternArrayDynamic &other) { + Pattern::initialise(other); - PatternArrayDynamic(const PatternArrayDynamic &other) : Pattern(other) { std::vector> entries; for (const auto &entry : other.m_entries) entries.push_back(entry); this->setEntries(entries); + } + + PatternArrayDynamic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) + : Pattern(evaluator, offset, size, line) { } + + PatternArrayDynamic(const PatternArrayDynamic &other) : Pattern(other) { } + + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + auto p = std::shared_ptr(new PatternArrayDynamic(evaluator, offset, size, line)); + p->initialise(evaluator, offset, size, line); + return p; + } + + static std::shared_ptr create(const PatternArrayDynamic &other) { + auto p = std::shared_ptr(new PatternArrayDynamic(other)); + p->initialise(other); + return p; } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternArrayDynamic(*this)); + return create(*this); } void setColor(u32 color) override { diff --git a/lib/include/pl/patterns/pattern_array_static.hpp b/lib/include/pl/patterns/pattern_array_static.hpp index d5f573a9..9ad59922 100644 --- a/lib/include/pl/patterns/pattern_array_static.hpp +++ b/lib/include/pl/patterns/pattern_array_static.hpp @@ -7,16 +7,37 @@ namespace pl::ptrn { class PatternArrayStatic : public Pattern, public IInlinable, public IIndexable { - public: + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + Pattern::initialise(evaluator, offset, size, line); + } + + void initialise(const PatternArrayStatic &other) { + Pattern::initialise(other); + + this->setEntries(other.getTemplate()->clone(), other.getEntryCount()); + } + PatternArrayStatic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } - PatternArrayStatic(const PatternArrayStatic &other) : Pattern(other) { - this->setEntries(other.getTemplate()->clone(), other.getEntryCount()); + PatternArrayStatic(const PatternArrayStatic &other) : Pattern(other) { } + + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + auto p = std::shared_ptr(new PatternArrayStatic(evaluator, offset, size, line)); + p->initialise(evaluator, offset, size, line); + return p; + } + + static std::shared_ptr create(const PatternArrayStatic &other) { + auto p = std::shared_ptr(new PatternArrayStatic(other)); + p->initialise(other); + return p; } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternArrayStatic(*this)); + return create(*this); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index 21da9599..4dd86321 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -6,8 +6,32 @@ namespace pl::ptrn { class PatternBitfieldMember : public Pattern { + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + Pattern::initialise(evaluator, offset, size, line); + } + + void initialise(const PatternBitfieldMember &other) { + Pattern::initialise(other); + } + + PatternBitfieldMember(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) + : Pattern(evaluator, offset, size, line) { } + + PatternBitfieldMember(const PatternBitfieldMember &other) : Pattern(other) { } + public: - using Pattern::Pattern; + /*static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + auto p = std::shared_ptr(new PatternBitfieldMember(evaluator, offset, size, line)); + p->initialise(evaluator, offset, size, line); + return p; + } + + static std::shared_ptr create(const PatternBitfieldMember &other) { + auto p = std::shared_ptr(new PatternBitfieldMember(other)); + p->initialise(other); + return p; + }*/ [[nodiscard]] const PatternBitfieldMember& getTopmostBitfield() const { const PatternBitfieldMember* topBitfield = this; @@ -52,20 +76,43 @@ namespace pl::ptrn { }; class PatternBitfieldField : public PatternBitfieldMember { - public: - PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) - : PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) { + protected: + void initialise(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { + PatternBitfieldMember::initialise(evaluator, offset, (bitOffset + bitSize + 7) / 8, line); + this->setParent(parentBitfield); } - PatternBitfieldField(const PatternBitfieldField &other) : PatternBitfieldMember(other) { + void initialise(const PatternBitfieldField &other) { + PatternBitfieldMember::initialise(other); + this->m_padding = other.m_padding; this->m_bitOffset = other.m_bitOffset; this->m_bitSize = other.m_bitSize; } + PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) + : PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) { + (void)parentBitfield; + } + + PatternBitfieldField(const PatternBitfieldField &other) : PatternBitfieldMember(other) { } + + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { + auto p = std::shared_ptr(new PatternBitfieldField(evaluator, offset, bitOffset, bitSize, line, parentBitfield)); + p->initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); + return p; + } + + static std::shared_ptr create(const PatternBitfieldField &other) { + auto p = std::shared_ptr(new PatternBitfieldField(other)); + p->initialise(other); + return p; + } + [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternBitfieldField(*this)); + return create(*this); } [[nodiscard]] u128 readValue() const { @@ -158,11 +205,35 @@ namespace pl::ptrn { }; class PatternBitfieldFieldSigned : public PatternBitfieldField { + protected: + void initialise(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { + PatternBitfieldField::initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); + } + + void initialise(const PatternBitfieldField &other) { + PatternBitfieldField::initialise(other); + } + + PatternBitfieldFieldSigned(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) + : PatternBitfieldField(evaluator, offset, bitOffset, bitSize, line, parentBitfield) {} + + PatternBitfieldFieldSigned(const PatternBitfieldFieldSigned &other) : PatternBitfieldField(other) { } + public: - using PatternBitfieldField::PatternBitfieldField; + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { + auto p = std::shared_ptr(new PatternBitfieldFieldSigned(evaluator, offset, bitOffset, bitSize, line, parentBitfield)); + p->initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); + return p; + } + + static std::shared_ptr create(const PatternBitfieldFieldSigned &other) { + auto p = std::shared_ptr(new PatternBitfieldFieldSigned(other)); + p->initialise(other); + return p; + } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternBitfieldFieldSigned(*this)); + return create(*this); } [[nodiscard]] core::Token::Literal getValue() const override { From e1b869dff4a3ffda3c73b024860a849c9f53d0d0 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 01:50:41 +1000 Subject: [PATCH 06/51] WIP --- lib/include/pl/patterns/pattern_bitfield.hpp | 90 +++++++++++++++++-- .../core/ast/ast_node_array_variable_decl.cpp | 4 +- .../ast_node_bitfield_array_variable_decl.cpp | 2 +- .../pl/core/ast/ast_node_bitfield_field.cpp | 8 +- 4 files changed, 88 insertions(+), 16 deletions(-) diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index 4dd86321..ca56b1b4 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -253,11 +253,36 @@ namespace pl::ptrn { }; class PatternBitfieldFieldBoolean : public PatternBitfieldField { + protected: + void initialise(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { + PatternBitfieldField::initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); + } + + void initialise(const PatternBitfieldFieldBoolean &other) { + PatternBitfieldField::initialise(other); + } + + PatternBitfieldFieldBoolean(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) + : PatternBitfieldField(evaluator, offset, bitOffset, bitSize, line, parentBitfield) { + } + + PatternBitfieldFieldBoolean(const PatternBitfieldFieldBoolean &other) : PatternBitfieldField(other) { } + public: - using PatternBitfieldField::PatternBitfieldField; + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { + auto p = std::shared_ptr(new PatternBitfieldFieldBoolean(evaluator, offset, bitOffset, bitSize, line, parentBitfield)); + p->initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); + return p; + } + + static std::shared_ptr create(const PatternBitfieldFieldBoolean &other) { + auto p = std::shared_ptr(new PatternBitfieldFieldBoolean(other)); + p->initialise(other); + return p; + } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternBitfieldFieldBoolean(*this)); + return create(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -285,8 +310,33 @@ namespace pl::ptrn { }; class PatternBitfieldFieldEnum : public PatternBitfieldField { + protected: + void initialise(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { + PatternBitfieldField::initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); + } + + void initialise(const PatternBitfieldFieldEnum &other) { + PatternBitfieldField::initialise(other); + } + + PatternBitfieldFieldEnum(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) + : PatternBitfieldField(evaluator, offset, bitOffset, bitSize, line, parentBitfield) { + } + + PatternBitfieldFieldEnum(const PatternBitfieldFieldEnum &other) : PatternBitfieldField(other) { } + public: - using PatternBitfieldField::PatternBitfieldField; + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { + auto p = std::shared_ptr(new PatternBitfieldFieldEnum(evaluator, offset, bitOffset, bitSize, line, parentBitfield)); + p->initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); + return p; + } + + static std::shared_ptr create(const PatternBitfieldFieldEnum &other) { + auto p = std::shared_ptr(new PatternBitfieldFieldEnum(other)); + p->initialise(other); + return p; + } [[nodiscard]] std::string getFormattedName() const override { return "enum " + Pattern::getTypeName(); @@ -316,7 +366,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternBitfieldFieldEnum(*this)); + return create(*this); } std::string formatDisplayValue() override { @@ -337,11 +387,15 @@ namespace pl::ptrn { class PatternBitfieldArray : public PatternBitfieldMember, public IInlinable, public IIndexable { - public: - PatternBitfieldArray(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) - : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } + protected: + void initialise(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) { + (void)firstBitOffset; + PatternBitfieldMember::initialise(evaluator, offset, size_t((totalBitSize + 7) / 8), line); + } + + void initialise(const PatternBitfieldArray &other) { + PatternBitfieldMember::initialise(other); - PatternBitfieldArray(const PatternBitfieldArray &other) : PatternBitfieldMember(other) { std::vector> entries; for (const auto &entry : other.m_entries) entries.push_back(entry->clone()); @@ -352,8 +406,26 @@ namespace pl::ptrn { this->m_totalBitSize = other.m_totalBitSize; } + PatternBitfieldArray(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) + : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } + + PatternBitfieldArray(const PatternBitfieldArray &other) : PatternBitfieldMember(other) { } + + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) { + auto p = std::shared_ptr(new PatternBitfieldArray(evaluator, offset, firstBitOffset, totalBitSize, line)); + p->initialise(evaluator, offset, firstBitOffset, totalBitSize, line); + return p; + } + + static std::shared_ptr create(const PatternBitfieldArray &other) { + auto p = std::shared_ptr(new PatternBitfieldArray(other)); + p->initialise(other); + return p; + } + [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternBitfieldArray(*this)); + return create(*this); } [[nodiscard]] u8 getBitOffset() const override { diff --git a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp index f3068731..df5b1434 100644 --- a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp @@ -224,7 +224,7 @@ namespace pl::core::ast { } else if (std::dynamic_pointer_cast(templatePattern)) { outputPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); } else { - auto arrayPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); + auto arrayPattern = ptrn::PatternArrayStatic::create(evaluator, startOffset, 0, getLocation().line); arrayPattern->setEntries(templatePattern->clone(), size_t(entryCount)); arrayPattern->setSection(templatePattern->getSection()); outputPattern = std::move(arrayPattern); @@ -256,7 +256,7 @@ namespace pl::core::ast { }; evaluator->alignToByte(); - auto arrayPattern = std::make_shared(evaluator, evaluator->getReadOffset(), 0, getLocation().line); + auto arrayPattern = ptrn::PatternArrayDynamic::create(evaluator, evaluator->getReadOffset(), 0, getLocation().line); arrayPattern->setVariableName(this->m_name); arrayPattern->setSection(evaluator->getSectionId()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp index 34dfd04b..89b606e1 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp @@ -53,7 +53,7 @@ namespace pl::core::ast { }; auto position = evaluator->getBitwiseReadOffset(); - auto arrayPattern = std::make_shared(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); + auto arrayPattern = ptrn::PatternBitfieldArray::create(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); arrayPattern->setVariableName(this->m_name); arrayPattern->setSection(evaluator->getSectionId()); arrayPattern->setReversed(evaluator->isReadOrderReversed()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp index 42832f6f..9621953f 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp @@ -25,7 +25,7 @@ namespace pl::core::ast { [[nodiscard]] bool ASTNodeBitfieldField::isPadding() const { return this->getName() == "$padding$"; } [[nodiscard]] std::shared_ptr ASTNodeBitfieldField::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { - return std::make_shared(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + return ptrn::PatternBitfieldField::create(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } void ASTNodeBitfieldField::createPatterns(Evaluator *evaluator, std::vector> &resultPatterns) const { @@ -57,7 +57,7 @@ namespace pl::core::ast { [[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSigned::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { - return std::make_shared(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + return ptrn::PatternBitfieldFieldSigned::create(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } @@ -79,12 +79,12 @@ namespace pl::core::ast { evaluator->setBitwiseReadOffset(originalPosition); if (auto *patternEnum = dynamic_cast(pattern.get()); patternEnum != nullptr) { - auto bitfieldEnum = std::make_shared(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + auto bitfieldEnum = ptrn::PatternBitfieldFieldEnum::create(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); bitfieldEnum->setTypeName(patternEnum->getTypeName()); bitfieldEnum->setEnumValues(patternEnum->getEnumValues()); result = std::move(bitfieldEnum); } else if (dynamic_cast(pattern.get()) != nullptr) { - result = std::make_shared(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + result = ptrn::PatternBitfieldFieldBoolean::create(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } else { err::E0004.throwError("Bit size specifiers may only be used with unsigned, signed, bool or enum types.", {}, this->getLocation()); } From fdf3df4dde9c7ce132e171c9c6e344916e64c39e Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 02:16:07 +1000 Subject: [PATCH 07/51] WIP --- lib/include/pl/patterns/pattern_bitfield.hpp | 34 +++++++++++++++++--- lib/source/pl/core/ast/ast_node_bitfield.cpp | 2 +- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index ca56b1b4..94ec914f 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -684,11 +684,15 @@ namespace pl::ptrn { class PatternBitfield : public PatternBitfieldMember, public IInlinable, public IIterable { - public: - PatternBitfield(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) - : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } + protected: + void initialise(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) { + (void)firstBitOffset; + PatternBitfieldMember::initialise(evaluator, offset, size_t((totalBitSize + 7) / 8), line); + } + + void initialise(const PatternBitfield &other) { + PatternBitfieldMember::initialise(other); - PatternBitfield(const PatternBitfield &other) : PatternBitfieldMember(other) { for (auto &field : other.m_fields) this->m_fields.push_back(field->clone()); @@ -696,10 +700,30 @@ namespace pl::ptrn { this->m_totalBitSize = other.m_totalBitSize; } + PatternBitfield(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) + : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } + + PatternBitfield(const PatternBitfield &other) : PatternBitfieldMember(other) { } + + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) { + auto p = std::shared_ptr(new PatternBitfield(evaluator, offset, firstBitOffset, totalBitSize, line)); + p->initialise(evaluator, offset, firstBitOffset, totalBitSize, line); + return p; + } + + static std::shared_ptr create(const PatternBitfield &other) { + auto p = std::shared_ptr(new PatternBitfield(other)); + p->initialise(other); + return p; + } + [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternBitfield(*this)); + return create(*this); } + // --- // + [[nodiscard]] u8 getBitOffset() const override { return m_firstBitOffset; } diff --git a/lib/source/pl/core/ast/ast_node_bitfield.cpp b/lib/source/pl/core/ast/ast_node_bitfield.cpp index 874da959..a9a5d034 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield.cpp @@ -26,7 +26,7 @@ namespace pl::core::ast { [[maybe_unused]] auto context = evaluator->updateRuntime(this); auto position = evaluator->getBitwiseReadOffset(); - auto bitfieldPattern = std::make_shared(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); + auto bitfieldPattern = ptrn::PatternBitfield::create(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); bitfieldPattern->setSection(evaluator->getSectionId()); From ad24e4410d9cea4636d36c81e1c8a894e81d5af8 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 02:16:42 +1000 Subject: [PATCH 08/51] WIP --- lib/include/pl/patterns/pattern_bitfield.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index 94ec914f..3c5c11fd 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -722,8 +722,6 @@ namespace pl::ptrn { return create(*this); } - // --- // - [[nodiscard]] u8 getBitOffset() const override { return m_firstBitOffset; } From c00486018657929dce739363146392d4694199c1 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 03:22:04 +1000 Subject: [PATCH 09/51] WIP --- lib/include/pl/patterns/pattern_boolean.hpp | 27 +++++++++++++++++-- .../pl/core/ast/ast_node_builtin_type.cpp | 2 +- lib/source/pl/core/evaluator.cpp | 6 ++--- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lib/include/pl/patterns/pattern_boolean.hpp b/lib/include/pl/patterns/pattern_boolean.hpp index c983b2ea..48edbf68 100644 --- a/lib/include/pl/patterns/pattern_boolean.hpp +++ b/lib/include/pl/patterns/pattern_boolean.hpp @@ -5,12 +5,35 @@ namespace pl::ptrn { class PatternBoolean : public Pattern { - public: + protected: + void initialise(core::Evaluator *evaluator, u64 offset, u32 line) { + Pattern::initialise(evaluator, offset, 1, line); + } + + void initialise(const PatternBoolean &other) { + Pattern::initialise(other); + } + explicit PatternBoolean(core::Evaluator *evaluator, u64 offset, u32 line) : Pattern(evaluator, offset, 1, line) { } + + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u32 line) { + auto p = std::shared_ptr(new PatternBoolean(evaluator, offset, line)); + p->initialise(evaluator, offset, line); + return p; + } + + static std::shared_ptr create(const PatternBoolean &other) { + auto p = std::shared_ptr(new PatternBoolean(other)); + p->initialise(other); + return p; + } + + [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternBoolean(*this)); + return create(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/source/pl/core/ast/ast_node_builtin_type.cpp b/lib/source/pl/core/ast/ast_node_builtin_type.cpp index fbac27f8..0ceec5c8 100644 --- a/lib/source/pl/core/ast/ast_node_builtin_type.cpp +++ b/lib/source/pl/core/ast/ast_node_builtin_type.cpp @@ -31,7 +31,7 @@ namespace pl::core::ast { else if (Token::isFloatingPoint(this->m_type)) pattern = std::make_shared(evaluator, offset, size, getLocation().line); else if (this->m_type == Token::ValueType::Boolean) - pattern = std::make_shared(evaluator, offset, getLocation().line); + pattern = ptrn::PatternBoolean::create(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character) pattern = std::make_shared(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character16) diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index 2978df9a..7ef23f7b 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -225,7 +225,7 @@ namespace pl::core { this->setBitwiseReadOffset(startOffset); - auto pattern = std::make_shared(this, 0, typePattern->getSize() * entryCount, 0); + auto pattern = ptrn::PatternArrayDynamic::create(this, 0, typePattern->getSize() * entryCount, 0); if (section == ptrn::Pattern::PatternLocalSectionId) { typePattern->setSection(section); @@ -404,7 +404,7 @@ namespace pl::core { else if (std::get_if(&value.value()) != nullptr) pattern = std::make_shared(this, 0, sizeof(double), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = std::make_shared(this, 0, 0); + pattern = ptrn::PatternBoolean::create(this, 0, 0); else if (std::get_if(&value.value()) != nullptr) pattern = std::make_shared(this, 0, 0); else if (auto string = std::get_if(&value.value()); string != nullptr) @@ -738,7 +738,7 @@ namespace pl::core { copyToStorage(adjustedValue); }, [&](const bool &value) { - changePatternType(pattern, std::make_shared(this, 0, 0)); + changePatternType(pattern, ptrn::PatternBoolean::create(this, 0, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); copyToStorage(adjustedValue); From b2606d8e2ad5e5ca3a10f5a41e903f418100dfa0 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 03:37:54 +1000 Subject: [PATCH 10/51] WIP --- lib/include/pl/patterns/pattern_character.hpp | 25 +++++++++++++++++-- lib/include/pl/patterns/pattern_string.hpp | 2 +- .../pl/core/ast/ast_node_builtin_type.cpp | 2 +- lib/source/pl/core/evaluator.cpp | 4 +-- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/lib/include/pl/patterns/pattern_character.hpp b/lib/include/pl/patterns/pattern_character.hpp index 66578064..cfbbab92 100644 --- a/lib/include/pl/patterns/pattern_character.hpp +++ b/lib/include/pl/patterns/pattern_character.hpp @@ -5,12 +5,33 @@ namespace pl::ptrn { class PatternCharacter : public Pattern { - public: + protected: + void initialise(core::Evaluator *evaluator, u64 offset, u32 line) { + Pattern::initialise(evaluator, offset, 1, line); + } + + void initialise(const PatternCharacter &other) { + Pattern::initialise(other); + } + PatternCharacter(core::Evaluator *evaluator, u64 offset, u32 line) : Pattern(evaluator, offset, 1, line) { } + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u32 line) { + auto p = std::shared_ptr(new PatternCharacter(evaluator, offset, line)); + p->initialise(evaluator, offset, line); + return p; + } + + static std::shared_ptr create(const PatternCharacter &other) { + auto p = std::shared_ptr(new PatternCharacter(other)); + p->initialise(other); + return p; + } + [[nodiscard]] std::shared_ptr clone() const override { - return std::make_unique(*this); + return create(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index 10f80c73..0c75d85a 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -76,7 +76,7 @@ namespace pl::ptrn { } std::shared_ptr getEntry(size_t index) const override { - auto result = std::make_shared(this->getEvaluator(), this->getOffset() + index, getLine()); + auto result = PatternCharacter::create(this->getEvaluator(), this->getOffset() + index, getLine()); result->setSection(this->getSection()); return result; diff --git a/lib/source/pl/core/ast/ast_node_builtin_type.cpp b/lib/source/pl/core/ast/ast_node_builtin_type.cpp index 0ceec5c8..e9f9ca43 100644 --- a/lib/source/pl/core/ast/ast_node_builtin_type.cpp +++ b/lib/source/pl/core/ast/ast_node_builtin_type.cpp @@ -33,7 +33,7 @@ namespace pl::core::ast { else if (this->m_type == Token::ValueType::Boolean) pattern = ptrn::PatternBoolean::create(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character) - pattern = std::make_shared(evaluator, offset, getLocation().line); + pattern = ptrn::PatternCharacter::create(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character16) pattern = std::make_shared(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Padding) diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index 7ef23f7b..b54edfbd 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -406,7 +406,7 @@ namespace pl::core { else if (std::get_if(&value.value()) != nullptr) pattern = ptrn::PatternBoolean::create(this, 0, 0); else if (std::get_if(&value.value()) != nullptr) - pattern = std::make_shared(this, 0, 0); + pattern = ptrn::PatternCharacter::create(this, 0, 0); else if (auto string = std::get_if(&value.value()); string != nullptr) pattern = std::make_shared(this, 0, string->size(), 0); else if (auto patternValue = std::get_if>(&value.value()); patternValue != nullptr) { @@ -744,7 +744,7 @@ namespace pl::core { copyToStorage(adjustedValue); }, [&](const char &value) { - changePatternType(pattern, std::make_shared(this, 0, 0)); + changePatternType(pattern, ptrn::PatternCharacter::create(this, 0, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); copyToStorage(adjustedValue); From 1214cd88c9f2f26b3d492d9ed8b7073602ed8405 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 04:09:53 +1000 Subject: [PATCH 11/51] WIP --- lib/include/pl/patterns/pattern_enum.hpp | 25 ++++++++++++++++++++++-- lib/source/pl/core/ast/ast_node_enum.cpp | 2 +- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/include/pl/patterns/pattern_enum.hpp b/lib/include/pl/patterns/pattern_enum.hpp index 5bbfd295..7a46cdc2 100644 --- a/lib/include/pl/patterns/pattern_enum.hpp +++ b/lib/include/pl/patterns/pattern_enum.hpp @@ -13,12 +13,33 @@ namespace pl::ptrn { [[nodiscard]] bool operator!=(const EnumValue &other) const = default; }; - public: + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + Pattern::initialise(evaluator, offset, size, line); + } + + void initialise(const PatternEnum &other) { + Pattern::initialise(other); + } + PatternEnum(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + auto p = std::shared_ptr(new PatternEnum(evaluator, offset, size, line)); + p->initialise(evaluator, offset, size, line); + return p; + } + + static std::shared_ptr create(const PatternEnum &other) { + auto p = std::shared_ptr(new PatternEnum(other)); + p->initialise(other); + return p; + } + [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternEnum(*this)); + return create(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/source/pl/core/ast/ast_node_enum.cpp b/lib/source/pl/core/ast/ast_node_enum.cpp index d54dc5ab..5968aad4 100644 --- a/lib/source/pl/core/ast/ast_node_enum.cpp +++ b/lib/source/pl/core/ast/ast_node_enum.cpp @@ -73,7 +73,7 @@ namespace pl::core::ast { err::E0005.throwError("'auto' can only be used with parameters.", { }, this->getLocation()); auto &underlying = underlyingTypePatterns.front(); - auto pattern = std::make_shared(evaluator, underlying->getOffset(), 0, getLocation().line); + auto pattern = ptrn::PatternEnum::create(evaluator, underlying->getOffset(), 0, getLocation().line); pattern->setSection(evaluator->getSectionId()); From 4295ce65f350ea2688eab3a951bb6b14ff6407d6 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 04:26:20 +1000 Subject: [PATCH 12/51] WIP --- lib/include/pl/patterns/pattern_error.hpp | 26 +++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/include/pl/patterns/pattern_error.hpp b/lib/include/pl/patterns/pattern_error.hpp index e6b2e817..ac22fef4 100644 --- a/lib/include/pl/patterns/pattern_error.hpp +++ b/lib/include/pl/patterns/pattern_error.hpp @@ -5,12 +5,34 @@ namespace pl::ptrn { class PatternError : public Pattern { - public: + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line, std::string errorMessage) { + (void)errorMessage; + Pattern::initialise(evaluator, offset, size, line); + } + + void initialise(const PatternError &other) { + Pattern::initialise(other); + } + PatternError(core::Evaluator *evaluator, u64 offset, size_t size, u32 line, std::string errorMessage) : Pattern(evaluator, offset, size, line), m_errorMessage(std::move(errorMessage)) { } + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line, std::string errorMessage) { + auto p = std::shared_ptr(new PatternError(evaluator, offset, size, line, errorMessage)); + p->initialise(evaluator, offset, size, line, errorMessage); + return p; + } + + static std::shared_ptr create(const PatternError &other) { + auto p = std::shared_ptr(new PatternError(other)); + p->initialise(other); + return p; + } + [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternError(*this)); + return create(*this); } [[nodiscard]] std::string getFormattedName() const override { From 5e0b38bad5bc40fd43ca55e5d8d3ee3a8b2a43aa Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 04:56:51 +1000 Subject: [PATCH 13/51] WIP --- lib/include/pl/patterns/pattern_float.hpp | 25 +++++++++++++++++-- .../pl/core/ast/ast_node_builtin_type.cpp | 2 +- lib/source/pl/core/evaluator.cpp | 4 +-- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/lib/include/pl/patterns/pattern_float.hpp b/lib/include/pl/patterns/pattern_float.hpp index df2bf7c8..60fddd80 100644 --- a/lib/include/pl/patterns/pattern_float.hpp +++ b/lib/include/pl/patterns/pattern_float.hpp @@ -5,12 +5,33 @@ namespace pl::ptrn { class PatternFloat : public Pattern { - public: + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + Pattern::initialise(evaluator, offset, size, line); + } + + void initialise(const PatternFloat &other) { + Pattern::initialise(other); + } + PatternFloat(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + auto p = std::shared_ptr(new PatternFloat(evaluator, offset, size, line)); + p->initialise(evaluator, offset, size, line); + return p; + } + + static std::shared_ptr create(const PatternFloat &other) { + auto p = std::shared_ptr(new PatternFloat(other)); + p->initialise(other); + return p; + } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternFloat(*this)); + return create(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/source/pl/core/ast/ast_node_builtin_type.cpp b/lib/source/pl/core/ast/ast_node_builtin_type.cpp index e9f9ca43..92a86648 100644 --- a/lib/source/pl/core/ast/ast_node_builtin_type.cpp +++ b/lib/source/pl/core/ast/ast_node_builtin_type.cpp @@ -29,7 +29,7 @@ namespace pl::core::ast { else if (Token::isSigned(this->m_type)) pattern = std::make_shared(evaluator, offset, size, getLocation().line); else if (Token::isFloatingPoint(this->m_type)) - pattern = std::make_shared(evaluator, offset, size, getLocation().line); + pattern = ptrn::PatternFloat::create(evaluator, offset, size, getLocation().line); else if (this->m_type == Token::ValueType::Boolean) pattern = ptrn::PatternBoolean::create(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character) diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index b54edfbd..255cd5eb 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -402,7 +402,7 @@ namespace pl::core { else if (std::get_if(&value.value()) != nullptr) pattern = std::make_shared(this, 0, sizeof(i128), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = std::make_shared(this, 0, sizeof(double), 0); + pattern = ptrn::PatternFloat::create(this, 0, sizeof(double), 0); else if (std::get_if(&value.value()) != nullptr) pattern = ptrn::PatternBoolean::create(this, 0, 0); else if (std::get_if(&value.value()) != nullptr) @@ -750,7 +750,7 @@ namespace pl::core { copyToStorage(adjustedValue); }, [&](const double &value) { - changePatternType(pattern, std::make_shared(this, 0, 8, 0)); + changePatternType(pattern, ptrn::PatternFloat::create(this, 0, 8, 0)); if (pattern->getSize() == sizeof(float)) { auto floatValue = float(value); From ab9a3a9242d856ff734c0934857077c7aa945e29 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 05:26:30 +1000 Subject: [PATCH 14/51] WIP --- lib/include/pl/patterns/pattern_padding.hpp | 26 +++++++++++++++++-- .../core/ast/ast_node_array_variable_decl.cpp | 2 +- .../pl/core/ast/ast_node_builtin_type.cpp | 2 +- lib/source/pl/core/ast/ast_node_rvalue.cpp | 2 +- lib/source/pl/core/evaluator.cpp | 4 +-- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/lib/include/pl/patterns/pattern_padding.hpp b/lib/include/pl/patterns/pattern_padding.hpp index f0caf166..930ae4b4 100644 --- a/lib/include/pl/patterns/pattern_padding.hpp +++ b/lib/include/pl/patterns/pattern_padding.hpp @@ -5,11 +5,33 @@ namespace pl::ptrn { class PatternPadding : public Pattern { + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + Pattern::initialise(evaluator, offset, size, line); + } + + void initialise(const PatternPadding &other) { + Pattern::initialise(other); + } + + PatternPadding(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) + : Pattern(evaluator, offset, size, line) { } + public: - PatternPadding(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + auto p = std::shared_ptr(new PatternPadding(evaluator, offset, size, line)); + p->initialise(evaluator, offset, size, line); + return p; + } + + static std::shared_ptr create(const PatternPadding &other) { + auto p = std::shared_ptr(new PatternPadding(other)); + p->initialise(other); + return p; + } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternPadding(*this)); + return create(*this); } [[nodiscard]] std::string getFormattedName() const override { diff --git a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp index df5b1434..7748fe3a 100644 --- a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp @@ -218,7 +218,7 @@ namespace pl::core::ast { } if (std::dynamic_pointer_cast(templatePattern)) { - outputPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); + outputPattern = ptrn::PatternPadding::create(evaluator, startOffset, 0, getLocation().line); } else if (std::dynamic_pointer_cast(templatePattern)) { outputPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); } else if (std::dynamic_pointer_cast(templatePattern)) { diff --git a/lib/source/pl/core/ast/ast_node_builtin_type.cpp b/lib/source/pl/core/ast/ast_node_builtin_type.cpp index 92a86648..1ef1ae5a 100644 --- a/lib/source/pl/core/ast/ast_node_builtin_type.cpp +++ b/lib/source/pl/core/ast/ast_node_builtin_type.cpp @@ -37,7 +37,7 @@ namespace pl::core::ast { else if (this->m_type == Token::ValueType::Character16) pattern = std::make_shared(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Padding) - pattern = std::make_shared(evaluator, offset, 1, getLocation().line); + pattern = ptrn::PatternPadding::create(evaluator, offset, 1, getLocation().line); else if (this->m_type == Token::ValueType::String) pattern = std::make_shared(evaluator, offset, 0, getLocation().line); else if (this->m_type == Token::ValueType::CustomType) { diff --git a/lib/source/pl/core/ast/ast_node_rvalue.cpp b/lib/source/pl/core/ast/ast_node_rvalue.cpp index d3eb73d3..620419d9 100644 --- a/lib/source/pl/core/ast/ast_node_rvalue.cpp +++ b/lib/source/pl/core/ast/ast_node_rvalue.cpp @@ -56,7 +56,7 @@ namespace pl::core::ast { if (auto name = std::get_if(&this->getPath().front()); name != nullptr) { if (*name == "$") return std::make_unique(u128(evaluator->getReadOffset())); else if (*name == "null") return std::make_unique( - std::make_shared(evaluator, 0, 0, getLocation().line)); + ptrn::PatternPadding::create(evaluator, 0, 0, getLocation().line)); // Why? auto parameterPack = evaluator->getScope(0).parameterPack; if (parameterPack && *name == parameterPack->name) diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index 255cd5eb..2ea31d00 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -396,7 +396,7 @@ namespace pl::core { if (auto builtinType = getBuiltinType(type); builtinType != nullptr && builtinType->getType() == Token::ValueType::Auto) { // Handle auto variables if (!value.has_value()) - pattern = std::make_shared(this, 0, 0, 0); + pattern = ptrn::PatternPadding::create(this, 0, 0, 0); else if (std::get_if(&value.value()) != nullptr) pattern = std::make_shared(this, 0, sizeof(u128), 0); else if (std::get_if(&value.value()) != nullptr) @@ -424,7 +424,7 @@ namespace pl::core { pattern = std::move(patterns.front()); } else { - pattern = std::make_shared(this, 0, 0, 0); + pattern = ptrn::PatternPadding::create(this, 0, 0, 0); if (auto typeName = findTypeName(type); typeName.has_value()) pattern->setTypeName(typeName.value()); From f7d6fc0a9ea301d31a60018345b3205c4ed878d5 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 05:43:32 +1000 Subject: [PATCH 15/51] WIP --- lib/include/pl/patterns/pattern_pointer.hpp | 32 ++++++++++++++++--- .../ast/ast_node_pointer_variable_decl.cpp | 2 +- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index 75c6d580..c303a206 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -7,12 +7,14 @@ namespace pl::ptrn { class PatternPointer : public Pattern, public IInlinable { - public: - PatternPointer(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) - : Pattern(evaluator, offset, size, line), m_pointedAt(nullptr), m_pointerType(nullptr) { + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + Pattern::initialise(evaluator, offset, size, line); } - PatternPointer(const PatternPointer &other) : Pattern(other) { + void initialise(const PatternPointer &other) { + Pattern::initialise(other); + this->m_pointedAt = std::shared_ptr(other.m_pointedAt->clone()); if (other.m_pointerType) { @@ -20,10 +22,30 @@ namespace pl::ptrn { } } + PatternPointer(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) + : Pattern(evaluator, offset, size, line), m_pointedAt(nullptr), m_pointerType(nullptr) { } + + PatternPointer(const PatternPointer &other) : Pattern(other) { } + + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + auto p = std::shared_ptr(new PatternPointer(evaluator, offset, size, line)); + p->initialise(evaluator, offset, size, line); + return p; + } + + static std::shared_ptr create(const PatternPointer &other) { + auto p = std::shared_ptr(new PatternPointer(other)); + p->initialise(other); + return p; + } + [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternPointer(*this)); + return create(*this); } + // --- // + [[nodiscard]] core::Token::Literal getValue() const override { return transformValue(this->m_pointerType->getValue()); } diff --git a/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp index 427625b6..647ad4c4 100644 --- a/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp @@ -67,7 +67,7 @@ namespace pl::core::ast { auto &sizePattern = sizePatterns.front(); sizePattern->setSection(evaluator->getSectionId()); - auto pattern = std::make_shared(evaluator, pointerStartOffset, sizePattern->getSize(), getLocation().line); + auto pattern = ptrn::PatternPointer::create(evaluator, pointerStartOffset, sizePattern->getSize(), getLocation().line); pattern->setVariableName(this->m_name); pattern->setPointerTypePattern(std::move(sizePattern)); From 2ac6ba91ea28d27e040da893f3b3b59480c6cafe Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 06:13:40 +1000 Subject: [PATCH 16/51] WIP --- lib/include/pl/patterns/pattern_pointer.hpp | 2 -- lib/include/pl/patterns/pattern_signed.hpp | 25 +++++++++++++++++-- .../pl/core/ast/ast_node_builtin_type.cpp | 2 +- lib/source/pl/core/evaluator.cpp | 4 +-- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index c303a206..2529d948 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -44,8 +44,6 @@ namespace pl::ptrn { return create(*this); } - // --- // - [[nodiscard]] core::Token::Literal getValue() const override { return transformValue(this->m_pointerType->getValue()); } diff --git a/lib/include/pl/patterns/pattern_signed.hpp b/lib/include/pl/patterns/pattern_signed.hpp index 5a2f0318..3a334d70 100644 --- a/lib/include/pl/patterns/pattern_signed.hpp +++ b/lib/include/pl/patterns/pattern_signed.hpp @@ -5,12 +5,33 @@ namespace pl::ptrn { class PatternSigned : public Pattern { - public: + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + Pattern::initialise(evaluator, offset, size, line); + } + + void initialise(const PatternSigned &other) { + Pattern::initialise(other); + } + PatternSigned(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + auto p = std::shared_ptr(new PatternSigned(evaluator, offset, size, line)); + p->initialise(evaluator, offset, size, line); + return p; + } + + static std::shared_ptr create(const PatternSigned &other) { + auto p = std::shared_ptr(new PatternSigned(other)); + p->initialise(other); + return p; + } + [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternSigned(*this)); + return create(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/source/pl/core/ast/ast_node_builtin_type.cpp b/lib/source/pl/core/ast/ast_node_builtin_type.cpp index 1ef1ae5a..37fa3a76 100644 --- a/lib/source/pl/core/ast/ast_node_builtin_type.cpp +++ b/lib/source/pl/core/ast/ast_node_builtin_type.cpp @@ -27,7 +27,7 @@ namespace pl::core::ast { if (Token::isUnsigned(this->m_type)) pattern = std::make_shared(evaluator, offset, size, getLocation().line); else if (Token::isSigned(this->m_type)) - pattern = std::make_shared(evaluator, offset, size, getLocation().line); + pattern = ptrn::PatternSigned::create(evaluator, offset, size, getLocation().line); else if (Token::isFloatingPoint(this->m_type)) pattern = ptrn::PatternFloat::create(evaluator, offset, size, getLocation().line); else if (this->m_type == Token::ValueType::Boolean) diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index 2ea31d00..e5bae924 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -400,7 +400,7 @@ namespace pl::core { else if (std::get_if(&value.value()) != nullptr) pattern = std::make_shared(this, 0, sizeof(u128), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = std::make_shared(this, 0, sizeof(i128), 0); + pattern = ptrn::PatternSigned::create(this, 0, sizeof(i128), 0); else if (std::get_if(&value.value()) != nullptr) pattern = ptrn::PatternFloat::create(this, 0, sizeof(double), 0); else if (std::get_if(&value.value()) != nullptr) @@ -731,7 +731,7 @@ namespace pl::core { copyToStorage(adjustedValue); }, [&](const i128 &value) { - changePatternType(pattern, std::make_shared(this, 0, 16, 0)); + changePatternType(pattern, ptrn::PatternSigned::create(this, 0, 16, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); adjustedValue = hlp::signExtend(pattern->getSize() * 8, adjustedValue); From c5496e105b6574d7d5efa865029c1c94982d0bc4 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 06:42:00 +1000 Subject: [PATCH 17/51] WIP --- lib/include/pl/patterns/pattern_string.hpp | 26 +++++++++++++++++-- .../core/ast/ast_node_array_variable_decl.cpp | 2 +- .../pl/core/ast/ast_node_builtin_type.cpp | 2 +- lib/source/pl/core/evaluator.cpp | 4 +-- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index 0c75d85a..0b48cc95 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -8,12 +8,34 @@ namespace pl::ptrn { class PatternString : public Pattern, public IIndexable { - public: + + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + Pattern::initialise(evaluator, offset, size, line); + } + + void initialise(const PatternString &other) { + Pattern::initialise(other); + } + PatternString(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + auto p = std::shared_ptr(new PatternString(evaluator, offset, size, line)); + p->initialise(evaluator, offset, size, line); + return p; + } + + static std::shared_ptr create(const PatternString &other) { + auto p = std::shared_ptr(new PatternString(other)); + p->initialise(other); + return p; + } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternString(*this)); + return create(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp index 7748fe3a..cdea3267 100644 --- a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp @@ -220,7 +220,7 @@ namespace pl::core::ast { if (std::dynamic_pointer_cast(templatePattern)) { outputPattern = ptrn::PatternPadding::create(evaluator, startOffset, 0, getLocation().line); } else if (std::dynamic_pointer_cast(templatePattern)) { - outputPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); + outputPattern = ptrn::PatternString::create(evaluator, startOffset, 0, getLocation().line); } else if (std::dynamic_pointer_cast(templatePattern)) { outputPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); } else { diff --git a/lib/source/pl/core/ast/ast_node_builtin_type.cpp b/lib/source/pl/core/ast/ast_node_builtin_type.cpp index 37fa3a76..a561927e 100644 --- a/lib/source/pl/core/ast/ast_node_builtin_type.cpp +++ b/lib/source/pl/core/ast/ast_node_builtin_type.cpp @@ -39,7 +39,7 @@ namespace pl::core::ast { else if (this->m_type == Token::ValueType::Padding) pattern = ptrn::PatternPadding::create(evaluator, offset, 1, getLocation().line); else if (this->m_type == Token::ValueType::String) - pattern = std::make_shared(evaluator, offset, 0, getLocation().line); + pattern = ptrn::PatternString::create(evaluator, offset, 0, getLocation().line); else if (this->m_type == Token::ValueType::CustomType) { std::vector params; diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index e5bae924..55b47652 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -408,7 +408,7 @@ namespace pl::core { else if (std::get_if(&value.value()) != nullptr) pattern = ptrn::PatternCharacter::create(this, 0, 0); else if (auto string = std::get_if(&value.value()); string != nullptr) - pattern = std::make_shared(this, 0, string->size(), 0); + pattern = ptrn::PatternString::create(this, 0, string->size(), 0); else if (auto patternValue = std::get_if>(&value.value()); patternValue != nullptr) { if (reference && !templateVariable) pattern = *patternValue; @@ -768,7 +768,7 @@ namespace pl::core { } }, [&](const std::string &value) { - changePatternType(pattern, std::make_shared(this, 0, value.length(), 0)); + changePatternType(pattern, ptrn::PatternString::create(this, 0, value.length(), 0)); pattern->setSize(value.size()); From 29be2d2eb74a066beb8757ca53e6545fbceb1a98 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 2 Jun 2025 23:37:42 +1000 Subject: [PATCH 18/51] WIP --- lib/include/pl/patterns/pattern_string.hpp | 1 - lib/include/pl/patterns/pattern_struct.hpp | 33 +++++++++++++++---- .../pl/core/ast/ast_node_imported_type.cpp | 2 +- lib/source/pl/core/ast/ast_node_struct.cpp | 2 +- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index 0b48cc95..c90e30ff 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -8,7 +8,6 @@ namespace pl::ptrn { class PatternString : public Pattern, public IIndexable { - protected: void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { Pattern::initialise(evaluator, offset, size, line); diff --git a/lib/include/pl/patterns/pattern_struct.hpp b/lib/include/pl/patterns/pattern_struct.hpp index 02b5d4a3..a1a3e8e9 100644 --- a/lib/include/pl/patterns/pattern_struct.hpp +++ b/lib/include/pl/patterns/pattern_struct.hpp @@ -7,11 +7,14 @@ namespace pl::ptrn { class PatternStruct : public Pattern, public IInlinable, public IIterable { - public: - PatternStruct(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) - : Pattern(evaluator, offset, size, line) { } + protected: + void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + Pattern::initialise(evaluator, offset, size, line); + } + + void initialise(const PatternStruct &other) { + Pattern::initialise(other); - PatternStruct(const PatternStruct &other) : Pattern(other) { for (const auto &member : other.m_members) { auto copy = member->clone(); @@ -21,8 +24,26 @@ namespace pl::ptrn { } } - [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternStruct(*this)); + PatternStruct(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) + : Pattern(evaluator, offset, size, line) { } + + PatternStruct(const PatternStruct &other) : Pattern(other) { } + + public: + static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { + auto p = std::shared_ptr(new PatternStruct(evaluator, offset, size, line)); + p->initialise(evaluator, offset, size, line); + return p; + } + + static std::shared_ptr create(const PatternStruct &other) { + auto p = std::shared_ptr(new PatternStruct(other)); + p->initialise(other); + return p; + } + + [[nodiscard]] std::shared_ptr clone() const override { + return create(*this); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { diff --git a/lib/source/pl/core/ast/ast_node_imported_type.cpp b/lib/source/pl/core/ast/ast_node_imported_type.cpp index 6f2858de..0959353d 100644 --- a/lib/source/pl/core/ast/ast_node_imported_type.cpp +++ b/lib/source/pl/core/ast/ast_node_imported_type.cpp @@ -33,7 +33,7 @@ namespace pl::core::ast { result = std::move(pattern); } else { - auto structPattern = std::make_shared(evaluator, 0x00, 0, getLocation().line); + auto structPattern = ptrn::PatternStruct::create(evaluator, 0x00, 0, getLocation().line); u64 minPos = std::numeric_limits::max(); u64 maxPos = std::numeric_limits::min(); diff --git a/lib/source/pl/core/ast/ast_node_struct.cpp b/lib/source/pl/core/ast/ast_node_struct.cpp index e1cdec3c..6663dd49 100644 --- a/lib/source/pl/core/ast/ast_node_struct.cpp +++ b/lib/source/pl/core/ast/ast_node_struct.cpp @@ -18,7 +18,7 @@ namespace pl::core::ast { [[maybe_unused]] auto context = evaluator->updateRuntime(this); evaluator->alignToByte(); - auto pattern = std::make_shared(evaluator, evaluator->getReadOffset(), 0, getLocation().line); + auto pattern = ptrn::PatternStruct::create(evaluator, evaluator->getReadOffset(), 0, getLocation().line); auto startOffset = evaluator->getReadOffset(); std::vector> memberPatterns; From 4e07ab245a9d08d6819eefefd5de2fbfd46d97b2 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Tue, 3 Jun 2025 06:42:09 +1000 Subject: [PATCH 19/51] Taking a slightly different approach --- lib/include/pl/patterns/pattern.hpp | 47 ++-- .../pl/patterns/pattern_array_dynamic.hpp | 35 +-- .../pl/patterns/pattern_array_static.hpp | 31 +-- lib/include/pl/patterns/pattern_bitfield.hpp | 215 ++---------------- lib/include/pl/patterns/pattern_boolean.hpp | 27 +-- lib/include/pl/patterns/pattern_character.hpp | 25 +- lib/include/pl/patterns/pattern_enum.hpp | 25 +- lib/include/pl/patterns/pattern_error.hpp | 26 +-- lib/include/pl/patterns/pattern_float.hpp | 25 +- lib/include/pl/patterns/pattern_padding.hpp | 26 +-- lib/include/pl/patterns/pattern_pointer.hpp | 30 +-- lib/include/pl/patterns/pattern_signed.hpp | 25 +- lib/include/pl/patterns/pattern_string.hpp | 27 +-- lib/include/pl/patterns/pattern_struct.hpp | 37 +-- lib/include/pl/patterns/pattern_union.hpp | 10 +- lib/include/pl/patterns/pattern_unsigned.hpp | 2 +- .../pl/patterns/pattern_wide_character.hpp | 2 +- .../pl/patterns/pattern_wide_string.hpp | 2 +- .../core/ast/ast_node_array_variable_decl.cpp | 8 +- lib/source/pl/core/ast/ast_node_bitfield.cpp | 2 +- .../ast_node_bitfield_array_variable_decl.cpp | 2 +- .../pl/core/ast/ast_node_bitfield_field.cpp | 14 +- .../pl/core/ast/ast_node_builtin_type.cpp | 12 +- lib/source/pl/core/ast/ast_node_enum.cpp | 2 +- .../pl/core/ast/ast_node_imported_type.cpp | 2 +- .../ast/ast_node_pointer_variable_decl.cpp | 2 +- lib/source/pl/core/ast/ast_node_rvalue.cpp | 2 +- lib/source/pl/core/ast/ast_node_struct.cpp | 2 +- lib/source/pl/core/evaluator.cpp | 28 +-- 29 files changed, 127 insertions(+), 566 deletions(-) diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index 53b4e60b..e0cd35da 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -68,21 +68,21 @@ namespace pl::ptrn { constexpr static u64 PatternLocalSectionId = 0xFFFF'FFFF'FFFF'FFFE; constexpr static u64 InstantiationSectionId = 0xFFFF'FFFF'FFFF'FFFD; - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - (void)evaluator; (void)offset; (void)size; (void)line; + Pattern(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) + : m_evaluator(evaluator), m_line(line), m_offset(offset), m_size(size) { - if (m_evaluator != nullptr) { - this->m_color = m_evaluator->getNextPatternColor(); + if (evaluator != nullptr) { + this->m_color = evaluator->getNextPatternColor(); this->m_manualColor = false; this->m_variableName = m_evaluator->getStringPool().end(); this->m_typeName = m_evaluator->getStringPool().end(); - m_evaluator->patternCreated(this); + evaluator->patternCreated(this); } + } - void initialise(const Pattern &other) { + Pattern(const Pattern &other) : std::enable_shared_from_this(other) { this->m_evaluator = other.m_evaluator; this->m_offset = other.m_offset; this->m_endian = other.m_endian; @@ -109,27 +109,6 @@ namespace pl::ptrn { } } - Pattern(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) - : m_evaluator(evaluator), m_line(line), m_offset(offset), m_size(size) { - } - - Pattern(const Pattern &other) : std::enable_shared_from_this(other) { - } - - /*public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - auto p = std::make_shared(evaluator, offset, size, line); - p->initialise(); - return p; - } - - static std::shared_ptr create(const Pattern &other) { - auto p = std::make_shared(other); - p->initialise(other); - return p; - }*/ - - public: virtual ~Pattern() { if (this->m_evaluator != nullptr) { this->m_evaluator->patternDestroyed(this); @@ -303,7 +282,9 @@ namespace pl::ptrn { } [[nodiscard]] virtual core::Token::Literal getValue() const { - return this->transformValue(const_cast(this)->reference()); + auto clone = this->clone(); + + return this->transformValue(std::move(clone)); } [[nodiscard]] virtual std::vector> getChildren() { @@ -556,15 +537,15 @@ namespace pl::ptrn { this->m_initialized = initialized; } - [[nodiscard]] std::shared_ptr getParent() const { + [[nodiscard]] const Pattern* getParent() const { return m_parent; } - [[nodiscard]] std::shared_ptr getParent() { + [[nodiscard]] Pattern* getParent() { return m_parent; } - void setParent(std::shared_ptr parent) { + void setParent(Pattern *parent) { m_parent = parent; } @@ -642,7 +623,7 @@ namespace pl::ptrn { core::Evaluator *m_evaluator; std::unique_ptr>> m_attributes; - std::shared_ptr m_parent; + Pattern *m_parent = nullptr; u32 m_line = 0; std::set::const_iterator m_variableName; diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index 6a0721c5..7334f1eb 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -7,41 +7,20 @@ namespace pl::ptrn { class PatternArrayDynamic : public Pattern, public IInlinable, public IIndexable { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - Pattern::initialise(evaluator, offset, size, line); - } - - void initialise(const PatternArrayDynamic &other) { - Pattern::initialise(other); + public: + PatternArrayDynamic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) + : Pattern(evaluator, offset, size, line) { } + PatternArrayDynamic(const PatternArrayDynamic &other) : Pattern(other) { std::vector> entries; for (const auto &entry : other.m_entries) - entries.push_back(entry); + entries.push_back(entry->clone()); this->setEntries(entries); - } - - PatternArrayDynamic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) - : Pattern(evaluator, offset, size, line) { } - - PatternArrayDynamic(const PatternArrayDynamic &other) : Pattern(other) { } - - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - auto p = std::shared_ptr(new PatternArrayDynamic(evaluator, offset, size, line)); - p->initialise(evaluator, offset, size, line); - return p; - } - - static std::shared_ptr create(const PatternArrayDynamic &other) { - auto p = std::shared_ptr(new PatternArrayDynamic(other)); - p->initialise(other); - return p; } [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternArrayDynamic(*this)); } void setColor(u32 color) override { @@ -154,7 +133,7 @@ namespace pl::ptrn { if (!entry->hasOverriddenColor()) entry->setBaseColor(this->getColor()); - entry->setParent(this->reference()); + entry->setParent(this); this->m_entries.emplace_back(entry); } diff --git a/lib/include/pl/patterns/pattern_array_static.hpp b/lib/include/pl/patterns/pattern_array_static.hpp index 9ad59922..36de9798 100644 --- a/lib/include/pl/patterns/pattern_array_static.hpp +++ b/lib/include/pl/patterns/pattern_array_static.hpp @@ -7,37 +7,16 @@ namespace pl::ptrn { class PatternArrayStatic : public Pattern, public IInlinable, public IIndexable { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - Pattern::initialise(evaluator, offset, size, line); - } - - void initialise(const PatternArrayStatic &other) { - Pattern::initialise(other); - - this->setEntries(other.getTemplate()->clone(), other.getEntryCount()); - } - + public: PatternArrayStatic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } - PatternArrayStatic(const PatternArrayStatic &other) : Pattern(other) { } - - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - auto p = std::shared_ptr(new PatternArrayStatic(evaluator, offset, size, line)); - p->initialise(evaluator, offset, size, line); - return p; - } - - static std::shared_ptr create(const PatternArrayStatic &other) { - auto p = std::shared_ptr(new PatternArrayStatic(other)); - p->initialise(other); - return p; + PatternArrayStatic(const PatternArrayStatic &other) : Pattern(other) { + this->setEntries(other.getTemplate()->clone(), other.getEntryCount()); } [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternArrayStatic(*this)); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { @@ -174,7 +153,7 @@ namespace pl::ptrn { void setEntries(std::shared_ptr &&templatePattern, size_t count) { this->m_template = std::move(templatePattern); - this->m_template->setParent(this->reference()); + this->m_template->setParent(this); this->m_highlightTemplates.push_back(this->m_template->clone()); this->m_entryCount = count; diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index 3c5c11fd..de64a087 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -6,37 +6,13 @@ namespace pl::ptrn { class PatternBitfieldMember : public Pattern { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - Pattern::initialise(evaluator, offset, size, line); - } - - void initialise(const PatternBitfieldMember &other) { - Pattern::initialise(other); - } - - PatternBitfieldMember(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) - : Pattern(evaluator, offset, size, line) { } - - PatternBitfieldMember(const PatternBitfieldMember &other) : Pattern(other) { } - public: - /*static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - auto p = std::shared_ptr(new PatternBitfieldMember(evaluator, offset, size, line)); - p->initialise(evaluator, offset, size, line); - return p; - } - - static std::shared_ptr create(const PatternBitfieldMember &other) { - auto p = std::shared_ptr(new PatternBitfieldMember(other)); - p->initialise(other); - return p; - }*/ + using Pattern::Pattern; [[nodiscard]] const PatternBitfieldMember& getTopmostBitfield() const { const PatternBitfieldMember* topBitfield = this; while (auto parent = topBitfield->getParent()) { - auto parentBitfield = dynamic_cast(parent.get()); + auto parentBitfield = dynamic_cast(parent); if (parentBitfield == nullptr) break; @@ -76,43 +52,20 @@ namespace pl::ptrn { }; class PatternBitfieldField : public PatternBitfieldMember { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { - PatternBitfieldMember::initialise(evaluator, offset, (bitOffset + bitSize + 7) / 8, line); - + public: + PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, PatternBitfieldMember *parentBitfield = nullptr) + : PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) { this->setParent(parentBitfield); } - void initialise(const PatternBitfieldField &other) { - PatternBitfieldMember::initialise(other); - + PatternBitfieldField(const PatternBitfieldField &other) : PatternBitfieldMember(other) { this->m_padding = other.m_padding; this->m_bitOffset = other.m_bitOffset; this->m_bitSize = other.m_bitSize; } - PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) - : PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) { - (void)parentBitfield; - } - - PatternBitfieldField(const PatternBitfieldField &other) : PatternBitfieldMember(other) { } - - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { - auto p = std::shared_ptr(new PatternBitfieldField(evaluator, offset, bitOffset, bitSize, line, parentBitfield)); - p->initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); - return p; - } - - static std::shared_ptr create(const PatternBitfieldField &other) { - auto p = std::shared_ptr(new PatternBitfieldField(other)); - p->initialise(other); - return p; - } - [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternBitfieldField(*this)); } [[nodiscard]] u128 readValue() const { @@ -205,35 +158,11 @@ namespace pl::ptrn { }; class PatternBitfieldFieldSigned : public PatternBitfieldField { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { - PatternBitfieldField::initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); - } - - void initialise(const PatternBitfieldField &other) { - PatternBitfieldField::initialise(other); - } - - PatternBitfieldFieldSigned(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) - : PatternBitfieldField(evaluator, offset, bitOffset, bitSize, line, parentBitfield) {} - - PatternBitfieldFieldSigned(const PatternBitfieldFieldSigned &other) : PatternBitfieldField(other) { } - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { - auto p = std::shared_ptr(new PatternBitfieldFieldSigned(evaluator, offset, bitOffset, bitSize, line, parentBitfield)); - p->initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); - return p; - } - - static std::shared_ptr create(const PatternBitfieldFieldSigned &other) { - auto p = std::shared_ptr(new PatternBitfieldFieldSigned(other)); - p->initialise(other); - return p; - } + using PatternBitfieldField::PatternBitfieldField; [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternBitfieldFieldSigned(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -253,36 +182,11 @@ namespace pl::ptrn { }; class PatternBitfieldFieldBoolean : public PatternBitfieldField { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { - PatternBitfieldField::initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); - } - - void initialise(const PatternBitfieldFieldBoolean &other) { - PatternBitfieldField::initialise(other); - } - - PatternBitfieldFieldBoolean(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) - : PatternBitfieldField(evaluator, offset, bitOffset, bitSize, line, parentBitfield) { - } - - PatternBitfieldFieldBoolean(const PatternBitfieldFieldBoolean &other) : PatternBitfieldField(other) { } - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { - auto p = std::shared_ptr(new PatternBitfieldFieldBoolean(evaluator, offset, bitOffset, bitSize, line, parentBitfield)); - p->initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); - return p; - } - - static std::shared_ptr create(const PatternBitfieldFieldBoolean &other) { - auto p = std::shared_ptr(new PatternBitfieldFieldBoolean(other)); - p->initialise(other); - return p; - } + using PatternBitfieldField::PatternBitfieldField; [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternBitfieldFieldBoolean(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -310,33 +214,8 @@ namespace pl::ptrn { }; class PatternBitfieldFieldEnum : public PatternBitfieldField { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { - PatternBitfieldField::initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); - } - - void initialise(const PatternBitfieldFieldEnum &other) { - PatternBitfieldField::initialise(other); - } - - PatternBitfieldFieldEnum(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) - : PatternBitfieldField(evaluator, offset, bitOffset, bitSize, line, parentBitfield) { - } - - PatternBitfieldFieldEnum(const PatternBitfieldFieldEnum &other) : PatternBitfieldField(other) { } - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { - auto p = std::shared_ptr(new PatternBitfieldFieldEnum(evaluator, offset, bitOffset, bitSize, line, parentBitfield)); - p->initialise(evaluator, offset, bitOffset, bitSize, line, parentBitfield); - return p; - } - - static std::shared_ptr create(const PatternBitfieldFieldEnum &other) { - auto p = std::shared_ptr(new PatternBitfieldFieldEnum(other)); - p->initialise(other); - return p; - } + using PatternBitfieldField::PatternBitfieldField; [[nodiscard]] std::string getFormattedName() const override { return "enum " + Pattern::getTypeName(); @@ -366,7 +245,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternBitfieldFieldEnum(*this)); } std::string formatDisplayValue() override { @@ -387,15 +266,11 @@ namespace pl::ptrn { class PatternBitfieldArray : public PatternBitfieldMember, public IInlinable, public IIndexable { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) { - (void)firstBitOffset; - PatternBitfieldMember::initialise(evaluator, offset, size_t((totalBitSize + 7) / 8), line); - } - - void initialise(const PatternBitfieldArray &other) { - PatternBitfieldMember::initialise(other); + public: + PatternBitfieldArray(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) + : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } + PatternBitfieldArray(const PatternBitfieldArray &other) : PatternBitfieldMember(other) { std::vector> entries; for (const auto &entry : other.m_entries) entries.push_back(entry->clone()); @@ -406,26 +281,8 @@ namespace pl::ptrn { this->m_totalBitSize = other.m_totalBitSize; } - PatternBitfieldArray(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) - : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } - - PatternBitfieldArray(const PatternBitfieldArray &other) : PatternBitfieldMember(other) { } - - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) { - auto p = std::shared_ptr(new PatternBitfieldArray(evaluator, offset, firstBitOffset, totalBitSize, line)); - p->initialise(evaluator, offset, firstBitOffset, totalBitSize, line); - return p; - } - - static std::shared_ptr create(const PatternBitfieldArray &other) { - auto p = std::shared_ptr(new PatternBitfieldArray(other)); - p->initialise(other); - return p; - } - [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternBitfieldArray(*this)); } [[nodiscard]] u8 getBitOffset() const override { @@ -565,7 +422,7 @@ namespace pl::ptrn { if (!entry->hasOverriddenColor()) entry->setBaseColor(this->getColor()); - entry->setParent(this->reference()); + entry->setParent(this); this->m_sortedEntries.push_back(entry.get()); } @@ -684,15 +541,11 @@ namespace pl::ptrn { class PatternBitfield : public PatternBitfieldMember, public IInlinable, public IIterable { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) { - (void)firstBitOffset; - PatternBitfieldMember::initialise(evaluator, offset, size_t((totalBitSize + 7) / 8), line); - } - - void initialise(const PatternBitfield &other) { - PatternBitfieldMember::initialise(other); + public: + PatternBitfield(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) + : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } + PatternBitfield(const PatternBitfield &other) : PatternBitfieldMember(other) { for (auto &field : other.m_fields) this->m_fields.push_back(field->clone()); @@ -700,26 +553,8 @@ namespace pl::ptrn { this->m_totalBitSize = other.m_totalBitSize; } - PatternBitfield(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) - : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } - - PatternBitfield(const PatternBitfield &other) : PatternBitfieldMember(other) { } - - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) { - auto p = std::shared_ptr(new PatternBitfield(evaluator, offset, firstBitOffset, totalBitSize, line)); - p->initialise(evaluator, offset, firstBitOffset, totalBitSize, line); - return p; - } - - static std::shared_ptr create(const PatternBitfield &other) { - auto p = std::shared_ptr(new PatternBitfield(other)); - p->initialise(other); - return p; - } - [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternBitfield(*this)); } [[nodiscard]] u8 getBitOffset() const override { @@ -808,7 +643,7 @@ namespace pl::ptrn { this->setBaseColor(this->m_fields.front()->getColor()); for (const auto &field : this->m_fields) { - field->setParent(this->reference()); + field->setParent(this); this->m_sortedFields.push_back(field.get()); } } diff --git a/lib/include/pl/patterns/pattern_boolean.hpp b/lib/include/pl/patterns/pattern_boolean.hpp index 48edbf68..af9bf441 100644 --- a/lib/include/pl/patterns/pattern_boolean.hpp +++ b/lib/include/pl/patterns/pattern_boolean.hpp @@ -5,35 +5,12 @@ namespace pl::ptrn { class PatternBoolean : public Pattern { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, u32 line) { - Pattern::initialise(evaluator, offset, 1, line); - } - - void initialise(const PatternBoolean &other) { - Pattern::initialise(other); - } - + public: explicit PatternBoolean(core::Evaluator *evaluator, u64 offset, u32 line) : Pattern(evaluator, offset, 1, line) { } - - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u32 line) { - auto p = std::shared_ptr(new PatternBoolean(evaluator, offset, line)); - p->initialise(evaluator, offset, line); - return p; - } - - static std::shared_ptr create(const PatternBoolean &other) { - auto p = std::shared_ptr(new PatternBoolean(other)); - p->initialise(other); - return p; - } - - [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternBoolean(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_character.hpp b/lib/include/pl/patterns/pattern_character.hpp index cfbbab92..66578064 100644 --- a/lib/include/pl/patterns/pattern_character.hpp +++ b/lib/include/pl/patterns/pattern_character.hpp @@ -5,33 +5,12 @@ namespace pl::ptrn { class PatternCharacter : public Pattern { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, u32 line) { - Pattern::initialise(evaluator, offset, 1, line); - } - - void initialise(const PatternCharacter &other) { - Pattern::initialise(other); - } - + public: PatternCharacter(core::Evaluator *evaluator, u64 offset, u32 line) : Pattern(evaluator, offset, 1, line) { } - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, u32 line) { - auto p = std::shared_ptr(new PatternCharacter(evaluator, offset, line)); - p->initialise(evaluator, offset, line); - return p; - } - - static std::shared_ptr create(const PatternCharacter &other) { - auto p = std::shared_ptr(new PatternCharacter(other)); - p->initialise(other); - return p; - } - [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::make_unique(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_enum.hpp b/lib/include/pl/patterns/pattern_enum.hpp index 7a46cdc2..b5462397 100644 --- a/lib/include/pl/patterns/pattern_enum.hpp +++ b/lib/include/pl/patterns/pattern_enum.hpp @@ -13,33 +13,12 @@ namespace pl::ptrn { [[nodiscard]] bool operator!=(const EnumValue &other) const = default; }; - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - Pattern::initialise(evaluator, offset, size, line); - } - - void initialise(const PatternEnum &other) { - Pattern::initialise(other); - } - + public: PatternEnum(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - auto p = std::shared_ptr(new PatternEnum(evaluator, offset, size, line)); - p->initialise(evaluator, offset, size, line); - return p; - } - - static std::shared_ptr create(const PatternEnum &other) { - auto p = std::shared_ptr(new PatternEnum(other)); - p->initialise(other); - return p; - } - [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternEnum(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_error.hpp b/lib/include/pl/patterns/pattern_error.hpp index ac22fef4..fc9e52be 100644 --- a/lib/include/pl/patterns/pattern_error.hpp +++ b/lib/include/pl/patterns/pattern_error.hpp @@ -5,34 +5,12 @@ namespace pl::ptrn { class PatternError : public Pattern { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line, std::string errorMessage) { - (void)errorMessage; - Pattern::initialise(evaluator, offset, size, line); - } - - void initialise(const PatternError &other) { - Pattern::initialise(other); - } - + public: PatternError(core::Evaluator *evaluator, u64 offset, size_t size, u32 line, std::string errorMessage) : Pattern(evaluator, offset, size, line), m_errorMessage(std::move(errorMessage)) { } - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line, std::string errorMessage) { - auto p = std::shared_ptr(new PatternError(evaluator, offset, size, line, errorMessage)); - p->initialise(evaluator, offset, size, line, errorMessage); - return p; - } - - static std::shared_ptr create(const PatternError &other) { - auto p = std::shared_ptr(new PatternError(other)); - p->initialise(other); - return p; - } - [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternError(*this)); } [[nodiscard]] std::string getFormattedName() const override { diff --git a/lib/include/pl/patterns/pattern_float.hpp b/lib/include/pl/patterns/pattern_float.hpp index 60fddd80..96dbe4a9 100644 --- a/lib/include/pl/patterns/pattern_float.hpp +++ b/lib/include/pl/patterns/pattern_float.hpp @@ -5,33 +5,12 @@ namespace pl::ptrn { class PatternFloat : public Pattern { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - Pattern::initialise(evaluator, offset, size, line); - } - - void initialise(const PatternFloat &other) { - Pattern::initialise(other); - } - + public: PatternFloat(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } - - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - auto p = std::shared_ptr(new PatternFloat(evaluator, offset, size, line)); - p->initialise(evaluator, offset, size, line); - return p; - } - - static std::shared_ptr create(const PatternFloat &other) { - auto p = std::shared_ptr(new PatternFloat(other)); - p->initialise(other); - return p; - } [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternFloat(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_padding.hpp b/lib/include/pl/patterns/pattern_padding.hpp index 930ae4b4..d3a95128 100644 --- a/lib/include/pl/patterns/pattern_padding.hpp +++ b/lib/include/pl/patterns/pattern_padding.hpp @@ -5,33 +5,11 @@ namespace pl::ptrn { class PatternPadding : public Pattern { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - Pattern::initialise(evaluator, offset, size, line); - } - - void initialise(const PatternPadding &other) { - Pattern::initialise(other); - } - - PatternPadding(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) - : Pattern(evaluator, offset, size, line) { } - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - auto p = std::shared_ptr(new PatternPadding(evaluator, offset, size, line)); - p->initialise(evaluator, offset, size, line); - return p; - } - - static std::shared_ptr create(const PatternPadding &other) { - auto p = std::shared_ptr(new PatternPadding(other)); - p->initialise(other); - return p; - } + PatternPadding(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternPadding(*this)); } [[nodiscard]] std::string getFormattedName() const override { diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index 2529d948..787d3c00 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -7,14 +7,12 @@ namespace pl::ptrn { class PatternPointer : public Pattern, public IInlinable { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - Pattern::initialise(evaluator, offset, size, line); + public: + PatternPointer(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) + : Pattern(evaluator, offset, size, line), m_pointedAt(nullptr), m_pointerType(nullptr) { } - void initialise(const PatternPointer &other) { - Pattern::initialise(other); - + PatternPointer(const PatternPointer &other) : Pattern(other) { this->m_pointedAt = std::shared_ptr(other.m_pointedAt->clone()); if (other.m_pointerType) { @@ -22,26 +20,8 @@ namespace pl::ptrn { } } - PatternPointer(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) - : Pattern(evaluator, offset, size, line), m_pointedAt(nullptr), m_pointerType(nullptr) { } - - PatternPointer(const PatternPointer &other) : Pattern(other) { } - - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - auto p = std::shared_ptr(new PatternPointer(evaluator, offset, size, line)); - p->initialise(evaluator, offset, size, line); - return p; - } - - static std::shared_ptr create(const PatternPointer &other) { - auto p = std::shared_ptr(new PatternPointer(other)); - p->initialise(other); - return p; - } - [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternPointer(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_signed.hpp b/lib/include/pl/patterns/pattern_signed.hpp index 3a334d70..94ad4b59 100644 --- a/lib/include/pl/patterns/pattern_signed.hpp +++ b/lib/include/pl/patterns/pattern_signed.hpp @@ -5,33 +5,12 @@ namespace pl::ptrn { class PatternSigned : public Pattern { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - Pattern::initialise(evaluator, offset, size, line); - } - - void initialise(const PatternSigned &other) { - Pattern::initialise(other); - } - + public: PatternSigned(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - auto p = std::shared_ptr(new PatternSigned(evaluator, offset, size, line)); - p->initialise(evaluator, offset, size, line); - return p; - } - - static std::shared_ptr create(const PatternSigned &other) { - auto p = std::shared_ptr(new PatternSigned(other)); - p->initialise(other); - return p; - } - [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternSigned(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index c90e30ff..de726c9e 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -8,33 +8,12 @@ namespace pl::ptrn { class PatternString : public Pattern, public IIndexable { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - Pattern::initialise(evaluator, offset, size, line); - } - - void initialise(const PatternString &other) { - Pattern::initialise(other); - } - + public: PatternString(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } - - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - auto p = std::shared_ptr(new PatternString(evaluator, offset, size, line)); - p->initialise(evaluator, offset, size, line); - return p; - } - - static std::shared_ptr create(const PatternString &other) { - auto p = std::shared_ptr(new PatternString(other)); - p->initialise(other); - return p; - } [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + return std::unique_ptr(new PatternString(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -97,7 +76,7 @@ namespace pl::ptrn { } std::shared_ptr getEntry(size_t index) const override { - auto result = PatternCharacter::create(this->getEvaluator(), this->getOffset() + index, getLine()); + auto result = std::make_shared(this->getEvaluator(), this->getOffset() + index, getLine()); result->setSection(this->getSection()); return result; diff --git a/lib/include/pl/patterns/pattern_struct.hpp b/lib/include/pl/patterns/pattern_struct.hpp index a1a3e8e9..3bd42bbd 100644 --- a/lib/include/pl/patterns/pattern_struct.hpp +++ b/lib/include/pl/patterns/pattern_struct.hpp @@ -7,43 +7,22 @@ namespace pl::ptrn { class PatternStruct : public Pattern, public IInlinable, public IIterable { - protected: - void initialise(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - Pattern::initialise(evaluator, offset, size, line); - } - - void initialise(const PatternStruct &other) { - Pattern::initialise(other); + public: + PatternStruct(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) + : Pattern(evaluator, offset, size, line) { } + PatternStruct(const PatternStruct &other) : Pattern(other) { for (const auto &member : other.m_members) { auto copy = member->clone(); - copy->setParent(this->reference()); + copy->setParent(this); this->m_sortedMembers.push_back(copy.get()); this->m_members.push_back(std::move(copy)); } } - PatternStruct(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) - : Pattern(evaluator, offset, size, line) { } - - PatternStruct(const PatternStruct &other) : Pattern(other) { } - - public: - static std::shared_ptr create(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) { - auto p = std::shared_ptr(new PatternStruct(evaluator, offset, size, line)); - p->initialise(evaluator, offset, size, line); - return p; - } - - static std::shared_ptr create(const PatternStruct &other) { - auto p = std::shared_ptr(new PatternStruct(other)); - p->initialise(other); - return p; - } - - [[nodiscard]] std::shared_ptr clone() const override { - return create(*this); + [[nodiscard]] std::shared_ptr clone() const override { + return std::unique_ptr(new PatternStruct(*this)); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { @@ -57,7 +36,7 @@ namespace pl::ptrn { void addEntry(const std::shared_ptr &entry) override { if (entry == nullptr) return; - entry->setParent(this->reference()); + entry->setParent(this); this->m_sortedMembers.push_back(entry.get()); this->m_members.push_back(entry); } diff --git a/lib/include/pl/patterns/pattern_union.hpp b/lib/include/pl/patterns/pattern_union.hpp index eb1c9c95..fa2939e3 100644 --- a/lib/include/pl/patterns/pattern_union.hpp +++ b/lib/include/pl/patterns/pattern_union.hpp @@ -13,15 +13,15 @@ namespace pl::ptrn { PatternUnion(const PatternUnion &other) : Pattern(other) { for (const auto &member : other.m_members) { - //auto copy = member->clone(); + auto copy = member->clone(); - this->m_sortedMembers.push_back(member.get()); - this->m_members.push_back(member); + this->m_sortedMembers.push_back(copy.get()); + this->m_members.push_back(std::move(copy)); } } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternUnion(*this)); + return std::unique_ptr(new PatternUnion(*this)); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { @@ -35,7 +35,7 @@ namespace pl::ptrn { void addEntry(const std::shared_ptr &entry) override { if (entry == nullptr) return; - entry->setParent(this->reference()); + entry->setParent(this); this->m_sortedMembers.push_back(entry.get()); this->m_members.push_back(entry); } diff --git a/lib/include/pl/patterns/pattern_unsigned.hpp b/lib/include/pl/patterns/pattern_unsigned.hpp index 806b7167..6cb650de 100644 --- a/lib/include/pl/patterns/pattern_unsigned.hpp +++ b/lib/include/pl/patterns/pattern_unsigned.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternUnsigned(*this)); + return std::unique_ptr(new PatternUnsigned(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_wide_character.hpp b/lib/include/pl/patterns/pattern_wide_character.hpp index ffee2b9a..1bc28b7c 100644 --- a/lib/include/pl/patterns/pattern_wide_character.hpp +++ b/lib/include/pl/patterns/pattern_wide_character.hpp @@ -12,7 +12,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, 2, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternWideCharacter(*this)); + return std::unique_ptr(new PatternWideCharacter(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_wide_string.hpp b/lib/include/pl/patterns/pattern_wide_string.hpp index e533baef..5b033492 100644 --- a/lib/include/pl/patterns/pattern_wide_string.hpp +++ b/lib/include/pl/patterns/pattern_wide_string.hpp @@ -13,7 +13,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::shared_ptr(new PatternWideString(*this)); + return std::unique_ptr(new PatternWideString(*this)); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp index cdea3267..ddd39044 100644 --- a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp @@ -218,13 +218,13 @@ namespace pl::core::ast { } if (std::dynamic_pointer_cast(templatePattern)) { - outputPattern = ptrn::PatternPadding::create(evaluator, startOffset, 0, getLocation().line); + outputPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); } else if (std::dynamic_pointer_cast(templatePattern)) { - outputPattern = ptrn::PatternString::create(evaluator, startOffset, 0, getLocation().line); + outputPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); } else if (std::dynamic_pointer_cast(templatePattern)) { outputPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); } else { - auto arrayPattern = ptrn::PatternArrayStatic::create(evaluator, startOffset, 0, getLocation().line); + auto arrayPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); arrayPattern->setEntries(templatePattern->clone(), size_t(entryCount)); arrayPattern->setSection(templatePattern->getSection()); outputPattern = std::move(arrayPattern); @@ -256,7 +256,7 @@ namespace pl::core::ast { }; evaluator->alignToByte(); - auto arrayPattern = ptrn::PatternArrayDynamic::create(evaluator, evaluator->getReadOffset(), 0, getLocation().line); + auto arrayPattern = construct_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); arrayPattern->setVariableName(this->m_name); arrayPattern->setSection(evaluator->getSectionId()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield.cpp b/lib/source/pl/core/ast/ast_node_bitfield.cpp index a9a5d034..24ebd058 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield.cpp @@ -26,7 +26,7 @@ namespace pl::core::ast { [[maybe_unused]] auto context = evaluator->updateRuntime(this); auto position = evaluator->getBitwiseReadOffset(); - auto bitfieldPattern = ptrn::PatternBitfield::create(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); + auto bitfieldPattern = construct_shared_object(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); bitfieldPattern->setSection(evaluator->getSectionId()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp index 89b606e1..d724121a 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp @@ -53,7 +53,7 @@ namespace pl::core::ast { }; auto position = evaluator->getBitwiseReadOffset(); - auto arrayPattern = ptrn::PatternBitfieldArray::create(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); + auto arrayPattern = construct_shared_object(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); arrayPattern->setVariableName(this->m_name); arrayPattern->setSection(evaluator->getSectionId()); arrayPattern->setReversed(evaluator->isReadOrderReversed()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp index 9621953f..f60a7ded 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp @@ -24,8 +24,8 @@ namespace pl::core::ast { [[nodiscard]] bool ASTNodeBitfieldField::isPadding() const { return this->getName() == "$padding$"; } - [[nodiscard]] std::shared_ptr ASTNodeBitfieldField::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { - return ptrn::PatternBitfieldField::create(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + [[nodiscard]] std::shared_ptr ASTNodeBitfieldField>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { + return construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } void ASTNodeBitfieldField::createPatterns(Evaluator *evaluator, std::vector> &resultPatterns) const { @@ -56,8 +56,8 @@ namespace pl::core::ast { } - [[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSigned::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { - return ptrn::PatternBitfieldFieldSigned::create(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + [[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSigned>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { + return construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } @@ -68,7 +68,7 @@ namespace pl::core::ast { this->m_type = std::unique_ptr(static_cast(other.m_type->clone().release())); } -[[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSizedType::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { +[[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSizedType>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { auto originalPosition = evaluator->getBitwiseReadOffset(); evaluator->setBitwiseReadOffset(byteOffset, bitOffset); @@ -79,12 +79,12 @@ namespace pl::core::ast { evaluator->setBitwiseReadOffset(originalPosition); if (auto *patternEnum = dynamic_cast(pattern.get()); patternEnum != nullptr) { - auto bitfieldEnum = ptrn::PatternBitfieldFieldEnum::create(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + auto bitfieldEnum = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); bitfieldEnum->setTypeName(patternEnum->getTypeName()); bitfieldEnum->setEnumValues(patternEnum->getEnumValues()); result = std::move(bitfieldEnum); } else if (dynamic_cast(pattern.get()) != nullptr) { - result = ptrn::PatternBitfieldFieldBoolean::create(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + result = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } else { err::E0004.throwError("Bit size specifiers may only be used with unsigned, signed, bool or enum types.", {}, this->getLocation()); } diff --git a/lib/source/pl/core/ast/ast_node_builtin_type.cpp b/lib/source/pl/core/ast/ast_node_builtin_type.cpp index a561927e..f0e76608 100644 --- a/lib/source/pl/core/ast/ast_node_builtin_type.cpp +++ b/lib/source/pl/core/ast/ast_node_builtin_type.cpp @@ -27,19 +27,19 @@ namespace pl::core::ast { if (Token::isUnsigned(this->m_type)) pattern = std::make_shared(evaluator, offset, size, getLocation().line); else if (Token::isSigned(this->m_type)) - pattern = ptrn::PatternSigned::create(evaluator, offset, size, getLocation().line); + pattern = construct_shared_object(evaluator, offset, size, getLocation().line); else if (Token::isFloatingPoint(this->m_type)) - pattern = ptrn::PatternFloat::create(evaluator, offset, size, getLocation().line); + pattern = construct_shared_object(evaluator, offset, size, getLocation().line); else if (this->m_type == Token::ValueType::Boolean) - pattern = ptrn::PatternBoolean::create(evaluator, offset, getLocation().line); + pattern = construct_shared_object(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character) - pattern = ptrn::PatternCharacter::create(evaluator, offset, getLocation().line); + pattern = construct_shared_object(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character16) pattern = std::make_shared(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Padding) - pattern = ptrn::PatternPadding::create(evaluator, offset, 1, getLocation().line); + pattern = construct_shared_object(evaluator, offset, 1, getLocation().line); else if (this->m_type == Token::ValueType::String) - pattern = ptrn::PatternString::create(evaluator, offset, 0, getLocation().line); + pattern = construct_shared_object(evaluator, offset, 0, getLocation().line); else if (this->m_type == Token::ValueType::CustomType) { std::vector params; diff --git a/lib/source/pl/core/ast/ast_node_enum.cpp b/lib/source/pl/core/ast/ast_node_enum.cpp index 5968aad4..39fbab58 100644 --- a/lib/source/pl/core/ast/ast_node_enum.cpp +++ b/lib/source/pl/core/ast/ast_node_enum.cpp @@ -73,7 +73,7 @@ namespace pl::core::ast { err::E0005.throwError("'auto' can only be used with parameters.", { }, this->getLocation()); auto &underlying = underlyingTypePatterns.front(); - auto pattern = ptrn::PatternEnum::create(evaluator, underlying->getOffset(), 0, getLocation().line); + auto pattern = construct_shared_object(evaluator, underlying->getOffset(), 0, getLocation().line); pattern->setSection(evaluator->getSectionId()); diff --git a/lib/source/pl/core/ast/ast_node_imported_type.cpp b/lib/source/pl/core/ast/ast_node_imported_type.cpp index 0959353d..a627d448 100644 --- a/lib/source/pl/core/ast/ast_node_imported_type.cpp +++ b/lib/source/pl/core/ast/ast_node_imported_type.cpp @@ -33,7 +33,7 @@ namespace pl::core::ast { result = std::move(pattern); } else { - auto structPattern = ptrn::PatternStruct::create(evaluator, 0x00, 0, getLocation().line); + auto structPattern = construct_shared_object(evaluator, 0x00, 0, getLocation().line); u64 minPos = std::numeric_limits::max(); u64 maxPos = std::numeric_limits::min(); diff --git a/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp index 647ad4c4..1cc8a3cb 100644 --- a/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp @@ -67,7 +67,7 @@ namespace pl::core::ast { auto &sizePattern = sizePatterns.front(); sizePattern->setSection(evaluator->getSectionId()); - auto pattern = ptrn::PatternPointer::create(evaluator, pointerStartOffset, sizePattern->getSize(), getLocation().line); + auto pattern = construct_shared_object(evaluator, pointerStartOffset, sizePattern->getSize(), getLocation().line); pattern->setVariableName(this->m_name); pattern->setPointerTypePattern(std::move(sizePattern)); diff --git a/lib/source/pl/core/ast/ast_node_rvalue.cpp b/lib/source/pl/core/ast/ast_node_rvalue.cpp index 620419d9..cadde74c 100644 --- a/lib/source/pl/core/ast/ast_node_rvalue.cpp +++ b/lib/source/pl/core/ast/ast_node_rvalue.cpp @@ -56,7 +56,7 @@ namespace pl::core::ast { if (auto name = std::get_if(&this->getPath().front()); name != nullptr) { if (*name == "$") return std::make_unique(u128(evaluator->getReadOffset())); else if (*name == "null") return std::make_unique( - ptrn::PatternPadding::create(evaluator, 0, 0, getLocation().line)); // Why? + construct_shared_object(evaluator, 0, 0, getLocation().line)); // Why? auto parameterPack = evaluator->getScope(0).parameterPack; if (parameterPack && *name == parameterPack->name) diff --git a/lib/source/pl/core/ast/ast_node_struct.cpp b/lib/source/pl/core/ast/ast_node_struct.cpp index 6663dd49..f15a9271 100644 --- a/lib/source/pl/core/ast/ast_node_struct.cpp +++ b/lib/source/pl/core/ast/ast_node_struct.cpp @@ -18,7 +18,7 @@ namespace pl::core::ast { [[maybe_unused]] auto context = evaluator->updateRuntime(this); evaluator->alignToByte(); - auto pattern = ptrn::PatternStruct::create(evaluator, evaluator->getReadOffset(), 0, getLocation().line); + auto pattern = construct_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); auto startOffset = evaluator->getReadOffset(); std::vector> memberPatterns; diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index 55b47652..75f7931c 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -225,7 +225,7 @@ namespace pl::core { this->setBitwiseReadOffset(startOffset); - auto pattern = ptrn::PatternArrayDynamic::create(this, 0, typePattern->getSize() * entryCount, 0); + auto pattern = construct_shared_object(this, 0, typePattern->getSize() * entryCount, 0); if (section == ptrn::Pattern::PatternLocalSectionId) { typePattern->setSection(section); @@ -352,7 +352,7 @@ namespace pl::core { } } - std::shared_ptr Evaluator::createVariable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { + std::shared_ptr Evaluator>Variable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { auto startPos = this->getBitwiseReadOffset(); ON_SCOPE_EXIT { this->setBitwiseReadOffset(startPos); }; @@ -396,19 +396,19 @@ namespace pl::core { if (auto builtinType = getBuiltinType(type); builtinType != nullptr && builtinType->getType() == Token::ValueType::Auto) { // Handle auto variables if (!value.has_value()) - pattern = ptrn::PatternPadding::create(this, 0, 0, 0); + pattern = construct_shared_object(this, 0, 0, 0); else if (std::get_if(&value.value()) != nullptr) pattern = std::make_shared(this, 0, sizeof(u128), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = ptrn::PatternSigned::create(this, 0, sizeof(i128), 0); + pattern = construct_shared_object(this, 0, sizeof(i128), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = ptrn::PatternFloat::create(this, 0, sizeof(double), 0); + pattern = construct_shared_object(this, 0, sizeof(double), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = ptrn::PatternBoolean::create(this, 0, 0); + pattern = construct_shared_object(this, 0, 0); else if (std::get_if(&value.value()) != nullptr) - pattern = ptrn::PatternCharacter::create(this, 0, 0); + pattern = construct_shared_object(this, 0, 0); else if (auto string = std::get_if(&value.value()); string != nullptr) - pattern = ptrn::PatternString::create(this, 0, string->size(), 0); + pattern = construct_shared_object(this, 0, string->size(), 0); else if (auto patternValue = std::get_if>(&value.value()); patternValue != nullptr) { if (reference && !templateVariable) pattern = *patternValue; @@ -424,7 +424,7 @@ namespace pl::core { pattern = std::move(patterns.front()); } else { - pattern = ptrn::PatternPadding::create(this, 0, 0, 0); + pattern = construct_shared_object(this, 0, 0, 0); if (auto typeName = findTypeName(type); typeName.has_value()) pattern->setTypeName(typeName.value()); @@ -731,26 +731,26 @@ namespace pl::core { copyToStorage(adjustedValue); }, [&](const i128 &value) { - changePatternType(pattern, ptrn::PatternSigned::create(this, 0, 16, 0)); + changePatternType(pattern, construct_shared_object(this, 0, 16, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); adjustedValue = hlp::signExtend(pattern->getSize() * 8, adjustedValue); copyToStorage(adjustedValue); }, [&](const bool &value) { - changePatternType(pattern, ptrn::PatternBoolean::create(this, 0, 0)); + changePatternType(pattern, construct_shared_object(this, 0, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); copyToStorage(adjustedValue); }, [&](const char &value) { - changePatternType(pattern, ptrn::PatternCharacter::create(this, 0, 0)); + changePatternType(pattern, construct_shared_object(this, 0, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); copyToStorage(adjustedValue); }, [&](const double &value) { - changePatternType(pattern, ptrn::PatternFloat::create(this, 0, 8, 0)); + changePatternType(pattern, construct_shared_object(this, 0, 8, 0)); if (pattern->getSize() == sizeof(float)) { auto floatValue = float(value); @@ -768,7 +768,7 @@ namespace pl::core { } }, [&](const std::string &value) { - changePatternType(pattern, ptrn::PatternString::create(this, 0, value.length(), 0)); + changePatternType(pattern, construct_shared_object(this, 0, value.length(), 0)); pattern->setSize(value.size()); From 8ea5dc481ef5876eb62586aa641d12da370d3a6f Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Tue, 3 Jun 2025 06:47:54 +1000 Subject: [PATCH 20/51] Add 'construct_shared_object.hpp' --- .../pl/helpers/construct_shared_object.hpp | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 lib/include/pl/helpers/construct_shared_object.hpp diff --git a/lib/include/pl/helpers/construct_shared_object.hpp b/lib/include/pl/helpers/construct_shared_object.hpp new file mode 100644 index 00000000..08b20749 --- /dev/null +++ b/lib/include/pl/helpers/construct_shared_object.hpp @@ -0,0 +1,88 @@ +// construct_shared_object.hpp +// + +#pragma once +/* +The motivation for this code is issues with std::shared_ptr and +std::enable_shared_from_this. + +Consider code like this: + std::shared ptr = std::make_shared(); + +Assume that `SomeClass`'s constructor uses shared_from_this. In this case, since +SomeClass is not yet owned by a std::shared_ptr, the shared_from_this call will +not work as expected. There seems to no way around this that I can find. +I wasn�t aware of this issue. It was a real kick in the pants. + +The solution implemented here is two-stage construction. First the object is +constructed and assigned to a std::shared_ptr; then, if present, a +post_construct method is called with the same arguments. All code that uses +shared_from_this in the constructors should be moved to a post_construct method. +The intent of the "if present" is to enable incremental migration to two-stage +construction on demand. + +Another issue addressed is with std::make_shared. This function requires that +the constructor be public. If we�re making factory methods for creation, we may +want to make the constructors non-public to stop misuse. In this case the code +uses std::shared_ptr�s constructor and a new call. The function that calls new +can be made a friend of the class to grant it access. We lose the advantages of +using std::make_shared but gain protection against incorrect object +instantiation. +*/ + +#include +#include +#include + +#define BEFRIEND_SHARED_OBJECT_CREATOR \ + template \ + friend std::shared_ptr shared_object_creator::impl::shared_ptr_creator(Args&&... args); + +namespace shared_object_creator { + + namespace impl { + + /* + shared_ptr_creator is responsible for actually creating the std::shared_ptr. + As described in this header's opening comment, it decides whether to use + std::make_shared or std::shared_ptr�s constructor and new based on the + accessibility the the class' constructor. If you wish to make the constructors + non-public make this a friend. The BEFRIEND_SHARED_OBJECT_CREATOR macro can be + used to do this tersely. + */ + + template + requires std::constructible_from + std::shared_ptr shared_ptr_creator(Args&&... args) { + return std::make_shared(std::forward(args)...); + } + + template + std::shared_ptr shared_ptr_creator(Args&&... args) { + return std::shared_ptr(new T(std::forward(args)...)); + } + + // Used to detect if the class has a post_construct method with the same + // arguments as the constructor. + template + concept HasPostConstruct = requires(T obj, Args... args) { + obj.post_construct(args...); + }; + + } // namespace impl + + // The actual creation functions. + + template + std::shared_ptr construct_shared_object(Args&&... args) { + return impl::shared_ptr_creator(std::forward(args)...); + } + + template + std::shared_ptr construct_shared_object(Args&&... args) { + std::shared_ptr p = impl::shared_ptr_creator(std::forward(args)...); + p->post_construct(std::forward(args)...); + return p; + } + +} // namespace shared_object_creator From 324a136f7fbe49178852b7858f240d62de6ead68 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Tue, 3 Jun 2025 07:00:08 +1000 Subject: [PATCH 21/51] WIP --- lib/include/pl/patterns/pattern.hpp | 3 ++ .../core/ast/ast_node_array_variable_decl.cpp | 8 +++--- lib/source/pl/core/ast/ast_node_bitfield.cpp | 2 +- .../ast_node_bitfield_array_variable_decl.cpp | 2 +- .../pl/core/ast/ast_node_bitfield_field.cpp | 14 +++++----- .../pl/core/ast/ast_node_builtin_type.cpp | 12 ++++---- lib/source/pl/core/ast/ast_node_enum.cpp | 2 +- .../pl/core/ast/ast_node_imported_type.cpp | 2 +- .../ast/ast_node_pointer_variable_decl.cpp | 2 +- lib/source/pl/core/ast/ast_node_rvalue.cpp | 2 +- lib/source/pl/core/ast/ast_node_struct.cpp | 2 +- lib/source/pl/core/evaluator.cpp | 28 +++++++++---------- 12 files changed, 41 insertions(+), 38 deletions(-) diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index e0cd35da..b21c46a6 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -14,6 +15,8 @@ #include #include +using namespace shared_object_creator; + namespace pl::ptrn { using namespace ::std::literals::string_literals; diff --git a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp index ddd39044..4cfec0f7 100644 --- a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp @@ -218,13 +218,13 @@ namespace pl::core::ast { } if (std::dynamic_pointer_cast(templatePattern)) { - outputPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); + outputPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); } else if (std::dynamic_pointer_cast(templatePattern)) { - outputPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); + outputPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); } else if (std::dynamic_pointer_cast(templatePattern)) { outputPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); } else { - auto arrayPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); + auto arrayPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); arrayPattern->setEntries(templatePattern->clone(), size_t(entryCount)); arrayPattern->setSection(templatePattern->getSection()); outputPattern = std::move(arrayPattern); @@ -256,7 +256,7 @@ namespace pl::core::ast { }; evaluator->alignToByte(); - auto arrayPattern = construct_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); + auto arrayPattern = construct_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); arrayPattern->setVariableName(this->m_name); arrayPattern->setSection(evaluator->getSectionId()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield.cpp b/lib/source/pl/core/ast/ast_node_bitfield.cpp index 24ebd058..51fe7315 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield.cpp @@ -26,7 +26,7 @@ namespace pl::core::ast { [[maybe_unused]] auto context = evaluator->updateRuntime(this); auto position = evaluator->getBitwiseReadOffset(); - auto bitfieldPattern = construct_shared_object(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); + auto bitfieldPattern = construct_shared_object(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); bitfieldPattern->setSection(evaluator->getSectionId()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp index d724121a..dd784dcf 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp @@ -53,7 +53,7 @@ namespace pl::core::ast { }; auto position = evaluator->getBitwiseReadOffset(); - auto arrayPattern = construct_shared_object(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); + auto arrayPattern = construct_shared_object(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); arrayPattern->setVariableName(this->m_name); arrayPattern->setSection(evaluator->getSectionId()); arrayPattern->setReversed(evaluator->isReadOrderReversed()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp index f60a7ded..c89553f0 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp @@ -24,8 +24,8 @@ namespace pl::core::ast { [[nodiscard]] bool ASTNodeBitfieldField::isPadding() const { return this->getName() == "$padding$"; } - [[nodiscard]] std::shared_ptr ASTNodeBitfieldField>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { - return construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + [[nodiscard]] std::shared_ptr ASTNodeBitfieldField>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { + return construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } void ASTNodeBitfieldField::createPatterns(Evaluator *evaluator, std::vector> &resultPatterns) const { @@ -56,8 +56,8 @@ namespace pl::core::ast { } - [[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSigned>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { - return construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + [[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSigned>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { + return construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } @@ -68,7 +68,7 @@ namespace pl::core::ast { this->m_type = std::unique_ptr(static_cast(other.m_type->clone().release())); } -[[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSizedType>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { +[[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSizedType>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { auto originalPosition = evaluator->getBitwiseReadOffset(); evaluator->setBitwiseReadOffset(byteOffset, bitOffset); @@ -79,12 +79,12 @@ namespace pl::core::ast { evaluator->setBitwiseReadOffset(originalPosition); if (auto *patternEnum = dynamic_cast(pattern.get()); patternEnum != nullptr) { - auto bitfieldEnum = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + auto bitfieldEnum = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); bitfieldEnum->setTypeName(patternEnum->getTypeName()); bitfieldEnum->setEnumValues(patternEnum->getEnumValues()); result = std::move(bitfieldEnum); } else if (dynamic_cast(pattern.get()) != nullptr) { - result = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + result = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } else { err::E0004.throwError("Bit size specifiers may only be used with unsigned, signed, bool or enum types.", {}, this->getLocation()); } diff --git a/lib/source/pl/core/ast/ast_node_builtin_type.cpp b/lib/source/pl/core/ast/ast_node_builtin_type.cpp index f0e76608..5e74aaf5 100644 --- a/lib/source/pl/core/ast/ast_node_builtin_type.cpp +++ b/lib/source/pl/core/ast/ast_node_builtin_type.cpp @@ -27,19 +27,19 @@ namespace pl::core::ast { if (Token::isUnsigned(this->m_type)) pattern = std::make_shared(evaluator, offset, size, getLocation().line); else if (Token::isSigned(this->m_type)) - pattern = construct_shared_object(evaluator, offset, size, getLocation().line); + pattern = construct_shared_object(evaluator, offset, size, getLocation().line); else if (Token::isFloatingPoint(this->m_type)) - pattern = construct_shared_object(evaluator, offset, size, getLocation().line); + pattern = construct_shared_object(evaluator, offset, size, getLocation().line); else if (this->m_type == Token::ValueType::Boolean) - pattern = construct_shared_object(evaluator, offset, getLocation().line); + pattern = construct_shared_object(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character) - pattern = construct_shared_object(evaluator, offset, getLocation().line); + pattern = construct_shared_object(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character16) pattern = std::make_shared(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Padding) - pattern = construct_shared_object(evaluator, offset, 1, getLocation().line); + pattern = construct_shared_object(evaluator, offset, 1, getLocation().line); else if (this->m_type == Token::ValueType::String) - pattern = construct_shared_object(evaluator, offset, 0, getLocation().line); + pattern = construct_shared_object(evaluator, offset, 0, getLocation().line); else if (this->m_type == Token::ValueType::CustomType) { std::vector params; diff --git a/lib/source/pl/core/ast/ast_node_enum.cpp b/lib/source/pl/core/ast/ast_node_enum.cpp index 39fbab58..0f64b7af 100644 --- a/lib/source/pl/core/ast/ast_node_enum.cpp +++ b/lib/source/pl/core/ast/ast_node_enum.cpp @@ -73,7 +73,7 @@ namespace pl::core::ast { err::E0005.throwError("'auto' can only be used with parameters.", { }, this->getLocation()); auto &underlying = underlyingTypePatterns.front(); - auto pattern = construct_shared_object(evaluator, underlying->getOffset(), 0, getLocation().line); + auto pattern = construct_shared_object(evaluator, underlying->getOffset(), 0, getLocation().line); pattern->setSection(evaluator->getSectionId()); diff --git a/lib/source/pl/core/ast/ast_node_imported_type.cpp b/lib/source/pl/core/ast/ast_node_imported_type.cpp index a627d448..f5f34d5f 100644 --- a/lib/source/pl/core/ast/ast_node_imported_type.cpp +++ b/lib/source/pl/core/ast/ast_node_imported_type.cpp @@ -33,7 +33,7 @@ namespace pl::core::ast { result = std::move(pattern); } else { - auto structPattern = construct_shared_object(evaluator, 0x00, 0, getLocation().line); + auto structPattern = construct_shared_object(evaluator, 0x00, 0, getLocation().line); u64 minPos = std::numeric_limits::max(); u64 maxPos = std::numeric_limits::min(); diff --git a/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp index 1cc8a3cb..2d7ce80c 100644 --- a/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp @@ -67,7 +67,7 @@ namespace pl::core::ast { auto &sizePattern = sizePatterns.front(); sizePattern->setSection(evaluator->getSectionId()); - auto pattern = construct_shared_object(evaluator, pointerStartOffset, sizePattern->getSize(), getLocation().line); + auto pattern = construct_shared_object(evaluator, pointerStartOffset, sizePattern->getSize(), getLocation().line); pattern->setVariableName(this->m_name); pattern->setPointerTypePattern(std::move(sizePattern)); diff --git a/lib/source/pl/core/ast/ast_node_rvalue.cpp b/lib/source/pl/core/ast/ast_node_rvalue.cpp index cadde74c..8503381d 100644 --- a/lib/source/pl/core/ast/ast_node_rvalue.cpp +++ b/lib/source/pl/core/ast/ast_node_rvalue.cpp @@ -56,7 +56,7 @@ namespace pl::core::ast { if (auto name = std::get_if(&this->getPath().front()); name != nullptr) { if (*name == "$") return std::make_unique(u128(evaluator->getReadOffset())); else if (*name == "null") return std::make_unique( - construct_shared_object(evaluator, 0, 0, getLocation().line)); // Why? + construct_shared_object(evaluator, 0, 0, getLocation().line)); // Why? auto parameterPack = evaluator->getScope(0).parameterPack; if (parameterPack && *name == parameterPack->name) diff --git a/lib/source/pl/core/ast/ast_node_struct.cpp b/lib/source/pl/core/ast/ast_node_struct.cpp index f15a9271..1195e10b 100644 --- a/lib/source/pl/core/ast/ast_node_struct.cpp +++ b/lib/source/pl/core/ast/ast_node_struct.cpp @@ -18,7 +18,7 @@ namespace pl::core::ast { [[maybe_unused]] auto context = evaluator->updateRuntime(this); evaluator->alignToByte(); - auto pattern = construct_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); + auto pattern = construct_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); auto startOffset = evaluator->getReadOffset(); std::vector> memberPatterns; diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index 75f7931c..53924287 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -225,7 +225,7 @@ namespace pl::core { this->setBitwiseReadOffset(startOffset); - auto pattern = construct_shared_object(this, 0, typePattern->getSize() * entryCount, 0); + auto pattern = construct_shared_object(this, 0, typePattern->getSize() * entryCount, 0); if (section == ptrn::Pattern::PatternLocalSectionId) { typePattern->setSection(section); @@ -352,7 +352,7 @@ namespace pl::core { } } - std::shared_ptr Evaluator>Variable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { + std::shared_ptr Evaluator>Variable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { auto startPos = this->getBitwiseReadOffset(); ON_SCOPE_EXIT { this->setBitwiseReadOffset(startPos); }; @@ -396,19 +396,19 @@ namespace pl::core { if (auto builtinType = getBuiltinType(type); builtinType != nullptr && builtinType->getType() == Token::ValueType::Auto) { // Handle auto variables if (!value.has_value()) - pattern = construct_shared_object(this, 0, 0, 0); + pattern = construct_shared_object(this, 0, 0, 0); else if (std::get_if(&value.value()) != nullptr) pattern = std::make_shared(this, 0, sizeof(u128), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = construct_shared_object(this, 0, sizeof(i128), 0); + pattern = construct_shared_object(this, 0, sizeof(i128), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = construct_shared_object(this, 0, sizeof(double), 0); + pattern = construct_shared_object(this, 0, sizeof(double), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = construct_shared_object(this, 0, 0); + pattern = construct_shared_object(this, 0, 0); else if (std::get_if(&value.value()) != nullptr) - pattern = construct_shared_object(this, 0, 0); + pattern = construct_shared_object(this, 0, 0); else if (auto string = std::get_if(&value.value()); string != nullptr) - pattern = construct_shared_object(this, 0, string->size(), 0); + pattern = construct_shared_object(this, 0, string->size(), 0); else if (auto patternValue = std::get_if>(&value.value()); patternValue != nullptr) { if (reference && !templateVariable) pattern = *patternValue; @@ -424,7 +424,7 @@ namespace pl::core { pattern = std::move(patterns.front()); } else { - pattern = construct_shared_object(this, 0, 0, 0); + pattern = construct_shared_object(this, 0, 0, 0); if (auto typeName = findTypeName(type); typeName.has_value()) pattern->setTypeName(typeName.value()); @@ -731,26 +731,26 @@ namespace pl::core { copyToStorage(adjustedValue); }, [&](const i128 &value) { - changePatternType(pattern, construct_shared_object(this, 0, 16, 0)); + changePatternType(pattern, construct_shared_object(this, 0, 16, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); adjustedValue = hlp::signExtend(pattern->getSize() * 8, adjustedValue); copyToStorage(adjustedValue); }, [&](const bool &value) { - changePatternType(pattern, construct_shared_object(this, 0, 0)); + changePatternType(pattern, construct_shared_object(this, 0, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); copyToStorage(adjustedValue); }, [&](const char &value) { - changePatternType(pattern, construct_shared_object(this, 0, 0)); + changePatternType(pattern, construct_shared_object(this, 0, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); copyToStorage(adjustedValue); }, [&](const double &value) { - changePatternType(pattern, construct_shared_object(this, 0, 8, 0)); + changePatternType(pattern, construct_shared_object(this, 0, 8, 0)); if (pattern->getSize() == sizeof(float)) { auto floatValue = float(value); @@ -768,7 +768,7 @@ namespace pl::core { } }, [&](const std::string &value) { - changePatternType(pattern, construct_shared_object(this, 0, value.length(), 0)); + changePatternType(pattern, construct_shared_object(this, 0, value.length(), 0)); pattern->setSize(value.size()); From 3ec6ae20ac2b5ded5829eefaa660f29b67ff1229 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Tue, 3 Jun 2025 07:45:57 +1000 Subject: [PATCH 22/51] WIP --- lib/include/pl/patterns/pattern.hpp | 9 ++-- .../pl/patterns/pattern_array_dynamic.hpp | 2 +- .../pl/patterns/pattern_array_static.hpp | 2 +- lib/include/pl/patterns/pattern_bitfield.hpp | 10 ++-- lib/include/pl/patterns/pattern_struct.hpp | 4 +- lib/include/pl/patterns/pattern_union.hpp | 2 +- .../pl/core/ast/ast_node_bitfield_field.cpp | 49 +++++++++---------- 7 files changed, 39 insertions(+), 39 deletions(-) diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index b21c46a6..cef1633b 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -119,6 +119,7 @@ namespace pl::ptrn { } virtual std::shared_ptr clone() const = 0; + std::shared_ptr reference() const { return shared_from_this(); } std::shared_ptr reference() { return shared_from_this(); } [[nodiscard]] u64 getOffset() const { return this->m_offset; } @@ -540,15 +541,15 @@ namespace pl::ptrn { this->m_initialized = initialized; } - [[nodiscard]] const Pattern* getParent() const { + [[nodiscard]] const std::shared_ptr getParent() const { return m_parent; } - [[nodiscard]] Pattern* getParent() { + [[nodiscard]] std::shared_ptr getParent() { return m_parent; } - void setParent(Pattern *parent) { + void setParent(std::shared_ptr parent) { m_parent = parent; } @@ -626,7 +627,7 @@ namespace pl::ptrn { core::Evaluator *m_evaluator; std::unique_ptr>> m_attributes; - Pattern *m_parent = nullptr; + std::shared_ptr m_parent; u32 m_line = 0; std::set::const_iterator m_variableName; diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index 7334f1eb..819b238a 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -133,7 +133,7 @@ namespace pl::ptrn { if (!entry->hasOverriddenColor()) entry->setBaseColor(this->getColor()); - entry->setParent(this); + entry->setParent(this->reference()); this->m_entries.emplace_back(entry); } diff --git a/lib/include/pl/patterns/pattern_array_static.hpp b/lib/include/pl/patterns/pattern_array_static.hpp index 36de9798..41a1ba1f 100644 --- a/lib/include/pl/patterns/pattern_array_static.hpp +++ b/lib/include/pl/patterns/pattern_array_static.hpp @@ -153,7 +153,7 @@ namespace pl::ptrn { void setEntries(std::shared_ptr &&templatePattern, size_t count) { this->m_template = std::move(templatePattern); - this->m_template->setParent(this); + this->m_template->setParent(this->reference()); this->m_highlightTemplates.push_back(this->m_template->clone()); this->m_entryCount = count; diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index de64a087..a7c6d5ed 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -12,7 +12,7 @@ namespace pl::ptrn { [[nodiscard]] const PatternBitfieldMember& getTopmostBitfield() const { const PatternBitfieldMember* topBitfield = this; while (auto parent = topBitfield->getParent()) { - auto parentBitfield = dynamic_cast(parent); + auto parentBitfield = dynamic_cast(parent.get()); if (parentBitfield == nullptr) break; @@ -53,7 +53,7 @@ namespace pl::ptrn { class PatternBitfieldField : public PatternBitfieldMember { public: - PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, PatternBitfieldMember *parentBitfield = nullptr) + PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) : PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) { this->setParent(parentBitfield); } @@ -422,7 +422,7 @@ namespace pl::ptrn { if (!entry->hasOverriddenColor()) entry->setBaseColor(this->getColor()); - entry->setParent(this); + entry->setParent(this->reference()); this->m_sortedEntries.push_back(entry.get()); } @@ -643,7 +643,7 @@ namespace pl::ptrn { this->setBaseColor(this->m_fields.front()->getColor()); for (const auto &field : this->m_fields) { - field->setParent(this); + field->setParent(this->reference()); this->m_sortedFields.push_back(field.get()); } } @@ -715,7 +715,7 @@ namespace pl::ptrn { } } else if (auto *member = dynamic_cast(pattern.get()); member != nullptr) { valueString += fmt::format("{} = {} | ", member->getVariableName(), member->toString()); - } else if (auto *bitfield = dynamic_cast(pattern.get()); bitfield != nullptr) { +} else if (auto *bitfield = dynamic_cast(pattern.get()); bitfield != nullptr) { valueString += fmt::format("{} = {} | ", bitfield->getVariableName(), bitfield->formatDisplayValue()); } } diff --git a/lib/include/pl/patterns/pattern_struct.hpp b/lib/include/pl/patterns/pattern_struct.hpp index 3bd42bbd..45a48c5d 100644 --- a/lib/include/pl/patterns/pattern_struct.hpp +++ b/lib/include/pl/patterns/pattern_struct.hpp @@ -15,7 +15,7 @@ namespace pl::ptrn { for (const auto &member : other.m_members) { auto copy = member->clone(); - copy->setParent(this); + copy->setParent(this->reference()); this->m_sortedMembers.push_back(copy.get()); this->m_members.push_back(std::move(copy)); } @@ -36,7 +36,7 @@ namespace pl::ptrn { void addEntry(const std::shared_ptr &entry) override { if (entry == nullptr) return; - entry->setParent(this); + entry->setParent(this->reference()); this->m_sortedMembers.push_back(entry.get()); this->m_members.push_back(entry); } diff --git a/lib/include/pl/patterns/pattern_union.hpp b/lib/include/pl/patterns/pattern_union.hpp index fa2939e3..a84de1ed 100644 --- a/lib/include/pl/patterns/pattern_union.hpp +++ b/lib/include/pl/patterns/pattern_union.hpp @@ -35,7 +35,7 @@ namespace pl::ptrn { void addEntry(const std::shared_ptr &entry) override { if (entry == nullptr) return; - entry->setParent(this); + entry->setParent(this->reference()); this->m_sortedMembers.push_back(entry.get()); this->m_members.push_back(entry); } diff --git a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp index c89553f0..85bd4f86 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp @@ -24,7 +24,7 @@ namespace pl::core::ast { [[nodiscard]] bool ASTNodeBitfieldField::isPadding() const { return this->getName() == "$padding$"; } - [[nodiscard]] std::shared_ptr ASTNodeBitfieldField>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { + [[nodiscard]] std::shared_ptr ASTNodeBitfieldField::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { return construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } @@ -56,7 +56,7 @@ namespace pl::core::ast { } - [[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSigned>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { + [[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSigned::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { return construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } @@ -68,29 +68,28 @@ namespace pl::core::ast { this->m_type = std::unique_ptr(static_cast(other.m_type->clone().release())); } -[[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSizedType>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { - auto originalPosition = evaluator->getBitwiseReadOffset(); - evaluator->setBitwiseReadOffset(byteOffset, bitOffset); - - std::vector> patterns; - this->m_type->createPatterns(evaluator, patterns); - auto &pattern = patterns[0]; - std::shared_ptr result = nullptr; - evaluator->setBitwiseReadOffset(originalPosition); - - if (auto *patternEnum = dynamic_cast(pattern.get()); patternEnum != nullptr) { - auto bitfieldEnum = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); - bitfieldEnum->setTypeName(patternEnum->getTypeName()); - bitfieldEnum->setEnumValues(patternEnum->getEnumValues()); - result = std::move(bitfieldEnum); - } else if (dynamic_cast(pattern.get()) != nullptr) { - result = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); - } else { - err::E0004.throwError("Bit size specifiers may only be used with unsigned, signed, bool or enum types.", {}, this->getLocation()); + [[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSizedType::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { + auto originalPosition = evaluator->getBitwiseReadOffset(); + evaluator->setBitwiseReadOffset(byteOffset, bitOffset); + + std::vector> patterns; + this->m_type->createPatterns(evaluator, patterns); + auto &pattern = patterns[0]; + std::shared_ptr result = nullptr; + evaluator->setBitwiseReadOffset(originalPosition); + + if (auto *patternEnum = dynamic_cast(pattern.get()); patternEnum != nullptr) { + auto bitfieldEnum = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + bitfieldEnum->setTypeName(patternEnum->getTypeName()); + bitfieldEnum->setEnumValues(patternEnum->getEnumValues()); + result = std::move(bitfieldEnum); + } else if (dynamic_cast(pattern.get()) != nullptr) { + result = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + } else { + err::E0004.throwError("Bit size specifiers may only be used with unsigned, signed, bool or enum types.", {}, this->getLocation()); + } + + return result; } - return result; -} - - } \ No newline at end of file From 9489b3cccddc11b149dd7c70fb8254e5bee16cc8 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Tue, 3 Jun 2025 09:01:09 +1000 Subject: [PATCH 23/51] It builds --- lib/include/pl/api.hpp | 2 +- lib/source/pl/core/evaluator.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/include/pl/api.hpp b/lib/include/pl/api.hpp index f90bbf0d..6317692b 100644 --- a/lib/include/pl/api.hpp +++ b/lib/include/pl/api.hpp @@ -126,7 +126,7 @@ namespace pl::api { /** * @brief A function callback called when a custom built-in type is being instantiated */ - using TypeCallback = std::function(core::Evaluator *, const std::vector &)>; + using TypeCallback = std::function(core::Evaluator *, const std::vector &)>; /** * @brief A type representing a function. diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index 53924287..396c6d09 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -352,7 +352,7 @@ namespace pl::core { } } - std::shared_ptr Evaluator>Variable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { + std::shared_ptr Evaluator::createVariable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { auto startPos = this->getBitwiseReadOffset(); ON_SCOPE_EXIT { this->setBitwiseReadOffset(startPos); }; From c6095e6803580ddebe9017b8baee062ad97874e9 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Tue, 3 Jun 2025 09:09:12 +1000 Subject: [PATCH 24/51] Change comment --- lib/include/pl/helpers/construct_shared_object.hpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/include/pl/helpers/construct_shared_object.hpp b/lib/include/pl/helpers/construct_shared_object.hpp index 08b20749..b1cbd141 100644 --- a/lib/include/pl/helpers/construct_shared_object.hpp +++ b/lib/include/pl/helpers/construct_shared_object.hpp @@ -1,8 +1,11 @@ // construct_shared_object.hpp // +// Written by Stephen Hewitt in 2025 +// GitHub repo: https://github.com/shewitt-au/std-enable_shared_from_this-and-constructors #pragma once /* + The motivation for this code is issues with std::shared_ptr and std::enable_shared_from_this. @@ -12,7 +15,7 @@ Consider code like this: Assume that `SomeClass`'s constructor uses shared_from_this. In this case, since SomeClass is not yet owned by a std::shared_ptr, the shared_from_this call will not work as expected. There seems to no way around this that I can find. -I wasn�t aware of this issue. It was a real kick in the pants. +I wasn't aware of this issue. It was a real kick in the pants. The solution implemented here is two-stage construction. First the object is constructed and assigned to a std::shared_ptr; then, if present, a @@ -22,9 +25,9 @@ The intent of the "if present" is to enable incremental migration to two-stage construction on demand. Another issue addressed is with std::make_shared. This function requires that -the constructor be public. If we�re making factory methods for creation, we may +the constructor be public. If we're making factory methods for creation, we may want to make the constructors non-public to stop misuse. In this case the code -uses std::shared_ptr�s constructor and a new call. The function that calls new +uses std::shared_ptr's constructor and a new call. The function that calls new can be made a friend of the class to grant it access. We lose the advantages of using std::make_shared but gain protection against incorrect object instantiation. @@ -45,7 +48,7 @@ namespace shared_object_creator { /* shared_ptr_creator is responsible for actually creating the std::shared_ptr. As described in this header's opening comment, it decides whether to use - std::make_shared or std::shared_ptr�s constructor and new based on the + std::make_shared or std::shared_ptr's constructor and new based on the accessibility the the class' constructor. If you wish to make the constructors non-public make this a friend. The BEFRIEND_SHARED_OBJECT_CREATOR macro can be used to do this tersely. From 830d0ee7997002eac11decc1d0a68dc40c131904 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Tue, 3 Jun 2025 13:50:57 +1000 Subject: [PATCH 25/51] fix: post_construct not being called on some compilers --- .../pl/helpers/construct_shared_object.hpp | 27 ++++++++----------- lib/include/pl/patterns/pattern.hpp | 6 ++--- .../pl/patterns/pattern_array_dynamic.hpp | 6 +++-- .../pl/patterns/pattern_array_static.hpp | 6 +++-- lib/include/pl/patterns/pattern_bitfield.hpp | 17 +++++++----- lib/include/pl/patterns/pattern_boolean.hpp | 2 +- lib/include/pl/patterns/pattern_character.hpp | 2 +- lib/include/pl/patterns/pattern_enum.hpp | 2 +- lib/include/pl/patterns/pattern_error.hpp | 2 +- lib/include/pl/patterns/pattern_float.hpp | 2 +- lib/include/pl/patterns/pattern_padding.hpp | 2 +- lib/include/pl/patterns/pattern_pointer.hpp | 2 +- lib/include/pl/patterns/pattern_signed.hpp | 2 +- lib/include/pl/patterns/pattern_string.hpp | 2 +- lib/include/pl/patterns/pattern_struct.hpp | 6 +++-- lib/include/pl/patterns/pattern_union.hpp | 2 +- lib/include/pl/patterns/pattern_unsigned.hpp | 2 +- .../pl/patterns/pattern_wide_character.hpp | 2 +- .../pl/patterns/pattern_wide_string.hpp | 2 +- 19 files changed, 50 insertions(+), 44 deletions(-) diff --git a/lib/include/pl/helpers/construct_shared_object.hpp b/lib/include/pl/helpers/construct_shared_object.hpp index b1cbd141..d05b4397 100644 --- a/lib/include/pl/helpers/construct_shared_object.hpp +++ b/lib/include/pl/helpers/construct_shared_object.hpp @@ -12,7 +12,7 @@ std::enable_shared_from_this. Consider code like this: std::shared ptr = std::make_shared(); -Assume that `SomeClass`'s constructor uses shared_from_this. In this case, since +Assume that SomeClass's constructor uses shared_from_this. In this case, since SomeClass is not yet owned by a std::shared_ptr, the shared_from_this call will not work as expected. There seems to no way around this that I can find. I wasn't aware of this issue. It was a real kick in the pants. @@ -33,9 +33,8 @@ using std::make_shared but gain protection against incorrect object instantiation. */ -#include -#include #include +#include #define BEFRIEND_SHARED_OBJECT_CREATOR \ template \ @@ -48,7 +47,7 @@ namespace shared_object_creator { /* shared_ptr_creator is responsible for actually creating the std::shared_ptr. As described in this header's opening comment, it decides whether to use - std::make_shared or std::shared_ptr's constructor and new based on the + std::make_shared's or std::shared_ptr's constructor and new based on the accessibility the the class' constructor. If you wish to make the constructors non-public make this a friend. The BEFRIEND_SHARED_OBJECT_CREATOR macro can be used to do this tersely. @@ -65,27 +64,23 @@ namespace shared_object_creator { return std::shared_ptr(new T(std::forward(args)...)); } - // Used to detect if the class has a post_construct method with the same - // arguments as the constructor. - template - concept HasPostConstruct = requires(T obj, Args... args) { - obj.post_construct(args...); - }; - } // namespace impl // The actual creation functions. template - std::shared_ptr construct_shared_object(Args&&... args) { - return impl::shared_ptr_creator(std::forward(args)...); + requires requires(T t, Args&&... args) { + t.post_construct(std::forward(args)...); } - - template std::shared_ptr construct_shared_object(Args&&... args) { - std::shared_ptr p = impl::shared_ptr_creator(std::forward(args)...); + auto p = impl::shared_ptr_creator(std::forward(args)...); p->post_construct(std::forward(args)...); return p; } + template + std::shared_ptr construct_shared_object(Args&&... args) { + return impl::shared_ptr_creator(std::forward(args)...); + } + } // namespace shared_object_creator diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index cef1633b..42c8f7af 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -542,11 +542,11 @@ namespace pl::ptrn { } [[nodiscard]] const std::shared_ptr getParent() const { - return m_parent; + return m_parent.lock(); } [[nodiscard]] std::shared_ptr getParent() { - return m_parent; + return m_parent.lock(); } void setParent(std::shared_ptr parent) { @@ -627,7 +627,7 @@ namespace pl::ptrn { core::Evaluator *m_evaluator; std::unique_ptr>> m_attributes; - std::shared_ptr m_parent; + std::weak_ptr m_parent; u32 m_line = 0; std::set::const_iterator m_variableName; diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index 819b238a..405fdb9b 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -11,7 +11,9 @@ namespace pl::ptrn { PatternArrayDynamic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } - PatternArrayDynamic(const PatternArrayDynamic &other) : Pattern(other) { + PatternArrayDynamic(const PatternArrayDynamic &other) : Pattern(other) {} + + void post_construct(const PatternArrayDynamic &other) { std::vector> entries; for (const auto &entry : other.m_entries) entries.push_back(entry->clone()); @@ -20,7 +22,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternArrayDynamic(*this)); + return construct_shared_object(*this); } void setColor(u32 color) override { diff --git a/lib/include/pl/patterns/pattern_array_static.hpp b/lib/include/pl/patterns/pattern_array_static.hpp index 41a1ba1f..2cee2e97 100644 --- a/lib/include/pl/patterns/pattern_array_static.hpp +++ b/lib/include/pl/patterns/pattern_array_static.hpp @@ -11,12 +11,14 @@ namespace pl::ptrn { PatternArrayStatic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } - PatternArrayStatic(const PatternArrayStatic &other) : Pattern(other) { + PatternArrayStatic(const PatternArrayStatic &other) : Pattern(other) {} + + void post_construct(const PatternArrayStatic &other) { this->setEntries(other.getTemplate()->clone(), other.getEntryCount()); } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternArrayStatic(*this)); + return construct_shared_object(*this); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index a7c6d5ed..cfc20b3b 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -55,6 +55,11 @@ namespace pl::ptrn { public: PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) : PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) { + (void)parentBitfield; + } + + void post_construct(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { + (void)evaluator; (void)offset; (void)bitOffset; (void)bitSize; (void)line; this->setParent(parentBitfield); } @@ -65,7 +70,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfieldField(*this)); + return construct_shared_object(*this); } [[nodiscard]] u128 readValue() const { @@ -162,7 +167,7 @@ namespace pl::ptrn { using PatternBitfieldField::PatternBitfieldField; [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfieldFieldSigned(*this)); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -186,7 +191,7 @@ namespace pl::ptrn { using PatternBitfieldField::PatternBitfieldField; [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfieldFieldBoolean(*this)); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -245,7 +250,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfieldFieldEnum(*this)); + return construct_shared_object(*this); } std::string formatDisplayValue() override { @@ -282,7 +287,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfieldArray(*this)); + return construct_shared_object(*this); } [[nodiscard]] u8 getBitOffset() const override { @@ -554,7 +559,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBitfield(*this)); + return construct_shared_object(*this); } [[nodiscard]] u8 getBitOffset() const override { diff --git a/lib/include/pl/patterns/pattern_boolean.hpp b/lib/include/pl/patterns/pattern_boolean.hpp index af9bf441..42ed92fc 100644 --- a/lib/include/pl/patterns/pattern_boolean.hpp +++ b/lib/include/pl/patterns/pattern_boolean.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, 1, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternBoolean(*this)); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_character.hpp b/lib/include/pl/patterns/pattern_character.hpp index 66578064..1428e346 100644 --- a/lib/include/pl/patterns/pattern_character.hpp +++ b/lib/include/pl/patterns/pattern_character.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, 1, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::make_unique(*this); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_enum.hpp b/lib/include/pl/patterns/pattern_enum.hpp index b5462397..1ab6429e 100644 --- a/lib/include/pl/patterns/pattern_enum.hpp +++ b/lib/include/pl/patterns/pattern_enum.hpp @@ -18,7 +18,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternEnum(*this)); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_error.hpp b/lib/include/pl/patterns/pattern_error.hpp index fc9e52be..484e0541 100644 --- a/lib/include/pl/patterns/pattern_error.hpp +++ b/lib/include/pl/patterns/pattern_error.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line), m_errorMessage(std::move(errorMessage)) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternError(*this)); + return construct_shared_object(*this); } [[nodiscard]] std::string getFormattedName() const override { diff --git a/lib/include/pl/patterns/pattern_float.hpp b/lib/include/pl/patterns/pattern_float.hpp index 96dbe4a9..5ad1dcc9 100644 --- a/lib/include/pl/patterns/pattern_float.hpp +++ b/lib/include/pl/patterns/pattern_float.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternFloat(*this)); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_padding.hpp b/lib/include/pl/patterns/pattern_padding.hpp index d3a95128..d0b69624 100644 --- a/lib/include/pl/patterns/pattern_padding.hpp +++ b/lib/include/pl/patterns/pattern_padding.hpp @@ -9,7 +9,7 @@ namespace pl::ptrn { PatternPadding(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternPadding(*this)); + return construct_shared_object(*this); } [[nodiscard]] std::string getFormattedName() const override { diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index 787d3c00..fca2204e 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -21,7 +21,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternPointer(*this)); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_signed.hpp b/lib/include/pl/patterns/pattern_signed.hpp index 94ad4b59..0b187b14 100644 --- a/lib/include/pl/patterns/pattern_signed.hpp +++ b/lib/include/pl/patterns/pattern_signed.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternSigned(*this)); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index de726c9e..44cbbd24 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -13,7 +13,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternString(*this)); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_struct.hpp b/lib/include/pl/patterns/pattern_struct.hpp index 45a48c5d..92a18593 100644 --- a/lib/include/pl/patterns/pattern_struct.hpp +++ b/lib/include/pl/patterns/pattern_struct.hpp @@ -11,7 +11,9 @@ namespace pl::ptrn { PatternStruct(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } - PatternStruct(const PatternStruct &other) : Pattern(other) { + PatternStruct(const PatternStruct &other) : Pattern(other) {} + + void post_construct(const PatternStruct &other) { for (const auto &member : other.m_members) { auto copy = member->clone(); @@ -22,7 +24,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternStruct(*this)); + return construct_shared_object(*this); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { diff --git a/lib/include/pl/patterns/pattern_union.hpp b/lib/include/pl/patterns/pattern_union.hpp index a84de1ed..ed8585b6 100644 --- a/lib/include/pl/patterns/pattern_union.hpp +++ b/lib/include/pl/patterns/pattern_union.hpp @@ -21,7 +21,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternUnion(*this)); + return construct_shared_object(*this); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { diff --git a/lib/include/pl/patterns/pattern_unsigned.hpp b/lib/include/pl/patterns/pattern_unsigned.hpp index 6cb650de..a9919a78 100644 --- a/lib/include/pl/patterns/pattern_unsigned.hpp +++ b/lib/include/pl/patterns/pattern_unsigned.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternUnsigned(*this)); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_wide_character.hpp b/lib/include/pl/patterns/pattern_wide_character.hpp index 1bc28b7c..09664a0b 100644 --- a/lib/include/pl/patterns/pattern_wide_character.hpp +++ b/lib/include/pl/patterns/pattern_wide_character.hpp @@ -12,7 +12,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, 2, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternWideCharacter(*this)); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { diff --git a/lib/include/pl/patterns/pattern_wide_string.hpp b/lib/include/pl/patterns/pattern_wide_string.hpp index 5b033492..76b900cc 100644 --- a/lib/include/pl/patterns/pattern_wide_string.hpp +++ b/lib/include/pl/patterns/pattern_wide_string.hpp @@ -13,7 +13,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line) { } [[nodiscard]] std::shared_ptr clone() const override { - return std::unique_ptr(new PatternWideString(*this)); + return construct_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { From ce784c4690846306e9e83b0ce6f50efab0695141 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Tue, 3 Jun 2025 20:10:44 +1000 Subject: [PATCH 26/51] Attempt and strange problem casuing build isssues --- lib/source/pl/core/evaluator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index 396c6d09..53924287 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -352,7 +352,7 @@ namespace pl::core { } } - std::shared_ptr Evaluator::createVariable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { + std::shared_ptr Evaluator>Variable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { auto startPos = this->getBitwiseReadOffset(); ON_SCOPE_EXIT { this->setBitwiseReadOffset(startPos); }; From 32037d1952434c1c008f3829525cd6b5ebc6d985 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Tue, 3 Jun 2025 20:13:07 +1000 Subject: [PATCH 27/51] Attempt and strange problem casuing build isssues --- lib/source/pl/core/evaluator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index 53924287..aad765db 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -352,7 +352,7 @@ namespace pl::core { } } - std::shared_ptr Evaluator>Variable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { + std::shared_ptr Evaluator>Variable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { auto startPos = this->getBitwiseReadOffset(); ON_SCOPE_EXIT { this->setBitwiseReadOffset(startPos); }; From 8a008a280f037f9a31a2033528208bd07f66eb63 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Tue, 3 Jun 2025 20:18:03 +1000 Subject: [PATCH 28/51] Attempt and strange problem casuing build isssues --- lib/source/pl/core/evaluator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index aad765db..396c6d09 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -352,7 +352,7 @@ namespace pl::core { } } - std::shared_ptr Evaluator>Variable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { + std::shared_ptr Evaluator::createVariable(const std::string &name, const ast::ASTNodeTypeDecl *type, const std::optional &value, bool outVariable, bool reference, bool templateVariable, bool constant) { auto startPos = this->getBitwiseReadOffset(); ON_SCOPE_EXIT { this->setBitwiseReadOffset(startPos); }; From 7c0884b3e297249416fd8663bcdfdc5762dd1ecb Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Wed, 4 Jun 2025 00:41:31 +1000 Subject: [PATCH 29/51] Replace more make_shared calls --- lib/include/pl/patterns/pattern_string.hpp | 2 +- lib/include/pl/patterns/pattern_wide_string.hpp | 2 +- lib/source/pl/core/ast/ast_node_array_variable_decl.cpp | 2 +- lib/source/pl/core/ast/ast_node_builtin_type.cpp | 4 ++-- lib/source/pl/core/ast/ast_node_union.cpp | 2 +- lib/source/pl/core/evaluator.cpp | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index 44cbbd24..3099432c 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -76,7 +76,7 @@ namespace pl::ptrn { } std::shared_ptr getEntry(size_t index) const override { - auto result = std::make_shared(this->getEvaluator(), this->getOffset() + index, getLine()); + auto result = construct_shared_object(this->getEvaluator(), this->getOffset() + index, getLine()); result->setSection(this->getSection()); return result; diff --git a/lib/include/pl/patterns/pattern_wide_string.hpp b/lib/include/pl/patterns/pattern_wide_string.hpp index 76b900cc..45abc32c 100644 --- a/lib/include/pl/patterns/pattern_wide_string.hpp +++ b/lib/include/pl/patterns/pattern_wide_string.hpp @@ -80,7 +80,7 @@ namespace pl::ptrn { } std::shared_ptr getEntry(size_t index) const override { - auto result = std::make_shared(this->getEvaluator(), this->getOffset() + index * sizeof(char16_t), getLine()); + auto result = construct_shared_object(this->getEvaluator(), this->getOffset() + index * sizeof(char16_t), getLine()); result->setSection(this->getSection()); return result; diff --git a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp index 4cfec0f7..70c4db1f 100644 --- a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp @@ -222,7 +222,7 @@ namespace pl::core::ast { } else if (std::dynamic_pointer_cast(templatePattern)) { outputPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); } else if (std::dynamic_pointer_cast(templatePattern)) { - outputPattern = std::make_shared(evaluator, startOffset, 0, getLocation().line); + outputPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); } else { auto arrayPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); arrayPattern->setEntries(templatePattern->clone(), size_t(entryCount)); diff --git a/lib/source/pl/core/ast/ast_node_builtin_type.cpp b/lib/source/pl/core/ast/ast_node_builtin_type.cpp index 5e74aaf5..ac6d5e83 100644 --- a/lib/source/pl/core/ast/ast_node_builtin_type.cpp +++ b/lib/source/pl/core/ast/ast_node_builtin_type.cpp @@ -25,7 +25,7 @@ namespace pl::core::ast { std::shared_ptr pattern; if (Token::isUnsigned(this->m_type)) - pattern = std::make_shared(evaluator, offset, size, getLocation().line); + pattern = construct_shared_object(evaluator, offset, size, getLocation().line); else if (Token::isSigned(this->m_type)) pattern = construct_shared_object(evaluator, offset, size, getLocation().line); else if (Token::isFloatingPoint(this->m_type)) @@ -35,7 +35,7 @@ namespace pl::core::ast { else if (this->m_type == Token::ValueType::Character) pattern = construct_shared_object(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character16) - pattern = std::make_shared(evaluator, offset, getLocation().line); + pattern = construct_shared_object(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Padding) pattern = construct_shared_object(evaluator, offset, 1, getLocation().line); else if (this->m_type == Token::ValueType::String) diff --git a/lib/source/pl/core/ast/ast_node_union.cpp b/lib/source/pl/core/ast/ast_node_union.cpp index b18bddbe..52c444d8 100644 --- a/lib/source/pl/core/ast/ast_node_union.cpp +++ b/lib/source/pl/core/ast/ast_node_union.cpp @@ -16,7 +16,7 @@ namespace pl::core::ast { [[maybe_unused]] auto context = evaluator->updateRuntime(this); evaluator->alignToByte(); - auto pattern = std::make_shared(evaluator, evaluator->getReadOffset(), 0, getLocation().line); + auto pattern = construct_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); std::vector> memberPatterns; u64 startOffset = evaluator->getReadOffset(); diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index 396c6d09..ede82579 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -398,7 +398,7 @@ namespace pl::core { if (!value.has_value()) pattern = construct_shared_object(this, 0, 0, 0); else if (std::get_if(&value.value()) != nullptr) - pattern = std::make_shared(this, 0, sizeof(u128), 0); + pattern = construct_shared_object(this, 0, sizeof(u128), 0); else if (std::get_if(&value.value()) != nullptr) pattern = construct_shared_object(this, 0, sizeof(i128), 0); else if (std::get_if(&value.value()) != nullptr) @@ -725,7 +725,7 @@ namespace pl::core { std::visit(wolv::util::overloaded { [&](const u128 &value) { - changePatternType(pattern, std::make_shared(this, 0, 16, 0)); + changePatternType(pattern, construct_shared_object(this, 0, 16, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); copyToStorage(adjustedValue); From a47cc5ff4b382ca11d13a19f62b0c0e4acb8e59e Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Wed, 4 Jun 2025 01:27:54 +1000 Subject: [PATCH 30/51] Work on unit tests --- tests/include/test_patterns/test_pattern.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/include/test_patterns/test_pattern.hpp b/tests/include/test_patterns/test_pattern.hpp index 78a054b0..95325116 100644 --- a/tests/include/test_patterns/test_pattern.hpp +++ b/tests/include/test_patterns/test_pattern.hpp @@ -30,8 +30,8 @@ namespace pl::test { virtual ~TestPattern() = default; template - std::unique_ptr create(const std::string &typeName, const std::string &varName, auto... args) { - auto pattern = std::make_unique(m_evaluator, args...); + std::shared_ptr create(const std::string &typeName, const std::string &varName, auto... args) { + auto pattern = create_shared_object(m_evaluator, args...); pattern->setTypeName(typeName); pattern->setVariableName(varName); From e1fd97a0aa5c4ed3ef0ce84c9a5b45849db8b542 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Wed, 4 Jun 2025 01:34:49 +1000 Subject: [PATCH 31/51] Work on unit tests --- tests/include/test_patterns/test_pattern.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/include/test_patterns/test_pattern.hpp b/tests/include/test_patterns/test_pattern.hpp index 95325116..c74ad87b 100644 --- a/tests/include/test_patterns/test_pattern.hpp +++ b/tests/include/test_patterns/test_pattern.hpp @@ -31,7 +31,7 @@ namespace pl::test { template std::shared_ptr create(const std::string &typeName, const std::string &varName, auto... args) { - auto pattern = create_shared_object(m_evaluator, args...); + auto pattern = construct_shared_object(m_evaluator, args...); pattern->setTypeName(typeName); pattern->setVariableName(varName); From b17db3f1c80b8118926fa354131afb3024c34e52 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Wed, 4 Jun 2025 01:39:29 +1000 Subject: [PATCH 32/51] Work on unit tests --- tests/include/test_patterns/test_pattern.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/include/test_patterns/test_pattern.hpp b/tests/include/test_patterns/test_pattern.hpp index c74ad87b..1ee0650c 100644 --- a/tests/include/test_patterns/test_pattern.hpp +++ b/tests/include/test_patterns/test_pattern.hpp @@ -41,7 +41,7 @@ namespace pl::test { [[nodiscard]] virtual std::string getSourceCode() const = 0; [[nodiscard]] virtual const std::vector> &getPatterns() const final { return this->m_patterns; } - virtual void addPattern(std::unique_ptr &&pattern) final { + virtual void addPattern(std::shared_ptr &&pattern) final { this->m_patterns.push_back(std::move(pattern)); } From 093a4e164e3abf714a6b7b91fe97cd3c744eb273 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Wed, 4 Jun 2025 01:42:22 +1000 Subject: [PATCH 33/51] Work on unit tests --- tests/include/test_patterns/test_pattern.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/include/test_patterns/test_pattern.hpp b/tests/include/test_patterns/test_pattern.hpp index 1ee0650c..3a9d29f3 100644 --- a/tests/include/test_patterns/test_pattern.hpp +++ b/tests/include/test_patterns/test_pattern.hpp @@ -40,7 +40,7 @@ namespace pl::test { [[nodiscard]] virtual std::string getSourceCode() const = 0; - [[nodiscard]] virtual const std::vector> &getPatterns() const final { return this->m_patterns; } + [[nodiscard]] virtual const std::vector> &getPatterns() const final { return this->m_patterns; } virtual void addPattern(std::shared_ptr &&pattern) final { this->m_patterns.push_back(std::move(pattern)); } @@ -60,7 +60,7 @@ namespace pl::test { } private: - std::vector> m_patterns; + std::vector> m_patterns; core::Evaluator *m_evaluator; Mode m_mode; From c40fbe35dbbbc648035ca86721000689ac728194 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Wed, 4 Jun 2025 01:47:01 +1000 Subject: [PATCH 34/51] Work on unit tests --- .../test_patterns/test_pattern_bitfields.hpp | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/tests/include/test_patterns/test_pattern_bitfields.hpp b/tests/include/test_patterns/test_pattern_bitfields.hpp index 0b41af6d..9a3200a5 100644 --- a/tests/include/test_patterns/test_pattern_bitfields.hpp +++ b/tests/include/test_patterns/test_pattern_bitfields.hpp @@ -13,22 +13,22 @@ namespace pl::test { std::vector> bitfieldFields; { - bitfieldFields.push_back(create("", "a", 0x25, 0, 2, 0, testBitfield.get())); - bitfieldFields.push_back(create("", "b", 0x25, 2, 3, 0, testBitfield.get())); + bitfieldFields.push_back(create("", "a", 0x25, 0, 2, 0, testBitfield.reference())); + bitfieldFields.push_back(create("", "b", 0x25, 2, 3, 0, testBitfield.reference())); auto nestedBitfield = create("NestedBitfield", "c", 0x25, 5, 4 * 2, 0); std::vector> nestedFields; { - nestedFields.push_back(create("", "nestedA", 0x25, 5, 4, 0, testBitfield.get())); - nestedFields.push_back(create("", "nestedB", 0x26, 1, 4, 0, testBitfield.get())); + nestedFields.push_back(create("", "nestedA", 0x25, 5, 4, 0, testBitfield.reference())); + nestedFields.push_back(create("", "nestedB", 0x26, 1, 4, 0, testBitfield.reference())); } - nestedBitfield->setParent(testBitfield.get()); + nestedBitfield->setParent(testBitfield.reference()); nestedBitfield->setFields(std::move(nestedFields)); nestedBitfield->setEndian(std::endian::big); bitfieldFields.push_back(std::move(nestedBitfield)); - bitfieldFields.push_back(create("", "d", 0x26, 5, 4, 0, testBitfield.get())); - bitfieldFields.push_back(create("", "e", 0x27, 1, 4, 0, testBitfield.get())); + bitfieldFields.push_back(create("", "d", 0x26, 5, 4, 0, testBitfield.reference())); + bitfieldFields.push_back(create("", "e", 0x27, 1, 4, 0, testBitfield.reference())); auto array = create("NestedBitfield", "f", 0x27, 5, 4 * 4, 0); std::vector> arrayEntries; @@ -36,10 +36,10 @@ namespace pl::test { auto array0Bitfield = create("NestedBitfield", "[0]", 0x27, 5, 4 * 2, 0); std::vector> array0Fields; { - array0Fields.push_back(create("", "nestedA", 0x27, 5, 4, 0, array0Bitfield.get())); - array0Fields.push_back(create("", "nestedB", 0x28, 1, 4, 0, array0Bitfield.get())); + array0Fields.push_back(create("", "nestedA", 0x27, 5, 4, 0, array0Bitfield.reference())); + array0Fields.push_back(create("", "nestedB", 0x28, 1, 4, 0, array0Bitfield.reference())); } - array0Bitfield->setParent(array.get()); + array0Bitfield->setParent(array.reference()); array0Bitfield->setFields(std::move(array0Fields)); array0Bitfield->setEndian(std::endian::big); arrayEntries.push_back(std::move(array0Bitfield)); @@ -47,15 +47,15 @@ namespace pl::test { auto array1Bitfield = create("NestedBitfield", "[1]", 0x28, 5, 4 * 2, 0); std::vector> array1Fields; { - array1Fields.push_back(create("", "nestedA", 0x28, 5, 4, 0, array1Bitfield.get())); - array1Fields.push_back(create("", "nestedB", 0x29, 1, 4, 0, array1Bitfield.get())); + array1Fields.push_back(create("", "nestedA", 0x28, 5, 4, 0, array1Bitfield.reference())); + array1Fields.push_back(create("", "nestedB", 0x29, 1, 4, 0, array1Bitfield.reference())); } - array1Bitfield->setParent(array.get()); + array1Bitfield->setParent(array.reference()); array1Bitfield->setFields(std::move(array1Fields)); array1Bitfield->setEndian(std::endian::big); arrayEntries.push_back(std::move(array1Bitfield)); } - array->setParent(testBitfield.get()); + array->setParent(testBitfield.reference()); array->setEntries(arrayEntries); array->setEndian(std::endian::big); bitfieldFields.push_back(std::move(array)); @@ -107,14 +107,14 @@ namespace pl::test { std::vector> bitfieldFields; { - bitfieldFields.push_back(create("", "flag0", 0x03, 7, 1, 0, testBitfield.get())); - bitfieldFields.push_back(create("", "flag1", 0x03, 6, 1, 0, testBitfield.get())); - bitfieldFields.push_back(create("", "flag2", 0x03, 5, 1, 0, testBitfield.get())); - bitfieldFields.push_back(create("", "flag3", 0x03, 4, 1, 0, testBitfield.get())); - bitfieldFields.push_back(create("", "flag4", 0x03, 3, 1, 0, testBitfield.get())); - bitfieldFields.push_back(create("", "flag5", 0x03, 2, 1, 0, testBitfield.get())); - - auto enumField = create("Enum", "enumerated", 0x02, 4, 6, 0, testBitfield.get()); + bitfieldFields.push_back(create("", "flag0", 0x03, 7, 1, 0, testBitfield.reference())); + bitfieldFields.push_back(create("", "flag1", 0x03, 6, 1, 0, testBitfield.reference())); + bitfieldFields.push_back(create("", "flag2", 0x03, 5, 1, 0, testBitfield.reference())); + bitfieldFields.push_back(create("", "flag3", 0x03, 4, 1, 0, testBitfield.reference())); + bitfieldFields.push_back(create("", "flag4", 0x03, 3, 1, 0, testBitfield.reference())); + bitfieldFields.push_back(create("", "flag5", 0x03, 2, 1, 0, testBitfield.reference())); + + auto enumField = create("Enum", "enumerated", 0x02, 4, 6, 0, testBitfield.reference()); std::map values; { values.insert({ "A", { 0x39, 0x39 } }); From ab43e672d8b2dabdb5f64b65ceec803c1b4489b0 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Wed, 4 Jun 2025 01:52:30 +1000 Subject: [PATCH 35/51] Work on unit tests --- .../test_patterns/test_pattern_bitfields.hpp | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/tests/include/test_patterns/test_pattern_bitfields.hpp b/tests/include/test_patterns/test_pattern_bitfields.hpp index 9a3200a5..f24a7b72 100644 --- a/tests/include/test_patterns/test_pattern_bitfields.hpp +++ b/tests/include/test_patterns/test_pattern_bitfields.hpp @@ -13,22 +13,22 @@ namespace pl::test { std::vector> bitfieldFields; { - bitfieldFields.push_back(create("", "a", 0x25, 0, 2, 0, testBitfield.reference())); - bitfieldFields.push_back(create("", "b", 0x25, 2, 3, 0, testBitfield.reference())); + bitfieldFields.push_back(create("", "a", 0x25, 0, 2, 0, testBitfield->reference())); + bitfieldFields.push_back(create("", "b", 0x25, 2, 3, 0, testBitfield->reference())); auto nestedBitfield = create("NestedBitfield", "c", 0x25, 5, 4 * 2, 0); std::vector> nestedFields; { - nestedFields.push_back(create("", "nestedA", 0x25, 5, 4, 0, testBitfield.reference())); - nestedFields.push_back(create("", "nestedB", 0x26, 1, 4, 0, testBitfield.reference())); + nestedFields.push_back(create("", "nestedA", 0x25, 5, 4, 0, testBitfield->reference())); + nestedFields.push_back(create("", "nestedB", 0x26, 1, 4, 0, testBitfield->reference())); } - nestedBitfield->setParent(testBitfield.reference()); + nestedBitfield->setParent(testBitfield->reference()); nestedBitfield->setFields(std::move(nestedFields)); nestedBitfield->setEndian(std::endian::big); bitfieldFields.push_back(std::move(nestedBitfield)); - bitfieldFields.push_back(create("", "d", 0x26, 5, 4, 0, testBitfield.reference())); - bitfieldFields.push_back(create("", "e", 0x27, 1, 4, 0, testBitfield.reference())); + bitfieldFields.push_back(create("", "d", 0x26, 5, 4, 0, testBitfield->reference())); + bitfieldFields.push_back(create("", "e", 0x27, 1, 4, 0, testBitfield->reference())); auto array = create("NestedBitfield", "f", 0x27, 5, 4 * 4, 0); std::vector> arrayEntries; @@ -36,10 +36,10 @@ namespace pl::test { auto array0Bitfield = create("NestedBitfield", "[0]", 0x27, 5, 4 * 2, 0); std::vector> array0Fields; { - array0Fields.push_back(create("", "nestedA", 0x27, 5, 4, 0, array0Bitfield.reference())); - array0Fields.push_back(create("", "nestedB", 0x28, 1, 4, 0, array0Bitfield.reference())); + array0Fields.push_back(create("", "nestedA", 0x27, 5, 4, 0, array0Bitfield->reference())); + array0Fields.push_back(create("", "nestedB", 0x28, 1, 4, 0, array0Bitfield->reference())); } - array0Bitfield->setParent(array.reference()); + array0Bitfield->setParent(array->reference()); array0Bitfield->setFields(std::move(array0Fields)); array0Bitfield->setEndian(std::endian::big); arrayEntries.push_back(std::move(array0Bitfield)); @@ -47,15 +47,15 @@ namespace pl::test { auto array1Bitfield = create("NestedBitfield", "[1]", 0x28, 5, 4 * 2, 0); std::vector> array1Fields; { - array1Fields.push_back(create("", "nestedA", 0x28, 5, 4, 0, array1Bitfield.reference())); - array1Fields.push_back(create("", "nestedB", 0x29, 1, 4, 0, array1Bitfield.reference())); + array1Fields.push_back(create("", "nestedA", 0x28, 5, 4, 0, array1Bitfield->reference())); + array1Fields.push_back(create("", "nestedB", 0x29, 1, 4, 0, array1Bitfield->reference())); } - array1Bitfield->setParent(array.reference()); + array1Bitfield->setParent(array->reference()); array1Bitfield->setFields(std::move(array1Fields)); array1Bitfield->setEndian(std::endian::big); arrayEntries.push_back(std::move(array1Bitfield)); } - array->setParent(testBitfield.reference()); + array->setParent(testBitfield->reference()); array->setEntries(arrayEntries); array->setEndian(std::endian::big); bitfieldFields.push_back(std::move(array)); @@ -107,14 +107,14 @@ namespace pl::test { std::vector> bitfieldFields; { - bitfieldFields.push_back(create("", "flag0", 0x03, 7, 1, 0, testBitfield.reference())); - bitfieldFields.push_back(create("", "flag1", 0x03, 6, 1, 0, testBitfield.reference())); - bitfieldFields.push_back(create("", "flag2", 0x03, 5, 1, 0, testBitfield.reference())); - bitfieldFields.push_back(create("", "flag3", 0x03, 4, 1, 0, testBitfield.reference())); - bitfieldFields.push_back(create("", "flag4", 0x03, 3, 1, 0, testBitfield.reference())); - bitfieldFields.push_back(create("", "flag5", 0x03, 2, 1, 0, testBitfield.reference())); - - auto enumField = create("Enum", "enumerated", 0x02, 4, 6, 0, testBitfield.reference()); + bitfieldFields.push_back(create("", "flag0", 0x03, 7, 1, 0, testBitfield->reference())); + bitfieldFields.push_back(create("", "flag1", 0x03, 6, 1, 0, testBitfield->reference())); + bitfieldFields.push_back(create("", "flag2", 0x03, 5, 1, 0, testBitfield->reference())); + bitfieldFields.push_back(create("", "flag3", 0x03, 4, 1, 0, testBitfield->reference())); + bitfieldFields.push_back(create("", "flag4", 0x03, 3, 1, 0, testBitfield->reference())); + bitfieldFields.push_back(create("", "flag5", 0x03, 2, 1, 0, testBitfield->reference())); + + auto enumField = create("Enum", "enumerated", 0x02, 4, 6, 0, testBitfield->reference()); std::map values; { values.insert({ "A", { 0x39, 0x39 } }); From bb5bc626d0a4708bca37562e64cfbb5cc303462e Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Wed, 4 Jun 2025 02:31:09 +1000 Subject: [PATCH 36/51] Work on unit tests --- tests/include/test_patterns/test_pattern_bitfields.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/include/test_patterns/test_pattern_bitfields.hpp b/tests/include/test_patterns/test_pattern_bitfields.hpp index f24a7b72..66e558aa 100644 --- a/tests/include/test_patterns/test_pattern_bitfields.hpp +++ b/tests/include/test_patterns/test_pattern_bitfields.hpp @@ -11,7 +11,7 @@ namespace pl::test { TestPatternBitfields(core::Evaluator *evaluator) : TestPattern(evaluator, "Bitfields") { auto testBitfield = create("TestBitfield", "testBitfield", 0x25, 0, 2 + 3 + (4 * 8), 0); - std::vector> bitfieldFields; + std::vector> bitfieldFields; { bitfieldFields.push_back(create("", "a", 0x25, 0, 2, 0, testBitfield->reference())); bitfieldFields.push_back(create("", "b", 0x25, 2, 3, 0, testBitfield->reference())); From 36deb1326a27364299a3dceb660ee8cde8e6fa1f Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Thu, 5 Jun 2025 00:12:01 +1000 Subject: [PATCH 37/51] Fixing tests --- .../test_patterns/test_pattern_bitfields.hpp | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/tests/include/test_patterns/test_pattern_bitfields.hpp b/tests/include/test_patterns/test_pattern_bitfields.hpp index 66e558aa..70992623 100644 --- a/tests/include/test_patterns/test_pattern_bitfields.hpp +++ b/tests/include/test_patterns/test_pattern_bitfields.hpp @@ -11,24 +11,26 @@ namespace pl::test { TestPatternBitfields(core::Evaluator *evaluator) : TestPattern(evaluator, "Bitfields") { auto testBitfield = create("TestBitfield", "testBitfield", 0x25, 0, 2 + 3 + (4 * 8), 0); - std::vector> bitfieldFields; + auto tbfRef = [&](){return std::static_pointer_cast(testBitfield.reference());} + + std::vector> bitfieldFields; { - bitfieldFields.push_back(create("", "a", 0x25, 0, 2, 0, testBitfield->reference())); - bitfieldFields.push_back(create("", "b", 0x25, 2, 3, 0, testBitfield->reference())); + bitfieldFields.push_back(create("", "a", 0x25, 0, 2, 0, tbfRef())); + bitfieldFields.push_back(create("", "b", 0x25, 2, 3, 0, tbfRef())); auto nestedBitfield = create("NestedBitfield", "c", 0x25, 5, 4 * 2, 0); std::vector> nestedFields; { - nestedFields.push_back(create("", "nestedA", 0x25, 5, 4, 0, testBitfield->reference())); - nestedFields.push_back(create("", "nestedB", 0x26, 1, 4, 0, testBitfield->reference())); + nestedFields.push_back(create("", "nestedA", 0x25, 5, 4, 0, tbfRef())); + nestedFields.push_back(create("", "nestedB", 0x26, 1, 4, 0, tbfRef())); } - nestedBitfield->setParent(testBitfield->reference()); + nestedBitfield->setParent(tbfRef()); nestedBitfield->setFields(std::move(nestedFields)); nestedBitfield->setEndian(std::endian::big); bitfieldFields.push_back(std::move(nestedBitfield)); - bitfieldFields.push_back(create("", "d", 0x26, 5, 4, 0, testBitfield->reference())); - bitfieldFields.push_back(create("", "e", 0x27, 1, 4, 0, testBitfield->reference())); + bitfieldFields.push_back(create("", "d", 0x26, 5, 4, 0, tbfRef())); + bitfieldFields.push_back(create("", "e", 0x27, 1, 4, 0, tbfRef())); auto array = create("NestedBitfield", "f", 0x27, 5, 4 * 4, 0); std::vector> arrayEntries; @@ -55,7 +57,7 @@ namespace pl::test { array1Bitfield->setEndian(std::endian::big); arrayEntries.push_back(std::move(array1Bitfield)); } - array->setParent(testBitfield->reference()); + array->setParent(tbfRef()); array->setEntries(arrayEntries); array->setEndian(std::endian::big); bitfieldFields.push_back(std::move(array)); From 3eb28338a4797bcfbd853d28f0b7a18f2d84c1fa Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Thu, 5 Jun 2025 00:15:10 +1000 Subject: [PATCH 38/51] Fixing tests --- tests/include/test_patterns/test_pattern_bitfields.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/include/test_patterns/test_pattern_bitfields.hpp b/tests/include/test_patterns/test_pattern_bitfields.hpp index 70992623..01c6c44d 100644 --- a/tests/include/test_patterns/test_pattern_bitfields.hpp +++ b/tests/include/test_patterns/test_pattern_bitfields.hpp @@ -11,7 +11,7 @@ namespace pl::test { TestPatternBitfields(core::Evaluator *evaluator) : TestPattern(evaluator, "Bitfields") { auto testBitfield = create("TestBitfield", "testBitfield", 0x25, 0, 2 + 3 + (4 * 8), 0); - auto tbfRef = [&](){return std::static_pointer_cast(testBitfield.reference());} + auto tbfRef = [&](){return std::static_pointer_cast(testBitfield->reference());} std::vector> bitfieldFields; { From cab951b30a430eee66dfc83d4e7bab9a6261c868 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Thu, 5 Jun 2025 00:18:33 +1000 Subject: [PATCH 39/51] Fixing tests --- tests/include/test_patterns/test_pattern_bitfields.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/include/test_patterns/test_pattern_bitfields.hpp b/tests/include/test_patterns/test_pattern_bitfields.hpp index 01c6c44d..86dd9611 100644 --- a/tests/include/test_patterns/test_pattern_bitfields.hpp +++ b/tests/include/test_patterns/test_pattern_bitfields.hpp @@ -11,7 +11,7 @@ namespace pl::test { TestPatternBitfields(core::Evaluator *evaluator) : TestPattern(evaluator, "Bitfields") { auto testBitfield = create("TestBitfield", "testBitfield", 0x25, 0, 2 + 3 + (4 * 8), 0); - auto tbfRef = [&](){return std::static_pointer_cast(testBitfield->reference());} + auto tbfRef = [&](){return std::static_pointer_cast(testBitfield->reference());}; std::vector> bitfieldFields; { From 8e82fdd6b8dd26f6ceff03faf973de29a9f5efef Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Thu, 5 Jun 2025 00:33:05 +1000 Subject: [PATCH 40/51] Fixing tests --- .../test_patterns/test_pattern_bitfields.hpp | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/tests/include/test_patterns/test_pattern_bitfields.hpp b/tests/include/test_patterns/test_pattern_bitfields.hpp index 86dd9611..68fe9a7b 100644 --- a/tests/include/test_patterns/test_pattern_bitfields.hpp +++ b/tests/include/test_patterns/test_pattern_bitfields.hpp @@ -6,31 +6,37 @@ namespace pl::test { + template + std::shared_ptr downcast_ref(std::shared_ptr &pat) + { + return std::static_pointer_cast(pat->reference()) + } + class TestPatternBitfields : public TestPattern { public: TestPatternBitfields(core::Evaluator *evaluator) : TestPattern(evaluator, "Bitfields") { auto testBitfield = create("TestBitfield", "testBitfield", 0x25, 0, 2 + 3 + (4 * 8), 0); - auto tbfRef = [&](){return std::static_pointer_cast(testBitfield->reference());}; + auto downcast_ref(testBitfield) [&](){return std::static_pointer_cast(testBitfield->reference());}; std::vector> bitfieldFields; { - bitfieldFields.push_back(create("", "a", 0x25, 0, 2, 0, tbfRef())); - bitfieldFields.push_back(create("", "b", 0x25, 2, 3, 0, tbfRef())); + bitfieldFields.push_back(create("", "a", 0x25, 0, 2, 0, downcast_ref(testBitfield))); + bitfieldFields.push_back(create("", "b", 0x25, 2, 3, 0, downcast_ref(testBitfield))); auto nestedBitfield = create("NestedBitfield", "c", 0x25, 5, 4 * 2, 0); std::vector> nestedFields; { - nestedFields.push_back(create("", "nestedA", 0x25, 5, 4, 0, tbfRef())); - nestedFields.push_back(create("", "nestedB", 0x26, 1, 4, 0, tbfRef())); + nestedFields.push_back(create("", "nestedA", 0x25, 5, 4, 0, downcast_ref(testBitfield))); + nestedFields.push_back(create("", "nestedB", 0x26, 1, 4, 0, downcast_ref(testBitfield))); } - nestedBitfield->setParent(tbfRef()); + nestedBitfield->setParent(downcast_ref(testBitfield)); nestedBitfield->setFields(std::move(nestedFields)); nestedBitfield->setEndian(std::endian::big); bitfieldFields.push_back(std::move(nestedBitfield)); - bitfieldFields.push_back(create("", "d", 0x26, 5, 4, 0, tbfRef())); - bitfieldFields.push_back(create("", "e", 0x27, 1, 4, 0, tbfRef())); + bitfieldFields.push_back(create("", "d", 0x26, 5, 4, 0, downcast_ref(testBitfield))); + bitfieldFields.push_back(create("", "e", 0x27, 1, 4, 0, downcast_ref(testBitfield))); auto array = create("NestedBitfield", "f", 0x27, 5, 4 * 4, 0); std::vector> arrayEntries; @@ -49,15 +55,15 @@ namespace pl::test { auto array1Bitfield = create("NestedBitfield", "[1]", 0x28, 5, 4 * 2, 0); std::vector> array1Fields; { - array1Fields.push_back(create("", "nestedA", 0x28, 5, 4, 0, array1Bitfield->reference())); - array1Fields.push_back(create("", "nestedB", 0x29, 1, 4, 0, array1Bitfield->reference())); + array1Fields.push_back(create("", "nestedA", 0x28, 5, 4, 0, downcast_ref(array1Bitfield))); + array1Fields.push_back(create("", "nestedB", 0x29, 1, 4, 0, downcast_ref(array1Bitfield))); } array1Bitfield->setParent(array->reference()); array1Bitfield->setFields(std::move(array1Fields)); array1Bitfield->setEndian(std::endian::big); arrayEntries.push_back(std::move(array1Bitfield)); } - array->setParent(tbfRef()); + array->setParent(downcast_ref(testBitfield)); array->setEntries(arrayEntries); array->setEndian(std::endian::big); bitfieldFields.push_back(std::move(array)); From 6173dfc60500d0cd678406f2c3649c2fa99bf346 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Thu, 5 Jun 2025 00:56:48 +1000 Subject: [PATCH 41/51] Fixing tests --- .../test_patterns/test_pattern_bitfields.hpp | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/tests/include/test_patterns/test_pattern_bitfields.hpp b/tests/include/test_patterns/test_pattern_bitfields.hpp index 68fe9a7b..51046ddd 100644 --- a/tests/include/test_patterns/test_pattern_bitfields.hpp +++ b/tests/include/test_patterns/test_pattern_bitfields.hpp @@ -7,9 +7,9 @@ namespace pl::test { template - std::shared_ptr downcast_ref(std::shared_ptr &pat) + std::shared_ptr downcast_ref(std::shared_ptr pat) { - return std::static_pointer_cast(pat->reference()) + return std::static_pointer_cast(pat->reference()); } class TestPatternBitfields : public TestPattern { @@ -17,8 +17,6 @@ namespace pl::test { TestPatternBitfields(core::Evaluator *evaluator) : TestPattern(evaluator, "Bitfields") { auto testBitfield = create("TestBitfield", "testBitfield", 0x25, 0, 2 + 3 + (4 * 8), 0); - auto downcast_ref(testBitfield) [&](){return std::static_pointer_cast(testBitfield->reference());}; - std::vector> bitfieldFields; { bitfieldFields.push_back(create("", "a", 0x25, 0, 2, 0, downcast_ref(testBitfield))); @@ -44,8 +42,8 @@ namespace pl::test { auto array0Bitfield = create("NestedBitfield", "[0]", 0x27, 5, 4 * 2, 0); std::vector> array0Fields; { - array0Fields.push_back(create("", "nestedA", 0x27, 5, 4, 0, array0Bitfield->reference())); - array0Fields.push_back(create("", "nestedB", 0x28, 1, 4, 0, array0Bitfield->reference())); + array0Fields.push_back(create("", "nestedA", 0x27, 5, 4, 0, downcast_ref(array0Bitfield))); + array0Fields.push_back(create("", "nestedB", 0x28, 1, 4, 0, downcast_ref(array0Bitfield))); } array0Bitfield->setParent(array->reference()); array0Bitfield->setFields(std::move(array0Fields)); @@ -115,14 +113,14 @@ namespace pl::test { std::vector> bitfieldFields; { - bitfieldFields.push_back(create("", "flag0", 0x03, 7, 1, 0, testBitfield->reference())); - bitfieldFields.push_back(create("", "flag1", 0x03, 6, 1, 0, testBitfield->reference())); - bitfieldFields.push_back(create("", "flag2", 0x03, 5, 1, 0, testBitfield->reference())); - bitfieldFields.push_back(create("", "flag3", 0x03, 4, 1, 0, testBitfield->reference())); - bitfieldFields.push_back(create("", "flag4", 0x03, 3, 1, 0, testBitfield->reference())); - bitfieldFields.push_back(create("", "flag5", 0x03, 2, 1, 0, testBitfield->reference())); - - auto enumField = create("Enum", "enumerated", 0x02, 4, 6, 0, testBitfield->reference()); + bitfieldFields.push_back(create("", "flag0", 0x03, 7, 1, 0, downcast_ref(testBitfield))); + bitfieldFields.push_back(create("", "flag1", 0x03, 6, 1, 0, downcast_ref(testBitfield))); + bitfieldFields.push_back(create("", "flag2", 0x03, 5, 1, 0, downcast_ref(testBitfield))); + bitfieldFields.push_back(create("", "flag3", 0x03, 4, 1, 0, downcast_ref(testBitfield))); + bitfieldFields.push_back(create("", "flag4", 0x03, 3, 1, 0, downcast_ref(testBitfield))); + bitfieldFields.push_back(create("", "flag5", 0x03, 2, 1, 0, downcast_ref(testBitfield))); + + auto enumField = create("Enum", "enumerated", 0x02, 4, 6, 0, downcast_ref(testBitfield)); std::map values; { values.insert({ "A", { 0x39, 0x39 } }); From 21fa172d71d8764cbbc87b2a34f7465991bab5e1 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Thu, 5 Jun 2025 03:36:33 +1000 Subject: [PATCH 42/51] Make all patterns I could find have protected constructors --- lib/include/pl/patterns/pattern.hpp | 3 ++ .../pl/patterns/pattern_array_dynamic.hpp | 4 +- .../pl/patterns/pattern_array_static.hpp | 4 +- lib/include/pl/patterns/pattern_bitfield.hpp | 40 +++++++++++++------ lib/include/pl/patterns/pattern_boolean.hpp | 4 +- lib/include/pl/patterns/pattern_character.hpp | 6 ++- lib/include/pl/patterns/pattern_enum.hpp | 4 +- lib/include/pl/patterns/pattern_error.hpp | 4 +- lib/include/pl/patterns/pattern_float.hpp | 4 +- lib/include/pl/patterns/pattern_padding.hpp | 4 +- lib/include/pl/patterns/pattern_pointer.hpp | 4 +- lib/include/pl/patterns/pattern_signed.hpp | 4 +- lib/include/pl/patterns/pattern_string.hpp | 4 +- lib/include/pl/patterns/pattern_struct.hpp | 4 +- lib/include/pl/patterns/pattern_union.hpp | 4 +- lib/include/pl/patterns/pattern_unsigned.hpp | 4 +- .../pl/patterns/pattern_wide_character.hpp | 6 ++- .../pl/patterns/pattern_wide_string.hpp | 4 +- 18 files changed, 80 insertions(+), 31 deletions(-) diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index 42c8f7af..46d099ce 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -71,6 +71,8 @@ namespace pl::ptrn { constexpr static u64 PatternLocalSectionId = 0xFFFF'FFFF'FFFF'FFFE; constexpr static u64 InstantiationSectionId = 0xFFFF'FFFF'FFFF'FFFD; + BEFRIEND_SHARED_OBJECT_CREATOR + protected: Pattern(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : m_evaluator(evaluator), m_line(line), m_offset(offset), m_size(size) { @@ -112,6 +114,7 @@ namespace pl::ptrn { } } + public: virtual ~Pattern() { if (this->m_evaluator != nullptr) { this->m_evaluator->patternDestroyed(this); diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index 405fdb9b..08ac73bc 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -7,12 +7,14 @@ namespace pl::ptrn { class PatternArrayDynamic : public Pattern, public IInlinable, public IIndexable { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternArrayDynamic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } PatternArrayDynamic(const PatternArrayDynamic &other) : Pattern(other) {} + public: void post_construct(const PatternArrayDynamic &other) { std::vector> entries; for (const auto &entry : other.m_entries) diff --git a/lib/include/pl/patterns/pattern_array_static.hpp b/lib/include/pl/patterns/pattern_array_static.hpp index 2cee2e97..e2fdbae5 100644 --- a/lib/include/pl/patterns/pattern_array_static.hpp +++ b/lib/include/pl/patterns/pattern_array_static.hpp @@ -7,12 +7,14 @@ namespace pl::ptrn { class PatternArrayStatic : public Pattern, public IInlinable, public IIndexable { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternArrayStatic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } PatternArrayStatic(const PatternArrayStatic &other) : Pattern(other) {} + public: void post_construct(const PatternArrayStatic &other) { this->setEntries(other.getTemplate()->clone(), other.getEntryCount()); } diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index cfc20b3b..9c5bf879 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -6,9 +6,11 @@ namespace pl::ptrn { class PatternBitfieldMember : public Pattern { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: using Pattern::Pattern; + public: [[nodiscard]] const PatternBitfieldMember& getTopmostBitfield() const { const PatternBitfieldMember* topBitfield = this; while (auto parent = topBitfield->getParent()) { @@ -52,23 +54,25 @@ namespace pl::ptrn { }; class PatternBitfieldField : public PatternBitfieldMember { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) : PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) { (void)parentBitfield; } - void post_construct(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { - (void)evaluator; (void)offset; (void)bitOffset; (void)bitSize; (void)line; - this->setParent(parentBitfield); - } - PatternBitfieldField(const PatternBitfieldField &other) : PatternBitfieldMember(other) { this->m_padding = other.m_padding; this->m_bitOffset = other.m_bitOffset; this->m_bitSize = other.m_bitSize; } + public: + void post_construct(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { + (void)evaluator; (void)offset; (void)bitOffset; (void)bitSize; (void)line; + this->setParent(parentBitfield); + } + [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } @@ -163,9 +167,11 @@ namespace pl::ptrn { }; class PatternBitfieldFieldSigned : public PatternBitfieldField { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: using PatternBitfieldField::PatternBitfieldField; + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } @@ -187,9 +193,11 @@ namespace pl::ptrn { }; class PatternBitfieldFieldBoolean : public PatternBitfieldField { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: using PatternBitfieldField::PatternBitfieldField; + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } @@ -219,9 +227,11 @@ namespace pl::ptrn { }; class PatternBitfieldFieldEnum : public PatternBitfieldField { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: using PatternBitfieldField::PatternBitfieldField; + public: [[nodiscard]] std::string getFormattedName() const override { return "enum " + Pattern::getTypeName(); } @@ -271,7 +281,8 @@ namespace pl::ptrn { class PatternBitfieldArray : public PatternBitfieldMember, public IInlinable, public IIndexable { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternBitfieldArray(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } @@ -285,7 +296,8 @@ namespace pl::ptrn { this->m_firstBitOffset = other.m_firstBitOffset; this->m_totalBitSize = other.m_totalBitSize; } - + + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } @@ -546,7 +558,8 @@ namespace pl::ptrn { class PatternBitfield : public PatternBitfieldMember, public IInlinable, public IIterable { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternBitfield(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } @@ -558,6 +571,7 @@ namespace pl::ptrn { this->m_totalBitSize = other.m_totalBitSize; } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_boolean.hpp b/lib/include/pl/patterns/pattern_boolean.hpp index 42ed92fc..61f8219b 100644 --- a/lib/include/pl/patterns/pattern_boolean.hpp +++ b/lib/include/pl/patterns/pattern_boolean.hpp @@ -5,10 +5,12 @@ namespace pl::ptrn { class PatternBoolean : public Pattern { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: explicit PatternBoolean(core::Evaluator *evaluator, u64 offset, u32 line) : Pattern(evaluator, offset, 1, line) { } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_character.hpp b/lib/include/pl/patterns/pattern_character.hpp index 1428e346..e44760d3 100644 --- a/lib/include/pl/patterns/pattern_character.hpp +++ b/lib/include/pl/patterns/pattern_character.hpp @@ -5,14 +5,16 @@ namespace pl::ptrn { class PatternCharacter : public Pattern { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternCharacter(core::Evaluator *evaluator, u64 offset, u32 line) : Pattern(evaluator, offset, 1, line) { } [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } - + + public: [[nodiscard]] core::Token::Literal getValue() const override { char character = '\x00'; this->getEvaluator()->readData(this->getOffset(), &character, 1, this->getSection()); diff --git a/lib/include/pl/patterns/pattern_enum.hpp b/lib/include/pl/patterns/pattern_enum.hpp index 1ab6429e..754ca596 100644 --- a/lib/include/pl/patterns/pattern_enum.hpp +++ b/lib/include/pl/patterns/pattern_enum.hpp @@ -13,7 +13,8 @@ namespace pl::ptrn { [[nodiscard]] bool operator!=(const EnumValue &other) const = default; }; - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternEnum(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -21,6 +22,7 @@ namespace pl::ptrn { return construct_shared_object(*this); } + public: [[nodiscard]] core::Token::Literal getValue() const override { u128 value = 0; this->getEvaluator()->readData(this->getOffset(), &value, this->getSize(), this->getSection()); diff --git a/lib/include/pl/patterns/pattern_error.hpp b/lib/include/pl/patterns/pattern_error.hpp index 484e0541..f1926496 100644 --- a/lib/include/pl/patterns/pattern_error.hpp +++ b/lib/include/pl/patterns/pattern_error.hpp @@ -5,10 +5,12 @@ namespace pl::ptrn { class PatternError : public Pattern { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternError(core::Evaluator *evaluator, u64 offset, size_t size, u32 line, std::string errorMessage) : Pattern(evaluator, offset, size, line), m_errorMessage(std::move(errorMessage)) { } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_float.hpp b/lib/include/pl/patterns/pattern_float.hpp index 5ad1dcc9..a2da9b7f 100644 --- a/lib/include/pl/patterns/pattern_float.hpp +++ b/lib/include/pl/patterns/pattern_float.hpp @@ -5,10 +5,12 @@ namespace pl::ptrn { class PatternFloat : public Pattern { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternFloat(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_padding.hpp b/lib/include/pl/patterns/pattern_padding.hpp index d0b69624..02824cd2 100644 --- a/lib/include/pl/patterns/pattern_padding.hpp +++ b/lib/include/pl/patterns/pattern_padding.hpp @@ -5,9 +5,11 @@ namespace pl::ptrn { class PatternPadding : public Pattern { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternPadding(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index fca2204e..70dfbc56 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -7,11 +7,13 @@ namespace pl::ptrn { class PatternPointer : public Pattern, public IInlinable { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternPointer(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line), m_pointedAt(nullptr), m_pointerType(nullptr) { } + public: PatternPointer(const PatternPointer &other) : Pattern(other) { this->m_pointedAt = std::shared_ptr(other.m_pointedAt->clone()); diff --git a/lib/include/pl/patterns/pattern_signed.hpp b/lib/include/pl/patterns/pattern_signed.hpp index 0b187b14..fb442530 100644 --- a/lib/include/pl/patterns/pattern_signed.hpp +++ b/lib/include/pl/patterns/pattern_signed.hpp @@ -5,10 +5,12 @@ namespace pl::ptrn { class PatternSigned : public Pattern { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternSigned(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index 3099432c..b71b5874 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -8,10 +8,12 @@ namespace pl::ptrn { class PatternString : public Pattern, public IIndexable { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternString(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_struct.hpp b/lib/include/pl/patterns/pattern_struct.hpp index 92a18593..29eebf89 100644 --- a/lib/include/pl/patterns/pattern_struct.hpp +++ b/lib/include/pl/patterns/pattern_struct.hpp @@ -7,12 +7,14 @@ namespace pl::ptrn { class PatternStruct : public Pattern, public IInlinable, public IIterable { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternStruct(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } PatternStruct(const PatternStruct &other) : Pattern(other) {} + public: void post_construct(const PatternStruct &other) { for (const auto &member : other.m_members) { auto copy = member->clone(); diff --git a/lib/include/pl/patterns/pattern_union.hpp b/lib/include/pl/patterns/pattern_union.hpp index ed8585b6..ad59c183 100644 --- a/lib/include/pl/patterns/pattern_union.hpp +++ b/lib/include/pl/patterns/pattern_union.hpp @@ -7,7 +7,8 @@ namespace pl::ptrn { class PatternUnion : public Pattern, public IInlinable, public IIterable { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternUnion(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -20,6 +21,7 @@ namespace pl::ptrn { } } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_unsigned.hpp b/lib/include/pl/patterns/pattern_unsigned.hpp index a9919a78..bc18d529 100644 --- a/lib/include/pl/patterns/pattern_unsigned.hpp +++ b/lib/include/pl/patterns/pattern_unsigned.hpp @@ -5,10 +5,12 @@ namespace pl::ptrn { class PatternUnsigned : public Pattern { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternUnsigned(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_wide_character.hpp b/lib/include/pl/patterns/pattern_wide_character.hpp index 09664a0b..7cc8fc0f 100644 --- a/lib/include/pl/patterns/pattern_wide_character.hpp +++ b/lib/include/pl/patterns/pattern_wide_character.hpp @@ -7,11 +7,13 @@ namespace pl::ptrn { class PatternWideCharacter : public Pattern { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: explicit PatternWideCharacter(core::Evaluator *evaluator, u64 offset, u32 line) : Pattern(evaluator, offset, 2, line) { } - [[nodiscard]] std::shared_ptr clone() const override { + public: + [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_wide_string.hpp b/lib/include/pl/patterns/pattern_wide_string.hpp index 45abc32c..fc9f1682 100644 --- a/lib/include/pl/patterns/pattern_wide_string.hpp +++ b/lib/include/pl/patterns/pattern_wide_string.hpp @@ -8,10 +8,12 @@ namespace pl::ptrn { class PatternWideString : public Pattern, public IIndexable { - public: + BEFRIEND_SHARED_OBJECT_CREATOR + protected: PatternWideString(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } From 32910510372bc4dfedc4eb2a5813c9d211d02576 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Fri, 6 Jun 2025 00:53:58 +1000 Subject: [PATCH 43/51] Change static cast to dynamic --- tests/include/test_patterns/test_pattern_bitfields.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/include/test_patterns/test_pattern_bitfields.hpp b/tests/include/test_patterns/test_pattern_bitfields.hpp index 51046ddd..abf84c1b 100644 --- a/tests/include/test_patterns/test_pattern_bitfields.hpp +++ b/tests/include/test_patterns/test_pattern_bitfields.hpp @@ -9,7 +9,7 @@ namespace pl::test { template std::shared_ptr downcast_ref(std::shared_ptr pat) { - return std::static_pointer_cast(pat->reference()); + return std::dynamic_pointer_cast(pat->reference()); } class TestPatternBitfields : public TestPattern { From 29b748612f2865080baabede3f453c6bed15db36 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Fri, 6 Jun 2025 04:08:34 +1000 Subject: [PATCH 44/51] Moved friend declations to end of class Its previous placement was confusing my debugger --- lib/include/pl/patterns/pattern.hpp | 3 ++- .../pl/patterns/pattern_array_dynamic.hpp | 3 ++- .../pl/patterns/pattern_array_static.hpp | 3 ++- lib/include/pl/patterns/pattern_bitfield.hpp | 21 ++++++++++++------- lib/include/pl/patterns/pattern_boolean.hpp | 3 ++- lib/include/pl/patterns/pattern_character.hpp | 3 ++- lib/include/pl/patterns/pattern_enum.hpp | 3 ++- lib/include/pl/patterns/pattern_error.hpp | 3 ++- lib/include/pl/patterns/pattern_float.hpp | 3 ++- lib/include/pl/patterns/pattern_padding.hpp | 3 ++- lib/include/pl/patterns/pattern_pointer.hpp | 3 ++- lib/include/pl/patterns/pattern_signed.hpp | 3 ++- lib/include/pl/patterns/pattern_string.hpp | 2 +- lib/include/pl/patterns/pattern_struct.hpp | 3 ++- lib/include/pl/patterns/pattern_union.hpp | 3 ++- lib/include/pl/patterns/pattern_unsigned.hpp | 3 ++- .../pl/patterns/pattern_wide_character.hpp | 3 ++- .../pl/patterns/pattern_wide_string.hpp | 3 ++- 18 files changed, 47 insertions(+), 24 deletions(-) diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index 46d099ce..b6823c35 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -71,7 +71,6 @@ namespace pl::ptrn { constexpr static u64 PatternLocalSectionId = 0xFFFF'FFFF'FFFF'FFFE; constexpr static u64 InstantiationSectionId = 0xFFFF'FFFF'FFFF'FFFD; - BEFRIEND_SHARED_OBJECT_CREATOR protected: Pattern(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : m_evaluator(evaluator), m_line(line), m_offset(offset), m_size(size) { @@ -648,6 +647,8 @@ namespace pl::ptrn { bool m_initialized = false; bool m_manualColor = false; + + BEFRIEND_SHARED_OBJECT_CREATOR }; } diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index 08ac73bc..db21153a 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -7,7 +7,6 @@ namespace pl::ptrn { class PatternArrayDynamic : public Pattern, public IInlinable, public IIndexable { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternArrayDynamic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -241,6 +240,8 @@ namespace pl::ptrn { private: std::vector> m_entries; + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_array_static.hpp b/lib/include/pl/patterns/pattern_array_static.hpp index e2fdbae5..8d290e4d 100644 --- a/lib/include/pl/patterns/pattern_array_static.hpp +++ b/lib/include/pl/patterns/pattern_array_static.hpp @@ -7,7 +7,6 @@ namespace pl::ptrn { class PatternArrayStatic : public Pattern, public IInlinable, public IIndexable { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternArrayStatic(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -256,6 +255,8 @@ namespace pl::ptrn { std::shared_ptr m_template = nullptr; mutable std::vector> m_highlightTemplates; size_t m_entryCount = 0; + + BEFRIEND_SHARED_OBJECT_CREATOR }; } diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index 9c5bf879..c0925899 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -6,7 +6,6 @@ namespace pl::ptrn { class PatternBitfieldMember : public Pattern { - BEFRIEND_SHARED_OBJECT_CREATOR protected: using Pattern::Pattern; @@ -51,10 +50,11 @@ namespace pl::ptrn { std::vector getRawBytes() override { return { }; } + + BEFRIEND_SHARED_OBJECT_CREATOR }; class PatternBitfieldField : public PatternBitfieldMember { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) : PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) { @@ -164,10 +164,11 @@ namespace pl::ptrn { u8 m_bitSize; bool m_padding = false; + + BEFRIEND_SHARED_OBJECT_CREATOR }; class PatternBitfieldFieldSigned : public PatternBitfieldField { - BEFRIEND_SHARED_OBJECT_CREATOR protected: using PatternBitfieldField::PatternBitfieldField; @@ -190,10 +191,11 @@ namespace pl::ptrn { auto result = fmt::format("{}", this->getValue().toSigned()); return Pattern::callUserFormatFunc(this->getValue(), true).value_or(result); } + + BEFRIEND_SHARED_OBJECT_CREATOR }; class PatternBitfieldFieldBoolean : public PatternBitfieldField { - BEFRIEND_SHARED_OBJECT_CREATOR protected: using PatternBitfieldField::PatternBitfieldField; @@ -224,10 +226,11 @@ namespace pl::ptrn { auto value = this->getValue(); return Pattern::callUserFormatFunc(value, true).value_or(fmt::format("{}", value.toBoolean() ? "true" : "false")); } + + BEFRIEND_SHARED_OBJECT_CREATOR }; class PatternBitfieldFieldEnum : public PatternBitfieldField { - BEFRIEND_SHARED_OBJECT_CREATOR protected: using PatternBitfieldField::PatternBitfieldField; @@ -276,12 +279,13 @@ namespace pl::ptrn { private: std::map m_enumValues; + + BEFRIEND_SHARED_OBJECT_CREATOR }; class PatternBitfieldArray : public PatternBitfieldMember, public IInlinable, public IIndexable { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternBitfieldArray(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } @@ -553,12 +557,13 @@ namespace pl::ptrn { u8 m_firstBitOffset = 0; u128 m_totalBitSize = 0; bool m_reversed = false; + + BEFRIEND_SHARED_OBJECT_CREATOR }; class PatternBitfield : public PatternBitfieldMember, public IInlinable, public IIterable { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternBitfield(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } @@ -837,6 +842,8 @@ namespace pl::ptrn { u8 m_firstBitOffset = 0; u64 m_totalBitSize = 0; bool m_reversed = false; + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_boolean.hpp b/lib/include/pl/patterns/pattern_boolean.hpp index 61f8219b..f7d5b02e 100644 --- a/lib/include/pl/patterns/pattern_boolean.hpp +++ b/lib/include/pl/patterns/pattern_boolean.hpp @@ -5,7 +5,6 @@ namespace pl::ptrn { class PatternBoolean : public Pattern { - BEFRIEND_SHARED_OBJECT_CREATOR protected: explicit PatternBoolean(core::Evaluator *evaluator, u64 offset, u32 line) : Pattern(evaluator, offset, 1, line) { } @@ -65,6 +64,8 @@ namespace pl::ptrn { return result; } + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_character.hpp b/lib/include/pl/patterns/pattern_character.hpp index e44760d3..089c2791 100644 --- a/lib/include/pl/patterns/pattern_character.hpp +++ b/lib/include/pl/patterns/pattern_character.hpp @@ -5,7 +5,6 @@ namespace pl::ptrn { class PatternCharacter : public Pattern { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternCharacter(core::Evaluator *evaluator, u64 offset, u32 line) : Pattern(evaluator, offset, 1, line) { } @@ -61,6 +60,8 @@ namespace pl::ptrn { return result; } + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_enum.hpp b/lib/include/pl/patterns/pattern_enum.hpp index 754ca596..19e1c7ae 100644 --- a/lib/include/pl/patterns/pattern_enum.hpp +++ b/lib/include/pl/patterns/pattern_enum.hpp @@ -13,7 +13,6 @@ namespace pl::ptrn { [[nodiscard]] bool operator!=(const EnumValue &other) const = default; }; - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternEnum(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -104,6 +103,8 @@ namespace pl::ptrn { private: std::map m_enumValues; + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_error.hpp b/lib/include/pl/patterns/pattern_error.hpp index f1926496..63e34f47 100644 --- a/lib/include/pl/patterns/pattern_error.hpp +++ b/lib/include/pl/patterns/pattern_error.hpp @@ -5,7 +5,6 @@ namespace pl::ptrn { class PatternError : public Pattern { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternError(core::Evaluator *evaluator, u64 offset, size_t size, u32 line, std::string errorMessage) : Pattern(evaluator, offset, size, line), m_errorMessage(std::move(errorMessage)) { } @@ -43,6 +42,8 @@ namespace pl::ptrn { private: std::string m_errorMessage; + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_float.hpp b/lib/include/pl/patterns/pattern_float.hpp index a2da9b7f..b7f08d48 100644 --- a/lib/include/pl/patterns/pattern_float.hpp +++ b/lib/include/pl/patterns/pattern_float.hpp @@ -5,7 +5,6 @@ namespace pl::ptrn { class PatternFloat : public Pattern { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternFloat(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -105,6 +104,8 @@ namespace pl::ptrn { return result; } + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_padding.hpp b/lib/include/pl/patterns/pattern_padding.hpp index 02824cd2..4bff8ff2 100644 --- a/lib/include/pl/patterns/pattern_padding.hpp +++ b/lib/include/pl/patterns/pattern_padding.hpp @@ -5,7 +5,6 @@ namespace pl::ptrn { class PatternPadding : public Pattern { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternPadding(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -46,6 +45,8 @@ namespace pl::ptrn { std::vector getRawBytes() override { return { }; } + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index 70dfbc56..aa8b67fe 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -7,7 +7,6 @@ namespace pl::ptrn { class PatternPointer : public Pattern, public IInlinable { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternPointer(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line), m_pointedAt(nullptr), m_pointerType(nullptr) { @@ -182,6 +181,8 @@ namespace pl::ptrn { std::shared_ptr m_pointerType; i128 m_pointedAtAddress = 0; u64 m_pointerBase = 0; + + BEFRIEND_SHARED_OBJECT_CREATOR }; } diff --git a/lib/include/pl/patterns/pattern_signed.hpp b/lib/include/pl/patterns/pattern_signed.hpp index fb442530..5a1c6f0c 100644 --- a/lib/include/pl/patterns/pattern_signed.hpp +++ b/lib/include/pl/patterns/pattern_signed.hpp @@ -5,7 +5,6 @@ namespace pl::ptrn { class PatternSigned : public Pattern { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternSigned(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -56,6 +55,8 @@ namespace pl::ptrn { return result; } + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index b71b5874..fbbeb118 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -8,7 +8,6 @@ namespace pl::ptrn { class PatternString : public Pattern, public IIndexable { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternString(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -104,6 +103,7 @@ namespace pl::ptrn { return result; } + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_struct.hpp b/lib/include/pl/patterns/pattern_struct.hpp index 29eebf89..f03089c7 100644 --- a/lib/include/pl/patterns/pattern_struct.hpp +++ b/lib/include/pl/patterns/pattern_struct.hpp @@ -7,7 +7,6 @@ namespace pl::ptrn { class PatternStruct : public Pattern, public IInlinable, public IIterable { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternStruct(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -233,6 +232,8 @@ namespace pl::ptrn { private: std::vector> m_members; std::vector m_sortedMembers; + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_union.hpp b/lib/include/pl/patterns/pattern_union.hpp index ad59c183..a8bcc253 100644 --- a/lib/include/pl/patterns/pattern_union.hpp +++ b/lib/include/pl/patterns/pattern_union.hpp @@ -7,7 +7,6 @@ namespace pl::ptrn { class PatternUnion : public Pattern, public IInlinable, public IIterable { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternUnion(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -223,6 +222,8 @@ namespace pl::ptrn { private: std::vector> m_members; std::vector m_sortedMembers; + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_unsigned.hpp b/lib/include/pl/patterns/pattern_unsigned.hpp index bc18d529..e2d6df68 100644 --- a/lib/include/pl/patterns/pattern_unsigned.hpp +++ b/lib/include/pl/patterns/pattern_unsigned.hpp @@ -5,7 +5,6 @@ namespace pl::ptrn { class PatternUnsigned : public Pattern { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternUnsigned(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -53,6 +52,8 @@ namespace pl::ptrn { return result; } + + BEFRIEND_SHARED_OBJECT_CREATOR }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_wide_character.hpp b/lib/include/pl/patterns/pattern_wide_character.hpp index 7cc8fc0f..c5c41304 100644 --- a/lib/include/pl/patterns/pattern_wide_character.hpp +++ b/lib/include/pl/patterns/pattern_wide_character.hpp @@ -7,7 +7,6 @@ namespace pl::ptrn { class PatternWideCharacter : public Pattern { - BEFRIEND_SHARED_OBJECT_CREATOR protected: explicit PatternWideCharacter(core::Evaluator *evaluator, u64 offset, u32 line) : Pattern(evaluator, offset, 2, line) { } @@ -57,6 +56,8 @@ namespace pl::ptrn { return result; } + + BEFRIEND_SHARED_OBJECT_CREATOR }; } diff --git a/lib/include/pl/patterns/pattern_wide_string.hpp b/lib/include/pl/patterns/pattern_wide_string.hpp index fc9f1682..6e4d2e6e 100644 --- a/lib/include/pl/patterns/pattern_wide_string.hpp +++ b/lib/include/pl/patterns/pattern_wide_string.hpp @@ -8,7 +8,6 @@ namespace pl::ptrn { class PatternWideString : public Pattern, public IIndexable { - BEFRIEND_SHARED_OBJECT_CREATOR protected: PatternWideString(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } @@ -107,6 +106,8 @@ namespace pl::ptrn { return result; } + + BEFRIEND_SHARED_OBJECT_CREATOR }; } From c308e82d2028ec3a413ffc1ea80820461e3c8300 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sat, 7 Jun 2025 03:54:05 +1000 Subject: [PATCH 45/51] New allocation method (WIP) Works, but needs more work --- .../pl/helpers/construct_shared_object.hpp | 103 +++++++++++------- lib/include/pl/patterns/pattern.hpp | 6 +- .../pl/patterns/pattern_array_dynamic.hpp | 2 +- .../pl/patterns/pattern_array_static.hpp | 2 +- lib/include/pl/patterns/pattern_bitfield.hpp | 20 ++-- lib/include/pl/patterns/pattern_boolean.hpp | 2 +- lib/include/pl/patterns/pattern_character.hpp | 2 +- lib/include/pl/patterns/pattern_enum.hpp | 2 +- lib/include/pl/patterns/pattern_error.hpp | 2 +- lib/include/pl/patterns/pattern_float.hpp | 2 +- lib/include/pl/patterns/pattern_padding.hpp | 2 +- lib/include/pl/patterns/pattern_pointer.hpp | 2 +- lib/include/pl/patterns/pattern_signed.hpp | 2 +- lib/include/pl/patterns/pattern_string.hpp | 2 +- lib/include/pl/patterns/pattern_struct.hpp | 2 +- lib/include/pl/patterns/pattern_union.hpp | 2 +- lib/include/pl/patterns/pattern_unsigned.hpp | 2 +- .../pl/patterns/pattern_wide_character.hpp | 2 +- .../pl/patterns/pattern_wide_string.hpp | 2 +- 19 files changed, 94 insertions(+), 67 deletions(-) diff --git a/lib/include/pl/helpers/construct_shared_object.hpp b/lib/include/pl/helpers/construct_shared_object.hpp index d05b4397..85281263 100644 --- a/lib/include/pl/helpers/construct_shared_object.hpp +++ b/lib/include/pl/helpers/construct_shared_object.hpp @@ -36,51 +36,78 @@ instantiation. #include #include -#define BEFRIEND_SHARED_OBJECT_CREATOR \ - template \ - friend std::shared_ptr shared_object_creator::impl::shared_ptr_creator(Args&&... args); +#define BEFRIEND_CONSTRUCT_SHARED_OBJECT(T) friend struct safe_enable_shared_from_this::Allocator; namespace shared_object_creator { - namespace impl { - - /* - shared_ptr_creator is responsible for actually creating the std::shared_ptr. - As described in this header's opening comment, it decides whether to use - std::make_shared's or std::shared_ptr's constructor and new based on the - accessibility the the class' constructor. If you wish to make the constructors - non-public make this a friend. The BEFRIEND_SHARED_OBJECT_CREATOR macro can be - used to do this tersely. - */ - - template - requires std::constructible_from - std::shared_ptr shared_ptr_creator(Args&&... args) { - return std::make_shared(std::forward(args)...); - } - - template - std::shared_ptr shared_ptr_creator(Args&&... args) { - return std::shared_ptr(new T(std::forward(args)...)); - } +/* +safe_enable_shared_from_this was found here: + https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const - } // namespace impl +Posted by stackoverflow member Carsten. +He adapted old code from stackoverflow member Zsolt Rizsányi, +who in turn says it was invented by Jonathan Wakely (GCC developer). - // The actual creation functions. +The only modification I have made is to enable copy-construction. - template - requires requires(T t, Args&&... args) { - t.post_construct(std::forward(args)...); - } - std::shared_ptr construct_shared_object(Args&&... args) { - auto p = impl::shared_ptr_creator(std::forward(args)...); - p->post_construct(std::forward(args)...); - return p; +C++23 +*/ +class safe_enable_shared_from_this : public std::enable_shared_from_this { +protected: + safe_enable_shared_from_this() noexcept = default; + safe_enable_shared_from_this(safe_enable_shared_from_this&&) noexcept = default; + safe_enable_shared_from_this(const safe_enable_shared_from_this&) noexcept = default; + safe_enable_shared_from_this& operator=(safe_enable_shared_from_this&&) noexcept = default; + safe_enable_shared_from_this& operator=(const safe_enable_shared_from_this&) noexcept = delete; + +public: + virtual ~safe_enable_shared_from_this() noexcept = default; + +protected: + template + struct Allocator : public std::allocator + { + template + void construct(TParent* parent, TArgs&&... args) + { ::new((void *)parent) TParent(std::forward(args)...); } + }; + +public: + template + static inline auto create(TArgs&&... args) -> ::std::shared_ptr { + return std::allocate_shared(Allocator{}, std::forward(args)...); } - template - std::shared_ptr construct_shared_object(Args&&... args) { - return impl::shared_ptr_creator(std::forward(args)...); - } + template + auto inline shared_from_this(this TSelf&& self) noexcept + { + return std::static_pointer_cast>( + std::forward(self).std::template enable_shared_from_this::shared_from_this()); + } + + template + auto inline weak_from_this(this TSelf&& self) noexcept -> ::std::weak_ptr> + { + return std::static_pointer_cast>( + std::forward(self).std::template enable_shared_from_this::weak_from_this().lock()); + } +}; + +// The actual creation functions. + +template + requires requires(T t, Args&&... args) { + t.post_construct(std::forward(args)...); +} +std::shared_ptr construct_shared_object(Args&&... args) { + auto p = safe_enable_shared_from_this::create(std::forward(args)...); + p->post_construct(std::forward(args)...); + return p; +} + +template +std::shared_ptr construct_shared_object(Args&&... args) { + return safe_enable_shared_from_this::create(std::forward(args)...); +} } // namespace shared_object_creator diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index b6823c35..78673c0d 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -64,7 +64,7 @@ namespace pl::ptrn { friend class core::Evaluator; }; - class Pattern : public std::enable_shared_from_this { + class Pattern : public safe_enable_shared_from_this { public: constexpr static u64 MainSectionId = 0x0000'0000'0000'0000; constexpr static u64 HeapSectionId = 0xFFFF'FFFF'FFFF'FFFF; @@ -86,7 +86,7 @@ namespace pl::ptrn { } - Pattern(const Pattern &other) : std::enable_shared_from_this(other) { + Pattern(const Pattern &other) : safe_enable_shared_from_this(other) { this->m_evaluator = other.m_evaluator; this->m_offset = other.m_offset; this->m_endian = other.m_endian; @@ -648,7 +648,7 @@ namespace pl::ptrn { bool m_manualColor = false; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(Pattern) }; } diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index db21153a..4f99cffe 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -241,7 +241,7 @@ namespace pl::ptrn { private: std::vector> m_entries; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternArrayDynamic) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_array_static.hpp b/lib/include/pl/patterns/pattern_array_static.hpp index 8d290e4d..0846a9bf 100644 --- a/lib/include/pl/patterns/pattern_array_static.hpp +++ b/lib/include/pl/patterns/pattern_array_static.hpp @@ -256,7 +256,7 @@ namespace pl::ptrn { mutable std::vector> m_highlightTemplates; size_t m_entryCount = 0; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternArrayStatic) }; } diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index c0925899..16063721 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -51,7 +51,7 @@ namespace pl::ptrn { return { }; } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldMember) }; class PatternBitfieldField : public PatternBitfieldMember { @@ -165,7 +165,7 @@ namespace pl::ptrn { bool m_padding = false; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldField) }; class PatternBitfieldFieldSigned : public PatternBitfieldField { @@ -192,7 +192,7 @@ namespace pl::ptrn { return Pattern::callUserFormatFunc(this->getValue(), true).value_or(result); } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldFieldSigned) }; class PatternBitfieldFieldBoolean : public PatternBitfieldField { @@ -227,7 +227,7 @@ namespace pl::ptrn { return Pattern::callUserFormatFunc(value, true).value_or(fmt::format("{}", value.toBoolean() ? "true" : "false")); } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldFieldBoolean) }; class PatternBitfieldFieldEnum : public PatternBitfieldField { @@ -280,7 +280,7 @@ namespace pl::ptrn { private: std::map m_enumValues; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldFieldEnum) }; class PatternBitfieldArray : public PatternBitfieldMember, @@ -558,12 +558,12 @@ namespace pl::ptrn { u128 m_totalBitSize = 0; bool m_reversed = false; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldArray) }; - class PatternBitfield : public PatternBitfieldMember, - public IInlinable, - public IIterable { +class PatternBitfield : public PatternBitfieldMember, + public IInlinable, + public IIterable { protected: PatternBitfield(core::Evaluator *evaluator, u64 offset, u8 firstBitOffset, u128 totalBitSize, u32 line) : PatternBitfieldMember(evaluator, offset, size_t((totalBitSize + 7) / 8), line), m_firstBitOffset(firstBitOffset), m_totalBitSize(totalBitSize) { } @@ -843,7 +843,7 @@ namespace pl::ptrn { u64 m_totalBitSize = 0; bool m_reversed = false; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfield) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_boolean.hpp b/lib/include/pl/patterns/pattern_boolean.hpp index f7d5b02e..18a30604 100644 --- a/lib/include/pl/patterns/pattern_boolean.hpp +++ b/lib/include/pl/patterns/pattern_boolean.hpp @@ -65,7 +65,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBoolean) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_character.hpp b/lib/include/pl/patterns/pattern_character.hpp index 089c2791..a7561cff 100644 --- a/lib/include/pl/patterns/pattern_character.hpp +++ b/lib/include/pl/patterns/pattern_character.hpp @@ -61,7 +61,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternCharacter) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_enum.hpp b/lib/include/pl/patterns/pattern_enum.hpp index 19e1c7ae..670d1fa7 100644 --- a/lib/include/pl/patterns/pattern_enum.hpp +++ b/lib/include/pl/patterns/pattern_enum.hpp @@ -104,7 +104,7 @@ namespace pl::ptrn { private: std::map m_enumValues; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternEnum) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_error.hpp b/lib/include/pl/patterns/pattern_error.hpp index 63e34f47..128f932c 100644 --- a/lib/include/pl/patterns/pattern_error.hpp +++ b/lib/include/pl/patterns/pattern_error.hpp @@ -43,7 +43,7 @@ namespace pl::ptrn { private: std::string m_errorMessage; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternError) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_float.hpp b/lib/include/pl/patterns/pattern_float.hpp index b7f08d48..c9004c26 100644 --- a/lib/include/pl/patterns/pattern_float.hpp +++ b/lib/include/pl/patterns/pattern_float.hpp @@ -105,7 +105,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternFloat) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_padding.hpp b/lib/include/pl/patterns/pattern_padding.hpp index 4bff8ff2..3789b818 100644 --- a/lib/include/pl/patterns/pattern_padding.hpp +++ b/lib/include/pl/patterns/pattern_padding.hpp @@ -46,7 +46,7 @@ namespace pl::ptrn { return { }; } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternPadding) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index aa8b67fe..7f192430 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -182,7 +182,7 @@ namespace pl::ptrn { i128 m_pointedAtAddress = 0; u64 m_pointerBase = 0; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternPointer) }; } diff --git a/lib/include/pl/patterns/pattern_signed.hpp b/lib/include/pl/patterns/pattern_signed.hpp index 5a1c6f0c..7d682f81 100644 --- a/lib/include/pl/patterns/pattern_signed.hpp +++ b/lib/include/pl/patterns/pattern_signed.hpp @@ -56,7 +56,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternSigned) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index fbbeb118..15eba8ed 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -103,7 +103,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternString) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_struct.hpp b/lib/include/pl/patterns/pattern_struct.hpp index f03089c7..39df599d 100644 --- a/lib/include/pl/patterns/pattern_struct.hpp +++ b/lib/include/pl/patterns/pattern_struct.hpp @@ -233,7 +233,7 @@ namespace pl::ptrn { std::vector> m_members; std::vector m_sortedMembers; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternStruct) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_union.hpp b/lib/include/pl/patterns/pattern_union.hpp index a8bcc253..102caef6 100644 --- a/lib/include/pl/patterns/pattern_union.hpp +++ b/lib/include/pl/patterns/pattern_union.hpp @@ -223,7 +223,7 @@ namespace pl::ptrn { std::vector> m_members; std::vector m_sortedMembers; - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternUnion) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_unsigned.hpp b/lib/include/pl/patterns/pattern_unsigned.hpp index e2d6df68..b86bc561 100644 --- a/lib/include/pl/patterns/pattern_unsigned.hpp +++ b/lib/include/pl/patterns/pattern_unsigned.hpp @@ -53,7 +53,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternUnsigned) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_wide_character.hpp b/lib/include/pl/patterns/pattern_wide_character.hpp index c5c41304..dfa61795 100644 --- a/lib/include/pl/patterns/pattern_wide_character.hpp +++ b/lib/include/pl/patterns/pattern_wide_character.hpp @@ -57,7 +57,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternWideCharacter) }; } diff --git a/lib/include/pl/patterns/pattern_wide_string.hpp b/lib/include/pl/patterns/pattern_wide_string.hpp index 6e4d2e6e..ce8639f7 100644 --- a/lib/include/pl/patterns/pattern_wide_string.hpp +++ b/lib/include/pl/patterns/pattern_wide_string.hpp @@ -107,7 +107,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_SHARED_OBJECT_CREATOR + BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternWideString) }; } From 1fd24010149e560ff3c6236485c685188c30e636 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sat, 7 Jun 2025 05:51:15 +1000 Subject: [PATCH 46/51] It's looking like it may actually buid. We'll soon know --- .../pl/helpers/construct_shared_object.hpp | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/lib/include/pl/helpers/construct_shared_object.hpp b/lib/include/pl/helpers/construct_shared_object.hpp index 85281263..ef5f1aa0 100644 --- a/lib/include/pl/helpers/construct_shared_object.hpp +++ b/lib/include/pl/helpers/construct_shared_object.hpp @@ -36,22 +36,19 @@ instantiation. #include #include -#define BEFRIEND_CONSTRUCT_SHARED_OBJECT(T) friend struct safe_enable_shared_from_this::Allocator; - namespace shared_object_creator { -/* -safe_enable_shared_from_this was found here: - https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const - -Posted by stackoverflow member Carsten. -He adapted old code from stackoverflow member Zsolt Rizsányi, -who in turn says it was invented by Jonathan Wakely (GCC developer). +// safe_enable_shared_from_this was found here: +// https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const +// +// Posted by stackoverflow member Carsten. +// He adapted old code from stackoverflow member Zsolt Rizsányi, +// who in turn says it was invented by Jonathan Wakely (GCC developer). +// +// The only modification I have made is to enable copy-construction. +// +// C++23 -The only modification I have made is to enable copy-construction. - -C++23 -*/ class safe_enable_shared_from_this : public std::enable_shared_from_this { protected: safe_enable_shared_from_this() noexcept = default; @@ -74,10 +71,11 @@ class safe_enable_shared_from_this : public std::enable_shared_from_this - static inline auto create(TArgs&&... args) -> ::std::shared_ptr { + static inline auto create(TArgs&&... args) -> std::shared_ptr { return std::allocate_shared(Allocator{}, std::forward(args)...); } +public: template auto inline shared_from_this(this TSelf&& self) noexcept { @@ -98,7 +96,7 @@ class safe_enable_shared_from_this : public std::enable_shared_from_this requires requires(T t, Args&&... args) { t.post_construct(std::forward(args)...); -} + } std::shared_ptr construct_shared_object(Args&&... args) { auto p = safe_enable_shared_from_this::create(std::forward(args)...); p->post_construct(std::forward(args)...); @@ -111,3 +109,8 @@ std::shared_ptr construct_shared_object(Args&&... args) { } } // namespace shared_object_creator + +#define BEFRIEND_CONSTRUCT_SHARED_OBJECT(T) \ + friend struct shared_object_creator::safe_enable_shared_from_this::Allocator; \ + template \ + friend std::shared_ptr shared_object_creator::construct_shared_object(Args&&... args); From e380aeb930859258740b69ab32ad05b6a31934cf Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sat, 7 Jun 2025 06:51:18 +1000 Subject: [PATCH 47/51] Last claims premature This is actualy looking promising --- .../pl/helpers/construct_shared_object.hpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/include/pl/helpers/construct_shared_object.hpp b/lib/include/pl/helpers/construct_shared_object.hpp index ef5f1aa0..6dbe2430 100644 --- a/lib/include/pl/helpers/construct_shared_object.hpp +++ b/lib/include/pl/helpers/construct_shared_object.hpp @@ -50,6 +50,15 @@ namespace shared_object_creator { // C++23 class safe_enable_shared_from_this : public std::enable_shared_from_this { + template + requires requires(T t, Args&&... args) { + t.post_construct(std::forward(args)...); + } + friend std::shared_ptr construct_shared_object(Args&&... args); + + template + friend std::shared_ptr construct_shared_object(Args&&... args); + protected: safe_enable_shared_from_this() noexcept = default; safe_enable_shared_from_this(safe_enable_shared_from_this&&) noexcept = default; @@ -69,7 +78,7 @@ class safe_enable_shared_from_this : public std::enable_shared_from_this(args)...); } }; -public: +//public: template static inline auto create(TArgs&&... args) -> std::shared_ptr { return std::allocate_shared(Allocator{}, std::forward(args)...); @@ -110,7 +119,5 @@ std::shared_ptr construct_shared_object(Args&&... args) { } // namespace shared_object_creator -#define BEFRIEND_CONSTRUCT_SHARED_OBJECT(T) \ - friend struct shared_object_creator::safe_enable_shared_from_this::Allocator; \ - template \ - friend std::shared_ptr shared_object_creator::construct_shared_object(Args&&... args); +#define BEFRIEND_CONSTRUCT_SHARED_OBJECT(T) \ + friend struct shared_object_creator::safe_enable_shared_from_this::Allocator; From aaae49855a9436b260baea44597c7595784b03d3 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sat, 7 Jun 2025 07:23:47 +1000 Subject: [PATCH 48/51] Move stuff around --- .../pl/helpers/construct_shared_object.hpp | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/lib/include/pl/helpers/construct_shared_object.hpp b/lib/include/pl/helpers/construct_shared_object.hpp index 6dbe2430..45905194 100644 --- a/lib/include/pl/helpers/construct_shared_object.hpp +++ b/lib/include/pl/helpers/construct_shared_object.hpp @@ -50,6 +50,7 @@ namespace shared_object_creator { // C++23 class safe_enable_shared_from_this : public std::enable_shared_from_this { + // Our friends. Somewhat verbose... template requires requires(T t, Args&&... args) { t.post_construct(std::forward(args)...); @@ -58,7 +59,24 @@ class safe_enable_shared_from_this : public std::enable_shared_from_this friend std::shared_ptr construct_shared_object(Args&&... args); - + +public: + virtual ~safe_enable_shared_from_this() noexcept = default; + + template + auto inline shared_from_this(this TSelf&& self) noexcept + { + return std::static_pointer_cast>( + std::forward(self).std::template enable_shared_from_this::shared_from_this()); + } + + template + auto inline weak_from_this(this TSelf&& self) noexcept -> ::std::weak_ptr> + { + return std::static_pointer_cast>( + std::forward(self).std::template enable_shared_from_this::weak_from_this().lock()); + } + protected: safe_enable_shared_from_this() noexcept = default; safe_enable_shared_from_this(safe_enable_shared_from_this&&) noexcept = default; @@ -66,10 +84,6 @@ class safe_enable_shared_from_this : public std::enable_shared_from_this struct Allocator : public std::allocator { @@ -78,26 +92,11 @@ class safe_enable_shared_from_this : public std::enable_shared_from_this(args)...); } }; -//public: +private: template static inline auto create(TArgs&&... args) -> std::shared_ptr { return std::allocate_shared(Allocator{}, std::forward(args)...); } - -public: - template - auto inline shared_from_this(this TSelf&& self) noexcept - { - return std::static_pointer_cast>( - std::forward(self).std::template enable_shared_from_this::shared_from_this()); - } - - template - auto inline weak_from_this(this TSelf&& self) noexcept -> ::std::weak_ptr> - { - return std::static_pointer_cast>( - std::forward(self).std::template enable_shared_from_this::weak_from_this().lock()); - } }; // The actual creation functions. From 9694a1ca4981c661e9a81656823f2b5622da8694 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sun, 8 Jun 2025 00:25:03 +1000 Subject: [PATCH 49/51] New allocation method. Other small changes --- .../pl/helpers/construct_shared_object.hpp | 40 +++++++++++-------- lib/include/pl/patterns/pattern_bitfield.hpp | 7 +--- lib/include/pl/patterns/pattern_character.hpp | 6 +-- lib/include/pl/patterns/pattern_enum.hpp | 2 +- lib/include/pl/patterns/pattern_pointer.hpp | 2 +- .../pl/patterns/pattern_wide_character.hpp | 2 +- 6 files changed, 31 insertions(+), 28 deletions(-) diff --git a/lib/include/pl/helpers/construct_shared_object.hpp b/lib/include/pl/helpers/construct_shared_object.hpp index 45905194..2f5faa8c 100644 --- a/lib/include/pl/helpers/construct_shared_object.hpp +++ b/lib/include/pl/helpers/construct_shared_object.hpp @@ -5,7 +5,6 @@ #pragma once /* - The motivation for this code is issues with std::shared_ptr and std::enable_shared_from_this. @@ -26,16 +25,27 @@ construction on demand. Another issue addressed is with std::make_shared. This function requires that the constructor be public. If we're making factory methods for creation, we may -want to make the constructors non-public to stop misuse. In this case the code -uses std::shared_ptr's constructor and a new call. The function that calls new -can be made a friend of the class to grant it access. We lose the advantages of -using std::make_shared but gain protection against incorrect object -instantiation. +want to make the constructors non-public to stop misuse. The solution to this +problem I can't take credit for. + +The code for safe_enable_shared_from_this is based on code found here: + https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const +Posted by stackoverflow member Carsten. +He adapted old code from stackoverflow member Zsolt Rizsányi, +who in turn says it was invented by Jonathan Wakely (GCC developer). + +I have made minor modifications to suit and added comments. + +Requires C++23 */ #include #include +// Used to enable construct_shared_object to access non-public constructors. +#define BEFRIEND_CONSTRUCT_SHARED_OBJECT(T) \ + friend struct shared_object_creator::safe_enable_shared_from_this::Allocator; + namespace shared_object_creator { // safe_enable_shared_from_this was found here: @@ -44,13 +54,8 @@ namespace shared_object_creator { // Posted by stackoverflow member Carsten. // He adapted old code from stackoverflow member Zsolt Rizsányi, // who in turn says it was invented by Jonathan Wakely (GCC developer). -// -// The only modification I have made is to enable copy-construction. -// -// C++23 - class safe_enable_shared_from_this : public std::enable_shared_from_this { - // Our friends. Somewhat verbose... + // Our friends. They're not from around here and have long hard to pronounce names. template requires requires(T t, Args&&... args) { t.post_construct(std::forward(args)...); @@ -63,6 +68,10 @@ class safe_enable_shared_from_this : public std::enable_shared_from_this with T being + // the derived type. template auto inline shared_from_this(this TSelf&& self) noexcept { @@ -93,6 +102,8 @@ class safe_enable_shared_from_this : public std::enable_shared_from_this static inline auto create(TArgs&&... args) -> std::shared_ptr { return std::allocate_shared(Allocator{}, std::forward(args)...); @@ -115,8 +126,5 @@ template std::shared_ptr construct_shared_object(Args&&... args) { return safe_enable_shared_from_this::create(std::forward(args)...); } - + } // namespace shared_object_creator - -#define BEFRIEND_CONSTRUCT_SHARED_OBJECT(T) \ - friend struct shared_object_creator::safe_enable_shared_from_this::Allocator; diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index 16063721..813a11d7 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -58,7 +58,7 @@ namespace pl::ptrn { protected: PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) : PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) { - (void)parentBitfield; + this->setParent(parentBitfield); } PatternBitfieldField(const PatternBitfieldField &other) : PatternBitfieldMember(other) { @@ -68,11 +68,6 @@ namespace pl::ptrn { } public: - void post_construct(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr parentBitfield = nullptr) { - (void)evaluator; (void)offset; (void)bitOffset; (void)bitSize; (void)line; - this->setParent(parentBitfield); - } - [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_character.hpp b/lib/include/pl/patterns/pattern_character.hpp index a7561cff..d3414c6c 100644 --- a/lib/include/pl/patterns/pattern_character.hpp +++ b/lib/include/pl/patterns/pattern_character.hpp @@ -8,12 +8,12 @@ namespace pl::ptrn { protected: PatternCharacter(core::Evaluator *evaluator, u64 offset, u32 line) : Pattern(evaluator, offset, 1, line) { } - + + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } - - public: + [[nodiscard]] core::Token::Literal getValue() const override { char character = '\x00'; this->getEvaluator()->readData(this->getOffset(), &character, 1, this->getSection()); diff --git a/lib/include/pl/patterns/pattern_enum.hpp b/lib/include/pl/patterns/pattern_enum.hpp index 670d1fa7..88da4dba 100644 --- a/lib/include/pl/patterns/pattern_enum.hpp +++ b/lib/include/pl/patterns/pattern_enum.hpp @@ -17,11 +17,11 @@ namespace pl::ptrn { PatternEnum(core::Evaluator *evaluator, u64 offset, size_t size, u32 line) : Pattern(evaluator, offset, size, line) { } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } - public: [[nodiscard]] core::Token::Literal getValue() const override { u128 value = 0; this->getEvaluator()->readData(this->getOffset(), &value, this->getSize(), this->getSection()); diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index 7f192430..a91d589d 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -12,7 +12,6 @@ namespace pl::ptrn { : Pattern(evaluator, offset, size, line), m_pointedAt(nullptr), m_pointerType(nullptr) { } - public: PatternPointer(const PatternPointer &other) : Pattern(other) { this->m_pointedAt = std::shared_ptr(other.m_pointedAt->clone()); @@ -21,6 +20,7 @@ namespace pl::ptrn { } } + public: [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } diff --git a/lib/include/pl/patterns/pattern_wide_character.hpp b/lib/include/pl/patterns/pattern_wide_character.hpp index dfa61795..a02014ba 100644 --- a/lib/include/pl/patterns/pattern_wide_character.hpp +++ b/lib/include/pl/patterns/pattern_wide_character.hpp @@ -12,7 +12,7 @@ namespace pl::ptrn { : Pattern(evaluator, offset, 2, line) { } public: - [[nodiscard]] std::shared_ptr clone() const override { + [[nodiscard]] std::shared_ptr clone() const override { return construct_shared_object(*this); } From 13ec0b80196edd689e9294f2f28c8ddb23ad3178 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 9 Jun 2025 00:32:08 +1000 Subject: [PATCH 50/51] Renamed some stuff --- ...ed_object.hpp => create_shared_object.hpp} | 43 ++++++++++--------- lib/include/pl/patterns/pattern.hpp | 8 ++-- .../pl/patterns/pattern_array_dynamic.hpp | 4 +- .../pl/patterns/pattern_array_static.hpp | 4 +- lib/include/pl/patterns/pattern_bitfield.hpp | 26 +++++------ lib/include/pl/patterns/pattern_boolean.hpp | 4 +- lib/include/pl/patterns/pattern_character.hpp | 4 +- lib/include/pl/patterns/pattern_enum.hpp | 4 +- lib/include/pl/patterns/pattern_error.hpp | 4 +- lib/include/pl/patterns/pattern_float.hpp | 4 +- lib/include/pl/patterns/pattern_padding.hpp | 4 +- lib/include/pl/patterns/pattern_pointer.hpp | 4 +- lib/include/pl/patterns/pattern_signed.hpp | 4 +- lib/include/pl/patterns/pattern_string.hpp | 6 +-- lib/include/pl/patterns/pattern_struct.hpp | 4 +- lib/include/pl/patterns/pattern_union.hpp | 4 +- lib/include/pl/patterns/pattern_unsigned.hpp | 4 +- .../pl/patterns/pattern_wide_character.hpp | 4 +- .../pl/patterns/pattern_wide_string.hpp | 6 +-- .../core/ast/ast_node_array_variable_decl.cpp | 10 ++--- lib/source/pl/core/ast/ast_node_bitfield.cpp | 2 +- .../ast_node_bitfield_array_variable_decl.cpp | 2 +- .../pl/core/ast/ast_node_bitfield_field.cpp | 8 ++-- .../pl/core/ast/ast_node_builtin_type.cpp | 16 +++---- lib/source/pl/core/ast/ast_node_enum.cpp | 2 +- .../pl/core/ast/ast_node_imported_type.cpp | 2 +- .../ast/ast_node_pointer_variable_decl.cpp | 2 +- lib/source/pl/core/ast/ast_node_rvalue.cpp | 2 +- lib/source/pl/core/ast/ast_node_struct.cpp | 2 +- lib/source/pl/core/ast/ast_node_union.cpp | 2 +- lib/source/pl/core/evaluator.cpp | 30 ++++++------- tests/include/test_patterns/test_pattern.hpp | 2 +- 32 files changed, 114 insertions(+), 113 deletions(-) rename lib/include/pl/helpers/{construct_shared_object.hpp => create_shared_object.hpp} (70%) diff --git a/lib/include/pl/helpers/construct_shared_object.hpp b/lib/include/pl/helpers/create_shared_object.hpp similarity index 70% rename from lib/include/pl/helpers/construct_shared_object.hpp rename to lib/include/pl/helpers/create_shared_object.hpp index 2f5faa8c..bf06c534 100644 --- a/lib/include/pl/helpers/construct_shared_object.hpp +++ b/lib/include/pl/helpers/create_shared_object.hpp @@ -1,4 +1,4 @@ -// construct_shared_object.hpp +// create_shared_object.hpp // // Written by Stephen Hewitt in 2025 // GitHub repo: https://github.com/shewitt-au/std-enable_shared_from_this-and-constructors @@ -28,7 +28,8 @@ the constructor be public. If we're making factory methods for creation, we may want to make the constructors non-public to stop misuse. The solution to this problem I can't take credit for. -The code for safe_enable_shared_from_this is based on code found here: +The code for enable_shared_from_nonpublic_constructor is based on code found here +(called safe_enable_shared_from_this): https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const Posted by stackoverflow member Carsten. He adapted old code from stackoverflow member Zsolt Rizsányi, @@ -42,31 +43,31 @@ Requires C++23 #include #include -// Used to enable construct_shared_object to access non-public constructors. -#define BEFRIEND_CONSTRUCT_SHARED_OBJECT(T) \ - friend struct shared_object_creator::safe_enable_shared_from_this::Allocator; +// Used to enable create_shared_object to access non-public constructors. +#define BEFRIEND_create_shared_object(T) \ + friend struct shared_object_creator::enable_shared_from_nonpublic_constructor::Allocator; namespace shared_object_creator { -// safe_enable_shared_from_this was found here: +// enable_shared_from_nonpublic_constructor was found here: // https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const // // Posted by stackoverflow member Carsten. // He adapted old code from stackoverflow member Zsolt Rizsányi, // who in turn says it was invented by Jonathan Wakely (GCC developer). -class safe_enable_shared_from_this : public std::enable_shared_from_this { +class enable_shared_from_nonpublic_constructor : public std::enable_shared_from_this { // Our friends. They're not from around here and have long hard to pronounce names. template requires requires(T t, Args&&... args) { t.post_construct(std::forward(args)...); } - friend std::shared_ptr construct_shared_object(Args&&... args); + friend std::shared_ptr create_shared_object(Args&&... args); template - friend std::shared_ptr construct_shared_object(Args&&... args); + friend std::shared_ptr create_shared_object(Args&&... args); public: - virtual ~safe_enable_shared_from_this() noexcept = default; + virtual ~enable_shared_from_nonpublic_constructor() noexcept = default; // The next two functions use C++23's "explicit object parameter" // syntax to make shared_from_this and weak_from_this, when called @@ -76,22 +77,22 @@ class safe_enable_shared_from_this : public std::enable_shared_from_this>( - std::forward(self).std::template enable_shared_from_this::shared_from_this()); + std::forward(self).std::template enable_shared_from_this::shared_from_this()); } template auto inline weak_from_this(this TSelf&& self) noexcept -> ::std::weak_ptr> { return std::static_pointer_cast>( - std::forward(self).std::template enable_shared_from_this::weak_from_this().lock()); + std::forward(self).std::template enable_shared_from_this::weak_from_this().lock()); } protected: - safe_enable_shared_from_this() noexcept = default; - safe_enable_shared_from_this(safe_enable_shared_from_this&&) noexcept = default; - safe_enable_shared_from_this(const safe_enable_shared_from_this&) noexcept = default; - safe_enable_shared_from_this& operator=(safe_enable_shared_from_this&&) noexcept = default; - safe_enable_shared_from_this& operator=(const safe_enable_shared_from_this&) noexcept = delete; + enable_shared_from_nonpublic_constructor() noexcept = default; + enable_shared_from_nonpublic_constructor(enable_shared_from_nonpublic_constructor&&) noexcept = default; + enable_shared_from_nonpublic_constructor(const enable_shared_from_nonpublic_constructor&) noexcept = default; + enable_shared_from_nonpublic_constructor& operator=(enable_shared_from_nonpublic_constructor&&) noexcept = default; + enable_shared_from_nonpublic_constructor& operator=(const enable_shared_from_nonpublic_constructor&) noexcept = delete; template struct Allocator : public std::allocator @@ -116,15 +117,15 @@ template requires requires(T t, Args&&... args) { t.post_construct(std::forward(args)...); } -std::shared_ptr construct_shared_object(Args&&... args) { - auto p = safe_enable_shared_from_this::create(std::forward(args)...); +std::shared_ptr create_shared_object(Args&&... args) { + auto p = enable_shared_from_nonpublic_constructor::create(std::forward(args)...); p->post_construct(std::forward(args)...); return p; } template -std::shared_ptr construct_shared_object(Args&&... args) { - return safe_enable_shared_from_this::create(std::forward(args)...); +std::shared_ptr create_shared_object(Args&&... args) { + return enable_shared_from_nonpublic_constructor::create(std::forward(args)...); } } // namespace shared_object_creator diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index 78673c0d..31b4291b 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include @@ -64,7 +64,7 @@ namespace pl::ptrn { friend class core::Evaluator; }; - class Pattern : public safe_enable_shared_from_this { + class Pattern : public enable_shared_from_nonpublic_constructor { public: constexpr static u64 MainSectionId = 0x0000'0000'0000'0000; constexpr static u64 HeapSectionId = 0xFFFF'FFFF'FFFF'FFFF; @@ -86,7 +86,7 @@ namespace pl::ptrn { } - Pattern(const Pattern &other) : safe_enable_shared_from_this(other) { + Pattern(const Pattern &other) : enable_shared_from_nonpublic_constructor(other) { this->m_evaluator = other.m_evaluator; this->m_offset = other.m_offset; this->m_endian = other.m_endian; @@ -648,7 +648,7 @@ namespace pl::ptrn { bool m_manualColor = false; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(Pattern) + BEFRIEND_create_shared_object(Pattern) }; } diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index 4f99cffe..22ddfd4a 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -23,7 +23,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } void setColor(u32 color) override { @@ -241,7 +241,7 @@ namespace pl::ptrn { private: std::vector> m_entries; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternArrayDynamic) + BEFRIEND_create_shared_object(PatternArrayDynamic) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_array_static.hpp b/lib/include/pl/patterns/pattern_array_static.hpp index 0846a9bf..8d605d9f 100644 --- a/lib/include/pl/patterns/pattern_array_static.hpp +++ b/lib/include/pl/patterns/pattern_array_static.hpp @@ -19,7 +19,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { @@ -256,7 +256,7 @@ namespace pl::ptrn { mutable std::vector> m_highlightTemplates; size_t m_entryCount = 0; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternArrayStatic) + BEFRIEND_create_shared_object(PatternArrayStatic) }; } diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index 813a11d7..0836ab21 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -51,7 +51,7 @@ namespace pl::ptrn { return { }; } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldMember) + BEFRIEND_create_shared_object(PatternBitfieldMember) }; class PatternBitfieldField : public PatternBitfieldMember { @@ -69,7 +69,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] u128 readValue() const { @@ -160,7 +160,7 @@ namespace pl::ptrn { bool m_padding = false; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldField) + BEFRIEND_create_shared_object(PatternBitfieldField) }; class PatternBitfieldFieldSigned : public PatternBitfieldField { @@ -169,7 +169,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -187,7 +187,7 @@ namespace pl::ptrn { return Pattern::callUserFormatFunc(this->getValue(), true).value_or(result); } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldFieldSigned) + BEFRIEND_create_shared_object(PatternBitfieldFieldSigned) }; class PatternBitfieldFieldBoolean : public PatternBitfieldField { @@ -196,7 +196,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -222,7 +222,7 @@ namespace pl::ptrn { return Pattern::callUserFormatFunc(value, true).value_or(fmt::format("{}", value.toBoolean() ? "true" : "false")); } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldFieldBoolean) + BEFRIEND_create_shared_object(PatternBitfieldFieldBoolean) }; class PatternBitfieldFieldEnum : public PatternBitfieldField { @@ -258,7 +258,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } std::string formatDisplayValue() override { @@ -275,7 +275,7 @@ namespace pl::ptrn { private: std::map m_enumValues; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldFieldEnum) + BEFRIEND_create_shared_object(PatternBitfieldFieldEnum) }; class PatternBitfieldArray : public PatternBitfieldMember, @@ -298,7 +298,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] u8 getBitOffset() const override { @@ -553,7 +553,7 @@ namespace pl::ptrn { u128 m_totalBitSize = 0; bool m_reversed = false; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfieldArray) + BEFRIEND_create_shared_object(PatternBitfieldArray) }; class PatternBitfield : public PatternBitfieldMember, @@ -573,7 +573,7 @@ class PatternBitfield : public PatternBitfieldMember, public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] u8 getBitOffset() const override { @@ -838,7 +838,7 @@ class PatternBitfield : public PatternBitfieldMember, u64 m_totalBitSize = 0; bool m_reversed = false; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBitfield) + BEFRIEND_create_shared_object(PatternBitfield) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_boolean.hpp b/lib/include/pl/patterns/pattern_boolean.hpp index 18a30604..4b0ad9f4 100644 --- a/lib/include/pl/patterns/pattern_boolean.hpp +++ b/lib/include/pl/patterns/pattern_boolean.hpp @@ -11,7 +11,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -65,7 +65,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternBoolean) + BEFRIEND_create_shared_object(PatternBoolean) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_character.hpp b/lib/include/pl/patterns/pattern_character.hpp index d3414c6c..3a315da6 100644 --- a/lib/include/pl/patterns/pattern_character.hpp +++ b/lib/include/pl/patterns/pattern_character.hpp @@ -11,7 +11,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -61,7 +61,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternCharacter) + BEFRIEND_create_shared_object(PatternCharacter) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_enum.hpp b/lib/include/pl/patterns/pattern_enum.hpp index 88da4dba..97f042db 100644 --- a/lib/include/pl/patterns/pattern_enum.hpp +++ b/lib/include/pl/patterns/pattern_enum.hpp @@ -19,7 +19,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -104,7 +104,7 @@ namespace pl::ptrn { private: std::map m_enumValues; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternEnum) + BEFRIEND_create_shared_object(PatternEnum) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_error.hpp b/lib/include/pl/patterns/pattern_error.hpp index 128f932c..c6faae74 100644 --- a/lib/include/pl/patterns/pattern_error.hpp +++ b/lib/include/pl/patterns/pattern_error.hpp @@ -11,7 +11,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] std::string getFormattedName() const override { @@ -43,7 +43,7 @@ namespace pl::ptrn { private: std::string m_errorMessage; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternError) + BEFRIEND_create_shared_object(PatternError) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_float.hpp b/lib/include/pl/patterns/pattern_float.hpp index c9004c26..468b3b54 100644 --- a/lib/include/pl/patterns/pattern_float.hpp +++ b/lib/include/pl/patterns/pattern_float.hpp @@ -11,7 +11,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -105,7 +105,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternFloat) + BEFRIEND_create_shared_object(PatternFloat) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_padding.hpp b/lib/include/pl/patterns/pattern_padding.hpp index 3789b818..64a38745 100644 --- a/lib/include/pl/patterns/pattern_padding.hpp +++ b/lib/include/pl/patterns/pattern_padding.hpp @@ -10,7 +10,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] std::string getFormattedName() const override { @@ -46,7 +46,7 @@ namespace pl::ptrn { return { }; } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternPadding) + BEFRIEND_create_shared_object(PatternPadding) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index a91d589d..0364bd4c 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -22,7 +22,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -182,7 +182,7 @@ namespace pl::ptrn { i128 m_pointedAtAddress = 0; u64 m_pointerBase = 0; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternPointer) + BEFRIEND_create_shared_object(PatternPointer) }; } diff --git a/lib/include/pl/patterns/pattern_signed.hpp b/lib/include/pl/patterns/pattern_signed.hpp index 7d682f81..b5d9f0fa 100644 --- a/lib/include/pl/patterns/pattern_signed.hpp +++ b/lib/include/pl/patterns/pattern_signed.hpp @@ -11,7 +11,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -56,7 +56,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternSigned) + BEFRIEND_create_shared_object(PatternSigned) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index 15eba8ed..a37d2978 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -14,7 +14,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -77,7 +77,7 @@ namespace pl::ptrn { } std::shared_ptr getEntry(size_t index) const override { - auto result = construct_shared_object(this->getEvaluator(), this->getOffset() + index, getLine()); + auto result = create_shared_object(this->getEvaluator(), this->getOffset() + index, getLine()); result->setSection(this->getSection()); return result; @@ -103,7 +103,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternString) + BEFRIEND_create_shared_object(PatternString) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_struct.hpp b/lib/include/pl/patterns/pattern_struct.hpp index 39df599d..a9f76273 100644 --- a/lib/include/pl/patterns/pattern_struct.hpp +++ b/lib/include/pl/patterns/pattern_struct.hpp @@ -25,7 +25,7 @@ namespace pl::ptrn { } [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { @@ -233,7 +233,7 @@ namespace pl::ptrn { std::vector> m_members; std::vector m_sortedMembers; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternStruct) + BEFRIEND_create_shared_object(PatternStruct) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_union.hpp b/lib/include/pl/patterns/pattern_union.hpp index 102caef6..e8032601 100644 --- a/lib/include/pl/patterns/pattern_union.hpp +++ b/lib/include/pl/patterns/pattern_union.hpp @@ -22,7 +22,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] std::shared_ptr getEntry(size_t index) const override { @@ -223,7 +223,7 @@ namespace pl::ptrn { std::vector> m_members; std::vector m_sortedMembers; - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternUnion) + BEFRIEND_create_shared_object(PatternUnion) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_unsigned.hpp b/lib/include/pl/patterns/pattern_unsigned.hpp index b86bc561..85ad8b42 100644 --- a/lib/include/pl/patterns/pattern_unsigned.hpp +++ b/lib/include/pl/patterns/pattern_unsigned.hpp @@ -11,7 +11,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -53,7 +53,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternUnsigned) + BEFRIEND_create_shared_object(PatternUnsigned) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_wide_character.hpp b/lib/include/pl/patterns/pattern_wide_character.hpp index a02014ba..04322d0c 100644 --- a/lib/include/pl/patterns/pattern_wide_character.hpp +++ b/lib/include/pl/patterns/pattern_wide_character.hpp @@ -13,7 +13,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -57,7 +57,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternWideCharacter) + BEFRIEND_create_shared_object(PatternWideCharacter) }; } diff --git a/lib/include/pl/patterns/pattern_wide_string.hpp b/lib/include/pl/patterns/pattern_wide_string.hpp index ce8639f7..60305982 100644 --- a/lib/include/pl/patterns/pattern_wide_string.hpp +++ b/lib/include/pl/patterns/pattern_wide_string.hpp @@ -14,7 +14,7 @@ namespace pl::ptrn { public: [[nodiscard]] std::shared_ptr clone() const override { - return construct_shared_object(*this); + return create_shared_object(*this); } [[nodiscard]] core::Token::Literal getValue() const override { @@ -81,7 +81,7 @@ namespace pl::ptrn { } std::shared_ptr getEntry(size_t index) const override { - auto result = construct_shared_object(this->getEvaluator(), this->getOffset() + index * sizeof(char16_t), getLine()); + auto result = create_shared_object(this->getEvaluator(), this->getOffset() + index * sizeof(char16_t), getLine()); result->setSection(this->getSection()); return result; @@ -107,7 +107,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_CONSTRUCT_SHARED_OBJECT(PatternWideString) + BEFRIEND_create_shared_object(PatternWideString) }; } diff --git a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp index 70c4db1f..bcb5ab5a 100644 --- a/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_array_variable_decl.cpp @@ -218,13 +218,13 @@ namespace pl::core::ast { } if (std::dynamic_pointer_cast(templatePattern)) { - outputPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); + outputPattern = create_shared_object(evaluator, startOffset, 0, getLocation().line); } else if (std::dynamic_pointer_cast(templatePattern)) { - outputPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); + outputPattern = create_shared_object(evaluator, startOffset, 0, getLocation().line); } else if (std::dynamic_pointer_cast(templatePattern)) { - outputPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); + outputPattern = create_shared_object(evaluator, startOffset, 0, getLocation().line); } else { - auto arrayPattern = construct_shared_object(evaluator, startOffset, 0, getLocation().line); + auto arrayPattern = create_shared_object(evaluator, startOffset, 0, getLocation().line); arrayPattern->setEntries(templatePattern->clone(), size_t(entryCount)); arrayPattern->setSection(templatePattern->getSection()); outputPattern = std::move(arrayPattern); @@ -256,7 +256,7 @@ namespace pl::core::ast { }; evaluator->alignToByte(); - auto arrayPattern = construct_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); + auto arrayPattern = create_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); arrayPattern->setVariableName(this->m_name); arrayPattern->setSection(evaluator->getSectionId()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield.cpp b/lib/source/pl/core/ast/ast_node_bitfield.cpp index 51fe7315..47f13558 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield.cpp @@ -26,7 +26,7 @@ namespace pl::core::ast { [[maybe_unused]] auto context = evaluator->updateRuntime(this); auto position = evaluator->getBitwiseReadOffset(); - auto bitfieldPattern = construct_shared_object(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); + auto bitfieldPattern = create_shared_object(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); bitfieldPattern->setSection(evaluator->getSectionId()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp index dd784dcf..c31b68c3 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp @@ -53,7 +53,7 @@ namespace pl::core::ast { }; auto position = evaluator->getBitwiseReadOffset(); - auto arrayPattern = construct_shared_object(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); + auto arrayPattern = create_shared_object(evaluator, position.byteOffset, position.bitOffset, 0, getLocation().line); arrayPattern->setVariableName(this->m_name); arrayPattern->setSection(evaluator->getSectionId()); arrayPattern->setReversed(evaluator->isReadOrderReversed()); diff --git a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp index 85bd4f86..0719d277 100644 --- a/lib/source/pl/core/ast/ast_node_bitfield_field.cpp +++ b/lib/source/pl/core/ast/ast_node_bitfield_field.cpp @@ -25,7 +25,7 @@ namespace pl::core::ast { [[nodiscard]] bool ASTNodeBitfieldField::isPadding() const { return this->getName() == "$padding$"; } [[nodiscard]] std::shared_ptr ASTNodeBitfieldField::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { - return construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + return create_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } void ASTNodeBitfieldField::createPatterns(Evaluator *evaluator, std::vector> &resultPatterns) const { @@ -57,7 +57,7 @@ namespace pl::core::ast { [[nodiscard]] std::shared_ptr ASTNodeBitfieldFieldSigned::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const { - return construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + return create_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } @@ -79,12 +79,12 @@ namespace pl::core::ast { evaluator->setBitwiseReadOffset(originalPosition); if (auto *patternEnum = dynamic_cast(pattern.get()); patternEnum != nullptr) { - auto bitfieldEnum = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + auto bitfieldEnum = create_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); bitfieldEnum->setTypeName(patternEnum->getTypeName()); bitfieldEnum->setEnumValues(patternEnum->getEnumValues()); result = std::move(bitfieldEnum); } else if (dynamic_cast(pattern.get()) != nullptr) { - result = construct_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); + result = create_shared_object(evaluator, byteOffset, bitOffset, bitSize, getLocation().line); } else { err::E0004.throwError("Bit size specifiers may only be used with unsigned, signed, bool or enum types.", {}, this->getLocation()); } diff --git a/lib/source/pl/core/ast/ast_node_builtin_type.cpp b/lib/source/pl/core/ast/ast_node_builtin_type.cpp index ac6d5e83..45dc80c6 100644 --- a/lib/source/pl/core/ast/ast_node_builtin_type.cpp +++ b/lib/source/pl/core/ast/ast_node_builtin_type.cpp @@ -25,21 +25,21 @@ namespace pl::core::ast { std::shared_ptr pattern; if (Token::isUnsigned(this->m_type)) - pattern = construct_shared_object(evaluator, offset, size, getLocation().line); + pattern = create_shared_object(evaluator, offset, size, getLocation().line); else if (Token::isSigned(this->m_type)) - pattern = construct_shared_object(evaluator, offset, size, getLocation().line); + pattern = create_shared_object(evaluator, offset, size, getLocation().line); else if (Token::isFloatingPoint(this->m_type)) - pattern = construct_shared_object(evaluator, offset, size, getLocation().line); + pattern = create_shared_object(evaluator, offset, size, getLocation().line); else if (this->m_type == Token::ValueType::Boolean) - pattern = construct_shared_object(evaluator, offset, getLocation().line); + pattern = create_shared_object(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character) - pattern = construct_shared_object(evaluator, offset, getLocation().line); + pattern = create_shared_object(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Character16) - pattern = construct_shared_object(evaluator, offset, getLocation().line); + pattern = create_shared_object(evaluator, offset, getLocation().line); else if (this->m_type == Token::ValueType::Padding) - pattern = construct_shared_object(evaluator, offset, 1, getLocation().line); + pattern = create_shared_object(evaluator, offset, 1, getLocation().line); else if (this->m_type == Token::ValueType::String) - pattern = construct_shared_object(evaluator, offset, 0, getLocation().line); + pattern = create_shared_object(evaluator, offset, 0, getLocation().line); else if (this->m_type == Token::ValueType::CustomType) { std::vector params; diff --git a/lib/source/pl/core/ast/ast_node_enum.cpp b/lib/source/pl/core/ast/ast_node_enum.cpp index 0f64b7af..f97a3d0a 100644 --- a/lib/source/pl/core/ast/ast_node_enum.cpp +++ b/lib/source/pl/core/ast/ast_node_enum.cpp @@ -73,7 +73,7 @@ namespace pl::core::ast { err::E0005.throwError("'auto' can only be used with parameters.", { }, this->getLocation()); auto &underlying = underlyingTypePatterns.front(); - auto pattern = construct_shared_object(evaluator, underlying->getOffset(), 0, getLocation().line); + auto pattern = create_shared_object(evaluator, underlying->getOffset(), 0, getLocation().line); pattern->setSection(evaluator->getSectionId()); diff --git a/lib/source/pl/core/ast/ast_node_imported_type.cpp b/lib/source/pl/core/ast/ast_node_imported_type.cpp index f5f34d5f..8884d149 100644 --- a/lib/source/pl/core/ast/ast_node_imported_type.cpp +++ b/lib/source/pl/core/ast/ast_node_imported_type.cpp @@ -33,7 +33,7 @@ namespace pl::core::ast { result = std::move(pattern); } else { - auto structPattern = construct_shared_object(evaluator, 0x00, 0, getLocation().line); + auto structPattern = create_shared_object(evaluator, 0x00, 0, getLocation().line); u64 minPos = std::numeric_limits::max(); u64 maxPos = std::numeric_limits::min(); diff --git a/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp b/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp index 2d7ce80c..b7d535a7 100644 --- a/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp +++ b/lib/source/pl/core/ast/ast_node_pointer_variable_decl.cpp @@ -67,7 +67,7 @@ namespace pl::core::ast { auto &sizePattern = sizePatterns.front(); sizePattern->setSection(evaluator->getSectionId()); - auto pattern = construct_shared_object(evaluator, pointerStartOffset, sizePattern->getSize(), getLocation().line); + auto pattern = create_shared_object(evaluator, pointerStartOffset, sizePattern->getSize(), getLocation().line); pattern->setVariableName(this->m_name); pattern->setPointerTypePattern(std::move(sizePattern)); diff --git a/lib/source/pl/core/ast/ast_node_rvalue.cpp b/lib/source/pl/core/ast/ast_node_rvalue.cpp index 8503381d..cb9910ba 100644 --- a/lib/source/pl/core/ast/ast_node_rvalue.cpp +++ b/lib/source/pl/core/ast/ast_node_rvalue.cpp @@ -56,7 +56,7 @@ namespace pl::core::ast { if (auto name = std::get_if(&this->getPath().front()); name != nullptr) { if (*name == "$") return std::make_unique(u128(evaluator->getReadOffset())); else if (*name == "null") return std::make_unique( - construct_shared_object(evaluator, 0, 0, getLocation().line)); // Why? + create_shared_object(evaluator, 0, 0, getLocation().line)); // Why? auto parameterPack = evaluator->getScope(0).parameterPack; if (parameterPack && *name == parameterPack->name) diff --git a/lib/source/pl/core/ast/ast_node_struct.cpp b/lib/source/pl/core/ast/ast_node_struct.cpp index 1195e10b..25891499 100644 --- a/lib/source/pl/core/ast/ast_node_struct.cpp +++ b/lib/source/pl/core/ast/ast_node_struct.cpp @@ -18,7 +18,7 @@ namespace pl::core::ast { [[maybe_unused]] auto context = evaluator->updateRuntime(this); evaluator->alignToByte(); - auto pattern = construct_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); + auto pattern = create_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); auto startOffset = evaluator->getReadOffset(); std::vector> memberPatterns; diff --git a/lib/source/pl/core/ast/ast_node_union.cpp b/lib/source/pl/core/ast/ast_node_union.cpp index 52c444d8..113afddd 100644 --- a/lib/source/pl/core/ast/ast_node_union.cpp +++ b/lib/source/pl/core/ast/ast_node_union.cpp @@ -16,7 +16,7 @@ namespace pl::core::ast { [[maybe_unused]] auto context = evaluator->updateRuntime(this); evaluator->alignToByte(); - auto pattern = construct_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); + auto pattern = create_shared_object(evaluator, evaluator->getReadOffset(), 0, getLocation().line); std::vector> memberPatterns; u64 startOffset = evaluator->getReadOffset(); diff --git a/lib/source/pl/core/evaluator.cpp b/lib/source/pl/core/evaluator.cpp index ede82579..fc5c6e68 100644 --- a/lib/source/pl/core/evaluator.cpp +++ b/lib/source/pl/core/evaluator.cpp @@ -225,7 +225,7 @@ namespace pl::core { this->setBitwiseReadOffset(startOffset); - auto pattern = construct_shared_object(this, 0, typePattern->getSize() * entryCount, 0); + auto pattern = create_shared_object(this, 0, typePattern->getSize() * entryCount, 0); if (section == ptrn::Pattern::PatternLocalSectionId) { typePattern->setSection(section); @@ -396,19 +396,19 @@ namespace pl::core { if (auto builtinType = getBuiltinType(type); builtinType != nullptr && builtinType->getType() == Token::ValueType::Auto) { // Handle auto variables if (!value.has_value()) - pattern = construct_shared_object(this, 0, 0, 0); + pattern = create_shared_object(this, 0, 0, 0); else if (std::get_if(&value.value()) != nullptr) - pattern = construct_shared_object(this, 0, sizeof(u128), 0); + pattern = create_shared_object(this, 0, sizeof(u128), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = construct_shared_object(this, 0, sizeof(i128), 0); + pattern = create_shared_object(this, 0, sizeof(i128), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = construct_shared_object(this, 0, sizeof(double), 0); + pattern = create_shared_object(this, 0, sizeof(double), 0); else if (std::get_if(&value.value()) != nullptr) - pattern = construct_shared_object(this, 0, 0); + pattern = create_shared_object(this, 0, 0); else if (std::get_if(&value.value()) != nullptr) - pattern = construct_shared_object(this, 0, 0); + pattern = create_shared_object(this, 0, 0); else if (auto string = std::get_if(&value.value()); string != nullptr) - pattern = construct_shared_object(this, 0, string->size(), 0); + pattern = create_shared_object(this, 0, string->size(), 0); else if (auto patternValue = std::get_if>(&value.value()); patternValue != nullptr) { if (reference && !templateVariable) pattern = *patternValue; @@ -424,7 +424,7 @@ namespace pl::core { pattern = std::move(patterns.front()); } else { - pattern = construct_shared_object(this, 0, 0, 0); + pattern = create_shared_object(this, 0, 0, 0); if (auto typeName = findTypeName(type); typeName.has_value()) pattern->setTypeName(typeName.value()); @@ -725,32 +725,32 @@ namespace pl::core { std::visit(wolv::util::overloaded { [&](const u128 &value) { - changePatternType(pattern, construct_shared_object(this, 0, 16, 0)); + changePatternType(pattern, create_shared_object(this, 0, 16, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); copyToStorage(adjustedValue); }, [&](const i128 &value) { - changePatternType(pattern, construct_shared_object(this, 0, 16, 0)); + changePatternType(pattern, create_shared_object(this, 0, 16, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); adjustedValue = hlp::signExtend(pattern->getSize() * 8, adjustedValue); copyToStorage(adjustedValue); }, [&](const bool &value) { - changePatternType(pattern, construct_shared_object(this, 0, 0)); + changePatternType(pattern, create_shared_object(this, 0, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); copyToStorage(adjustedValue); }, [&](const char &value) { - changePatternType(pattern, construct_shared_object(this, 0, 0)); + changePatternType(pattern, create_shared_object(this, 0, 0)); auto adjustedValue = hlp::changeEndianess(value, pattern->getSize(), pattern->getEndian()); copyToStorage(adjustedValue); }, [&](const double &value) { - changePatternType(pattern, construct_shared_object(this, 0, 8, 0)); + changePatternType(pattern, create_shared_object(this, 0, 8, 0)); if (pattern->getSize() == sizeof(float)) { auto floatValue = float(value); @@ -768,7 +768,7 @@ namespace pl::core { } }, [&](const std::string &value) { - changePatternType(pattern, construct_shared_object(this, 0, value.length(), 0)); + changePatternType(pattern, create_shared_object(this, 0, value.length(), 0)); pattern->setSize(value.size()); diff --git a/tests/include/test_patterns/test_pattern.hpp b/tests/include/test_patterns/test_pattern.hpp index 3a9d29f3..bfa77743 100644 --- a/tests/include/test_patterns/test_pattern.hpp +++ b/tests/include/test_patterns/test_pattern.hpp @@ -31,7 +31,7 @@ namespace pl::test { template std::shared_ptr create(const std::string &typeName, const std::string &varName, auto... args) { - auto pattern = construct_shared_object(m_evaluator, args...); + auto pattern = create_shared_object(m_evaluator, args...); pattern->setTypeName(typeName); pattern->setVariableName(varName); From cbd3f62f5b8e4acc79fad46b5e87508fda855404 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Mon, 9 Jun 2025 01:06:06 +1000 Subject: [PATCH 51/51] Renamed some stuff --- .../pl/helpers/create_shared_object.hpp | 30 +++++++++---------- lib/include/pl/patterns/pattern.hpp | 6 ++-- .../pl/patterns/pattern_array_dynamic.hpp | 2 +- .../pl/patterns/pattern_array_static.hpp | 2 +- lib/include/pl/patterns/pattern_bitfield.hpp | 14 ++++----- lib/include/pl/patterns/pattern_boolean.hpp | 2 +- lib/include/pl/patterns/pattern_character.hpp | 2 +- lib/include/pl/patterns/pattern_enum.hpp | 2 +- lib/include/pl/patterns/pattern_error.hpp | 2 +- lib/include/pl/patterns/pattern_float.hpp | 2 +- lib/include/pl/patterns/pattern_padding.hpp | 2 +- lib/include/pl/patterns/pattern_pointer.hpp | 2 +- lib/include/pl/patterns/pattern_signed.hpp | 2 +- lib/include/pl/patterns/pattern_string.hpp | 2 +- lib/include/pl/patterns/pattern_struct.hpp | 2 +- lib/include/pl/patterns/pattern_union.hpp | 2 +- lib/include/pl/patterns/pattern_unsigned.hpp | 2 +- .../pl/patterns/pattern_wide_character.hpp | 2 +- .../pl/patterns/pattern_wide_string.hpp | 2 +- 19 files changed, 41 insertions(+), 41 deletions(-) diff --git a/lib/include/pl/helpers/create_shared_object.hpp b/lib/include/pl/helpers/create_shared_object.hpp index bf06c534..947449b0 100644 --- a/lib/include/pl/helpers/create_shared_object.hpp +++ b/lib/include/pl/helpers/create_shared_object.hpp @@ -28,7 +28,7 @@ the constructor be public. If we're making factory methods for creation, we may want to make the constructors non-public to stop misuse. The solution to this problem I can't take credit for. -The code for enable_shared_from_nonpublic_constructor is based on code found here +The code for enable_shared_with_nonpublic_constructor is based on code found here (called safe_enable_shared_from_this): https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const Posted by stackoverflow member Carsten. @@ -44,18 +44,18 @@ Requires C++23 #include // Used to enable create_shared_object to access non-public constructors. -#define BEFRIEND_create_shared_object(T) \ - friend struct shared_object_creator::enable_shared_from_nonpublic_constructor::Allocator; +#define BEFRIEND_CREATE_SHARED_OBJECT(T) \ + friend struct shared_object_creator::enable_shared_with_nonpublic_constructor::Allocator; namespace shared_object_creator { -// enable_shared_from_nonpublic_constructor was found here: +// enable_shared_with_nonpublic_constructor was found here: // https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const // // Posted by stackoverflow member Carsten. // He adapted old code from stackoverflow member Zsolt Rizsányi, // who in turn says it was invented by Jonathan Wakely (GCC developer). -class enable_shared_from_nonpublic_constructor : public std::enable_shared_from_this { +class enable_shared_with_nonpublic_constructor : public std::enable_shared_from_this { // Our friends. They're not from around here and have long hard to pronounce names. template requires requires(T t, Args&&... args) { @@ -67,7 +67,7 @@ class enable_shared_from_nonpublic_constructor : public std::enable_shared_from_ friend std::shared_ptr create_shared_object(Args&&... args); public: - virtual ~enable_shared_from_nonpublic_constructor() noexcept = default; + virtual ~enable_shared_with_nonpublic_constructor() noexcept = default; // The next two functions use C++23's "explicit object parameter" // syntax to make shared_from_this and weak_from_this, when called @@ -77,22 +77,22 @@ class enable_shared_from_nonpublic_constructor : public std::enable_shared_from_ auto inline shared_from_this(this TSelf&& self) noexcept { return std::static_pointer_cast>( - std::forward(self).std::template enable_shared_from_this::shared_from_this()); + std::forward(self).std::template enable_shared_from_this::shared_from_this()); } template auto inline weak_from_this(this TSelf&& self) noexcept -> ::std::weak_ptr> { return std::static_pointer_cast>( - std::forward(self).std::template enable_shared_from_this::weak_from_this().lock()); + std::forward(self).std::template enable_shared_from_this::weak_from_this().lock()); } protected: - enable_shared_from_nonpublic_constructor() noexcept = default; - enable_shared_from_nonpublic_constructor(enable_shared_from_nonpublic_constructor&&) noexcept = default; - enable_shared_from_nonpublic_constructor(const enable_shared_from_nonpublic_constructor&) noexcept = default; - enable_shared_from_nonpublic_constructor& operator=(enable_shared_from_nonpublic_constructor&&) noexcept = default; - enable_shared_from_nonpublic_constructor& operator=(const enable_shared_from_nonpublic_constructor&) noexcept = delete; + enable_shared_with_nonpublic_constructor() noexcept = default; + enable_shared_with_nonpublic_constructor(enable_shared_with_nonpublic_constructor&&) noexcept = default; + enable_shared_with_nonpublic_constructor(const enable_shared_with_nonpublic_constructor&) noexcept = default; + enable_shared_with_nonpublic_constructor& operator=(enable_shared_with_nonpublic_constructor&&) noexcept = default; + enable_shared_with_nonpublic_constructor& operator=(const enable_shared_with_nonpublic_constructor&) noexcept = delete; template struct Allocator : public std::allocator @@ -118,14 +118,14 @@ template t.post_construct(std::forward(args)...); } std::shared_ptr create_shared_object(Args&&... args) { - auto p = enable_shared_from_nonpublic_constructor::create(std::forward(args)...); + auto p = enable_shared_with_nonpublic_constructor::create(std::forward(args)...); p->post_construct(std::forward(args)...); return p; } template std::shared_ptr create_shared_object(Args&&... args) { - return enable_shared_from_nonpublic_constructor::create(std::forward(args)...); + return enable_shared_with_nonpublic_constructor::create(std::forward(args)...); } } // namespace shared_object_creator diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index 31b4291b..6399d447 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -64,7 +64,7 @@ namespace pl::ptrn { friend class core::Evaluator; }; - class Pattern : public enable_shared_from_nonpublic_constructor { + class Pattern : public enable_shared_with_nonpublic_constructor { public: constexpr static u64 MainSectionId = 0x0000'0000'0000'0000; constexpr static u64 HeapSectionId = 0xFFFF'FFFF'FFFF'FFFF; @@ -86,7 +86,7 @@ namespace pl::ptrn { } - Pattern(const Pattern &other) : enable_shared_from_nonpublic_constructor(other) { + Pattern(const Pattern &other) : enable_shared_with_nonpublic_constructor(other) { this->m_evaluator = other.m_evaluator; this->m_offset = other.m_offset; this->m_endian = other.m_endian; @@ -648,7 +648,7 @@ namespace pl::ptrn { bool m_manualColor = false; - BEFRIEND_create_shared_object(Pattern) + BEFRIEND_CREATE_SHARED_OBJECT(Pattern) }; } diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index 22ddfd4a..ef5f6abd 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -241,7 +241,7 @@ namespace pl::ptrn { private: std::vector> m_entries; - BEFRIEND_create_shared_object(PatternArrayDynamic) + BEFRIEND_CREATE_SHARED_OBJECT(PatternArrayDynamic) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_array_static.hpp b/lib/include/pl/patterns/pattern_array_static.hpp index 8d605d9f..26e2b331 100644 --- a/lib/include/pl/patterns/pattern_array_static.hpp +++ b/lib/include/pl/patterns/pattern_array_static.hpp @@ -256,7 +256,7 @@ namespace pl::ptrn { mutable std::vector> m_highlightTemplates; size_t m_entryCount = 0; - BEFRIEND_create_shared_object(PatternArrayStatic) + BEFRIEND_CREATE_SHARED_OBJECT(PatternArrayStatic) }; } diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index 0836ab21..833cba07 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -51,7 +51,7 @@ namespace pl::ptrn { return { }; } - BEFRIEND_create_shared_object(PatternBitfieldMember) + BEFRIEND_CREATE_SHARED_OBJECT(PatternBitfieldMember) }; class PatternBitfieldField : public PatternBitfieldMember { @@ -160,7 +160,7 @@ namespace pl::ptrn { bool m_padding = false; - BEFRIEND_create_shared_object(PatternBitfieldField) + BEFRIEND_CREATE_SHARED_OBJECT(PatternBitfieldField) }; class PatternBitfieldFieldSigned : public PatternBitfieldField { @@ -187,7 +187,7 @@ namespace pl::ptrn { return Pattern::callUserFormatFunc(this->getValue(), true).value_or(result); } - BEFRIEND_create_shared_object(PatternBitfieldFieldSigned) + BEFRIEND_CREATE_SHARED_OBJECT(PatternBitfieldFieldSigned) }; class PatternBitfieldFieldBoolean : public PatternBitfieldField { @@ -222,7 +222,7 @@ namespace pl::ptrn { return Pattern::callUserFormatFunc(value, true).value_or(fmt::format("{}", value.toBoolean() ? "true" : "false")); } - BEFRIEND_create_shared_object(PatternBitfieldFieldBoolean) + BEFRIEND_CREATE_SHARED_OBJECT(PatternBitfieldFieldBoolean) }; class PatternBitfieldFieldEnum : public PatternBitfieldField { @@ -275,7 +275,7 @@ namespace pl::ptrn { private: std::map m_enumValues; - BEFRIEND_create_shared_object(PatternBitfieldFieldEnum) + BEFRIEND_CREATE_SHARED_OBJECT(PatternBitfieldFieldEnum) }; class PatternBitfieldArray : public PatternBitfieldMember, @@ -553,7 +553,7 @@ namespace pl::ptrn { u128 m_totalBitSize = 0; bool m_reversed = false; - BEFRIEND_create_shared_object(PatternBitfieldArray) + BEFRIEND_CREATE_SHARED_OBJECT(PatternBitfieldArray) }; class PatternBitfield : public PatternBitfieldMember, @@ -838,7 +838,7 @@ class PatternBitfield : public PatternBitfieldMember, u64 m_totalBitSize = 0; bool m_reversed = false; - BEFRIEND_create_shared_object(PatternBitfield) + BEFRIEND_CREATE_SHARED_OBJECT(PatternBitfield) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_boolean.hpp b/lib/include/pl/patterns/pattern_boolean.hpp index 4b0ad9f4..0455ea2e 100644 --- a/lib/include/pl/patterns/pattern_boolean.hpp +++ b/lib/include/pl/patterns/pattern_boolean.hpp @@ -65,7 +65,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_create_shared_object(PatternBoolean) + BEFRIEND_CREATE_SHARED_OBJECT(PatternBoolean) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_character.hpp b/lib/include/pl/patterns/pattern_character.hpp index 3a315da6..06c6da62 100644 --- a/lib/include/pl/patterns/pattern_character.hpp +++ b/lib/include/pl/patterns/pattern_character.hpp @@ -61,7 +61,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_create_shared_object(PatternCharacter) + BEFRIEND_CREATE_SHARED_OBJECT(PatternCharacter) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_enum.hpp b/lib/include/pl/patterns/pattern_enum.hpp index 97f042db..2667be71 100644 --- a/lib/include/pl/patterns/pattern_enum.hpp +++ b/lib/include/pl/patterns/pattern_enum.hpp @@ -104,7 +104,7 @@ namespace pl::ptrn { private: std::map m_enumValues; - BEFRIEND_create_shared_object(PatternEnum) + BEFRIEND_CREATE_SHARED_OBJECT(PatternEnum) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_error.hpp b/lib/include/pl/patterns/pattern_error.hpp index c6faae74..3a169867 100644 --- a/lib/include/pl/patterns/pattern_error.hpp +++ b/lib/include/pl/patterns/pattern_error.hpp @@ -43,7 +43,7 @@ namespace pl::ptrn { private: std::string m_errorMessage; - BEFRIEND_create_shared_object(PatternError) + BEFRIEND_CREATE_SHARED_OBJECT(PatternError) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_float.hpp b/lib/include/pl/patterns/pattern_float.hpp index 468b3b54..7b79432e 100644 --- a/lib/include/pl/patterns/pattern_float.hpp +++ b/lib/include/pl/patterns/pattern_float.hpp @@ -105,7 +105,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_create_shared_object(PatternFloat) + BEFRIEND_CREATE_SHARED_OBJECT(PatternFloat) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_padding.hpp b/lib/include/pl/patterns/pattern_padding.hpp index 64a38745..abc5539a 100644 --- a/lib/include/pl/patterns/pattern_padding.hpp +++ b/lib/include/pl/patterns/pattern_padding.hpp @@ -46,7 +46,7 @@ namespace pl::ptrn { return { }; } - BEFRIEND_create_shared_object(PatternPadding) + BEFRIEND_CREATE_SHARED_OBJECT(PatternPadding) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index 0364bd4c..93d2237c 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -182,7 +182,7 @@ namespace pl::ptrn { i128 m_pointedAtAddress = 0; u64 m_pointerBase = 0; - BEFRIEND_create_shared_object(PatternPointer) + BEFRIEND_CREATE_SHARED_OBJECT(PatternPointer) }; } diff --git a/lib/include/pl/patterns/pattern_signed.hpp b/lib/include/pl/patterns/pattern_signed.hpp index b5d9f0fa..1dc4b687 100644 --- a/lib/include/pl/patterns/pattern_signed.hpp +++ b/lib/include/pl/patterns/pattern_signed.hpp @@ -56,7 +56,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_create_shared_object(PatternSigned) + BEFRIEND_CREATE_SHARED_OBJECT(PatternSigned) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_string.hpp b/lib/include/pl/patterns/pattern_string.hpp index a37d2978..bd1febd3 100644 --- a/lib/include/pl/patterns/pattern_string.hpp +++ b/lib/include/pl/patterns/pattern_string.hpp @@ -103,7 +103,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_create_shared_object(PatternString) + BEFRIEND_CREATE_SHARED_OBJECT(PatternString) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_struct.hpp b/lib/include/pl/patterns/pattern_struct.hpp index a9f76273..3a4c7150 100644 --- a/lib/include/pl/patterns/pattern_struct.hpp +++ b/lib/include/pl/patterns/pattern_struct.hpp @@ -233,7 +233,7 @@ namespace pl::ptrn { std::vector> m_members; std::vector m_sortedMembers; - BEFRIEND_create_shared_object(PatternStruct) + BEFRIEND_CREATE_SHARED_OBJECT(PatternStruct) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_union.hpp b/lib/include/pl/patterns/pattern_union.hpp index e8032601..c7f1d510 100644 --- a/lib/include/pl/patterns/pattern_union.hpp +++ b/lib/include/pl/patterns/pattern_union.hpp @@ -223,7 +223,7 @@ namespace pl::ptrn { std::vector> m_members; std::vector m_sortedMembers; - BEFRIEND_create_shared_object(PatternUnion) + BEFRIEND_CREATE_SHARED_OBJECT(PatternUnion) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_unsigned.hpp b/lib/include/pl/patterns/pattern_unsigned.hpp index 85ad8b42..7dee412b 100644 --- a/lib/include/pl/patterns/pattern_unsigned.hpp +++ b/lib/include/pl/patterns/pattern_unsigned.hpp @@ -53,7 +53,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_create_shared_object(PatternUnsigned) + BEFRIEND_CREATE_SHARED_OBJECT(PatternUnsigned) }; } \ No newline at end of file diff --git a/lib/include/pl/patterns/pattern_wide_character.hpp b/lib/include/pl/patterns/pattern_wide_character.hpp index 04322d0c..ac6d1f64 100644 --- a/lib/include/pl/patterns/pattern_wide_character.hpp +++ b/lib/include/pl/patterns/pattern_wide_character.hpp @@ -57,7 +57,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_create_shared_object(PatternWideCharacter) + BEFRIEND_CREATE_SHARED_OBJECT(PatternWideCharacter) }; } diff --git a/lib/include/pl/patterns/pattern_wide_string.hpp b/lib/include/pl/patterns/pattern_wide_string.hpp index 60305982..264fa47b 100644 --- a/lib/include/pl/patterns/pattern_wide_string.hpp +++ b/lib/include/pl/patterns/pattern_wide_string.hpp @@ -107,7 +107,7 @@ namespace pl::ptrn { return result; } - BEFRIEND_create_shared_object(PatternWideString) + BEFRIEND_CREATE_SHARED_OBJECT(PatternWideString) }; }