Skip to content

Commit f60e18b

Browse files
committed
replaced with table offset
1 parent 0769d3d commit f60e18b

2 files changed

Lines changed: 14 additions & 12 deletions

File tree

include/omath/rev_eng/internal_rev_object.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,11 @@ namespace omath::rev_eng
116116
return call_method<ReturnType>(vtable[Id], arg_list...);
117117
}
118118

119-
template<std::size_t TableIndex, std::size_t Id, class ReturnType>
119+
template<std::ptrdiff_t TableOffset, std::size_t Id, class ReturnType>
120120
ReturnType call_virtual_method(auto... arg_list)
121121
{
122122
auto sub_this = reinterpret_cast<void*>(
123-
reinterpret_cast<std::uintptr_t>(this) + TableIndex * sizeof(std::uintptr_t));
123+
reinterpret_cast<std::uintptr_t>(this) + TableOffset);
124124
const auto vtable = *reinterpret_cast<void***>(sub_this);
125125
#ifdef _MSC_VER
126126
using Fn = ReturnType(__thiscall*)(void*, decltype(arg_list)...);
@@ -129,11 +129,11 @@ namespace omath::rev_eng
129129
#endif
130130
return reinterpret_cast<Fn>(vtable[Id])(sub_this, arg_list...);
131131
}
132-
template<std::size_t TableIndex, std::size_t Id, class ReturnType>
132+
template<std::ptrdiff_t TableOffset, std::size_t Id, class ReturnType>
133133
ReturnType call_virtual_method(auto... arg_list) const
134134
{
135135
auto sub_this = reinterpret_cast<const void*>(
136-
reinterpret_cast<std::uintptr_t>(this) + TableIndex * sizeof(std::uintptr_t));
136+
reinterpret_cast<std::uintptr_t>(this) + TableOffset);
137137
const auto vtable = *reinterpret_cast<void* const* const*>(sub_this);
138138
#ifdef _MSC_VER
139139
using Fn = ReturnType(__thiscall*)(const void*, decltype(arg_list)...);

tests/general/unit_test_reverse_enineering.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,20 @@ class MultiPlayer final : public BaseA, public BaseB
5252

5353
class RevMultiPlayer final : omath::rev_eng::InternalReverseEngineeredObject
5454
{
55+
static constexpr std::ptrdiff_t TABLE_A_OFFSET = 0;
56+
static constexpr std::ptrdiff_t TABLE_B_OFFSET = sizeof(void*);
5557
public:
56-
// Table 0 (BaseA vtable): index 0 = get_a, 1 = get_a2
57-
[[nodiscard]] int rev_get_a() const { return call_virtual_method<0, 0, int>(); }
58-
[[nodiscard]] int rev_get_a2() const { return call_virtual_method<0, 1, int>(); }
58+
// Table at offset 0 (BaseA vtable): index 0 = get_a, 1 = get_a2
59+
[[nodiscard]] int rev_get_a() const { return call_virtual_method<TABLE_A_OFFSET, 0, int>(); }
60+
[[nodiscard]] int rev_get_a2() const { return call_virtual_method<TABLE_A_OFFSET, 1, int>(); }
5961

60-
// Table 1 (BaseB vtable): index 0 = get_b, 1 = get_b2
61-
[[nodiscard]] int rev_get_b() const { return call_virtual_method<1, 0, int>(); }
62-
[[nodiscard]] int rev_get_b2() const { return call_virtual_method<1, 1, int>(); }
62+
// Table at offset sizeof(void*) (BaseB vtable): index 0 = get_b, 1 = get_b2
63+
[[nodiscard]] int rev_get_b() const { return call_virtual_method<TABLE_B_OFFSET, 0, int>(); }
64+
[[nodiscard]] int rev_get_b2() const { return call_virtual_method<TABLE_B_OFFSET, 1, int>(); }
6365

6466
// Non-const versions
65-
int rev_get_a_mut() { return call_virtual_method<0, 0, int>(); }
66-
int rev_get_b_mut() { return call_virtual_method<1, 0, int>(); }
67+
int rev_get_a_mut() { return call_virtual_method<TABLE_A_OFFSET, 0, int>(); }
68+
int rev_get_b_mut() { return call_virtual_method<TABLE_B_OFFSET, 0, int>(); }
6769
};
6870

6971
class RevPlayer final : omath::rev_eng::InternalReverseEngineeredObject

0 commit comments

Comments
 (0)