From 3d022424ebd03ae328a4452b750bba67b3e86e0a Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sat, 24 May 2025 06:53:21 +1000 Subject: [PATCH 1/3] Smallest change that fixes the problem --- lib/include/pl/patterns/pattern.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index 1a478f3f..fdb6cf89 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -699,7 +699,8 @@ namespace pl::ptrn { m_refPattern(other.m_refPattern) {} std::unique_ptr clone() const override { - return std::make_unique(*this); + //return std::make_unique(*this); + return std::make_unique(*m_refPattern); } void accept(PatternVisitor &v) override { From d3a5b02ac9514cf01f6ed1f13bc037c1d8dc9593 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sat, 24 May 2025 06:55:17 +1000 Subject: [PATCH 2/3] Remove comment --- lib/include/pl/patterns/pattern.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index fdb6cf89..ffe6b109 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -699,7 +699,6 @@ namespace pl::ptrn { m_refPattern(other.m_refPattern) {} std::unique_ptr clone() const override { - //return std::make_unique(*this); return std::make_unique(*m_refPattern); } From 4c6e362c1f7c6e3277dc52a5ef1dc23ae344f4e2 Mon Sep 17 00:00:00 2001 From: "shewitt.au" Date: Sun, 25 May 2025 01:31:35 +1000 Subject: [PATCH 3/3] cast-to-int-format-error-v2 --- lib/include/pl/patterns/pattern.hpp | 7 ++++++- lib/include/pl/patterns/pattern_array_dynamic.hpp | 4 ++-- lib/include/pl/patterns/pattern_array_static.hpp | 4 ++-- lib/include/pl/patterns/pattern_bitfield.hpp | 10 +++++----- lib/include/pl/patterns/pattern_enum.hpp | 2 +- lib/include/pl/patterns/pattern_pointer.hpp | 2 +- lib/include/pl/patterns/pattern_struct.hpp | 4 ++-- lib/include/pl/patterns/pattern_union.hpp | 4 ++-- 8 files changed, 21 insertions(+), 16 deletions(-) diff --git a/lib/include/pl/patterns/pattern.hpp b/lib/include/pl/patterns/pattern.hpp index ffe6b109..d32cb039 100644 --- a/lib/include/pl/patterns/pattern.hpp +++ b/lib/include/pl/patterns/pattern.hpp @@ -61,6 +61,11 @@ namespace pl::ptrn { friend class core::Evaluator; }; + inline std::shared_ptr make_shared_pattern_raw(Pattern *p) + { + return std::shared_ptr(p, [](Pattern*){}); + } + class Pattern { public: constexpr static u64 MainSectionId = 0x0000'0000'0000'0000; @@ -699,7 +704,7 @@ namespace pl::ptrn { m_refPattern(other.m_refPattern) {} std::unique_ptr clone() const override { - return std::make_unique(*m_refPattern); + return std::make_unique(*this); } void accept(PatternVisitor &v) override { diff --git a/lib/include/pl/patterns/pattern_array_dynamic.hpp b/lib/include/pl/patterns/pattern_array_dynamic.hpp index eb768745..4f1c8e40 100644 --- a/lib/include/pl/patterns/pattern_array_dynamic.hpp +++ b/lib/include/pl/patterns/pattern_array_dynamic.hpp @@ -173,7 +173,7 @@ namespace pl::ptrn { result += " ]"; - return Pattern::callUserFormatFunc(PatternRef::create(this), true).value_or(result); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this), true).value_or(result); } [[nodiscard]] bool operator==(const Pattern &other) const override { @@ -208,7 +208,7 @@ namespace pl::ptrn { } std::string formatDisplayValue() override { - return Pattern::callUserFormatFunc(PatternRef::create(this)).value_or("[ ... ]"); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this)).value_or("[ ... ]"); } std::vector getRawBytes() override { diff --git a/lib/include/pl/patterns/pattern_array_static.hpp b/lib/include/pl/patterns/pattern_array_static.hpp index 9e29ee77..9deb2fce 100644 --- a/lib/include/pl/patterns/pattern_array_static.hpp +++ b/lib/include/pl/patterns/pattern_array_static.hpp @@ -191,7 +191,7 @@ namespace pl::ptrn { } std::string formatDisplayValue() override { - return Pattern::callUserFormatFunc(PatternRef::create(this)).value_or("[ ... ]"); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this)).value_or("[ ... ]"); } [[nodiscard]] std::string toString() override { @@ -220,7 +220,7 @@ namespace pl::ptrn { result += " ]"; - return Pattern::callUserFormatFunc(PatternRef::create(this), true).value_or(result); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this), true).value_or(result); } std::vector getRawBytes() override { diff --git a/lib/include/pl/patterns/pattern_bitfield.hpp b/lib/include/pl/patterns/pattern_bitfield.hpp index 5d9788bd..2984eff5 100644 --- a/lib/include/pl/patterns/pattern_bitfield.hpp +++ b/lib/include/pl/patterns/pattern_bitfield.hpp @@ -455,7 +455,7 @@ namespace pl::ptrn { result += " ]"; - return Pattern::callUserFormatFunc(PatternRef::create(this), true).value_or(result); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this), true).value_or(result); } [[nodiscard]] bool operator==(const Pattern &other) const override { @@ -495,7 +495,7 @@ namespace pl::ptrn { } std::string formatDisplayValue() override { - return Pattern::callUserFormatFunc(PatternRef::create(this)).value_or("[ ... ]"); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this)).value_or("[ ... ]"); } void sort(const std::function &comparator) override { @@ -691,7 +691,7 @@ namespace pl::ptrn { result += " }"; - return Pattern::callUserFormatFunc(PatternRef::create(this), true).value_or(result); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this), true).value_or(result); } std::string formatDisplayValue() override { @@ -725,9 +725,9 @@ namespace pl::ptrn { } if (valueString.size() > 64) - return Pattern::callUserFormatFunc(PatternRef::create(this)).value_or(fmt::format("{{ ... }}", valueString)); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this)).value_or(fmt::format("{{ ... }}", valueString)); else - return Pattern::callUserFormatFunc(PatternRef::create(this)).value_or(fmt::format("{{ {} }}", valueString)); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this)).value_or(fmt::format("{{ {} }}", valueString)); } void setEndian(std::endian endian) override { diff --git a/lib/include/pl/patterns/pattern_enum.hpp b/lib/include/pl/patterns/pattern_enum.hpp index 1da766ab..2d0379dc 100644 --- a/lib/include/pl/patterns/pattern_enum.hpp +++ b/lib/include/pl/patterns/pattern_enum.hpp @@ -86,7 +86,7 @@ namespace pl::ptrn { [[nodiscard]] std::string toString() override { u128 value = this->getValue().toUnsigned(); - return Pattern::callUserFormatFunc(PatternRef::create(this), true).value_or(getEnumName(this->getTypeName(), value, m_enumValues)); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this), true).value_or(getEnumName(this->getTypeName(), value, m_enumValues)); } std::vector getRawBytes() override { diff --git a/lib/include/pl/patterns/pattern_pointer.hpp b/lib/include/pl/patterns/pattern_pointer.hpp index fa834512..c958209e 100644 --- a/lib/include/pl/patterns/pattern_pointer.hpp +++ b/lib/include/pl/patterns/pattern_pointer.hpp @@ -155,7 +155,7 @@ namespace pl::ptrn { [[nodiscard]] std::string toString() override { auto result = this->m_pointedAt->toString(); - return Pattern::callUserFormatFunc(PatternRef::create(this), true).value_or(result); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this), true).value_or(result); } std::vector getRawBytes() override { diff --git a/lib/include/pl/patterns/pattern_struct.hpp b/lib/include/pl/patterns/pattern_struct.hpp index 28f087a6..2925b77a 100644 --- a/lib/include/pl/patterns/pattern_struct.hpp +++ b/lib/include/pl/patterns/pattern_struct.hpp @@ -153,7 +153,7 @@ namespace pl::ptrn { result += " }"; - return Pattern::callUserFormatFunc(PatternRef::create(this), true).value_or(result); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this), true).value_or(result); } void sort(const std::function &comparator) override { @@ -199,7 +199,7 @@ namespace pl::ptrn { } std::string formatDisplayValue() override { - return Pattern::callUserFormatFunc(PatternRef::create(this)).value_or("{ ... }"); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this)).value_or("{ ... }"); } std::vector getRawBytes() override { diff --git a/lib/include/pl/patterns/pattern_union.hpp b/lib/include/pl/patterns/pattern_union.hpp index 2b3470db..1d63db45 100644 --- a/lib/include/pl/patterns/pattern_union.hpp +++ b/lib/include/pl/patterns/pattern_union.hpp @@ -152,7 +152,7 @@ namespace pl::ptrn { result += " }"; - return Pattern::callUserFormatFunc(PatternRef::create(this), true).value_or(result); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this), true).value_or(result); } void sort(const std::function &comparator) override { @@ -198,7 +198,7 @@ namespace pl::ptrn { } std::string formatDisplayValue() override { - return Pattern::callUserFormatFunc(PatternRef::create(this)).value_or("{ ... }"); + return Pattern::callUserFormatFunc(make_shared_pattern_raw(this)).value_or("{ ... }"); } std::vector getRawBytes() override {