1 | /**************************************************************************/ |
2 | /* variant_construct.cpp */ |
3 | /**************************************************************************/ |
4 | /* This file is part of: */ |
5 | /* GODOT ENGINE */ |
6 | /* https://godotengine.org */ |
7 | /**************************************************************************/ |
8 | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ |
9 | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ |
10 | /* */ |
11 | /* Permission is hereby granted, free of charge, to any person obtaining */ |
12 | /* a copy of this software and associated documentation files (the */ |
13 | /* "Software"), to deal in the Software without restriction, including */ |
14 | /* without limitation the rights to use, copy, modify, merge, publish, */ |
15 | /* distribute, sublicense, and/or sell copies of the Software, and to */ |
16 | /* permit persons to whom the Software is furnished to do so, subject to */ |
17 | /* the following conditions: */ |
18 | /* */ |
19 | /* The above copyright notice and this permission notice shall be */ |
20 | /* included in all copies or substantial portions of the Software. */ |
21 | /* */ |
22 | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ |
23 | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ |
24 | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ |
25 | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ |
26 | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ |
27 | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ |
28 | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
29 | /**************************************************************************/ |
30 | |
31 | #include "variant_construct.h" |
32 | |
33 | struct VariantConstructData { |
34 | void (*construct)(Variant &r_base, const Variant **p_args, Callable::CallError &r_error) = nullptr; |
35 | Variant::ValidatedConstructor validated_construct = nullptr; |
36 | Variant::PTRConstructor ptr_construct = nullptr; |
37 | Variant::Type (*get_argument_type)(int) = nullptr; |
38 | int argument_count = 0; |
39 | Vector<String> arg_names; |
40 | }; |
41 | |
42 | static LocalVector<VariantConstructData> construct_data[Variant::VARIANT_MAX]; |
43 | |
44 | template <class T> |
45 | static void add_constructor(const Vector<String> &arg_names) { |
46 | ERR_FAIL_COND_MSG(arg_names.size() != T::get_argument_count(), "Argument names size mismatch for " + Variant::get_type_name(T::get_base_type()) + "." ); |
47 | |
48 | VariantConstructData cd; |
49 | cd.construct = T::construct; |
50 | cd.validated_construct = T::validated_construct; |
51 | cd.ptr_construct = T::ptr_construct; |
52 | cd.get_argument_type = T::get_argument_type; |
53 | cd.argument_count = T::get_argument_count(); |
54 | cd.arg_names = arg_names; |
55 | construct_data[T::get_base_type()].push_back(cd); |
56 | } |
57 | |
58 | void Variant::_register_variant_constructors() { |
59 | add_constructor<VariantConstructNoArgsNil>(sarray()); |
60 | add_constructor<VariantConstructorNil>(sarray("from" )); |
61 | |
62 | add_constructor<VariantConstructNoArgs<bool>>(sarray()); |
63 | add_constructor<VariantConstructor<bool, bool>>(sarray("from" )); |
64 | add_constructor<VariantConstructor<bool, int64_t>>(sarray("from" )); |
65 | add_constructor<VariantConstructor<bool, double>>(sarray("from" )); |
66 | |
67 | add_constructor<VariantConstructNoArgs<int64_t>>(sarray()); |
68 | add_constructor<VariantConstructor<int64_t, int64_t>>(sarray("from" )); |
69 | add_constructor<VariantConstructor<int64_t, double>>(sarray("from" )); |
70 | add_constructor<VariantConstructor<int64_t, bool>>(sarray("from" )); |
71 | add_constructor<VariantConstructorFromString<int64_t>>(sarray("from" )); |
72 | |
73 | add_constructor<VariantConstructNoArgs<double>>(sarray()); |
74 | add_constructor<VariantConstructor<double, double>>(sarray("from" )); |
75 | add_constructor<VariantConstructor<double, int64_t>>(sarray("from" )); |
76 | add_constructor<VariantConstructor<double, bool>>(sarray("from" )); |
77 | add_constructor<VariantConstructorFromString<double>>(sarray("from" )); |
78 | |
79 | add_constructor<VariantConstructNoArgs<String>>(sarray()); |
80 | add_constructor<VariantConstructor<String, String>>(sarray("from" )); |
81 | add_constructor<VariantConstructor<String, StringName>>(sarray("from" )); |
82 | add_constructor<VariantConstructor<String, NodePath>>(sarray("from" )); |
83 | |
84 | add_constructor<VariantConstructNoArgs<Vector2>>(sarray()); |
85 | add_constructor<VariantConstructor<Vector2, Vector2>>(sarray("from" )); |
86 | add_constructor<VariantConstructor<Vector2, Vector2i>>(sarray("from" )); |
87 | add_constructor<VariantConstructor<Vector2, double, double>>(sarray("x" , "y" )); |
88 | |
89 | add_constructor<VariantConstructNoArgs<Vector2i>>(sarray()); |
90 | add_constructor<VariantConstructor<Vector2i, Vector2i>>(sarray("from" )); |
91 | add_constructor<VariantConstructor<Vector2i, Vector2>>(sarray("from" )); |
92 | add_constructor<VariantConstructor<Vector2i, int64_t, int64_t>>(sarray("x" , "y" )); |
93 | |
94 | add_constructor<VariantConstructNoArgs<Rect2>>(sarray()); |
95 | add_constructor<VariantConstructor<Rect2, Rect2>>(sarray("from" )); |
96 | add_constructor<VariantConstructor<Rect2, Rect2i>>(sarray("from" )); |
97 | add_constructor<VariantConstructor<Rect2, Vector2, Vector2>>(sarray("position" , "size" )); |
98 | add_constructor<VariantConstructor<Rect2, double, double, double, double>>(sarray("x" , "y" , "width" , "height" )); |
99 | |
100 | add_constructor<VariantConstructNoArgs<Rect2i>>(sarray()); |
101 | add_constructor<VariantConstructor<Rect2i, Rect2i>>(sarray("from" )); |
102 | add_constructor<VariantConstructor<Rect2i, Rect2>>(sarray("from" )); |
103 | add_constructor<VariantConstructor<Rect2i, Vector2i, Vector2i>>(sarray("position" , "size" )); |
104 | add_constructor<VariantConstructor<Rect2i, int64_t, int64_t, int64_t, int64_t>>(sarray("x" , "y" , "width" , "height" )); |
105 | |
106 | add_constructor<VariantConstructNoArgs<Vector3>>(sarray()); |
107 | add_constructor<VariantConstructor<Vector3, Vector3>>(sarray("from" )); |
108 | add_constructor<VariantConstructor<Vector3, Vector3i>>(sarray("from" )); |
109 | add_constructor<VariantConstructor<Vector3, double, double, double>>(sarray("x" , "y" , "z" )); |
110 | |
111 | add_constructor<VariantConstructNoArgs<Vector3i>>(sarray()); |
112 | add_constructor<VariantConstructor<Vector3i, Vector3i>>(sarray("from" )); |
113 | add_constructor<VariantConstructor<Vector3i, Vector3>>(sarray("from" )); |
114 | add_constructor<VariantConstructor<Vector3i, int64_t, int64_t, int64_t>>(sarray("x" , "y" , "z" )); |
115 | |
116 | add_constructor<VariantConstructNoArgs<Vector4>>(sarray()); |
117 | add_constructor<VariantConstructor<Vector4, Vector4>>(sarray("from" )); |
118 | add_constructor<VariantConstructor<Vector4, Vector4i>>(sarray("from" )); |
119 | add_constructor<VariantConstructor<Vector4, double, double, double, double>>(sarray("x" , "y" , "z" , "w" )); |
120 | |
121 | add_constructor<VariantConstructNoArgs<Vector4i>>(sarray()); |
122 | add_constructor<VariantConstructor<Vector4i, Vector4i>>(sarray("from" )); |
123 | add_constructor<VariantConstructor<Vector4i, Vector4>>(sarray("from" )); |
124 | add_constructor<VariantConstructor<Vector4i, int64_t, int64_t, int64_t, int64_t>>(sarray("x" , "y" , "z" , "w" )); |
125 | |
126 | add_constructor<VariantConstructNoArgs<Transform2D>>(sarray()); |
127 | add_constructor<VariantConstructor<Transform2D, Transform2D>>(sarray("from" )); |
128 | add_constructor<VariantConstructor<Transform2D, float, Vector2>>(sarray("rotation" , "position" )); |
129 | add_constructor<VariantConstructor<Transform2D, float, Size2, float, Vector2>>(sarray("rotation" , "scale" , "skew" , "position" )); |
130 | add_constructor<VariantConstructor<Transform2D, Vector2, Vector2, Vector2>>(sarray("x_axis" , "y_axis" , "origin" )); |
131 | |
132 | add_constructor<VariantConstructNoArgs<Plane>>(sarray()); |
133 | add_constructor<VariantConstructor<Plane, Plane>>(sarray("from" )); |
134 | add_constructor<VariantConstructor<Plane, Vector3>>(sarray("normal" )); |
135 | add_constructor<VariantConstructor<Plane, Vector3, double>>(sarray("normal" , "d" )); |
136 | add_constructor<VariantConstructor<Plane, Vector3, Vector3>>(sarray("normal" , "point" )); |
137 | add_constructor<VariantConstructor<Plane, Vector3, Vector3, Vector3>>(sarray("point1" , "point2" , "point3" )); |
138 | add_constructor<VariantConstructor<Plane, double, double, double, double>>(sarray("a" , "b" , "c" , "d" )); |
139 | |
140 | add_constructor<VariantConstructNoArgs<Quaternion>>(sarray()); |
141 | add_constructor<VariantConstructor<Quaternion, Quaternion>>(sarray("from" )); |
142 | add_constructor<VariantConstructor<Quaternion, Basis>>(sarray("from" )); |
143 | add_constructor<VariantConstructor<Quaternion, Vector3, double>>(sarray("axis" , "angle" )); |
144 | add_constructor<VariantConstructor<Quaternion, Vector3, Vector3>>(sarray("arc_from" , "arc_to" )); |
145 | add_constructor<VariantConstructor<Quaternion, double, double, double, double>>(sarray("x" , "y" , "z" , "w" )); |
146 | |
147 | add_constructor<VariantConstructNoArgs<::AABB>>(sarray()); |
148 | add_constructor<VariantConstructor<::AABB, ::AABB>>(sarray("from" )); |
149 | add_constructor<VariantConstructor<::AABB, Vector3, Vector3>>(sarray("position" , "size" )); |
150 | |
151 | add_constructor<VariantConstructNoArgs<Basis>>(sarray()); |
152 | add_constructor<VariantConstructor<Basis, Basis>>(sarray("from" )); |
153 | add_constructor<VariantConstructor<Basis, Quaternion>>(sarray("from" )); |
154 | add_constructor<VariantConstructor<Basis, Vector3, double>>(sarray("axis" , "angle" )); |
155 | add_constructor<VariantConstructor<Basis, Vector3, Vector3, Vector3>>(sarray("x_axis" , "y_axis" , "z_axis" )); |
156 | |
157 | add_constructor<VariantConstructNoArgs<Transform3D>>(sarray()); |
158 | add_constructor<VariantConstructor<Transform3D, Transform3D>>(sarray("from" )); |
159 | add_constructor<VariantConstructor<Transform3D, Basis, Vector3>>(sarray("basis" , "origin" )); |
160 | add_constructor<VariantConstructor<Transform3D, Vector3, Vector3, Vector3, Vector3>>(sarray("x_axis" , "y_axis" , "z_axis" , "origin" )); |
161 | add_constructor<VariantConstructor<Transform3D, Projection>>(sarray("from" )); |
162 | |
163 | add_constructor<VariantConstructNoArgs<Projection>>(sarray()); |
164 | add_constructor<VariantConstructor<Projection, Projection>>(sarray("from" )); |
165 | add_constructor<VariantConstructor<Projection, Transform3D>>(sarray("from" )); |
166 | add_constructor<VariantConstructor<Projection, Vector4, Vector4, Vector4, Vector4>>(sarray("x_axis" , "y_axis" , "z_axis" , "w_axis" )); |
167 | |
168 | add_constructor<VariantConstructNoArgs<Color>>(sarray()); |
169 | add_constructor<VariantConstructor<Color, Color>>(sarray("from" )); |
170 | add_constructor<VariantConstructor<Color, Color, double>>(sarray("from" , "alpha" )); |
171 | add_constructor<VariantConstructor<Color, double, double, double>>(sarray("r" , "g" , "b" )); |
172 | add_constructor<VariantConstructor<Color, double, double, double, double>>(sarray("r" , "g" , "b" , "a" )); |
173 | add_constructor<VariantConstructor<Color, String>>(sarray("code" )); |
174 | add_constructor<VariantConstructor<Color, String, double>>(sarray("code" , "alpha" )); |
175 | |
176 | add_constructor<VariantConstructNoArgs<StringName>>(sarray()); |
177 | add_constructor<VariantConstructor<StringName, StringName>>(sarray("from" )); |
178 | add_constructor<VariantConstructor<StringName, String>>(sarray("from" )); |
179 | |
180 | add_constructor<VariantConstructNoArgs<NodePath>>(sarray()); |
181 | add_constructor<VariantConstructor<NodePath, NodePath>>(sarray("from" )); |
182 | add_constructor<VariantConstructor<NodePath, String>>(sarray("from" )); |
183 | |
184 | add_constructor<VariantConstructNoArgs<::RID>>(sarray()); |
185 | add_constructor<VariantConstructor<::RID, ::RID>>(sarray("from" )); |
186 | |
187 | add_constructor<VariantConstructNoArgsObject>(sarray()); |
188 | add_constructor<VariantConstructorObject>(sarray("from" )); |
189 | add_constructor<VariantConstructorNilObject>(sarray("from" )); |
190 | |
191 | add_constructor<VariantConstructNoArgs<Callable>>(sarray()); |
192 | add_constructor<VariantConstructor<Callable, Callable>>(sarray("from" )); |
193 | add_constructor<VariantConstructorCallableArgs>(sarray("object" , "method" )); |
194 | |
195 | add_constructor<VariantConstructNoArgs<Signal>>(sarray()); |
196 | add_constructor<VariantConstructor<Signal, Signal>>(sarray("from" )); |
197 | add_constructor<VariantConstructorSignalArgs>(sarray("object" , "signal" )); |
198 | |
199 | add_constructor<VariantConstructNoArgs<Dictionary>>(sarray()); |
200 | add_constructor<VariantConstructor<Dictionary, Dictionary>>(sarray("from" )); |
201 | |
202 | add_constructor<VariantConstructNoArgs<Array>>(sarray()); |
203 | add_constructor<VariantConstructor<Array, Array>>(sarray("from" )); |
204 | add_constructor<VariantConstructorTypedArray>(sarray("base" , "type" , "class_name" , "script" )); |
205 | add_constructor<VariantConstructorToArray<PackedByteArray>>(sarray("from" )); |
206 | add_constructor<VariantConstructorToArray<PackedInt32Array>>(sarray("from" )); |
207 | add_constructor<VariantConstructorToArray<PackedInt64Array>>(sarray("from" )); |
208 | add_constructor<VariantConstructorToArray<PackedFloat32Array>>(sarray("from" )); |
209 | add_constructor<VariantConstructorToArray<PackedFloat64Array>>(sarray("from" )); |
210 | add_constructor<VariantConstructorToArray<PackedStringArray>>(sarray("from" )); |
211 | add_constructor<VariantConstructorToArray<PackedVector2Array>>(sarray("from" )); |
212 | add_constructor<VariantConstructorToArray<PackedVector3Array>>(sarray("from" )); |
213 | add_constructor<VariantConstructorToArray<PackedColorArray>>(sarray("from" )); |
214 | |
215 | add_constructor<VariantConstructNoArgs<PackedByteArray>>(sarray()); |
216 | add_constructor<VariantConstructor<PackedByteArray, PackedByteArray>>(sarray("from" )); |
217 | add_constructor<VariantConstructorFromArray<PackedByteArray>>(sarray("from" )); |
218 | |
219 | add_constructor<VariantConstructNoArgs<PackedInt32Array>>(sarray()); |
220 | add_constructor<VariantConstructor<PackedInt32Array, PackedInt32Array>>(sarray("from" )); |
221 | add_constructor<VariantConstructorFromArray<PackedInt32Array>>(sarray("from" )); |
222 | |
223 | add_constructor<VariantConstructNoArgs<PackedInt64Array>>(sarray()); |
224 | add_constructor<VariantConstructor<PackedInt64Array, PackedInt64Array>>(sarray("from" )); |
225 | add_constructor<VariantConstructorFromArray<PackedInt64Array>>(sarray("from" )); |
226 | |
227 | add_constructor<VariantConstructNoArgs<PackedFloat32Array>>(sarray()); |
228 | add_constructor<VariantConstructor<PackedFloat32Array, PackedFloat32Array>>(sarray("from" )); |
229 | add_constructor<VariantConstructorFromArray<PackedFloat32Array>>(sarray("from" )); |
230 | |
231 | add_constructor<VariantConstructNoArgs<PackedFloat64Array>>(sarray()); |
232 | add_constructor<VariantConstructor<PackedFloat64Array, PackedFloat64Array>>(sarray("from" )); |
233 | add_constructor<VariantConstructorFromArray<PackedFloat64Array>>(sarray("from" )); |
234 | |
235 | add_constructor<VariantConstructNoArgs<PackedStringArray>>(sarray()); |
236 | add_constructor<VariantConstructor<PackedStringArray, PackedStringArray>>(sarray("from" )); |
237 | add_constructor<VariantConstructorFromArray<PackedStringArray>>(sarray("from" )); |
238 | |
239 | add_constructor<VariantConstructNoArgs<PackedVector2Array>>(sarray()); |
240 | add_constructor<VariantConstructor<PackedVector2Array, PackedVector2Array>>(sarray("from" )); |
241 | add_constructor<VariantConstructorFromArray<PackedVector2Array>>(sarray("from" )); |
242 | |
243 | add_constructor<VariantConstructNoArgs<PackedVector3Array>>(sarray()); |
244 | add_constructor<VariantConstructor<PackedVector3Array, PackedVector3Array>>(sarray("from" )); |
245 | add_constructor<VariantConstructorFromArray<PackedVector3Array>>(sarray("from" )); |
246 | |
247 | add_constructor<VariantConstructNoArgs<PackedColorArray>>(sarray()); |
248 | add_constructor<VariantConstructor<PackedColorArray, PackedColorArray>>(sarray("from" )); |
249 | add_constructor<VariantConstructorFromArray<PackedColorArray>>(sarray("from" )); |
250 | } |
251 | |
252 | void Variant::_unregister_variant_constructors() { |
253 | for (int i = 0; i < Variant::VARIANT_MAX; i++) { |
254 | construct_data[i].clear(); |
255 | } |
256 | } |
257 | |
258 | void Variant::construct(Variant::Type p_type, Variant &base, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { |
259 | ERR_FAIL_INDEX(p_type, Variant::VARIANT_MAX); |
260 | uint32_t s = construct_data[p_type].size(); |
261 | for (uint32_t i = 0; i < s; i++) { |
262 | int argc = construct_data[p_type][i].argument_count; |
263 | if (argc != p_argcount) { |
264 | continue; |
265 | } |
266 | bool args_match = true; |
267 | for (int j = 0; j < argc; j++) { |
268 | if (!Variant::can_convert_strict(p_args[j]->get_type(), construct_data[p_type][i].get_argument_type(j))) { |
269 | args_match = false; |
270 | break; |
271 | } |
272 | } |
273 | |
274 | if (!args_match) { |
275 | continue; |
276 | } |
277 | |
278 | construct_data[p_type][i].construct(base, p_args, r_error); |
279 | return; |
280 | } |
281 | |
282 | r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD; |
283 | } |
284 | |
285 | int Variant::get_constructor_count(Variant::Type p_type) { |
286 | ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, -1); |
287 | return construct_data[p_type].size(); |
288 | } |
289 | |
290 | Variant::ValidatedConstructor Variant::get_validated_constructor(Variant::Type p_type, int p_constructor) { |
291 | ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, nullptr); |
292 | ERR_FAIL_INDEX_V(p_constructor, (int)construct_data[p_type].size(), nullptr); |
293 | return construct_data[p_type][p_constructor].validated_construct; |
294 | } |
295 | |
296 | Variant::PTRConstructor Variant::get_ptr_constructor(Variant::Type p_type, int p_constructor) { |
297 | ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, nullptr); |
298 | ERR_FAIL_INDEX_V(p_constructor, (int)construct_data[p_type].size(), nullptr); |
299 | return construct_data[p_type][p_constructor].ptr_construct; |
300 | } |
301 | |
302 | int Variant::get_constructor_argument_count(Variant::Type p_type, int p_constructor) { |
303 | ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, -1); |
304 | ERR_FAIL_INDEX_V(p_constructor, (int)construct_data[p_type].size(), -1); |
305 | return construct_data[p_type][p_constructor].argument_count; |
306 | } |
307 | |
308 | Variant::Type Variant::get_constructor_argument_type(Variant::Type p_type, int p_constructor, int p_argument) { |
309 | ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, Variant::VARIANT_MAX); |
310 | ERR_FAIL_INDEX_V(p_constructor, (int)construct_data[p_type].size(), Variant::VARIANT_MAX); |
311 | return construct_data[p_type][p_constructor].get_argument_type(p_argument); |
312 | } |
313 | |
314 | String Variant::get_constructor_argument_name(Variant::Type p_type, int p_constructor, int p_argument) { |
315 | ERR_FAIL_INDEX_V(p_type, Variant::VARIANT_MAX, String()); |
316 | ERR_FAIL_INDEX_V(p_constructor, (int)construct_data[p_type].size(), String()); |
317 | return construct_data[p_type][p_constructor].arg_names[p_argument]; |
318 | } |
319 | |
320 | void VariantInternal::refcounted_object_assign(Variant *v, const RefCounted *rc) { |
321 | if (!rc || !const_cast<RefCounted *>(rc)->init_ref()) { |
322 | v->_get_obj().obj = nullptr; |
323 | v->_get_obj().id = ObjectID(); |
324 | return; |
325 | } |
326 | |
327 | v->_get_obj().obj = const_cast<RefCounted *>(rc); |
328 | v->_get_obj().id = rc->get_instance_id(); |
329 | } |
330 | |
331 | void VariantInternal::object_assign(Variant *v, const Object *o) { |
332 | if (o) { |
333 | if (o->is_ref_counted()) { |
334 | RefCounted *ref_counted = const_cast<RefCounted *>(static_cast<const RefCounted *>(o)); |
335 | if (!ref_counted->init_ref()) { |
336 | v->_get_obj().obj = nullptr; |
337 | v->_get_obj().id = ObjectID(); |
338 | return; |
339 | } |
340 | } |
341 | |
342 | v->_get_obj().obj = const_cast<Object *>(o); |
343 | v->_get_obj().id = o->get_instance_id(); |
344 | } else { |
345 | v->_get_obj().obj = nullptr; |
346 | v->_get_obj().id = ObjectID(); |
347 | } |
348 | } |
349 | |
350 | void Variant::get_constructor_list(Type p_type, List<MethodInfo> *r_list) { |
351 | ERR_FAIL_INDEX(p_type, Variant::VARIANT_MAX); |
352 | |
353 | MethodInfo mi; |
354 | mi.return_val.type = p_type; |
355 | mi.name = get_type_name(p_type); |
356 | |
357 | for (int i = 0; i < get_constructor_count(p_type); i++) { |
358 | int ac = get_constructor_argument_count(p_type, i); |
359 | mi.arguments.clear(); |
360 | for (int j = 0; j < ac; j++) { |
361 | PropertyInfo arg; |
362 | arg.name = get_constructor_argument_name(p_type, i, j); |
363 | arg.type = get_constructor_argument_type(p_type, i, j); |
364 | mi.arguments.push_back(arg); |
365 | } |
366 | r_list->push_back(mi); |
367 | } |
368 | } |
369 | |