Skip to content

Commit b377562

Browse files
committed
Merge pull request godotengine#91660 from AThousandShips/methodinfo_vec
[Core] Use `Vector` for `MethodInfo::arguments`
2 parents 1700a84 + d972195 commit b377562

18 files changed

+107
-124
lines changed

core/doc_data.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,10 @@ void DocData::method_doc_from_methodinfo(DocData::MethodDoc &p_method, const Met
136136

137137
return_doc_from_retinfo(p_method, p_methodinfo.return_val);
138138

139-
int i = 0;
140-
for (List<PropertyInfo>::ConstIterator itr = p_methodinfo.arguments.begin(); itr != p_methodinfo.arguments.end(); ++itr, ++i) {
139+
for (int64_t i = 0; i < p_methodinfo.arguments.size(); ++i) {
141140
DocData::ArgumentDoc argument;
142-
argument_doc_from_arginfo(argument, *itr);
143-
int default_arg_index = i - (p_methodinfo.arguments.size() - p_methodinfo.default_arguments.size());
141+
argument_doc_from_arginfo(argument, p_methodinfo.arguments[i]);
142+
int64_t default_arg_index = i - (p_methodinfo.arguments.size() - p_methodinfo.default_arguments.size());
144143
if (default_arg_index >= 0) {
145144
Variant default_arg = p_methodinfo.default_arguments[default_arg_index];
146145
argument.default_value = get_default_value_string(default_arg);

core/extension/extension_api_dump.cpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -1053,9 +1053,8 @@ Dictionary GDExtensionAPIDump::generate_extension_api(bool p_include_docs) {
10531053
}
10541054

10551055
Array arguments;
1056-
int i = 0;
1057-
for (List<PropertyInfo>::ConstIterator itr = mi.arguments.begin(); itr != mi.arguments.end(); ++itr, ++i) {
1058-
const PropertyInfo &pinfo = *itr;
1056+
for (int64_t i = 0; i < mi.arguments.size(); ++i) {
1057+
const PropertyInfo &pinfo = mi.arguments[i];
10591058
Dictionary d3;
10601059

10611060
d3["name"] = pinfo.name;
@@ -1180,11 +1179,10 @@ Dictionary GDExtensionAPIDump::generate_extension_api(bool p_include_docs) {
11801179

11811180
Array arguments;
11821181

1183-
int i = 0;
1184-
for (List<PropertyInfo>::ConstIterator itr = F.arguments.begin(); itr != F.arguments.end(); ++itr, ++i) {
1182+
for (int64_t i = 0; i < F.arguments.size(); ++i) {
11851183
Dictionary d3;
1186-
d3["name"] = itr->name;
1187-
d3["type"] = get_property_info_type_name(*itr);
1184+
d3["name"] = F.arguments[i].name;
1185+
d3["type"] = get_property_info_type_name(F.arguments[i]);
11881186
if (F.get_argument_meta(i) > 0) {
11891187
d3["meta"] = get_type_meta_name((GodotTypeInfo::Metadata)F.get_argument_meta(i));
11901188
}

core/object/class_db.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -2011,9 +2011,8 @@ void ClassDB::add_virtual_method(const StringName &p_class, const MethodInfo &p_
20112011
if (p_arg_names.size() != mi.arguments.size()) {
20122012
WARN_PRINT(vformat("Mismatch argument name count for virtual method: '%s::%s'.", String(p_class), p_method.name));
20132013
} else {
2014-
List<PropertyInfo>::Iterator itr = mi.arguments.begin();
2015-
for (int i = 0; i < p_arg_names.size(); ++itr, ++i) {
2016-
itr->name = p_arg_names[i];
2014+
for (int64_t i = 0; i < p_arg_names.size(); ++i) {
2015+
mi.arguments.write[i].name = p_arg_names[i];
20172016
}
20182017
}
20192018
}

core/object/method_bind.h

+4-5
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ class MethodBindVarArgBase : public MethodBind {
151151
if (p_arg < 0) {
152152
return _gen_return_type_info();
153153
} else if (p_arg < method_info.arguments.size()) {
154-
return method_info.arguments.get(p_arg);
154+
return method_info.arguments[p_arg];
155155
} else {
156156
return PropertyInfo(Variant::NIL, "arg_" + itos(p_arg), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NIL_IS_VARIANT);
157157
}
@@ -192,11 +192,10 @@ class MethodBindVarArgBase : public MethodBind {
192192
Vector<StringName> names;
193193
names.resize(method_info.arguments.size());
194194
#endif
195-
int i = 0;
196-
for (List<PropertyInfo>::ConstIterator itr = method_info.arguments.begin(); itr != method_info.arguments.end(); ++itr, ++i) {
197-
at[i + 1] = itr->type;
195+
for (int64_t i = 0; i < method_info.arguments.size(); ++i) {
196+
at[i + 1] = method_info.arguments[i].type;
198197
#ifdef DEBUG_METHODS_ENABLED
199-
names.write[i] = itr->name;
198+
names.write[i] = method_info.arguments[i].name;
200199
#endif
201200
}
202201

core/object/object.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,19 @@ TypedArray<Dictionary> convert_property_list(const List<PropertyInfo> *p_list) {
115115
return va;
116116
}
117117

118+
TypedArray<Dictionary> convert_property_list(const Vector<PropertyInfo> &p_vector) {
119+
TypedArray<Dictionary> va;
120+
for (const PropertyInfo &E : p_vector) {
121+
va.push_back(Dictionary(E));
122+
}
123+
124+
return va;
125+
}
126+
118127
MethodInfo::operator Dictionary() const {
119128
Dictionary d;
120129
d["name"] = name;
121-
d["args"] = convert_property_list(&arguments);
130+
d["args"] = convert_property_list(arguments);
122131
Array da;
123132
for (int i = 0; i < default_arguments.size(); i++) {
124133
da.push_back(default_arguments[i]);

core/object/object.h

+7-16
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ struct PropertyInfo {
208208
};
209209

210210
TypedArray<Dictionary> convert_property_list(const List<PropertyInfo> *p_list);
211+
TypedArray<Dictionary> convert_property_list(const Vector<PropertyInfo> &p_vector);
211212

212213
enum MethodFlags {
213214
METHOD_FLAG_NORMAL = 1,
@@ -226,7 +227,7 @@ struct MethodInfo {
226227
PropertyInfo return_val;
227228
uint32_t flags = METHOD_FLAGS_DEFAULT;
228229
int id = 0;
229-
List<PropertyInfo> arguments;
230+
Vector<PropertyInfo> arguments;
230231
Vector<Variant> default_arguments;
231232
int return_val_metadata = 0;
232233
Vector<int> arguments_metadata;
@@ -255,31 +256,21 @@ struct MethodInfo {
255256
return_val(PropertyInfo(pinfo.return_value)),
256257
flags(pinfo.flags),
257258
id(pinfo.id) {
258-
for (uint32_t j = 0; j < pinfo.argument_count; j++) {
259-
arguments.push_back(PropertyInfo(pinfo.arguments[j]));
259+
for (uint32_t i = 0; i < pinfo.argument_count; i++) {
260+
arguments.push_back(PropertyInfo(pinfo.arguments[i]));
260261
}
261262
const Variant *def_values = (const Variant *)pinfo.default_arguments;
262263
for (uint32_t j = 0; j < pinfo.default_argument_count; j++) {
263264
default_arguments.push_back(def_values[j]);
264265
}
265266
}
266267

267-
void _push_params(const PropertyInfo &p_param) {
268-
arguments.push_back(p_param);
269-
}
270-
271-
template <typename... VarArgs>
272-
void _push_params(const PropertyInfo &p_param, VarArgs... p_params) {
273-
arguments.push_back(p_param);
274-
_push_params(p_params...);
275-
}
276-
277268
MethodInfo(const String &p_name) { name = p_name; }
278269

279270
template <typename... VarArgs>
280271
MethodInfo(const String &p_name, VarArgs... p_params) {
281272
name = p_name;
282-
_push_params(p_params...);
273+
arguments = Vector<PropertyInfo>{ p_params... };
283274
}
284275

285276
MethodInfo(Variant::Type ret) { return_val.type = ret; }
@@ -292,7 +283,7 @@ struct MethodInfo {
292283
MethodInfo(Variant::Type ret, const String &p_name, VarArgs... p_params) {
293284
name = p_name;
294285
return_val.type = ret;
295-
_push_params(p_params...);
286+
arguments = Vector<PropertyInfo>{ p_params... };
296287
}
297288

298289
MethodInfo(const PropertyInfo &p_ret, const String &p_name) {
@@ -304,7 +295,7 @@ struct MethodInfo {
304295
MethodInfo(const PropertyInfo &p_ret, const String &p_name, VarArgs... p_params) {
305296
return_val = p_ret;
306297
name = p_name;
307-
_push_params(p_params...);
298+
arguments = Vector<PropertyInfo>{ p_params... };
308299
}
309300
};
310301

editor/animation_track_editor.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -5636,17 +5636,16 @@ void AnimationTrackEditor::_add_method_key(const String &p_method) {
56365636
Dictionary d;
56375637
d["method"] = p_method;
56385638
Array params;
5639-
int first_defarg = E.arguments.size() - E.default_arguments.size();
5639+
int64_t first_defarg = E.arguments.size() - E.default_arguments.size();
56405640

5641-
int i = 0;
5642-
for (List<PropertyInfo>::ConstIterator itr = E.arguments.begin(); itr != E.arguments.end(); ++itr, ++i) {
5641+
for (int64_t i = 0; i < E.arguments.size(); ++i) {
56435642
if (i >= first_defarg) {
56445643
Variant arg = E.default_arguments[i - first_defarg];
56455644
params.push_back(arg);
56465645
} else {
56475646
Callable::CallError ce;
56485647
Variant arg;
5649-
Variant::construct(itr->type, arg, nullptr, 0, ce);
5648+
Variant::construct(E.arguments[i].type, arg, nullptr, 0, ce);
56505649
params.push_back(arg);
56515650
}
56525651
}

editor/connections_dialog.cpp

+11-12
Original file line numberDiff line numberDiff line change
@@ -282,10 +282,11 @@ List<MethodInfo> ConnectDialog::_filter_method_list(const List<MethodInfo> &p_me
282282
bool check_signal = compatible_methods_only->is_pressed();
283283
List<MethodInfo> ret;
284284

285-
List<Pair<Variant::Type, StringName>> effective_args;
285+
LocalVector<Pair<Variant::Type, StringName>> effective_args;
286286
int unbind = get_unbinds();
287-
for (int i = 0; i < p_signal.arguments.size() - unbind; i++) {
288-
PropertyInfo pi = p_signal.arguments.get(i);
287+
effective_args.reserve(p_signal.arguments.size() - unbind);
288+
for (int64_t i = 0; i < p_signal.arguments.size() - unbind; i++) {
289+
PropertyInfo pi = p_signal.arguments[i];
289290
effective_args.push_back(Pair(pi.type, pi.class_name));
290291
}
291292
if (unbind == 0) {
@@ -312,17 +313,16 @@ List<MethodInfo> ConnectDialog::_filter_method_list(const List<MethodInfo> &p_me
312313
}
313314

314315
bool type_mismatch = false;
315-
const List<Pair<Variant::Type, StringName>>::Element *E = effective_args.front();
316-
for (const List<PropertyInfo>::Element *F = mi.arguments.front(); F; F = F->next(), E = E->next()) {
317-
Variant::Type stype = E->get().first;
318-
Variant::Type mtype = F->get().type;
316+
for (int64_t i = 0; i < mi.arguments.size(); ++i) {
317+
Variant::Type stype = effective_args[i].first;
318+
Variant::Type mtype = mi.arguments[i].type;
319319

320320
if (stype != Variant::NIL && mtype != Variant::NIL && stype != mtype) {
321321
type_mismatch = true;
322322
break;
323323
}
324324

325-
if (stype == Variant::OBJECT && mtype == Variant::OBJECT && !ClassDB::is_parent_class(E->get().second, F->get().class_name)) {
325+
if (stype == Variant::OBJECT && mtype == Variant::OBJECT && !ClassDB::is_parent_class(effective_args[i].second, mi.arguments[i].class_name)) {
326326
type_mismatch = true;
327327
break;
328328
}
@@ -552,13 +552,12 @@ String ConnectDialog::get_signature(const MethodInfo &p_method, PackedStringArra
552552
signature.append(p_method.name);
553553
signature.append("(");
554554

555-
int i = 0;
556-
for (List<PropertyInfo>::ConstIterator itr = p_method.arguments.begin(); itr != p_method.arguments.end(); ++itr, ++i) {
557-
if (itr != p_method.arguments.begin()) {
555+
for (int64_t i = 0; i < p_method.arguments.size(); ++i) {
556+
if (i > 0) {
558557
signature.append(", ");
559558
}
560559

561-
const PropertyInfo &pi = *itr;
560+
const PropertyInfo &pi = p_method.arguments[i];
562561
String type_name;
563562
switch (pi.type) {
564563
case Variant::NIL:

editor/doc_tools.cpp

+8-12
Original file line numberDiff line numberDiff line change
@@ -660,8 +660,7 @@ void DocTools::generate(BitField<GenerateFlags> p_flags) {
660660
for (List<MethodInfo>::Element *EV = signal_list.front(); EV; EV = EV->next()) {
661661
DocData::MethodDoc signal;
662662
signal.name = EV->get().name;
663-
for (List<PropertyInfo>::Element *EA = EV->get().arguments.front(); EA; EA = EA->next()) {
664-
const PropertyInfo &arginfo = EA->get();
663+
for (const PropertyInfo &arginfo : EV->get().arguments) {
665664
DocData::ArgumentDoc argument;
666665
DocData::argument_doc_from_arginfo(argument, arginfo);
667666

@@ -853,9 +852,8 @@ void DocTools::generate(BitField<GenerateFlags> p_flags) {
853852

854853
method.name = mi.name;
855854

856-
int j = 0;
857-
for (List<PropertyInfo>::ConstIterator itr = mi.arguments.begin(); itr != mi.arguments.end(); ++itr, ++j) {
858-
PropertyInfo arginfo = *itr;
855+
for (int64_t j = 0; j < mi.arguments.size(); ++j) {
856+
const PropertyInfo &arginfo = mi.arguments[j];
859857
DocData::ArgumentDoc ad;
860858
DocData::argument_doc_from_arginfo(ad, arginfo);
861859
ad.name = arginfo.name;
@@ -1066,10 +1064,9 @@ void DocTools::generate(BitField<GenerateFlags> p_flags) {
10661064

10671065
DocData::return_doc_from_retinfo(md, mi.return_val);
10681066

1069-
int j = 0;
1070-
for (List<PropertyInfo>::ConstIterator itr = mi.arguments.begin(); itr != mi.arguments.end(); ++itr, ++j) {
1067+
for (int64_t j = 0; j < mi.arguments.size(); ++j) {
10711068
DocData::ArgumentDoc ad;
1072-
DocData::argument_doc_from_arginfo(ad, *itr);
1069+
DocData::argument_doc_from_arginfo(ad, mi.arguments[j]);
10731070

10741071
int darg_idx = j - (mi.arguments.size() - mi.default_arguments.size());
10751072
if (darg_idx >= 0) {
@@ -1112,12 +1109,11 @@ void DocTools::generate(BitField<GenerateFlags> p_flags) {
11121109

11131110
DocData::return_doc_from_retinfo(atd, ai.return_val);
11141111

1115-
int j = 0;
1116-
for (List<PropertyInfo>::ConstIterator itr = ai.arguments.begin(); itr != ai.arguments.end(); ++itr, ++j) {
1112+
for (int64_t j = 0; j < ai.arguments.size(); ++j) {
11171113
DocData::ArgumentDoc ad;
1118-
DocData::argument_doc_from_arginfo(ad, *itr);
1114+
DocData::argument_doc_from_arginfo(ad, ai.arguments[j]);
11191115

1120-
int darg_idx = j - (ai.arguments.size() - ai.default_arguments.size());
1116+
int64_t darg_idx = j - (ai.arguments.size() - ai.default_arguments.size());
11211117
if (darg_idx >= 0) {
11221118
ad.default_value = DocData::get_default_value_string(ai.default_arguments[darg_idx]);
11231119
}

editor/property_selector.cpp

+9-8
Original file line numberDiff line numberDiff line change
@@ -269,20 +269,21 @@ void PropertySelector::_update_search() {
269269

270270
desc += vformat(" %s(", mi.name);
271271

272-
for (List<PropertyInfo>::Iterator arg_itr = mi.arguments.begin(); arg_itr != mi.arguments.end(); ++arg_itr) {
273-
if (arg_itr != mi.arguments.begin()) {
272+
for (int64_t i = 0; i < mi.arguments.size(); ++i) {
273+
PropertyInfo &arg = mi.arguments.write[i];
274+
if (i > 0) {
274275
desc += ", ";
275276
}
276277

277-
desc += arg_itr->name;
278+
desc += arg.name;
278279

279-
if (arg_itr->type == Variant::NIL) {
280+
if (arg.type == Variant::NIL) {
280281
desc += ": Variant";
281-
} else if (arg_itr->name.contains_char(':')) {
282-
desc += vformat(": %s", arg_itr->name.get_slicec(':', 1));
283-
arg_itr->name = arg_itr->name.get_slicec(':', 0);
282+
} else if (arg.name.contains_char(':')) {
283+
desc += vformat(": %s", arg.name.get_slicec(':', 1));
284+
arg.name = arg.name.get_slicec(':', 0);
284285
} else {
285-
desc += vformat(": %s", Variant::get_type_name(arg_itr->type));
286+
desc += vformat(": %s", Variant::get_type_name(arg.type));
286287
}
287288
}
288289

modules/gdscript/gdscript_analyzer.cpp

+16-21
Original file line numberDiff line numberDiff line change
@@ -1640,13 +1640,12 @@ void GDScriptAnalyzer::resolve_annotation(GDScriptParser::AnnotationNode *p_anno
16401640

16411641
const MethodInfo &annotation_info = parser->valid_annotations[p_annotation->name].info;
16421642

1643-
const List<PropertyInfo>::Element *E = annotation_info.arguments.front();
1644-
for (int i = 0; i < p_annotation->arguments.size(); i++) {
1643+
for (int64_t i = 0, j = 0; i < p_annotation->arguments.size(); i++) {
16451644
GDScriptParser::ExpressionNode *argument = p_annotation->arguments[i];
1646-
const PropertyInfo &argument_info = E->get();
1645+
const PropertyInfo &argument_info = annotation_info.arguments[j];
16471646

1648-
if (E->next() != nullptr) {
1649-
E = E->next();
1647+
if (j + 1 < annotation_info.arguments.size()) {
1648+
++j;
16501649
}
16511650

16521651
reduce_expression(argument);
@@ -3323,28 +3322,24 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a
33233322

33243323
bool types_match = true;
33253324

3326-
{
3327-
List<PropertyInfo>::ConstIterator arg_itr = info.arguments.begin();
3328-
for (int i = 0; i < p_call->arguments.size(); ++arg_itr, ++i) {
3329-
GDScriptParser::DataType par_type = type_from_property(*arg_itr, true);
3330-
GDScriptParser::DataType arg_type = p_call->arguments[i]->get_datatype();
3331-
if (!is_type_compatible(par_type, arg_type, true)) {
3332-
types_match = false;
3333-
break;
3325+
for (int64_t i = 0; i < p_call->arguments.size(); ++i) {
3326+
GDScriptParser::DataType par_type = type_from_property(info.arguments[i], true);
3327+
GDScriptParser::DataType arg_type = p_call->arguments[i]->get_datatype();
3328+
if (!is_type_compatible(par_type, arg_type, true)) {
3329+
types_match = false;
3330+
break;
33343331
#ifdef DEBUG_ENABLED
3335-
} else {
3336-
if (par_type.builtin_type == Variant::INT && arg_type.builtin_type == Variant::FLOAT && builtin_type != Variant::INT) {
3337-
parser->push_warning(p_call, GDScriptWarning::NARROWING_CONVERSION, function_name);
3338-
}
3339-
#endif
3332+
} else {
3333+
if (par_type.builtin_type == Variant::INT && arg_type.builtin_type == Variant::FLOAT && builtin_type != Variant::INT) {
3334+
parser->push_warning(p_call, GDScriptWarning::NARROWING_CONVERSION, function_name);
33403335
}
3336+
#endif
33413337
}
33423338
}
33433339

33443340
if (types_match) {
3345-
List<PropertyInfo>::ConstIterator arg_itr = info.arguments.begin();
3346-
for (int i = 0; i < p_call->arguments.size(); ++arg_itr, ++i) {
3347-
GDScriptParser::DataType par_type = type_from_property(*arg_itr, true);
3341+
for (int64_t i = 0; i < p_call->arguments.size(); ++i) {
3342+
GDScriptParser::DataType par_type = type_from_property(info.arguments[i], true);
33483343
if (p_call->arguments[i]->is_constant) {
33493344
update_const_expression_builtin_type(p_call->arguments[i], par_type, "pass");
33503345
}

modules/gdscript/gdscript_compiler.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,8 @@ static bool _can_use_validate_call(const MethodBind *p_method, const Vector<GDSc
243243
}
244244
MethodInfo info;
245245
ClassDB::get_method_info(p_method->get_instance_class(), p_method->get_name(), &info);
246-
int i = 0;
247-
for (List<PropertyInfo>::ConstIterator itr = info.arguments.begin(); itr != info.arguments.end(); ++itr, ++i) {
248-
if (!_is_exact_type(*itr, p_arguments[i].type)) {
246+
for (int64_t i = 0; i < info.arguments.size(); ++i) {
247+
if (!_is_exact_type(info.arguments[i], p_arguments[i].type)) {
249248
return false;
250249
}
251250
}

0 commit comments

Comments
 (0)