summaryrefslogtreecommitdiffstats
path: root/include/godot_cpp/classes
diff options
context:
space:
mode:
authorEmmanuel Leblond <emmanuel.leblond@gmail.com>2022-11-08 23:00:42 +0100
committerGitHub <noreply@github.com>2022-11-08 23:00:42 +0100
commitce3c08359a1aef24bc438ac1c7bb18f2820aed81 (patch)
treee514830ab0eaa2d12e03c643faf69b4f0530348c /include/godot_cpp/classes
parent73ad6717e907ab24a5c5550f518eda53092c4495 (diff)
parented4d3d36f9398c45e2b5a4e71b0af43d01c555b0 (diff)
downloadredot-cpp-ce3c08359a1aef24bc438ac1c7bb18f2820aed81.tar.gz
Merge pull request #896 from touilleMan/stringname-in-gdextension-api
Uses `StringName` in GDExtension perf critical instance creation & method/properties setter/getter
Diffstat (limited to 'include/godot_cpp/classes')
-rw-r--r--include/godot_cpp/classes/ref.hpp8
-rw-r--r--include/godot_cpp/classes/wrapped.hpp53
2 files changed, 27 insertions, 34 deletions
diff --git a/include/godot_cpp/classes/ref.hpp b/include/godot_cpp/classes/ref.hpp
index 16e418d..21171d7 100644
--- a/include/godot_cpp/classes/ref.hpp
+++ b/include/godot_cpp/classes/ref.hpp
@@ -264,8 +264,8 @@ struct GetTypeInfo<Ref<T>, typename EnableIf<TypeInherits<RefCounted, T>::value>
static const GDNativeVariantType VARIANT_TYPE = GDNATIVE_VARIANT_TYPE_OBJECT;
static const GDNativeExtensionClassMethodArgumentMetadata METADATA = GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE;
- static inline GDNativePropertyInfo get_class_info() {
- return make_property_info(GDNATIVE_VARIANT_TYPE_OBJECT, T::get_class_static());
+ static inline PropertyInfo get_class_info() {
+ return make_property_info(Variant::Type::OBJECT, T::get_class_static());
}
};
@@ -274,8 +274,8 @@ struct GetTypeInfo<const Ref<T> &, typename EnableIf<TypeInherits<RefCounted, T>
static const GDNativeVariantType VARIANT_TYPE = GDNATIVE_VARIANT_TYPE_OBJECT;
static const GDNativeExtensionClassMethodArgumentMetadata METADATA = GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE;
- static inline GDNativePropertyInfo get_class_info() {
- return make_property_info(GDNATIVE_VARIANT_TYPE_OBJECT, T::get_class_static());
+ static inline PropertyInfo get_class_info() {
+ return make_property_info(Variant::Type::OBJECT, T::get_class_static());
}
};
diff --git a/include/godot_cpp/classes/wrapped.hpp b/include/godot_cpp/classes/wrapped.hpp
index ce1bc51..1dfa5a2 100644
--- a/include/godot_cpp/classes/wrapped.hpp
+++ b/include/godot_cpp/classes/wrapped.hpp
@@ -49,7 +49,7 @@ class Wrapped {
friend void postinitialize_handler(Wrapped *);
protected:
- virtual const char *_get_extension_class() const; // This is needed to retrieve the class name before the godot object has its _extension and _extension_instance members assigned.
+ virtual const StringName *_get_extension_class_name() const; // This is needed to retrieve the class name before the godot object has its _extension and _extension_instance members assigned.
virtual const GDNativeInstanceBindingCallbacks *_get_bindings_callbacks() const = 0;
void _notification(int p_what){};
@@ -67,32 +67,26 @@ protected:
static void free_property_list_bind(GDExtensionClassInstancePtr p_instance, const GDNativePropertyInfo *p_list) {}
static GDNativeBool property_can_revert_bind(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name) { return false; }
static GDNativeBool property_get_revert_bind(GDExtensionClassInstancePtr p_instance, const GDNativeStringNamePtr p_name, GDNativeVariantPtr r_ret) { return false; }
- static void to_string_bind(GDExtensionClassInstancePtr p_instance, GDNativeStringPtr r_out) {}
+ static void to_string_bind(GDExtensionClassInstancePtr p_instance, GDNativeBool *r_is_valid, GDNativeStringPtr r_out) {}
GDNativePropertyInfo *plist = nullptr;
uint32_t plist_size = 0;
void _postinitialize();
- Wrapped(const char *p_godot_class);
+ Wrapped(const StringName p_godot_class);
Wrapped(GodotObject *p_godot_object);
public:
- static const char *get_class_static() {
- return "Wrapped";
+ static StringName &get_class_static() {
+ static StringName string_name = StringName("Wrapped");
+ return string_name;
}
uint64_t get_instance_id() const {
return 0;
}
- static _FORCE_INLINE_ char *_alloc_and_copy_cstr(const char *p_str) {
- size_t size = strlen(p_str) + 1;
- char *ret = reinterpret_cast<char *>(memalloc(size));
- memcpy(ret, p_str, size);
- return ret;
- }
-
// Must be public but you should not touch this.
GodotObject *_owner = nullptr;
};
@@ -105,8 +99,9 @@ private:
friend class ::godot::ClassDB; \
\
protected: \
- virtual const char *_get_extension_class() const override { \
- return get_class_static(); \
+ virtual const StringName *_get_extension_class_name() const override { \
+ static StringName string_name = get_class_static(); \
+ return &string_name; \
} \
\
virtual const GDNativeInstanceBindingCallbacks *_get_bindings_callbacks() const override { \
@@ -164,11 +159,12 @@ public:
initialized = true; \
} \
\
- static const char *get_class_static() { \
- return #m_class; \
+ static StringName &get_class_static() { \
+ static StringName string_name = StringName(#m_class); \
+ return string_name; \
} \
\
- static const char *get_parent_class_static() { \
+ static StringName &get_parent_class_static() { \
return m_inherits::get_class_static(); \
} \
\
@@ -220,10 +216,10 @@ public:
cls->plist_size = 0; \
for (const ::godot::PropertyInfo &E : list) { \
cls->plist[cls->plist_size].type = static_cast<GDNativeVariantType>(E.type); \
- cls->plist[cls->plist_size].name = _alloc_and_copy_cstr(E.name.utf8().get_data()); \
+ cls->plist[cls->plist_size].name = E.name._native_ptr(); \
cls->plist[cls->plist_size].hint = E.hint; \
- cls->plist[cls->plist_size].hint_string = _alloc_and_copy_cstr(E.hint_string.utf8().get_data()); \
- cls->plist[cls->plist_size].class_name = _alloc_and_copy_cstr(E.class_name.utf8().get_data()); \
+ cls->plist[cls->plist_size].hint_string = E.hint_string._native_ptr(); \
+ cls->plist[cls->plist_size].class_name = E.class_name._native_ptr(); \
cls->plist[cls->plist_size].usage = E.usage; \
cls->plist_size++; \
} \
@@ -240,11 +236,6 @@ public:
if (p_instance) { \
m_class *cls = reinterpret_cast<m_class *>(p_instance); \
ERR_FAIL_COND_MSG(cls->plist == nullptr, "Internal error, property list double free!"); \
- for (size_t i = 0; i < cls->plist_size; i++) { \
- memfree(const_cast<char *>(cls->plist[i].name)); \
- memfree(const_cast<char *>(cls->plist[i].class_name)); \
- memfree(const_cast<char *>(cls->plist[i].hint_string)); \
- } \
memfree(cls->plist); \
cls->plist = nullptr; \
cls->plist_size = 0; \
@@ -273,14 +264,15 @@ public:
return false; \
} \
\
- static void to_string_bind(GDExtensionClassInstancePtr p_instance, GDNativeStringPtr r_out) { \
+ static void to_string_bind(GDExtensionClassInstancePtr p_instance, GDNativeBool *r_is_valid, GDNativeStringPtr r_out) { \
if (p_instance && m_class::_get_to_string()) { \
if (m_class::_get_to_string() != m_inherits::_get_to_string()) { \
m_class *cls = reinterpret_cast<m_class *>(p_instance); \
*reinterpret_cast<::godot::String *>(r_out) = cls->_to_string(); \
+ *r_is_valid = true; \
return; \
} \
- m_inherits::to_string_bind(p_instance, r_out); \
+ m_inherits::to_string_bind(p_instance, r_is_valid, r_out); \
} \
} \
\
@@ -357,11 +349,12 @@ protected:
public: \
static void initialize_class() {} \
\
- static const char *get_class_static() { \
- return #m_class; \
+ static StringName &get_class_static() { \
+ static StringName string_name = StringName(#m_class); \
+ return string_name; \
} \
\
- static const char *get_parent_class_static() { \
+ static StringName &get_parent_class_static() { \
return m_inherits::get_class_static(); \
} \
\