Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 21 additions & 12 deletions patch_common/include/patch_common/CodeInjection.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ class CodeInjection2<T, decltype(std::declval<T>()(std::declval<BaseCodeInjectio
public:
CodeInjection2(uintptr_t addr, T handler, bool needs_trampoline) :
BaseCodeInjectionWithRegsAccess(addr, reinterpret_cast<WrapperPtr>(&wrapper), needs_trampoline),
m_functor(handler)
m_functor(std::move(handler))
{}

private:
Expand All @@ -253,8 +253,8 @@ class BaseCodeInjectionWithoutRegsAccess : public BaseCodeInjection

WrapperPtr m_wrapper_ptr;

BaseCodeInjectionWithoutRegsAccess(uintptr_t addr, WrapperPtr wrapper_ptr, bool needs_trampoline) :
BaseCodeInjection(addr, needs_trampoline), m_wrapper_ptr(wrapper_ptr)
BaseCodeInjectionWithoutRegsAccess(uintptr_t addr, WrapperPtr wrapper_ptr) :
BaseCodeInjection(addr, true), m_wrapper_ptr(wrapper_ptr)
{}

void emit_code(AsmWriter& asm_writter, void* trampoline) override;
Expand All @@ -266,9 +266,9 @@ class CodeInjection2<T, decltype(std::declval<T>()())> : public BaseCodeInjectio
T m_functor;

public:
CodeInjection2(uintptr_t addr, T handler, bool needs_trampoline) :
BaseCodeInjectionWithoutRegsAccess(addr, reinterpret_cast<WrapperPtr>(&wrapper), needs_trampoline),
m_functor(handler)
CodeInjection2(uintptr_t addr, T handler) :
BaseCodeInjectionWithoutRegsAccess(addr, reinterpret_cast<WrapperPtr>(&wrapper)),
m_functor(std::move(handler))
{}

private:
Expand All @@ -278,11 +278,20 @@ class CodeInjection2<T, decltype(std::declval<T>()())> : public BaseCodeInjectio
}
};

template<typename T>
class CodeInjection : public CodeInjection2<T>
{
template <typename T>
class CodeInjection : public CodeInjection2<T> {
public:
CodeInjection(uintptr_t addr, T handler, bool needs_trampoline = true) :
CodeInjection2<T>(addr, handler, needs_trampoline)
{}
CodeInjection(const uintptr_t addr, T handler)
requires std::invocable<T&>
: CodeInjection2<T>(addr, std::move(handler)) {
}

CodeInjection(
const uintptr_t addr,
T handler,
const bool needs_trampoline = true
)
requires std::invocable<T&, BaseCodeInjection::Regs&>
: CodeInjection2<T>(addr, std::move(handler), needs_trampoline) {
}
};
Loading