40 lines
1.4 KiB
C++
40 lines
1.4 KiB
C++
#include "function.h"
|
|
|
|
// Virtual Function Information
|
|
template <typename T>
|
|
__VirtualFunctionInfo<T>::__VirtualFunctionInfo(T *const addr_, void *const parent_):
|
|
addr(addr_),
|
|
parent(parent_) {}
|
|
template <typename T>
|
|
bool __VirtualFunctionInfo<T>::can_overwrite() const {
|
|
return ((void *) *addr) != parent;
|
|
}
|
|
|
|
// Function Information
|
|
template <typename Ret, typename... Args>
|
|
__Function<Ret(Args...)>::__Function(const char *const name_, const __Function<Ret(Args...)>::ptr_type func_, const __Function<Ret(Args...)>::ptr_type thunk_):
|
|
is_virtual(false),
|
|
func(func_),
|
|
enabled(true),
|
|
name(name_),
|
|
backup(func_),
|
|
thunk(thunk_) {}
|
|
template <typename Ret, typename... Args>
|
|
__Function<Ret(Args...)>::__Function(const char *const name_, __Function<Ret(Args...)>::ptr_type *const func_, void *const parent, const __Function<Ret(Args...)>::ptr_type thunk_):
|
|
is_virtual(true),
|
|
func(__VirtualFunctionInfo(func_, parent)),
|
|
enabled(std::get<__VirtualFunctionInfo<ptr_type>>(func).can_overwrite()),
|
|
name(name_),
|
|
backup(*get_vtable_addr()),
|
|
thunk(thunk_) {}
|
|
|
|
// Thunks
|
|
template <typename Ret, typename... Args>
|
|
void __Function<Ret(Args...)>::enable_thunk(const thunk_enabler_t &thunk_enabler) {
|
|
if (enabled) {
|
|
ptr_type real_thunk = (ptr_type) thunk_enabler((void *) get(), (void *) thunk);
|
|
if (!is_virtual) {
|
|
func = real_thunk;
|
|
}
|
|
}
|
|
} |