#pragma once #include #include #include #include #include namespace Kernel::ACPI::AML { struct SizeOf { static ParseResult parse(ParseContext& context) { ASSERT(context.aml_data.size() >= 1); ASSERT(static_cast(context.aml_data[0]) == Byte::SizeOfOp); context.aml_data = context.aml_data.slice(1); auto object_result = AML::parse_object(context); if (!object_result.success()) return ParseResult::Failure; auto object = object_result.node()->evaluate(); if (object && object->type == AML::Node::Type::Reference) object = static_cast(object.ptr())->node->evaluate(); if (!object) { AML_ERROR("SizeOf object is null"); return ParseResult::Failure; } uint64_t size = 0; switch (object->type) { case AML::Node::Type::Buffer: size = static_cast(object.ptr())->buffer.size(); break; case AML::Node::Type::String: size = static_cast(object.ptr())->string.size(); break; case AML::Node::Type::Package: size = static_cast(object.ptr())->elements.size(); break; default: AML_ERROR("SizeOf object is not a buffer, string or package ({})", static_cast(object->type)); return ParseResult::Failure; } return ParseResult(MUST(BAN::RefPtr::create(size))); } }; }