3737namespace godot {
3838
3939class 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; }
4051};
4152
4253namespace internal {
@@ -51,21 +62,26 @@ Callable create_callable_from_ccmp(CallableCustomMethodPointerBase *p_callable_m
5162
5263template <class T , class ... P>
5364class 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 );
5670
5771public:
5872virtual ObjectID get_object () const override {
59- return ObjectID (instance->get_instance_id ());
73+ return ObjectID (data. instance ->get_instance_id ());
6074}
6175
6276virtual 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);
6478}
6579
6680CallableCustomMethodPointer (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));
6985}
7086};
7187
@@ -82,22 +98,27 @@ Callable create_custom_callable_function_pointer(T *p_instance, void (T::*p_meth
8298
8399template <class T , class R , class ... P>
84100class 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 );
88107
89108public:
90109virtual ObjectID get_object () const override {
91- return ObjectID (instance->get_instance_id ());
110+ return ObjectID (data. instance ->get_instance_id ());
92111}
93112
94113virtual 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);
96115}
97116
98117CallableCustomMethodPointerRet (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));
101122}
102123};
103124
@@ -114,22 +135,27 @@ Callable create_custom_callable_function_pointer(T *p_instance, R (T::*p_method)
114135
115136template <class T , class R , class ... P>
116137class 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 );
120144
121145public:
122146virtual ObjectID get_object () const override {
123- return ObjectID (instance->get_instance_id ());
147+ return ObjectID (data. instance ->get_instance_id ());
124148}
125149
126150virtual 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);
128152}
129153
130154CallableCustomMethodPointerRetC (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));
133159}
134160};
135161
@@ -146,20 +172,25 @@ Callable create_custom_callable_function_pointer(const T *p_instance, R (T::*p_m
146172
147173template <class ... P>
148174class CallableCustomStaticMethodPointer : public CallableCustomMethodPointerBase {
149- void (*method)(P...);
175+ struct Data {
176+ void (*method)(P...);
177+ } data;
178+ static_assert (sizeof (Data) % 4 == 0 );
150179
151180public:
152181virtual ObjectID get_object () const override {
153182return ObjectID ();
154183}
155184
156185virtual 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);
158187r_return_value = Variant ();
159188}
160189
161190CallableCustomStaticMethodPointer (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));
163194}
164195};
165196
@@ -176,20 +207,25 @@ Callable create_custom_callable_static_function_pointer(void (*p_method)(P...))
176207
177208template <class R , class ... P>
178209class 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 );
181215
182216public:
183217virtual ObjectID get_object () const override {
184218return ObjectID ();
185219}
186220
187221virtual 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);
189223}
190224
191225CallableCustomStaticMethodPointerRet (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));
193229}
194230};
195231
0 commit comments