This repository has been archived on 2024-10-22. You can view files and clone it, but cannot push or open issues or pull requests.
YimMenu/BigBaseV2/src/invoker.cpp

53 lines
1.1 KiB
C++
Raw Normal View History

2019-03-21 20:18:31 +01:00
#include "common.hpp"
#include "crossmap.hpp"
#include "invoker.hpp"
#include "logger.hpp"
#include "pointers.hpp"
namespace big
{
native_call_context::native_call_context()
{
m_return_value = &m_return_stack[0];
m_args = &m_arg_stack[0];
}
2019-07-29 23:19:21 +02:00
void native_invoker::cache_handlers()
2019-03-21 20:18:31 +01:00
{
2019-07-29 23:19:21 +02:00
for (const rage::scrNativeMapping &mapping : g_crossmap)
2019-03-21 20:18:31 +01:00
{
2019-07-29 23:19:21 +02:00
rage::scrNativeHandler handler = g_pointers->m_get_native_handler(
g_pointers->m_native_registration_table, mapping.second);
2019-03-21 20:18:31 +01:00
2019-07-29 23:19:21 +02:00
m_handler_cache.emplace(mapping.first, handler);
}
2019-03-21 20:18:31 +01:00
}
void native_invoker::begin_call()
{
m_call_context.reset();
}
void native_invoker::end_call(rage::scrNativeHash hash)
{
2019-07-29 23:19:21 +02:00
if (auto it = m_handler_cache.find(hash); it != m_handler_cache.end())
2019-03-21 20:18:31 +01:00
{
2019-07-29 23:19:21 +02:00
rage::scrNativeHandler handler = it->second;
2019-03-21 20:18:31 +01:00
__try
{
handler(&m_call_context);
g_pointers->m_fix_vectors(&m_call_context);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
LOG_ERROR("Exception caught while trying to call 0x{:X} native.", hash);
}
}
else
{
LOG_ERROR("Failed to find 0x{:X} native's handler.", hash);
}
}
}