Skip to content

Commit 3ec6ae2

Browse files
committed
WIP
1 parent 324a136 commit 3ec6ae2

7 files changed

Lines changed: 39 additions & 39 deletions

File tree

lib/include/pl/patterns/pattern.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ namespace pl::ptrn {
119119
}
120120

121121
virtual std::shared_ptr<Pattern> clone() const = 0;
122+
std::shared_ptr<const Pattern> reference() const { return shared_from_this(); }
122123
std::shared_ptr<Pattern> reference() { return shared_from_this(); }
123124

124125
[[nodiscard]] u64 getOffset() const { return this->m_offset; }
@@ -540,15 +541,15 @@ namespace pl::ptrn {
540541
this->m_initialized = initialized;
541542
}
542543

543-
[[nodiscard]] const Pattern* getParent() const {
544+
[[nodiscard]] const std::shared_ptr<Pattern> getParent() const {
544545
return m_parent;
545546
}
546547

547-
[[nodiscard]] Pattern* getParent() {
548+
[[nodiscard]] std::shared_ptr<Pattern> getParent() {
548549
return m_parent;
549550
}
550551

551-
void setParent(Pattern *parent) {
552+
void setParent(std::shared_ptr<Pattern> parent) {
552553
m_parent = parent;
553554
}
554555

@@ -626,7 +627,7 @@ namespace pl::ptrn {
626627
core::Evaluator *m_evaluator;
627628

628629
std::unique_ptr<std::map<std::string, std::vector<core::Token::Literal>>> m_attributes;
629-
Pattern *m_parent = nullptr;
630+
std::shared_ptr<Pattern> m_parent;
630631
u32 m_line = 0;
631632

632633
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
@@ -133,7 +133,7 @@ namespace pl::ptrn {
133133

134134
if (!entry->hasOverriddenColor())
135135
entry->setBaseColor(this->getColor());
136-
entry->setParent(this);
136+
entry->setParent(this->reference());
137137

138138
this->m_entries.emplace_back(entry);
139139
}

lib/include/pl/patterns/pattern_array_static.hpp

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

154154
void setEntries(std::shared_ptr<Pattern> &&templatePattern, size_t count) {
155155
this->m_template = std::move(templatePattern);
156-
this->m_template->setParent(this);
156+
this->m_template->setParent(this->reference());
157157
this->m_highlightTemplates.push_back(this->m_template->clone());
158158
this->m_entryCount = count;
159159

lib/include/pl/patterns/pattern_bitfield.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace pl::ptrn {
1212
[[nodiscard]] const PatternBitfieldMember& getTopmostBitfield() const {
1313
const PatternBitfieldMember* topBitfield = this;
1414
while (auto parent = topBitfield->getParent()) {
15-
auto parentBitfield = dynamic_cast<const PatternBitfieldMember*>(parent);
15+
auto parentBitfield = dynamic_cast<const PatternBitfieldMember*>(parent.get());
1616
if (parentBitfield == nullptr)
1717
break;
1818

@@ -53,7 +53,7 @@ namespace pl::ptrn {
5353

5454
class PatternBitfieldField : public PatternBitfieldMember {
5555
public:
56-
PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, PatternBitfieldMember *parentBitfield = nullptr)
56+
PatternBitfieldField(core::Evaluator *evaluator, u64 offset, u8 bitOffset, u8 bitSize, u32 line, std::shared_ptr<PatternBitfieldMember> parentBitfield = nullptr)
5757
: PatternBitfieldMember(evaluator, offset, (bitOffset + bitSize + 7) / 8, line), m_bitOffset(bitOffset % 8), m_bitSize(bitSize) {
5858
this->setParent(parentBitfield);
5959
}
@@ -422,7 +422,7 @@ namespace pl::ptrn {
422422
if (!entry->hasOverriddenColor())
423423
entry->setBaseColor(this->getColor());
424424

425-
entry->setParent(this);
425+
entry->setParent(this->reference());
426426

427427
this->m_sortedEntries.push_back(entry.get());
428428
}
@@ -643,7 +643,7 @@ namespace pl::ptrn {
643643
this->setBaseColor(this->m_fields.front()->getColor());
644644

645645
for (const auto &field : this->m_fields) {
646-
field->setParent(this);
646+
field->setParent(this->reference());
647647
this->m_sortedFields.push_back(field.get());
648648
}
649649
}
@@ -715,7 +715,7 @@ namespace pl::ptrn {
715715
}
716716
} else if (auto *member = dynamic_cast<PatternBitfieldMember *>(pattern.get()); member != nullptr) {
717717
valueString += fmt::format("{} = {} | ", member->getVariableName(), member->toString());
718-
} else if (auto *bitfield = dynamic_cast<PatternBitfield *>(pattern.get()); bitfield != nullptr) {
718+
} else if (auto *bitfield = dynamic_cast<PatternBitfield *>(pattern.get()); bitfield != nullptr) {
719719
valueString += fmt::format("{} = {} | ", bitfield->getVariableName(), bitfield->formatDisplayValue());
720720
}
721721
}

lib/include/pl/patterns/pattern_struct.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace pl::ptrn {
1515
for (const auto &member : other.m_members) {
1616
auto copy = member->clone();
1717

18-
copy->setParent(this);
18+
copy->setParent(this->reference());
1919
this->m_sortedMembers.push_back(copy.get());
2020
this->m_members.push_back(std::move(copy));
2121
}
@@ -36,7 +36,7 @@ namespace pl::ptrn {
3636
void addEntry(const std::shared_ptr<Pattern> &entry) override {
3737
if (entry == nullptr) return;
3838

39-
entry->setParent(this);
39+
entry->setParent(this->reference());
4040
this->m_sortedMembers.push_back(entry.get());
4141
this->m_members.push_back(entry);
4242
}

lib/include/pl/patterns/pattern_union.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ namespace pl::ptrn {
3535
void addEntry(const std::shared_ptr<Pattern> &entry) override {
3636
if (entry == nullptr) return;
3737

38-
entry->setParent(this);
38+
entry->setParent(this->reference());
3939
this->m_sortedMembers.push_back(entry.get());
4040
this->m_members.push_back(entry);
4141
}

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

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace pl::core::ast {
2424

2525
[[nodiscard]] bool ASTNodeBitfieldField::isPadding() const { return this->getName() == "$padding$"; }
2626

27-
[[nodiscard]] std::shared_ptr<construct_shared_object<pl::ptrn::PatternBitfieldField> ASTNodeBitfieldField>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const {
27+
[[nodiscard]] std::shared_ptr<ptrn::PatternBitfieldField> ASTNodeBitfieldField::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const {
2828
return construct_shared_object<pl::ptrn::PatternBitfieldField>(evaluator, byteOffset, bitOffset, bitSize, getLocation().line);
2929
}
3030

@@ -56,7 +56,7 @@ namespace pl::core::ast {
5656
}
5757

5858

59-
[[nodiscard]] std::shared_ptr<construct_shared_object<pl::ptrn::PatternBitfieldField> ASTNodeBitfieldFieldSigned>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const {
59+
[[nodiscard]] std::shared_ptr<ptrn::PatternBitfieldField> ASTNodeBitfieldFieldSigned::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const {
6060
return construct_shared_object<pl::ptrn::PatternBitfieldFieldSigned>(evaluator, byteOffset, bitOffset, bitSize, getLocation().line);
6161
}
6262

@@ -68,29 +68,28 @@ namespace pl::core::ast {
6868
this->m_type = std::unique_ptr<ASTNodeTypeDecl>(static_cast<ASTNodeTypeDecl*>(other.m_type->clone().release()));
6969
}
7070

71-
[[nodiscard]] std::shared_ptr<construct_shared_object<pl::ptrn::PatternBitfieldField> ASTNodeBitfieldFieldSizedType>Bitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const {
72-
auto originalPosition = evaluator->getBitwiseReadOffset();
73-
evaluator->setBitwiseReadOffset(byteOffset, bitOffset);
74-
75-
std::vector<std::shared_ptr<ptrn::Pattern>> patterns;
76-
this->m_type->createPatterns(evaluator, patterns);
77-
auto &pattern = patterns[0];
78-
std::shared_ptr<ptrn::PatternBitfieldField> result = nullptr;
79-
evaluator->setBitwiseReadOffset(originalPosition);
80-
81-
if (auto *patternEnum = dynamic_cast<ptrn::PatternEnum *>(pattern.get()); patternEnum != nullptr) {
82-
auto bitfieldEnum = construct_shared_object<pl::ptrn::PatternBitfieldFieldEnum>(evaluator, byteOffset, bitOffset, bitSize, getLocation().line);
83-
bitfieldEnum->setTypeName(patternEnum->getTypeName());
84-
bitfieldEnum->setEnumValues(patternEnum->getEnumValues());
85-
result = std::move(bitfieldEnum);
86-
} else if (dynamic_cast<ptrn::PatternBoolean *>(pattern.get()) != nullptr) {
87-
result = construct_shared_object<pl::ptrn::PatternBitfieldFieldBoolean>(evaluator, byteOffset, bitOffset, bitSize, getLocation().line);
88-
} else {
89-
err::E0004.throwError("Bit size specifiers may only be used with unsigned, signed, bool or enum types.", {}, this->getLocation());
71+
[[nodiscard]] std::shared_ptr<ptrn::PatternBitfieldField> ASTNodeBitfieldFieldSizedType::createBitfield(Evaluator *evaluator, u64 byteOffset, u8 bitOffset, u8 bitSize) const {
72+
auto originalPosition = evaluator->getBitwiseReadOffset();
73+
evaluator->setBitwiseReadOffset(byteOffset, bitOffset);
74+
75+
std::vector<std::shared_ptr<ptrn::Pattern>> patterns;
76+
this->m_type->createPatterns(evaluator, patterns);
77+
auto &pattern = patterns[0];
78+
std::shared_ptr<ptrn::PatternBitfieldField> result = nullptr;
79+
evaluator->setBitwiseReadOffset(originalPosition);
80+
81+
if (auto *patternEnum = dynamic_cast<ptrn::PatternEnum *>(pattern.get()); patternEnum != nullptr) {
82+
auto bitfieldEnum = construct_shared_object<pl::ptrn::PatternBitfieldFieldEnum>(evaluator, byteOffset, bitOffset, bitSize, getLocation().line);
83+
bitfieldEnum->setTypeName(patternEnum->getTypeName());
84+
bitfieldEnum->setEnumValues(patternEnum->getEnumValues());
85+
result = std::move(bitfieldEnum);
86+
} else if (dynamic_cast<ptrn::PatternBoolean *>(pattern.get()) != nullptr) {
87+
result = construct_shared_object<pl::ptrn::PatternBitfieldFieldBoolean>(evaluator, byteOffset, bitOffset, bitSize, getLocation().line);
88+
} else {
89+
err::E0004.throwError("Bit size specifiers may only be used with unsigned, signed, bool or enum types.", {}, this->getLocation());
90+
}
91+
92+
return result;
9093
}
9194

92-
return result;
93-
}
94-
95-
9695
}

0 commit comments

Comments
 (0)