mirror of
https://github.com/momo5502/emulator.git
synced 2026-01-22 21:21:03 +00:00
Fix argument adapters
This commit is contained in:
2
deps/unicorn
vendored
2
deps/unicorn
vendored
Submodule deps/unicorn updated: 6011de1c1e...6f2156dfac
@@ -5,28 +5,26 @@
|
||||
|
||||
#include <utils/object.hpp>
|
||||
|
||||
uint32_t resolve_indexed_argument_part(uint32_t* args, size_t& index)
|
||||
{
|
||||
return args[index++];
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T resolve_indexed_argument_internal(uint32_t* args, size_t& index)
|
||||
T resolve_indexed_argument_internal(size_t* args, size_t& index)
|
||||
{
|
||||
const auto a1 = resolve_indexed_argument_part(args, index);
|
||||
const auto a1 = args[index++];
|
||||
|
||||
if(sizeof(T) <= sizeof(a1)) {
|
||||
return (T)a1;
|
||||
if constexpr (sizeof(T) <= sizeof(a1) || sizeof(size_t) > 4)
|
||||
{
|
||||
return (T)(a1);
|
||||
}
|
||||
else
|
||||
{
|
||||
const auto a2 = args[index++];
|
||||
|
||||
const auto a2 = resolve_indexed_argument_part(args, index);
|
||||
|
||||
const auto arg = (a1 | ((uint64_t)a2 << 32));
|
||||
return (T)arg;
|
||||
const auto arg = (a1 | (static_cast<uint64_t>(a2) << 32));
|
||||
return (T)(arg);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T resolve_indexed_argument(uint32_t* args, size_t& index)
|
||||
T resolve_indexed_argument(size_t* args, size_t& index)
|
||||
{
|
||||
auto arg = resolve_indexed_argument_internal<T>(args, index);
|
||||
return arg;
|
||||
@@ -49,27 +47,28 @@ class function_wrapper2 : public utils::object
|
||||
|
||||
c_function_type* get_c_function() const
|
||||
{
|
||||
return (c_function_type*)(void*)+[](uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4,uint32_t a5,uint32_t a6,uint32_t a7,uint32_t a8,uint32_t a9,uint32_t a10,uint32_t a11,uint32_t a12)-> uint64_t {
|
||||
|
||||
uint32_t real_args[] {
|
||||
a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12
|
||||
};
|
||||
return (c_function_type*)(void*)+[](size_t a1, size_t a2, size_t a3, size_t a4, size_t a5, size_t a6, size_t a7,
|
||||
size_t a8, size_t a9, size_t a10, size_t a11, size_t a12) -> uint64_t {
|
||||
size_t real_args[]{a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12};
|
||||
|
||||
const auto lambda = +[](Args... args, user_data_pointer user_data) -> ReturnType {
|
||||
return (*static_cast<functor_type*>(user_data))(std::forward<Args>(args)...);
|
||||
};
|
||||
|
||||
size_t index = 0;
|
||||
std::tuple<Args..., user_data_pointer> func_args{resolve_indexed_argument<std::remove_cv_t<std::remove_reference_t<Args>>>(real_args, index)..., resolve_indexed_argument<user_data_pointer>(real_args, index)};
|
||||
std::tuple<Args..., user_data_pointer> func_args{
|
||||
resolve_indexed_argument<std::remove_cv_t<std::remove_reference_t<Args>>>(real_args, index)...,
|
||||
resolve_indexed_argument<user_data_pointer>(real_args, index)};
|
||||
|
||||
(void)index;
|
||||
(void)index;
|
||||
|
||||
if constexpr(!std::is_void_v<ReturnType>){
|
||||
return (uint64_t)std::apply(lambda, std::move(func_args));
|
||||
}
|
||||
|
||||
std::apply(lambda, std::move(func_args));
|
||||
return 0;
|
||||
if constexpr (!std::is_void_v<ReturnType>)
|
||||
{
|
||||
return (uint64_t)std::apply(lambda, std::move(func_args));
|
||||
}
|
||||
|
||||
std::apply(lambda, std::move(func_args));
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user