37
37
namespace godot {
38
38
39
39
class CallableCustomMethodPointerBase : public CallableCustomBase {
40
+ uint32_t *comp_ptr = nullptr ;
41
+ uint32_t comp_size;
42
+ uint32_t h;
43
+
44
+ protected:
45
+ void _setup (uint32_t *p_base_ptr, uint32_t p_ptr_size);
46
+
47
+ public:
48
+ _FORCE_INLINE_ const uint32_t *get_comp_ptr () const { return comp_ptr; }
49
+ _FORCE_INLINE_ uint32_t get_comp_size () const { return comp_size; }
50
+ _FORCE_INLINE_ uint32_t get_hash () const { return h; }
40
51
};
41
52
42
53
namespace internal {
@@ -51,21 +62,26 @@ Callable create_callable_from_ccmp(CallableCustomMethodPointerBase *p_callable_m
51
62
52
63
template <class T , class ... P>
53
64
class CallableCustomMethodPointer : public CallableCustomMethodPointerBase {
54
- T *instance;
55
- void (T::*method)(P...);
65
+ struct Data {
66
+ T *instance;
67
+ void (T::*method)(P...);
68
+ } data;
69
+ static_assert (sizeof (Data) % 4 == 0 );
56
70
57
71
public:
58
72
virtual ObjectID get_object () const override {
59
- return ObjectID (instance->get_instance_id ());
73
+ return ObjectID (data. instance ->get_instance_id ());
60
74
}
61
75
62
76
virtual void call (const Variant **p_arguments, int p_argcount, Variant &r_return_value, GDExtensionCallError &r_call_error) const override {
63
- call_with_variant_args (instance, method, p_arguments, p_argcount, r_call_error);
77
+ call_with_variant_args (data. instance , data. method , p_arguments, p_argcount, r_call_error);
64
78
}
65
79
66
80
CallableCustomMethodPointer (T *p_instance, void (T::*p_method)(P...)) {
67
- instance = p_instance;
68
- method = p_method;
81
+ memset (&data, 0 , sizeof (Data));
82
+ data.instance = p_instance;
83
+ data.method = p_method;
84
+ _setup ((uint32_t *)&data, sizeof (Data));
69
85
}
70
86
};
71
87
@@ -82,22 +98,27 @@ Callable create_custom_callable_function_pointer(T *p_instance, void (T::*p_meth
82
98
83
99
template <class T , class R , class ... P>
84
100
class CallableCustomMethodPointerRet : public CallableCustomMethodPointerBase {
85
- T *instance;
86
- R (T::*method)
87
- (P...);
101
+ struct Data {
102
+ T *instance;
103
+ R (T::*method)
104
+ (P...);
105
+ } data;
106
+ static_assert (sizeof (Data) % 4 == 0 );
88
107
89
108
public:
90
109
virtual ObjectID get_object () const override {
91
- return ObjectID (instance->get_instance_id ());
110
+ return ObjectID (data. instance ->get_instance_id ());
92
111
}
93
112
94
113
virtual void call (const Variant **p_arguments, int p_argcount, Variant &r_return_value, GDExtensionCallError &r_call_error) const override {
95
- call_with_variant_args_ret (instance, method, p_arguments, p_argcount, r_return_value, r_call_error);
114
+ call_with_variant_args_ret (data. instance , data. method , p_arguments, p_argcount, r_return_value, r_call_error);
96
115
}
97
116
98
117
CallableCustomMethodPointerRet (T *p_instance, R (T::*p_method)(P...)) {
99
- instance = p_instance;
100
- method = p_method;
118
+ memset (&data, 0 , sizeof (Data));
119
+ data.instance = p_instance;
120
+ data.method = p_method;
121
+ _setup ((uint32_t *)&data, sizeof (Data));
101
122
}
102
123
};
103
124
@@ -114,22 +135,27 @@ Callable create_custom_callable_function_pointer(T *p_instance, R (T::*p_method)
114
135
115
136
template <class T , class R , class ... P>
116
137
class CallableCustomMethodPointerRetC : public CallableCustomMethodPointerBase {
117
- T *instance;
118
- R (T::*method)
119
- (P...) const ;
138
+ struct Data {
139
+ T *instance;
140
+ R (T::*method)
141
+ (P...) const ;
142
+ } data;
143
+ static_assert (sizeof (Data) % 4 == 0 );
120
144
121
145
public:
122
146
virtual ObjectID get_object () const override {
123
- return ObjectID (instance->get_instance_id ());
147
+ return ObjectID (data. instance ->get_instance_id ());
124
148
}
125
149
126
150
virtual void call (const Variant **p_arguments, int p_argcount, Variant &r_return_value, GDExtensionCallError &r_call_error) const override {
127
- call_with_variant_args_retc (instance, method, p_arguments, p_argcount, r_return_value, r_call_error);
151
+ call_with_variant_args_retc (data. instance , data. method , p_arguments, p_argcount, r_return_value, r_call_error);
128
152
}
129
153
130
154
CallableCustomMethodPointerRetC (const T *p_instance, R (T::*p_method)(P...) const ) {
131
- instance = const_cast <T *>(p_instance);
132
- method = p_method;
155
+ memset (&data, 0 , sizeof (Data));
156
+ data.instance = const_cast <T *>(p_instance);
157
+ data.method = p_method;
158
+ _setup ((uint32_t *)&data, sizeof (Data));
133
159
}
134
160
};
135
161
@@ -146,20 +172,25 @@ Callable create_custom_callable_function_pointer(const T *p_instance, R (T::*p_m
146
172
147
173
template <class ... P>
148
174
class CallableCustomStaticMethodPointer : public CallableCustomMethodPointerBase {
149
- void (*method)(P...);
175
+ struct Data {
176
+ void (*method)(P...);
177
+ } data;
178
+ static_assert (sizeof (Data) % 4 == 0 );
150
179
151
180
public:
152
181
virtual ObjectID get_object () const override {
153
182
return ObjectID ();
154
183
}
155
184
156
185
virtual void call (const Variant **p_arguments, int p_argcount, Variant &r_return_value, GDExtensionCallError &r_call_error) const override {
157
- call_with_variant_args_static_ret (method, p_arguments, p_argcount, r_return_value, r_call_error);
186
+ call_with_variant_args_static_ret (data. method , p_arguments, p_argcount, r_return_value, r_call_error);
158
187
r_return_value = Variant ();
159
188
}
160
189
161
190
CallableCustomStaticMethodPointer (void (*p_method)(P...)) {
162
- method = p_method;
191
+ memset (&data, 0 , sizeof (Data));
192
+ data.method = p_method;
193
+ _setup ((uint32_t *)&data, sizeof (Data));
163
194
}
164
195
};
165
196
@@ -176,20 +207,25 @@ Callable create_custom_callable_static_function_pointer(void (*p_method)(P...))
176
207
177
208
template <class R , class ... P>
178
209
class CallableCustomStaticMethodPointerRet : public CallableCustomMethodPointerBase {
179
- R (*method)
180
- (P...);
210
+ struct Data {
211
+ R (*method)
212
+ (P...);
213
+ } data;
214
+ static_assert (sizeof (Data) % 4 == 0 );
181
215
182
216
public:
183
217
virtual ObjectID get_object () const override {
184
218
return ObjectID ();
185
219
}
186
220
187
221
virtual void call (const Variant **p_arguments, int p_argcount, Variant &r_return_value, GDExtensionCallError &r_call_error) const override {
188
- call_with_variant_args_static_ret (method, p_arguments, p_argcount, r_return_value, r_call_error);
222
+ call_with_variant_args_static_ret (data. method , p_arguments, p_argcount, r_return_value, r_call_error);
189
223
}
190
224
191
225
CallableCustomStaticMethodPointerRet (R (*p_method)(P...)) {
192
- method = p_method;
226
+ memset (&data, 0 , sizeof (Data));
227
+ data.method = p_method;
228
+ _setup ((uint32_t *)&data, sizeof (Data));
193
229
}
194
230
};
195
231
0 commit comments