|
@@ -36,13 +36,11 @@
|
|
|
|
|
|
#include <godot_cpp/core/memory.hpp>
|
|
#include <godot_cpp/core/memory.hpp>
|
|
|
|
|
|
-#include <algorithm>
|
|
|
|
-
|
|
|
|
namespace godot {
|
|
namespace godot {
|
|
|
|
|
|
std::unordered_map<StringName, ClassDB::ClassInfo> ClassDB::classes;
|
|
std::unordered_map<StringName, ClassDB::ClassInfo> ClassDB::classes;
|
|
std::unordered_map<StringName, const GDExtensionInstanceBindingCallbacks *> ClassDB::instance_binding_callbacks;
|
|
std::unordered_map<StringName, const GDExtensionInstanceBindingCallbacks *> ClassDB::instance_binding_callbacks;
|
|
-std::vector<StringName> ClassDB::class_register_order;
|
|
|
|
|
|
+LocalVector<StringName> ClassDB::class_register_order;
|
|
std::unordered_map<StringName, Object *> ClassDB::engine_singletons;
|
|
std::unordered_map<StringName, Object *> ClassDB::engine_singletons;
|
|
std::mutex ClassDB::engine_singletons_mutex;
|
|
std::mutex ClassDB::engine_singletons_mutex;
|
|
GDExtensionInitializationLevel ClassDB::current_level = GDEXTENSION_INITIALIZATION_CORE;
|
|
GDExtensionInitializationLevel ClassDB::current_level = GDEXTENSION_INITIALIZATION_CORE;
|
|
@@ -157,7 +155,7 @@ MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const M
|
|
|
|
|
|
p_bind->set_hint_flags(p_flags);
|
|
p_bind->set_hint_flags(p_flags);
|
|
|
|
|
|
- std::vector<StringName> args;
|
|
|
|
|
|
+ LocalVector<StringName> args;
|
|
args.resize(method_name.args.size());
|
|
args.resize(method_name.args.size());
|
|
size_t arg_index = 0;
|
|
size_t arg_index = 0;
|
|
for (StringName arg : method_name.args) {
|
|
for (StringName arg : method_name.args) {
|
|
@@ -166,7 +164,7 @@ MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const M
|
|
|
|
|
|
p_bind->set_argument_names(args);
|
|
p_bind->set_argument_names(args);
|
|
|
|
|
|
- std::vector<Variant> defvals;
|
|
|
|
|
|
+ LocalVector<Variant> defvals;
|
|
|
|
|
|
defvals.resize(p_defcount);
|
|
defvals.resize(p_defcount);
|
|
for (int i = 0; i < p_defcount; i++) {
|
|
for (int i = 0; i < p_defcount; i++) {
|
|
@@ -186,34 +184,34 @@ MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const M
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::bind_method_godot(const StringName &p_class_name, MethodBind *p_method) {
|
|
void ClassDB::bind_method_godot(const StringName &p_class_name, MethodBind *p_method) {
|
|
- std::vector<GDExtensionVariantPtr> def_args;
|
|
|
|
- const std::vector<Variant> &def_args_val = p_method->get_default_arguments();
|
|
|
|
|
|
+ LocalVector<GDExtensionVariantPtr> def_args;
|
|
|
|
+ const LocalVector<Variant> &def_args_val = p_method->get_default_arguments();
|
|
def_args.resize(def_args_val.size());
|
|
def_args.resize(def_args_val.size());
|
|
for (size_t i = 0; i < def_args_val.size(); i++) {
|
|
for (size_t i = 0; i < def_args_val.size(); i++) {
|
|
def_args[i] = (GDExtensionVariantPtr)&def_args_val[i];
|
|
def_args[i] = (GDExtensionVariantPtr)&def_args_val[i];
|
|
}
|
|
}
|
|
|
|
|
|
- std::vector<PropertyInfo> return_value_and_arguments_info = p_method->get_arguments_info_list();
|
|
|
|
- std::vector<GDExtensionClassMethodArgumentMetadata> return_value_and_arguments_metadata = p_method->get_arguments_metadata_list();
|
|
|
|
|
|
+ LocalVector<PropertyInfo> return_value_and_arguments_info = p_method->get_arguments_info_list();
|
|
|
|
+ LocalVector<GDExtensionClassMethodArgumentMetadata> return_value_and_arguments_metadata = p_method->get_arguments_metadata_list();
|
|
|
|
|
|
- std::vector<GDExtensionPropertyInfo> return_value_and_arguments_gdextension_info;
|
|
|
|
|
|
+ LocalVector<GDExtensionPropertyInfo> return_value_and_arguments_gdextension_info;
|
|
return_value_and_arguments_gdextension_info.reserve(return_value_and_arguments_info.size());
|
|
return_value_and_arguments_gdextension_info.reserve(return_value_and_arguments_info.size());
|
|
- for (std::vector<PropertyInfo>::iterator it = return_value_and_arguments_info.begin(); it != return_value_and_arguments_info.end(); it++) {
|
|
|
|
|
|
+ for (const PropertyInfo &info : return_value_and_arguments_info) {
|
|
return_value_and_arguments_gdextension_info.push_back(
|
|
return_value_and_arguments_gdextension_info.push_back(
|
|
GDExtensionPropertyInfo{
|
|
GDExtensionPropertyInfo{
|
|
- static_cast<GDExtensionVariantType>(it->type), // GDExtensionVariantType type;
|
|
|
|
- it->name._native_ptr(), // GDExtensionStringNamePtr name;
|
|
|
|
- it->class_name._native_ptr(), // GDExtensionStringNamePtr class_name;
|
|
|
|
- it->hint, // uint32_t hint;
|
|
|
|
- it->hint_string._native_ptr(), // GDExtensionStringPtr hint_string;
|
|
|
|
- it->usage, // uint32_t usage;
|
|
|
|
|
|
+ static_cast<GDExtensionVariantType>(info.type), // GDExtensionVariantType type;
|
|
|
|
+ info.name._native_ptr(), // GDExtensionStringNamePtr name;
|
|
|
|
+ info.class_name._native_ptr(), // GDExtensionStringNamePtr class_name;
|
|
|
|
+ info.hint, // uint32_t hint;
|
|
|
|
+ info.hint_string._native_ptr(), // GDExtensionStringPtr hint_string;
|
|
|
|
+ info.usage, // uint32_t usage;
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
- GDExtensionPropertyInfo *return_value_info = return_value_and_arguments_gdextension_info.data();
|
|
|
|
- GDExtensionClassMethodArgumentMetadata *return_value_metadata = return_value_and_arguments_metadata.data();
|
|
|
|
- GDExtensionPropertyInfo *arguments_info = return_value_and_arguments_gdextension_info.data() + 1;
|
|
|
|
- GDExtensionClassMethodArgumentMetadata *arguments_metadata = return_value_and_arguments_metadata.data() + 1;
|
|
|
|
|
|
+ GDExtensionPropertyInfo *return_value_info = return_value_and_arguments_gdextension_info.ptr();
|
|
|
|
+ GDExtensionClassMethodArgumentMetadata *return_value_metadata = return_value_and_arguments_metadata.ptr();
|
|
|
|
+ GDExtensionPropertyInfo *arguments_info = return_value_and_arguments_gdextension_info.ptr() + 1;
|
|
|
|
+ GDExtensionClassMethodArgumentMetadata *arguments_metadata = return_value_and_arguments_metadata.ptr() + 1;
|
|
|
|
|
|
StringName name = p_method->get_name();
|
|
StringName name = p_method->get_name();
|
|
GDExtensionClassMethodInfo method_info = {
|
|
GDExtensionClassMethodInfo method_info = {
|
|
@@ -229,7 +227,7 @@ void ClassDB::bind_method_godot(const StringName &p_class_name, MethodBind *p_me
|
|
arguments_info, // GDExtensionPropertyInfo *
|
|
arguments_info, // GDExtensionPropertyInfo *
|
|
arguments_metadata, // GDExtensionClassMethodArgumentMetadata *
|
|
arguments_metadata, // GDExtensionClassMethodArgumentMetadata *
|
|
(uint32_t)p_method->get_default_argument_count(), // uint32_t default_argument_count;
|
|
(uint32_t)p_method->get_default_argument_count(), // uint32_t default_argument_count;
|
|
- def_args.data(), // GDExtensionVariantPtr *default_arguments;
|
|
|
|
|
|
+ def_args.ptr(), // GDExtensionVariantPtr *default_arguments;
|
|
};
|
|
};
|
|
internal::gdextension_interface_classdb_register_extension_class_method(internal::library, p_class_name._native_ptr(), &method_info);
|
|
internal::gdextension_interface_classdb_register_extension_class_method(internal::library, p_class_name._native_ptr(), &method_info);
|
|
}
|
|
}
|
|
@@ -252,7 +250,7 @@ void ClassDB::add_signal(const StringName &p_class, const MethodInfo &p_signal)
|
|
cl.signal_names.insert(p_signal.name);
|
|
cl.signal_names.insert(p_signal.name);
|
|
|
|
|
|
// register our signal in godot
|
|
// register our signal in godot
|
|
- std::vector<GDExtensionPropertyInfo> parameters;
|
|
|
|
|
|
+ LocalVector<GDExtensionPropertyInfo> parameters;
|
|
parameters.reserve(p_signal.arguments.size());
|
|
parameters.reserve(p_signal.arguments.size());
|
|
|
|
|
|
for (const PropertyInfo &par : p_signal.arguments) {
|
|
for (const PropertyInfo &par : p_signal.arguments) {
|
|
@@ -266,7 +264,7 @@ void ClassDB::add_signal(const StringName &p_class, const MethodInfo &p_signal)
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
- internal::gdextension_interface_classdb_register_extension_class_signal(internal::library, cl.name._native_ptr(), p_signal.name._native_ptr(), parameters.data(), parameters.size());
|
|
|
|
|
|
+ internal::gdextension_interface_classdb_register_extension_class_signal(internal::library, cl.name._native_ptr(), p_signal.name._native_ptr(), parameters.ptr(), parameters.size());
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::bind_integer_constant(const StringName &p_class_name, const StringName &p_enum_name, const StringName &p_constant_name, GDExtensionInt p_constant_value, bool p_is_bitfield) {
|
|
void ClassDB::bind_integer_constant(const StringName &p_class_name, const StringName &p_enum_name, const StringName &p_constant_name, GDExtensionInt p_constant_value, bool p_is_bitfield) {
|
|
@@ -413,8 +411,8 @@ void ClassDB::initialize(GDExtensionInitializationLevel p_level) {
|
|
|
|
|
|
void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) {
|
|
void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) {
|
|
std::set<StringName> to_erase;
|
|
std::set<StringName> to_erase;
|
|
- for (std::vector<StringName>::reverse_iterator i = class_register_order.rbegin(); i != class_register_order.rend(); ++i) {
|
|
|
|
- const StringName &name = *i;
|
|
|
|
|
|
+ for (int i = class_register_order.size() - 1; i >= 0; --i) {
|
|
|
|
+ const StringName &name = class_register_order[i];
|
|
const ClassInfo &cl = classes[name];
|
|
const ClassInfo &cl = classes[name];
|
|
|
|
|
|
if (cl.level != p_level) {
|
|
if (cl.level != p_level) {
|
|
@@ -432,17 +430,15 @@ void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) {
|
|
}
|
|
}
|
|
|
|
|
|
{
|
|
{
|
|
- // The following is equivalent to c++20 `std::erase_if(class_register_order, [&](const StringName& name){ return to_erase.contains(name); });`
|
|
|
|
- std::vector<StringName>::iterator it = std::remove_if(class_register_order.begin(), class_register_order.end(), [&](const StringName &p_name) {
|
|
|
|
- return to_erase.count(p_name) > 0;
|
|
|
|
- });
|
|
|
|
- class_register_order.erase(it, class_register_order.end());
|
|
|
|
|
|
+ for (const StringName &x : to_erase) {
|
|
|
|
+ class_register_order.erase(x);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
if (p_level == GDEXTENSION_INITIALIZATION_CORE) {
|
|
if (p_level == GDEXTENSION_INITIALIZATION_CORE) {
|
|
// Make a new list of the singleton objects, since freeing the instance bindings will lead to
|
|
// Make a new list of the singleton objects, since freeing the instance bindings will lead to
|
|
// elements getting removed from engine_singletons.
|
|
// elements getting removed from engine_singletons.
|
|
- std::vector<Object *> singleton_objects;
|
|
|
|
|
|
+ LocalVector<Object *> singleton_objects;
|
|
{
|
|
{
|
|
std::lock_guard<std::mutex> lock(engine_singletons_mutex);
|
|
std::lock_guard<std::mutex> lock(engine_singletons_mutex);
|
|
singleton_objects.reserve(engine_singletons.size());
|
|
singleton_objects.reserve(engine_singletons.size());
|
|
@@ -450,8 +446,8 @@ void ClassDB::deinitialize(GDExtensionInitializationLevel p_level) {
|
|
singleton_objects.push_back(pair.second);
|
|
singleton_objects.push_back(pair.second);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- for (std::vector<Object *>::iterator i = singleton_objects.begin(); i != singleton_objects.end(); i++) {
|
|
|
|
- internal::gdextension_interface_object_free_instance_binding((*i)->_owner, internal::token);
|
|
|
|
|
|
+ for (const Object *i : singleton_objects) {
|
|
|
|
+ internal::gdextension_interface_object_free_instance_binding((*i)._owner, internal::token);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|