Skip to content

Commit 5923f2b

Browse files
committed
Needed to set m_parent to weak_ptr in order to fix problems with dynamic cast. Also json types needed to be set to shared_ptrs instead of unique.
1 parent 11201dd commit 5923f2b

11 files changed

Lines changed: 37 additions & 47 deletions

lib/include/pl/api.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ namespace pl::api {
126126
/**
127127
* @brief A function callback called when a custom built-in type is being instantiated
128128
*/
129-
using TypeCallback = std::function<std::unique_ptr<ptrn::Pattern>(core::Evaluator *, const std::vector<core::Token::Literal> &)>;
129+
using TypeCallback = std::function<std::shared_ptr<ptrn::Pattern>(core::Evaluator *, const std::vector<core::Token::Literal> &)>;
130130

131131
/**
132132
* @brief A type representing a function.

lib/include/pl/patterns/pattern.hpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ namespace pl::ptrn {
6868
constexpr static u64 PatternLocalSectionId = 0xFFFF'FFFF'FFFF'FFFE;
6969
constexpr static u64 InstantiationSectionId = 0xFFFF'FFFF'FFFF'FFFD;
7070

71+
Pattern() = default;
72+
7173
Pattern(core::Evaluator *evaluator, u64 offset, size_t size, u32 line)
7274
: m_evaluator(evaluator), m_line(line), m_offset(offset), m_size(size) {
7375

@@ -543,15 +545,15 @@ namespace pl::ptrn {
543545
this->m_initialized = initialized;
544546
}
545547

546-
[[nodiscard]] const Pattern* getParent() const {
547-
return m_parent;
548+
[[nodiscard]] const Pattern *getParent() const {
549+
return m_parent.lock().get();
548550
}
549551

550-
[[nodiscard]] Pattern* getParent() {
551-
return m_parent;
552+
[[nodiscard]] Pattern *getParent() {
553+
return m_parent.lock().get();
552554
}
553555

554-
void setParent(Pattern *parent) {
556+
void setParent(std::shared_ptr<Pattern> parent) {
555557
m_parent = parent;
556558
}
557559

@@ -626,10 +628,10 @@ namespace pl::ptrn {
626628
private:
627629
friend pl::core::Evaluator;
628630

629-
core::Evaluator *m_evaluator;
631+
core::Evaluator *m_evaluator = nullptr;
630632

631633
std::unique_ptr<std::map<std::string, std::vector<core::Token::Literal>>> m_attributes;
632-
Pattern *m_parent = nullptr;
634+
std::weak_ptr<Pattern> m_parent;
633635
u32 m_line = 0;
634636

635637
std::set<std::string>::const_iterator m_variableName;

lib/include/pl/patterns/pattern_array_dynamic.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace pl::ptrn {
2222
[[nodiscard]] std::shared_ptr<Pattern> clone() const override {
2323
auto other = std::make_shared<PatternArrayDynamic>(*this);
2424
for (const auto &entry : other->m_entries)
25-
entry->setParent(other->reference().get());
25+
entry->setParent(other->reference());
2626

2727
return other;
2828
}

lib/include/pl/patterns/pattern_array_static.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace pl::ptrn {
1717

1818
[[nodiscard]] std::shared_ptr<Pattern> clone() const override {
1919
auto other = std::make_shared<PatternArrayStatic>(*this);
20-
other->m_template->setParent(other->reference().get());
20+
other->m_template->setParent(other->reference());
2121
return other;
2222
}
2323

lib/include/pl/patterns/pattern_bitfield.hpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,12 @@ namespace pl::ptrn {
1111

1212
[[nodiscard]] const PatternBitfieldMember& getTopmostBitfield() const {
1313
const PatternBitfieldMember* topBitfield = this;
14-
while (auto *parent = topBitfield->getParent()) {
15-
if ( parent == nullptr || parent->getParent() ==nullptr )
16-
break;
17-
else if (auto weakPtr = parent->weak_from_this(); !weakPtr.expired()) {
18-
const auto *parentBitfield = dynamic_cast<const PatternBitfieldMember *>(parent);
19-
if (parentBitfield == nullptr)
20-
break;
21-
topBitfield = parentBitfield;
22-
} else
14+
while (auto parent = topBitfield->getParent()) {
15+
auto parentBitfield = dynamic_cast<const PatternBitfieldMember*>(parent);
16+
if (parentBitfield == nullptr)
2317
break;
18+
19+
topBitfield = parentBitfield;
2420
}
2521

2622
return *topBitfield;
@@ -60,7 +56,7 @@ namespace pl::ptrn {
6056
PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, PatternBitfieldMember *parentBitfield = nullptr)
6157
: PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) {
6258
if (parentBitfield != nullptr)
63-
this->setParent(parentBitfield->reference().get());
59+
this->setParent(parentBitfield->reference());
6460
}
6561

6662
PatternBitfieldField(const PatternBitfieldField &other) : PatternBitfieldMember(other) {
@@ -289,7 +285,7 @@ namespace pl::ptrn {
289285
[[nodiscard]] std::shared_ptr<Pattern> clone() const override {
290286
auto other = std::make_shared<PatternBitfieldArray>(*this);
291287
for (const auto &entry : other->m_entries)
292-
entry->setParent(other->reference().get());
288+
entry->setParent(other->reference());
293289
return other;
294290
}
295291

@@ -649,7 +645,7 @@ namespace pl::ptrn {
649645
this->setBaseColor(this->m_fields.front()->getColor());
650646

651647
for (const auto &field : this->m_fields) {
652-
field->setParent(this);
648+
field->setParent(this->reference());
653649
this->m_sortedFields.push_back(field.get());
654650
}
655651
}

lib/include/pl/patterns/pattern_struct.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace pl::ptrn {
2323
[[nodiscard]] std::shared_ptr<Pattern> clone() const override {
2424
auto other = std::make_shared<PatternStruct>(*this);
2525
for (const auto &member : other->m_members)
26-
member->setParent(other->reference().get());
26+
member->setParent(other->reference());
2727

2828
return other;
2929
}
@@ -39,7 +39,7 @@ namespace pl::ptrn {
3939
void addEntry(const std::shared_ptr<Pattern> &entry) override {
4040
if (entry == nullptr) return;
4141

42-
entry->setParent(this);
42+
entry->setParent(this->reference());
4343
this->m_sortedMembers.push_back(entry.get());
4444
this->m_members.push_back(entry);
4545
}

lib/include/pl/patterns/pattern_union.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace pl::ptrn {
2323
[[nodiscard]] std::shared_ptr<Pattern> clone() const override {
2424
auto other = std::make_shared<PatternUnion>(*this);
2525
for (const auto &member : other->m_members)
26-
member->setParent(other->reference().get());
26+
member->setParent(other->reference());
2727

2828
return other;
2929
}

lib/source/pl/core/ast/ast_node_bitfield.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ namespace pl::core::ast {
139139

140140
for (auto &pattern : potentialPatterns) {
141141
if (auto bitfieldMember = dynamic_cast<ptrn::PatternBitfieldMember*>(pattern.get()); bitfieldMember != nullptr) {
142-
bitfieldMember->setParent(bitfieldPattern.get());
142+
bitfieldMember->setParent(bitfieldPattern->reference());
143143
if (!bitfieldMember->isPadding())
144144
fields.push_back(pattern);
145145
} else {

lib/source/pl/core/ast/ast_node_bitfield_array_variable_decl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ namespace pl::core::ast {
133133

134134
for (auto &pattern : entries) {
135135
if (auto bitfieldMember = dynamic_cast<ptrn::PatternBitfieldMember*>(pattern.get()); bitfieldMember != nullptr)
136-
bitfieldMember->setParent(arrayPattern.get());
136+
bitfieldMember->setParent(arrayPattern->reference());
137137
}
138138

139139
arrayPattern->setEntries(entries);

lib/source/pl/core/ast/ast_node_builtin_type.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,23 @@ namespace pl::core::ast {
2323
auto size = Token::getTypeSize(this->m_type);
2424
auto offset = evaluator->getReadOffsetAndIncrement(size);
2525

26-
std::unique_ptr<ptrn::Pattern> pattern;
26+
std::shared_ptr<ptrn::Pattern> pattern;
2727
if (Token::isUnsigned(this->m_type))
28-
pattern = std::make_unique<ptrn::PatternUnsigned>(evaluator, offset, size, getLocation().line);
28+
pattern = std::make_shared<ptrn::PatternUnsigned>(evaluator, offset, size, getLocation().line);
2929
else if (Token::isSigned(this->m_type))
30-
pattern = std::make_unique<ptrn::PatternSigned>(evaluator, offset, size, getLocation().line);
30+
pattern = std::make_shared<ptrn::PatternSigned>(evaluator, offset, size, getLocation().line);
3131
else if (Token::isFloatingPoint(this->m_type))
32-
pattern = std::make_unique<ptrn::PatternFloat>(evaluator, offset, size, getLocation().line);
32+
pattern = std::make_shared<ptrn::PatternFloat>(evaluator, offset, size, getLocation().line);
3333
else if (this->m_type == Token::ValueType::Boolean)
34-
pattern = std::make_unique<ptrn::PatternBoolean>(evaluator, offset, getLocation().line);
34+
pattern = std::make_shared<ptrn::PatternBoolean>(evaluator, offset, getLocation().line);
3535
else if (this->m_type == Token::ValueType::Character)
36-
pattern = std::make_unique<ptrn::PatternCharacter>(evaluator, offset, getLocation().line);
36+
pattern = std::make_shared<ptrn::PatternCharacter>(evaluator, offset, getLocation().line);
3737
else if (this->m_type == Token::ValueType::Character16)
38-
pattern = std::make_unique<ptrn::PatternWideCharacter>(evaluator, offset, getLocation().line);
38+
pattern = std::make_shared<ptrn::PatternWideCharacter>(evaluator, offset, getLocation().line);
3939
else if (this->m_type == Token::ValueType::Padding)
40-
pattern = std::make_unique<ptrn::PatternPadding>(evaluator, offset, 1, getLocation().line);
40+
pattern = std::make_shared<ptrn::PatternPadding>(evaluator, offset, 1, getLocation().line);
4141
else if (this->m_type == Token::ValueType::String)
42-
pattern = std::make_unique<ptrn::PatternString>(evaluator, offset, 0, getLocation().line);
42+
pattern = std::make_shared<ptrn::PatternString>(evaluator, offset, 0, getLocation().line);
4343
else if (this->m_type == Token::ValueType::CustomType) {
4444
std::vector<Token::Literal> params;
4545

0 commit comments

Comments
 (0)