LibACPI: Add a failable way to clone an Object

This will be needed in the kernel.
This commit is contained in:
Undefine authored and Sönke Holz committed 2026-11-07 13:27:30 +01:00
1 parent 3db136af6e
commit ee1cf23dec
3 files changed
+51

No files matched your search

@@ -2,6 +2,7 @@ set(SOURCES
Interpreter.cpp
NameString.cpp
Node.cpp
Object.cpp
OpcodeFilters.cpp
OpcodeFrame.cpp
Table.cpp
+42
View File
@@ -0,0 +1,42 @@
/*
* Copyright (c) 2026, Undefine <[email protected]>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "Object.h"
namespace ACPI::AML {
ErrorOr<String> String::clone() const
{
return String(TRY(m_buffer.clone()));
}
ErrorOr<Buffer> Buffer::clone() const
{
return Buffer(TRY(m_buffer.clone()));
}
ErrorOr<Package> Package::clone() const
{
Vector<Object> package;
TRY(package.try_ensure_capacity(m_package.size()));
for (auto const& object : m_package)
package.unchecked_append(TRY(object.clone()));
return Package(move(package));
}
ErrorOr<Object> Object::clone() const
{
return m_data.visit(
[](AK::Empty) -> ErrorOr<Object> { return Object(); },
[](u64 value) -> ErrorOr<Object> { return value; },
[](String const& value) -> ErrorOr<Object> { return TRY(value.clone()); },
[](Buffer const& value) -> ErrorOr<Object> { return TRY(value.clone()); },
[](Package const& value) -> ErrorOr<Object> { return TRY(value.clone()); },
[](NameString const& value) -> ErrorOr<Object> { return TRY(value.clone()); });
}
}
+8
View File
@@ -27,6 +27,8 @@ public:
ByteBuffer const& buffer() const { return m_buffer; }
ErrorOr<String> clone() const;
private:
ByteBuffer m_buffer;
};
@@ -40,6 +42,8 @@ public:
ByteBuffer const& buffer() const { return m_buffer; }
ErrorOr<Buffer> clone() const;
private:
ByteBuffer m_buffer;
};
@@ -53,6 +57,8 @@ public:
Vector<Object> const& package() const { return m_package; }
ErrorOr<Package> clone() const;
private:
Vector<Object> m_package;
};
@@ -107,6 +113,8 @@ public:
return Error::from_string_view_or_print_error_and_return_errno("Can not cast given type!"sv, EINVAL);
}
ErrorOr<Object> clone() const;
protected:
Variant<AK::Empty, u64, String, Buffer, Package, NameString> m_data;
};