mirror of
https://git.suyu.dev/suyu/dynarmic.git
synced 2026-02-23 07:49:37 +00:00
mp: Generalize function information retrieval
Generalizes MemFnInfo to be compatible with all function types. Also adds type introspection for arguments, as well as helper templates for the common types supported by all partial specializations.
This commit is contained in:
@@ -22,7 +22,7 @@ namespace Arm {
|
||||
|
||||
template <typename Visitor>
|
||||
struct ArmMatcher {
|
||||
using CallRetT = typename mp::MemFnInfo<decltype(&Visitor::arm_UDF)>::return_type;
|
||||
using CallRetT = mp::return_type_t<decltype(&Visitor::arm_UDF)>;
|
||||
|
||||
ArmMatcher(const char* const name, u32 mask, u32 expect, std::function<CallRetT(Visitor&, u32)> fn)
|
||||
: name(name), mask(mask), expect(expect), fn(fn) {}
|
||||
|
||||
@@ -127,8 +127,8 @@ public:
|
||||
*/
|
||||
template<typename FnT>
|
||||
static auto GetMatcher(FnT fn, const char* const name, const char* const bitstring) {
|
||||
using Visitor = typename mp::MemFnInfo<FnT>::class_type;
|
||||
constexpr size_t args_count = mp::MemFnInfo<FnT>::args_count;
|
||||
using Visitor = typename mp::FunctionInfo<FnT>::class_type;
|
||||
constexpr size_t args_count = mp::FunctionInfo<FnT>::args_count;
|
||||
using Iota = std::make_index_sequence<args_count>;
|
||||
|
||||
const auto mask_and_expect = GetMaskAndExpect(bitstring);
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace Arm {
|
||||
|
||||
template <typename Visitor>
|
||||
struct Thumb16Matcher {
|
||||
using CallRetT = typename mp::MemFnInfo<decltype(&Visitor::thumb16_UDF)>::return_type;
|
||||
using CallRetT = mp::return_type_t<decltype(&Visitor::thumb16_UDF)>;
|
||||
|
||||
Thumb16Matcher(const char* const name, u16 mask, u16 expect, std::function<CallRetT(Visitor&, u16)> fn)
|
||||
: name(name), mask(mask), expect(expect), fn(fn) {}
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace Arm {
|
||||
|
||||
template <typename Visitor>
|
||||
struct Thumb32Matcher {
|
||||
using CallRetT = typename mp::MemFnInfo<decltype(&Visitor::thumb32_UDF)>::return_type;
|
||||
using CallRetT = mp::return_type_t<decltype(&Visitor::thumb32_UDF)>;
|
||||
|
||||
Thumb32Matcher(const char* const name, u32 mask, u32 expect, std::function<CallRetT(Visitor&, u32)> fn)
|
||||
: name(name), mask(mask), expect(expect), fn(fn) {}
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace Arm {
|
||||
|
||||
template <typename Visitor>
|
||||
struct VFP2Matcher {
|
||||
using CallRetT = typename mp::MemFnInfo<decltype(&Visitor::vfp2_VADD)>::return_type;
|
||||
using CallRetT = mp::return_type_t<decltype(&Visitor::vfp2_VADD)>;
|
||||
|
||||
VFP2Matcher(const char* const name, u32 mask, u32 expect, std::function<CallRetT(Visitor&, u32)> fn)
|
||||
: name(name), mask(mask), expect(expect), fn(fn) {}
|
||||
|
||||
Reference in New Issue
Block a user