diff options
-rw-r--r-- | src/core/hle/service/cmif_serialization.h | 6 | ||||
-rw-r--r-- | src/core/hle/service/cmif_types.h | 27 |
2 files changed, 31 insertions, 2 deletions
diff --git a/src/core/hle/service/cmif_serialization.h b/src/core/hle/service/cmif_serialization.h index 315475e71..e985fe317 100644 --- a/src/core/hle/service/cmif_serialization.h +++ b/src/core/hle/service/cmif_serialization.h @@ -115,6 +115,11 @@ struct ArgumentTraits { static constexpr ArgumentType Type = ArgumentType::InData; }; +template <typename... Ts> +consteval bool ConstIfReference() { + return ((!std::is_reference_v<Ts> || std::is_const_v<std::remove_reference_t<Ts>>) && ... && true); +} + struct RequestLayout { u32 copy_handle_count; u32 move_handle_count; @@ -435,6 +440,7 @@ void CmifReplyWrapImpl(HLERequestContext& ctx, T& t, Result (T::*f)(A...)) { } const bool is_domain = Domain ? ctx.GetManager()->IsDomain() : false; + static_assert(ConstIfReference<A...>(), "Arguments taken by reference must be const"); using MethodArguments = std::tuple<std::remove_cvref_t<A>...>; OutTemporaryBuffers buffers{}; diff --git a/src/core/hle/service/cmif_types.h b/src/core/hle/service/cmif_types.h index dc06169f4..84f4c2456 100644 --- a/src/core/hle/service/cmif_types.h +++ b/src/core/hle/service/cmif_types.h @@ -4,10 +4,9 @@ #pragma once #include <memory> +#include <span> -#include "common/common_funcs.h" #include "common/common_types.h" -#include "core/hle/service/hle_ipc.h" namespace Service { @@ -22,8 +21,10 @@ class Out { public: using Type = T; + /* implicit */ Out(const Out& t) : raw(t.raw) {} /* implicit */ Out(AutoOut<Type>& t) : raw(&t.raw) {} /* implicit */ Out(Type* t) : raw(t) {} + Out& operator=(const Out&) = delete; Type* Get() const { return raw; @@ -37,6 +38,10 @@ public: return raw; } + operator Type*() const { + return raw; + } + private: Type* raw; }; @@ -113,8 +118,10 @@ class OutCopyHandle { public: using Type = T*; + /* implicit */ OutCopyHandle(const OutCopyHandle& t) : raw(t.raw) {} /* implicit */ OutCopyHandle(AutoOut<Type>& t) : raw(&t.raw) {} /* implicit */ OutCopyHandle(Type* t) : raw(t) {} + OutCopyHandle& operator=(const OutCopyHandle&) = delete; Type* Get() const { return raw; @@ -128,6 +135,10 @@ public: return raw; } + operator Type*() const { + return raw; + } + private: Type* raw; }; @@ -137,8 +148,10 @@ class OutMoveHandle { public: using Type = T*; + /* implicit */ OutMoveHandle(const OutMoveHandle& t) : raw(t.raw) {} /* implicit */ OutMoveHandle(AutoOut<Type>& t) : raw(&t.raw) {} /* implicit */ OutMoveHandle(Type* t) : raw(t) {} + OutMoveHandle& operator=(const OutMoveHandle&) = delete; Type* Get() const { return raw; @@ -152,6 +165,10 @@ public: return raw; } + operator Type*() const { + return raw; + } + private: Type* raw; }; @@ -248,8 +265,10 @@ public: static constexpr BufferAttr Attr = static_cast<BufferAttr>(A | BufferAttr_In | BufferAttr_FixedSize); using Type = T; + /* implicit */ OutLargeData(const OutLargeData& t) : raw(t.raw) {} /* implicit */ OutLargeData(Type* t) : raw(t) {} /* implicit */ OutLargeData(AutoOut<T>& t) : raw(&t.raw) {} + OutLargeData& operator=(const OutLargeData&) = delete; Type* Get() const { return raw; @@ -263,6 +282,10 @@ public: return raw; } + operator Type*() const { + return raw; + } + private: Type* raw; }; |