Skip to content

Commit cb42bf1

Browse files
authored
Merge pull request #44406 from vnen/variant-ptr-construct
Add PtrConstruct template to use in Variant constructors
2 parents 94b15bf + b3f452b commit cb42bf1

File tree

2 files changed

+70
-13
lines changed

2 files changed

+70
-13
lines changed

core/variant/method_ptrcall.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ struct PtrToArg {};
100100
}
101101

102102
MAKE_PTRARG(bool);
103+
// Integer types.
103104
MAKE_PTRARGCONV(uint8_t, int64_t);
104105
MAKE_PTRARGCONV(int8_t, int64_t);
105106
MAKE_PTRARGCONV(uint16_t, int64_t);
@@ -108,15 +109,16 @@ MAKE_PTRARGCONV(uint32_t, int64_t);
108109
MAKE_PTRARGCONV(int32_t, int64_t);
109110
MAKE_PTRARG(int64_t);
110111
MAKE_PTRARG(uint64_t);
112+
// Float types
111113
MAKE_PTRARGCONV(float, double);
112114
MAKE_PTRARG(double);
113115

114116
MAKE_PTRARG(String);
115117
MAKE_PTRARG(Vector2);
116-
MAKE_PTRARG(Rect2);
117-
MAKE_PTRARG_BY_REFERENCE(Vector3);
118118
MAKE_PTRARG(Vector2i);
119+
MAKE_PTRARG(Rect2);
119120
MAKE_PTRARG(Rect2i);
121+
MAKE_PTRARG_BY_REFERENCE(Vector3);
120122
MAKE_PTRARG_BY_REFERENCE(Vector3i);
121123
MAKE_PTRARG(Transform2D);
122124
MAKE_PTRARG_BY_REFERENCE(Plane);
@@ -128,9 +130,10 @@ MAKE_PTRARG_BY_REFERENCE(Color);
128130
MAKE_PTRARG(StringName);
129131
MAKE_PTRARG(NodePath);
130132
MAKE_PTRARG(RID);
131-
MAKE_PTRARG(Dictionary);
133+
// Object doesn't need this.
132134
MAKE_PTRARG(Callable);
133135
MAKE_PTRARG(Signal);
136+
MAKE_PTRARG(Dictionary);
134137
MAKE_PTRARG(Array);
135138
MAKE_PTRARG(PackedByteArray);
136139
MAKE_PTRARG(PackedInt32Array);

core/variant/variant_construct.cpp

+64-10
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,60 @@
3939
#include "core/templates/local_vector.h"
4040
#include "core/templates/oa_hash_map.h"
4141

