#pragma once #include #include #include #include namespace Kernel::ACPI::AML { struct CopyObject { static ParseResult parse(ParseContext& context) { ASSERT(context.aml_data.size() >= 1); ASSERT(static_cast(context.aml_data[0]) == Byte::CopyObjectOp); context.aml_data = context.aml_data.slice(1); auto source_result = AML::parse_object(context); if (!source_result.success()) return ParseResult::Failure; auto source = source_result.node() ? source_result.node()->to_underlying() : BAN::RefPtr(); if (!source) { AML_ERROR("CopyObject source is null"); return ParseResult::Failure; } auto destination_result = AML::parse_object(context); if (!destination_result.success()) return ParseResult::Failure; auto destination = destination_result.node(); if (!destination) { AML_ERROR("CopyObject destination is null"); return ParseResult::Failure; } #if AML_DEBUG_LEVEL >= 2 AML_DEBUG_PRINTLN("CopyObject {"); source->debug_print(1); AML_DEBUG_PRINTLN(""); AML_DEBUG_PRINTLN("} to {"); destination->debug_print(1); AML_DEBUG_PRINTLN(""); AML_DEBUG_PRINTLN("}"); #endif switch (destination->type) { case AML::Node::Type::Name: static_cast(destination.ptr())->object = source->copy(); return source; case AML::Node::Type::Register: static_cast(destination.ptr())->value = source->copy(); return source; default: ASSERT_NOT_REACHED(); } } }; }