Skip to content

Commit dc688bd

Browse files
authored
Update CodeInjection.h (#193) (#347)
* Update CodeInjection.h * Update CodeInjection.h
1 parent 184c6b0 commit dc688bd

1 file changed

Lines changed: 21 additions & 12 deletions

File tree

patch_common/include/patch_common/CodeInjection.h

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ class CodeInjection2<T, decltype(std::declval<T>()(std::declval<BaseCodeInjectio
234234
public:
235235
CodeInjection2(uintptr_t addr, T handler, bool needs_trampoline) :
236236
BaseCodeInjectionWithRegsAccess(addr, reinterpret_cast<WrapperPtr>(&wrapper), needs_trampoline),
237-
m_functor(handler)
237+
m_functor(std::move(handler))
238238
{}
239239

240240
private:
@@ -253,8 +253,8 @@ class BaseCodeInjectionWithoutRegsAccess : public BaseCodeInjection
253253

254254
WrapperPtr m_wrapper_ptr;
255255

256-
BaseCodeInjectionWithoutRegsAccess(uintptr_t addr, WrapperPtr wrapper_ptr, bool needs_trampoline) :
257-
BaseCodeInjection(addr, needs_trampoline), m_wrapper_ptr(wrapper_ptr)
256+
BaseCodeInjectionWithoutRegsAccess(uintptr_t addr, WrapperPtr wrapper_ptr) :
257+
BaseCodeInjection(addr, true), m_wrapper_ptr(wrapper_ptr)
258258
{}
259259

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

268268
public:
269-
CodeInjection2(uintptr_t addr, T handler, bool needs_trampoline) :
270-
BaseCodeInjectionWithoutRegsAccess(addr, reinterpret_cast<WrapperPtr>(&wrapper), needs_trampoline),
271-
m_functor(handler)
269+
CodeInjection2(uintptr_t addr, T handler) :
270+
BaseCodeInjectionWithoutRegsAccess(addr, reinterpret_cast<WrapperPtr>(&wrapper)),
271+
m_functor(std::move(handler))
272272
{}
273273

274274
private:
@@ -278,11 +278,20 @@ class CodeInjection2<T, decltype(std::declval<T>()())> : public BaseCodeInjectio
278278
}
279279
};
280280

281-
template<typename T>
282-
class CodeInjection : public CodeInjection2<T>
283-
{
281+
template <typename T>
282+
class CodeInjection : public CodeInjection2<T> {
284283
public:
285-
CodeInjection(uintptr_t addr, T handler, bool needs_trampoline = true) :
286-
CodeInjection2<T>(addr, handler, needs_trampoline)
287-
{}
284+
CodeInjection(const uintptr_t addr, T handler)
285+
requires std::invocable<T&>
286+
: CodeInjection2<T>(addr, std::move(handler)) {
287+
}
288+
289+
CodeInjection(
290+
const uintptr_t addr,
291+
T handler,
292+
const bool needs_trampoline = true
293+
)
294+
requires std::invocable<T&, BaseCodeInjection::Regs&>
295+
: CodeInjection2<T>(addr, std::move(handler), needs_trampoline) {
296+
}
288297
};

0 commit comments

Comments
 (0)