LibWasm: Make Wasm::Validator::Stack hold a Vector instead of inheriting

This commit is contained in:
Ali Mohammad Pur 2025-08-06 08:03:24 +02:00 committed by Ali Mohammad Pur
commit 8af095f797
Notes: github-actions[bot] 2025-08-08 10:55:29 +00:00

View file

@ -201,21 +201,27 @@ public:
// This is a wrapper that can model "polymorphic" stacks, // This is a wrapper that can model "polymorphic" stacks,
// by treating unknown stack entries as a potentially infinite number of entries // by treating unknown stack entries as a potentially infinite number of entries
class Stack : private Vector<StackEntry> { class Stack {
template<typename, typename> template<typename, typename>
friend struct AK::Formatter; friend struct AK::Formatter;
public: public:
Stack(Vector<Frame> const& frames) explicit Stack(Vector<Frame> const& frames)
: m_frames(frames) : m_frames(frames)
{ {
} }
using Vector<StackEntry>::is_empty; bool is_empty() const { return m_entries.is_empty(); }
using Vector<StackEntry>::last; auto& last() const { return m_entries.last(); }
using Vector<StackEntry>::at; auto& last() { return m_entries.last(); }
using Vector<StackEntry>::size; auto& at(size_t index) const { return m_entries.at(index); }
using Vector<StackEntry>::resize; auto& at(size_t index) { return m_entries.at(index); }
size_t size() const { return m_entries.size(); }
void resize(size_t size)
{
m_entries.resize(size);
m_max_known_size = max(m_max_known_size, size);
}
ErrorOr<StackEntry, ValidationError> take_last() ErrorOr<StackEntry, ValidationError> take_last()
{ {
@ -223,11 +229,11 @@ public:
return StackEntry(); return StackEntry();
if (size() == m_frames.last().initial_size) if (size() == m_frames.last().initial_size)
return Errors::invalid("stack state"sv, "<any>"sv, "<nothing>"sv); return Errors::invalid("stack state"sv, "<any>"sv, "<nothing>"sv);
return Vector<StackEntry>::take_last(); return m_entries.take_last();
} }
void append(StackEntry entry) void append(StackEntry entry)
{ {
Vector<StackEntry>::append(entry); m_entries.append(entry);
m_max_known_size = max(m_max_known_size, size()); m_max_known_size = max(m_max_known_size, size());
} }
@ -258,12 +264,13 @@ public:
Vector<StackEntry> release_vector() Vector<StackEntry> release_vector()
{ {
m_max_known_size = 0; m_max_known_size = 0;
return exchange(static_cast<Vector<StackEntry>&>(*this), Vector<StackEntry> {}); return exchange(m_entries, Vector<StackEntry> {});
} }
size_t max_known_size() const { return m_max_known_size; } size_t max_known_size() const { return m_max_known_size; }
private: private:
Vector<StackEntry> m_entries;
Vector<Frame> const& m_frames; Vector<Frame> const& m_frames;
size_t m_max_known_size { 0 }; size_t m_max_known_size { 0 };
}; };
@ -374,7 +381,7 @@ template<>
struct AK::Formatter<Wasm::Validator::Stack> : public AK::Formatter<Vector<Wasm::Validator::StackEntry>> { struct AK::Formatter<Wasm::Validator::Stack> : public AK::Formatter<Vector<Wasm::Validator::StackEntry>> {
ErrorOr<void> format(FormatBuilder& builder, Wasm::Validator::Stack const& value) ErrorOr<void> format(FormatBuilder& builder, Wasm::Validator::Stack const& value)
{ {
return Formatter<Vector<Wasm::Validator::StackEntry>>::format(builder, static_cast<Vector<Wasm::Validator::StackEntry> const&>(value)); return Formatter<Vector<Wasm::Validator::StackEntry>>::format(builder, value.m_entries);
} }
}; };