42+
template <class T>
43+
struct PtrConstruct {};
44+
45+
#define MAKE_PTRCONSTRUCT(m_type) \
46+
template <> \
47+
struct PtrConstruct<m_type> { \
48+
_FORCE_INLINE_ static void construct(const m_type &p_value, void *p_ptr) { \
49+
memnew_placement(p_ptr, m_type(p_value)); \
50+
} \
51+
};
52+
53+
MAKE_PTRCONSTRUCT(bool);
54+
MAKE_PTRCONSTRUCT(int64_t);
55+
MAKE_PTRCONSTRUCT(double);
56+
MAKE_PTRCONSTRUCT(String);
57+
MAKE_PTRCONSTRUCT(Vector2);
58+
MAKE_PTRCONSTRUCT(Vector2i);
59+
MAKE_PTRCONSTRUCT(Rect2);
60+
MAKE_PTRCONSTRUCT(Rect2i);
61+
MAKE_PTRCONSTRUCT(Vector3);
62+
MAKE_PTRCONSTRUCT(Vector3i);
63+
MAKE_PTRCONSTRUCT(Transform2D);
64+
MAKE_PTRCONSTRUCT(Plane);
65+
MAKE_PTRCONSTRUCT(Quat);
66+
MAKE_PTRCONSTRUCT(AABB);
67+
MAKE_PTRCONSTRUCT(Basis);
68+
MAKE_PTRCONSTRUCT(Transform);
69+
MAKE_PTRCONSTRUCT(Color);
70+
MAKE_PTRCONSTRUCT(StringName);
71+
MAKE_PTRCONSTRUCT(NodePath);
72+
MAKE_PTRCONSTRUCT(RID);
73+
74+
template <>
75+
struct PtrConstruct<Object *> {
76+
_FORCE_INLINE_ static void construct(Object *p_value, void *p_ptr) {
77+
*((Object **)p_ptr) = p_value;
78+
}
79+
};
80+
81+
MAKE_PTRCONSTRUCT(Callable);
82+
MAKE_PTRCONSTRUCT(Signal);
83+
MAKE_PTRCONSTRUCT(Dictionary);
84+
MAKE_PTRCONSTRUCT(Array);
85+
MAKE_PTRCONSTRUCT(PackedByteArray);
86+
MAKE_PTRCONSTRUCT(PackedInt32Array);
87+
MAKE_PTRCONSTRUCT(PackedInt64Array);
88+
MAKE_PTRCONSTRUCT(PackedFloat32Array);
89+
MAKE_PTRCONSTRUCT(PackedFloat64Array);
90+
MAKE_PTRCONSTRUCT(PackedStringArray);
91+
MAKE_PTRCONSTRUCT(PackedVector2Array);
92+
MAKE_PTRCONSTRUCT(PackedVector3Array);
93+
MAKE_PTRCONSTRUCT(PackedColorArray);
94+
MAKE_PTRCONSTRUCT(Variant);
95+
4296
template <class T, class... P>
4397
class VariantConstructor {
4498
template <size_t... Is>
@@ -59,7 +113,7 @@ class VariantConstructor {
59113

60114
template <size_t... Is>
61115
static _FORCE_INLINE_ void ptr_construct_helper(void *base, const void **p_args, IndexSequence<Is...>) {
62-
PtrToArg<T>::encode(T(PtrToArg<P>::convert(p_args[Is])...), base);
116+
PtrConstruct<T>::construct(T(PtrToArg<P>::convert(p_args[Is])...), base);
63117
}
64118

65119
public:
@@ -112,7 +166,7 @@ class VariantConstructorObject {
112166
VariantInternal::object_assign(r_ret, p_args[0]);
113167
}
114168
static void ptr_construct(void *base, const void **p_args) {
115-
PtrToArg<Object *>::encode(PtrToArg<Object *>::convert(p_args[0]), base);
169+
PtrConstruct<Object *>::construct(PtrToArg<Object *>::convert(p_args[0]), base);
116170
}
117171

118172
static int get_argument_count() {
@@ -146,7 +200,7 @@ class VariantConstructorNilObject {
146200
VariantInternal::object_assign_null(r_ret);
147201
}
148202
static void ptr_construct(void *base, const void **p_args) {
149-
PtrToArg<Object *>::encode(nullptr, base);
203+
PtrConstruct<Object *>::construct(nullptr, base);
150204
}
151205

152206
static int get_argument_count() {
@@ -199,7 +253,7 @@ class VariantConstructorCallableArgs {
199253
*VariantGetInternalPtr<Callable>::get_ptr(r_ret) = Callable(VariantInternal::get_object_id(p_args[0]), *VariantGetInternalPtr<StringName>::get_ptr(p_args[1]));
200254
}
201255
static void ptr_construct(void *base, const void **p_args) {
202-
PtrToArg<Callable>::encode(Callable(PtrToArg<Object *>::convert(p_args[0]), PtrToArg<StringName>::convert(p_args[1])), base);
256+
PtrConstruct<Callable>::construct(Callable(PtrToArg<Object *>::convert(p_args[0]), PtrToArg<StringName>::convert(p_args[1])), base);
203257
}
204258

205259
static int get_argument_count() {
@@ -256,7 +310,7 @@ class VariantConstructorSignalArgs {
256310
*VariantGetInternalPtr<Signal>::get_ptr(r_ret) = Signal(VariantInternal::get_object_id(p_args[0]), *VariantGetInternalPtr<StringName>::get_ptr(p_args[1]));
257311
}
258312
static void ptr_construct(void *base, const void **p_args) {
259-
PtrToArg<Signal>::encode(Signal(PtrToArg<Object *>::convert(p_args[0]), PtrToArg<StringName>::convert(p_args[1])), base);
313+
PtrConstruct<Signal>::construct(Signal(PtrToArg<Object *>::convert(p_args[0]), PtrToArg<StringName>::convert(p_args[1])), base);
260314
}
261315

262316
static int get_argument_count() {
@@ -319,7 +373,7 @@ class VariantConstructorToArray {
319373
dst_arr[i] = src_arr[i];
320374
}
321375

322-
PtrToArg<Array>::encode(dst_arr, base);
376+
PtrConstruct<Array>::construct(dst_arr, base);
323377
}
324378

325379
static int get_argument_count() {
@@ -378,7 +432,7 @@ class VariantConstructorFromArray {
378432
dst_arr.write[i] = src_arr[i];
379433
}
380434

381-
PtrToArg<T>::encode(dst_arr, base);
435+
PtrConstruct<T>::construct(dst_arr, base);
382436
}
383437

384438
static int get_argument_count() {
@@ -412,7 +466,7 @@ class VariantConstructorNil {
412466
VariantInternal::clear(r_ret);
413467
}
414468
static void ptr_construct(void *base, const void **p_args) {
415-
PtrToArg<Variant>::encode(Variant(), base);
469+
PtrConstruct<Variant>::construct(Variant(), base);
416470
}
417471

418472
static int get_argument_count() {
@@ -440,7 +494,7 @@ class VariantConstructNoArgs {
440494
VariantTypeChanger<T>::change_and_reset(r_ret);
441495
}
442496
static void ptr_construct(void *base, const void **p_args) {
443-
PtrToArg<T>::encode(T(), base);
497+
PtrConstruct<T>::construct(T(), base);
444498
}
445499

446500
static int get_argument_count() {
@@ -496,7 +550,7 @@ class VariantConstructNoArgsObject {
496550
VariantInternal::object_assign_null(r_ret);
497551
}
498552
static void ptr_construct(void *base, const void **p_args) {
499-
PtrToArg<Object *>::encode(nullptr, base);
553+
PtrConstruct<Object *>::construct(nullptr, base);
500554
}
501555

502556
static int get_argument_count() {

0 commit comments

Comments
 (0)