Skip to content

Commit

Permalink
[Core] Use LocalVector for MethodInfo::arguments
Browse files Browse the repository at this point in the history
  • Loading branch information
AThousandShips committed Aug 29, 2024
1 parent fd7239c commit aefa43f
Show file tree
Hide file tree
Showing 19 changed files with 115 additions and 131 deletions.
5 changes: 2 additions & 3 deletions core/doc_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,10 +152,9 @@ void DocData::method_doc_from_methodinfo(DocData::MethodDoc &p_method, const Met

return_doc_from_retinfo(p_method, p_methodinfo.return_val);

int i = 0;
for (List<PropertyInfo>::ConstIterator itr = p_methodinfo.arguments.begin(); itr != p_methodinfo.arguments.end(); ++itr, ++i) {
for (uint32_t i = 0; i < p_methodinfo.arguments.size(); ++i) {
DocData::ArgumentDoc argument;
argument_doc_from_arginfo(argument, *itr);
argument_doc_from_arginfo(argument, p_methodinfo.arguments[i]);
int default_arg_index = i - (p_methodinfo.arguments.size() - p_methodinfo.default_arguments.size());
if (default_arg_index >= 0) {
Variant default_arg = p_methodinfo.default_arguments[default_arg_index];
Expand Down
12 changes: 5 additions & 7 deletions core/extension/extension_api_dump.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1032,9 +1032,8 @@ Dictionary GDExtensionAPIDump::generate_extension_api(bool p_include_docs) {
}

Array arguments;
int i = 0;
for (List<PropertyInfo>::ConstIterator itr = mi.arguments.begin(); itr != mi.arguments.end(); ++itr, ++i) {
const PropertyInfo &pinfo = *itr;
for (uint32_t i = 0; i < mi.arguments.size(); ++i) {
const PropertyInfo &pinfo = mi.arguments[i];
Dictionary d3;

d3["name"] = pinfo.name;
Expand Down Expand Up @@ -1159,11 +1158,10 @@ Dictionary GDExtensionAPIDump::generate_extension_api(bool p_include_docs) {

Array arguments;

int i = 0;
for (List<PropertyInfo>::ConstIterator itr = F.arguments.begin(); itr != F.arguments.end(); ++itr, ++i) {
for (uint32_t i = 0; i < F.arguments.size(); ++i) {
Dictionary d3;
d3["name"] = itr->name;
d3["type"] = get_property_info_type_name(*itr);
d3["name"] = F.arguments[i].name;
d3["type"] = get_property_info_type_name(F.arguments[i]);
if (F.get_argument_meta(i) > 0) {
d3["meta"] = get_type_meta_name((GodotTypeInfo::Metadata)F.get_argument_meta(i));
}
Expand Down
5 changes: 2 additions & 3 deletions core/object/class_db.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1967,9 +1967,8 @@ void ClassDB::add_virtual_method(const StringName &p_class, const MethodInfo &p_
if (p_arg_names.size() != mi.arguments.size()) {
WARN_PRINT("Mismatch argument name count for virtual method: " + String(p_class) + "::" + p_method.name);
} else {
List<PropertyInfo>::Iterator itr = mi.arguments.begin();
for (int i = 0; i < p_arg_names.size(); ++itr, ++i) {
itr->name = p_arg_names[i];
for (int i = 0; i < p_arg_names.size(); ++i) {
mi.arguments[i].name = p_arg_names[i];
}
}
}
Expand Down
11 changes: 5 additions & 6 deletions core/object/method_bind.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,8 @@ class MethodBindVarArgBase : public MethodBind {
virtual PropertyInfo _gen_argument_type_info(int p_arg) const override {
if (p_arg < 0) {
return _gen_return_type_info();
} else if (p_arg < method_info.arguments.size()) {
return method_info.arguments.get(p_arg);
} else if (p_arg < (int)method_info.arguments.size()) {
return method_info.arguments[p_arg];
} else {
return PropertyInfo(Variant::NIL, "arg_" + itos(p_arg), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NIL_IS_VARIANT);
}
Expand Down Expand Up @@ -193,11 +193,10 @@ class MethodBindVarArgBase : public MethodBind {
Vector<StringName> names;
names.resize(method_info.arguments.size());
#endif
int i = 0;
for (List<PropertyInfo>::ConstIterator itr = method_info.arguments.begin(); itr != method_info.arguments.end(); ++itr, ++i) {
at[i + 1] = itr->type;
for (uint32_t i = 0; i < method_info.arguments.size(); ++i) {
at[i + 1] = method_info.arguments[i].type;
#ifdef DEBUG_METHODS_ENABLED
names.write[i] = itr->name;
names.write[i] = method_info.arguments[i].name;
#endif
}

Expand Down
11 changes: 10 additions & 1 deletion core/object/object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,10 +114,19 @@ TypedArray<Dictionary> convert_property_list(const List<PropertyInfo> *p_list) {
return va;
}

TypedArray<Dictionary> convert_property_list(const LocalVector<PropertyInfo> &p_vector) {
TypedArray<Dictionary> va;
for (const PropertyInfo &E : p_vector) {
va.push_back(Dictionary(E));
}

return va;
}

MethodInfo::operator Dictionary() const {
Dictionary d;
d["name"] = name;
d["args"] = convert_property_list(&arguments);
d["args"] = convert_property_list(arguments);
Array da;
for (int i = 0; i < default_arguments.size(); i++) {
da.push_back(default_arguments[i]);
Expand Down
27 changes: 10 additions & 17 deletions core/object/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include "core/templates/hash_map.h"
#include "core/templates/hash_set.h"
#include "core/templates/list.h"
#include "core/templates/local_vector.h"
#include "core/templates/rb_map.h"
#include "core/templates/safe_refcount.h"
#include "core/variant/callable_bind.h"
Expand Down Expand Up @@ -205,6 +206,7 @@ struct PropertyInfo {
};

TypedArray<Dictionary> convert_property_list(const List<PropertyInfo> *p_list);
TypedArray<Dictionary> convert_property_list(const LocalVector<PropertyInfo> &p_vector);

enum MethodFlags {
METHOD_FLAG_NORMAL = 1,
Expand All @@ -222,13 +224,13 @@ struct MethodInfo {
PropertyInfo return_val;
uint32_t flags = METHOD_FLAGS_DEFAULT;
int id = 0;
List<PropertyInfo> arguments;
LocalVector<PropertyInfo> arguments;
Vector<Variant> default_arguments;
int return_val_metadata = 0;
Vector<int> arguments_metadata;

int get_argument_meta(int p_arg) const {
ERR_FAIL_COND_V(p_arg < -1 || p_arg > arguments.size(), 0);
ERR_FAIL_COND_V(p_arg < -1 || p_arg > (int)arguments.size(), 0);
if (p_arg == -1) {
return return_val_metadata;
}
Expand All @@ -249,31 +251,22 @@ struct MethodInfo {
return_val(PropertyInfo(pinfo.return_value)),
flags(pinfo.flags),
id(pinfo.id) {
for (uint32_t j = 0; j < pinfo.argument_count; j++) {
arguments.push_back(PropertyInfo(pinfo.arguments[j]));
arguments.resize(pinfo.argument_count);
for (uint32_t i = 0; i < pinfo.argument_count; i++) {
arguments[i] = PropertyInfo(pinfo.arguments[i]);
}
const Variant *def_values = (const Variant *)pinfo.default_arguments;
for (uint32_t j = 0; j < pinfo.default_argument_count; j++) {
default_arguments.push_back(def_values[j]);
}
}

void _push_params(const PropertyInfo &p_param) {
arguments.push_back(p_param);
}

template <typename... VarArgs>
void _push_params(const PropertyInfo &p_param, VarArgs... p_params) {
arguments.push_back(p_param);
_push_params(p_params...);
}

MethodInfo(const String &p_name) { name = p_name; }

template <typename... VarArgs>
MethodInfo(const String &p_name, VarArgs... p_params) {
name = p_name;
_push_params(p_params...);
arguments = LocalVector<PropertyInfo>{ p_params... };
}

MethodInfo(Variant::Type ret) { return_val.type = ret; }
Expand All @@ -286,7 +279,7 @@ struct MethodInfo {
MethodInfo(Variant::Type ret, const String &p_name, VarArgs... p_params) {
name = p_name;
return_val.type = ret;
_push_params(p_params...);
arguments = LocalVector<PropertyInfo>{ p_params... };
}

MethodInfo(const PropertyInfo &p_ret, const String &p_name) {
Expand All @@ -298,7 +291,7 @@ struct MethodInfo {
MethodInfo(const PropertyInfo &p_ret, const String &p_name, VarArgs... p_params) {
return_val = p_ret;
name = p_name;
_push_params(p_params...);
arguments = LocalVector<PropertyInfo>{ p_params... };
}
};

Expand Down
7 changes: 3 additions & 4 deletions editor/animation_track_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5372,17 +5372,16 @@ void AnimationTrackEditor::_add_method_key(const String &p_method) {
Dictionary d;
d["method"] = p_method;
Array params;
int first_defarg = E.arguments.size() - E.default_arguments.size();
uint32_t first_defarg = E.arguments.size() - E.default_arguments.size();

int i = 0;
for (List<PropertyInfo>::ConstIterator itr = E.arguments.begin(); itr != E.arguments.end(); ++itr, ++i) {
for (uint32_t i = 0; i < E.arguments.size(); ++i) {
if (i >= first_defarg) {
Variant arg = E.default_arguments[i - first_defarg];
params.push_back(arg);
} else {
Callable::CallError ce;
Variant arg;
Variant::construct(itr->type, arg, nullptr, 0, ce);
Variant::construct(E.arguments[i].type, arg, nullptr, 0, ce);
params.push_back(arg);
}
}
Expand Down
22 changes: 10 additions & 12 deletions editor/connections_dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -281,10 +281,10 @@ List<MethodInfo> ConnectDialog::_filter_method_list(const List<MethodInfo> &p_me
bool check_signal = compatible_methods_only->is_pressed();
List<MethodInfo> ret;

List<Pair<Variant::Type, StringName>> effective_args;
LocalVector<Pair<Variant::Type, StringName>> effective_args;
int unbind = get_unbinds();
for (int i = 0; i < p_signal.arguments.size() - unbind; i++) {
PropertyInfo pi = p_signal.arguments.get(i);
for (uint32_t i = 0; i < p_signal.arguments.size() - unbind; i++) {
PropertyInfo pi = p_signal.arguments[i];
effective_args.push_back(Pair(pi.type, pi.class_name));
}
if (unbind == 0) {
Expand All @@ -311,17 +311,16 @@ List<MethodInfo> ConnectDialog::_filter_method_list(const List<MethodInfo> &p_me
}

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

if (stype != Variant::NIL && mtype != Variant::NIL && stype != mtype) {
type_mismatch = true;
break;
}

if (stype == Variant::OBJECT && mtype == Variant::OBJECT && !ClassDB::is_parent_class(E->get().second, F->get().class_name)) {
if (stype == Variant::OBJECT && mtype == Variant::OBJECT && !ClassDB::is_parent_class(effective_args[i].second, mi.arguments[i].class_name)) {
type_mismatch = true;
break;
}
Expand Down Expand Up @@ -550,13 +549,12 @@ String ConnectDialog::get_signature(const MethodInfo &p_method, PackedStringArra
signature.append(p_method.name);
signature.append("(");

int i = 0;
for (List<PropertyInfo>::ConstIterator itr = p_method.arguments.begin(); itr != p_method.arguments.end(); ++itr, ++i) {
if (itr != p_method.arguments.begin()) {
for (uint32_t i = 0; i < p_method.arguments.size(); ++i) {
if (i > 0) {
signature.append(", ");
}

const PropertyInfo &pi = *itr;
const PropertyInfo &pi = p_method.arguments[i];
String type_name;
switch (pi.type) {
case Variant::NIL:
Expand Down
18 changes: 7 additions & 11 deletions editor/doc_tools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -646,8 +646,7 @@ void DocTools::generate(BitField<GenerateFlags> p_flags) {
for (List<MethodInfo>::Element *EV = signal_list.front(); EV; EV = EV->next()) {
DocData::MethodDoc signal;
signal.name = EV->get().name;
for (List<PropertyInfo>::Element *EA = EV->get().arguments.front(); EA; EA = EA->next()) {
const PropertyInfo &arginfo = EA->get();
for (const PropertyInfo &arginfo : EV->get().arguments) {
DocData::ArgumentDoc argument;
DocData::argument_doc_from_arginfo(argument, arginfo);

Expand Down Expand Up @@ -838,9 +837,8 @@ void DocTools::generate(BitField<GenerateFlags> p_flags) {

method.name = mi.name;

int j = 0;
for (List<PropertyInfo>::ConstIterator itr = mi.arguments.begin(); itr != mi.arguments.end(); ++itr, ++j) {
PropertyInfo arginfo = *itr;
for (uint32_t j = 0; j < mi.arguments.size(); ++j) {
const PropertyInfo &arginfo = mi.arguments[j];
DocData::ArgumentDoc ad;
DocData::argument_doc_from_arginfo(ad, arginfo);
ad.name = arginfo.name;
Expand Down Expand Up @@ -1029,10 +1027,9 @@ void DocTools::generate(BitField<GenerateFlags> p_flags) {

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

int j = 0;
for (List<PropertyInfo>::ConstIterator itr = mi.arguments.begin(); itr != mi.arguments.end(); ++itr, ++j) {
for (uint32_t j = 0; j < mi.arguments.size(); ++j) {
DocData::ArgumentDoc ad;
DocData::argument_doc_from_arginfo(ad, *itr);
DocData::argument_doc_from_arginfo(ad, mi.arguments[j]);

int darg_idx = j - (mi.arguments.size() - mi.default_arguments.size());
if (darg_idx >= 0) {
Expand Down Expand Up @@ -1074,10 +1071,9 @@ void DocTools::generate(BitField<GenerateFlags> p_flags) {

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

int j = 0;
for (List<PropertyInfo>::ConstIterator itr = ai.arguments.begin(); itr != ai.arguments.end(); ++itr, ++j) {
for (uint32_t j = 0; j < ai.arguments.size(); ++j) {
DocData::ArgumentDoc ad;
DocData::argument_doc_from_arginfo(ad, *itr);
DocData::argument_doc_from_arginfo(ad, ai.arguments[j]);

int darg_idx = j - (ai.arguments.size() - ai.default_arguments.size());
if (darg_idx >= 0) {
Expand Down
17 changes: 9 additions & 8 deletions editor/property_selector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,20 +271,21 @@ void PropertySelector::_update_search() {

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

for (List<PropertyInfo>::Iterator arg_itr = mi.arguments.begin(); arg_itr != mi.arguments.end(); ++arg_itr) {
if (arg_itr != mi.arguments.begin()) {
for (uint32_t i = 0; i < mi.arguments.size(); ++i) {
PropertyInfo &arg = mi.arguments[i];
if (i > 0) {
desc += ", ";
}

desc += arg_itr->name;
desc += arg.name;

if (arg_itr->type == Variant::NIL) {
if (arg.type == Variant::NIL) {
desc += ": Variant";
} else if (arg_itr->name.contains(":")) {
desc += vformat(": %s", arg_itr->name.get_slice(":", 1));
arg_itr->name = arg_itr->name.get_slice(":", 0);
} else if (arg.name.contains(":")) {
desc += vformat(": %s", arg.name.get_slice(":", 1));
arg.name = arg.name.get_slice(":", 0);
} else {
desc += vformat(": %s", Variant::get_type_name(arg_itr->type));
desc += vformat(": %s", Variant::get_type_name(arg.type));
}
}

Expand Down
37 changes: 16 additions & 21 deletions modules/gdscript/gdscript_analyzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1575,13 +1575,12 @@ void GDScriptAnalyzer::resolve_annotation(GDScriptParser::AnnotationNode *p_anno

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

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

if (E->next() != nullptr) {
E = E->next();
if (j + 1 < (int)annotation_info.arguments.size()) {
++j;
}

reduce_expression(argument);
Expand Down Expand Up @@ -3192,28 +3191,24 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a

bool types_match = true;

{
List<PropertyInfo>::ConstIterator arg_itr = info.arguments.begin();
for (int i = 0; i < p_call->arguments.size(); ++arg_itr, ++i) {
GDScriptParser::DataType par_type = type_from_property(*arg_itr, true);
GDScriptParser::DataType arg_type = p_call->arguments[i]->get_datatype();
if (!is_type_compatible(par_type, arg_type, true)) {
types_match = false;
break;
for (int i = 0; i < p_call->arguments.size(); ++i) {
GDScriptParser::DataType par_type = type_from_property(info.arguments[i], true);
GDScriptParser::DataType arg_type = p_call->arguments[i]->get_datatype();
if (!is_type_compatible(par_type, arg_type, true)) {
types_match = false;
break;
#ifdef DEBUG_ENABLED
} else {
if (par_type.builtin_type == Variant::INT && arg_type.builtin_type == Variant::FLOAT && builtin_type != Variant::INT) {
parser->push_warning(p_call, GDScriptWarning::NARROWING_CONVERSION, function_name);
}
#endif
} else {
if (par_type.builtin_type == Variant::INT && arg_type.builtin_type == Variant::FLOAT && builtin_type != Variant::INT) {
parser->push_warning(p_call, GDScriptWarning::NARROWING_CONVERSION, function_name);
}
#endif
}
}

if (types_match) {
List<PropertyInfo>::ConstIterator arg_itr = info.arguments.begin();
for (int i = 0; i < p_call->arguments.size(); ++arg_itr, ++i) {
GDScriptParser::DataType par_type = type_from_property(*arg_itr, true);
for (int i = 0; i < p_call->arguments.size(); ++i) {
GDScriptParser::DataType par_type = type_from_property(info.arguments[i], true);
if (p_call->arguments[i]->is_constant) {
update_const_expression_builtin_type(p_call->arguments[i], par_type, "pass");
}
Expand Down
Loading

0 comments on commit aefa43f

Please sign in to comment.