diff --git a/include/omath/rev_eng/internal_rev_object.hpp b/include/omath/rev_eng/internal_rev_object.hpp index 4925230..6955e9a 100644 --- a/include/omath/rev_eng/internal_rev_object.hpp +++ b/include/omath/rev_eng/internal_rev_object.hpp @@ -116,11 +116,11 @@ namespace omath::rev_eng return call_method(vtable[Id], arg_list...); } - template + template ReturnType call_virtual_method(auto... arg_list) { auto sub_this = reinterpret_cast( - reinterpret_cast(this) + TableIndex * sizeof(std::uintptr_t)); + reinterpret_cast(this) + TableOffset); const auto vtable = *reinterpret_cast(sub_this); #ifdef _MSC_VER using Fn = ReturnType(__thiscall*)(void*, decltype(arg_list)...); @@ -129,11 +129,11 @@ namespace omath::rev_eng #endif return reinterpret_cast(vtable[Id])(sub_this, arg_list...); } - template + template ReturnType call_virtual_method(auto... arg_list) const { auto sub_this = reinterpret_cast( - reinterpret_cast(this) + TableIndex * sizeof(std::uintptr_t)); + reinterpret_cast(this) + TableOffset); const auto vtable = *reinterpret_cast(sub_this); #ifdef _MSC_VER using Fn = ReturnType(__thiscall*)(const void*, decltype(arg_list)...); diff --git a/tests/general/unit_test_reverse_enineering.cpp b/tests/general/unit_test_reverse_enineering.cpp index 2736cf2..bf28afc 100644 --- a/tests/general/unit_test_reverse_enineering.cpp +++ b/tests/general/unit_test_reverse_enineering.cpp @@ -52,18 +52,20 @@ public: class RevMultiPlayer final : omath::rev_eng::InternalReverseEngineeredObject { + static constexpr std::ptrdiff_t TABLE_A_OFFSET = 0; + static constexpr std::ptrdiff_t TABLE_B_OFFSET = sizeof(void*); public: - // Table 0 (BaseA vtable): index 0 = get_a, 1 = get_a2 - [[nodiscard]] int rev_get_a() const { return call_virtual_method<0, 0, int>(); } - [[nodiscard]] int rev_get_a2() const { return call_virtual_method<0, 1, int>(); } + // Table at offset 0 (BaseA vtable): index 0 = get_a, 1 = get_a2 + [[nodiscard]] int rev_get_a() const { return call_virtual_method(); } + [[nodiscard]] int rev_get_a2() const { return call_virtual_method(); } - // Table 1 (BaseB vtable): index 0 = get_b, 1 = get_b2 - [[nodiscard]] int rev_get_b() const { return call_virtual_method<1, 0, int>(); } - [[nodiscard]] int rev_get_b2() const { return call_virtual_method<1, 1, int>(); } + // Table at offset sizeof(void*) (BaseB vtable): index 0 = get_b, 1 = get_b2 + [[nodiscard]] int rev_get_b() const { return call_virtual_method(); } + [[nodiscard]] int rev_get_b2() const { return call_virtual_method(); } // Non-const versions - int rev_get_a_mut() { return call_virtual_method<0, 0, int>(); } - int rev_get_b_mut() { return call_virtual_method<1, 0, int>(); } + int rev_get_a_mut() { return call_virtual_method(); } + int rev_get_b_mut() { return call_virtual_method(); } }; class RevPlayer final : omath::rev_eng::InternalReverseEngineeredObject