Fix argument adapters

This commit is contained in:
momo5502
2025-04-17 20:31:33 +02:00
parent 4e836cef49
commit 00353e9a16
2 changed files with 27 additions and 28 deletions

2
deps/unicorn vendored

View File

@@ -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;
};
}