1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-17 14:11:06 +00:00

Add GDType and Object::_gdtype_ptr for first-class Object typing.

The type is currently bare-bones, but will be expanded in future PRs.
This commit is contained in:
Lukas Tenbrink
2025-05-02 01:57:34 +02:00
parent d705613db3
commit ac85d24e64
4 changed files with 151 additions and 47 deletions

View File

@@ -31,6 +31,7 @@
#pragma once
#include "core/extension/gdextension_interface.h"
#include "core/object/gdtype.h"
#include "core/object/message_queue.h"
#include "core/object/object_id.h"
#include "core/os/rw_lock.h"
@@ -494,21 +495,18 @@ private:
friend class ::ClassDB; \
\
public: \
virtual const StringName *_get_class_namev() const override { \
return &get_class_static(); \
virtual const GDType &_get_typev() const override { \
return get_gdtype_static(); \
} \
static const GDType &get_gdtype_static() { \
static GDType *_class_static; \
if (unlikely(!_class_static)) { \
assign_type_static(&_class_static, #m_class, &super_type::get_gdtype_static()); \
} \
return *_class_static; \
} \
static const StringName &get_class_static() { \
static StringName _class_name_static; \
if (unlikely(!_class_name_static)) { \
assign_class_name_static(#m_class, _class_name_static); \
} \
return _class_name_static; \
} \
virtual bool is_class(const String &p_class) const override { \
if (_get_extension() && _get_extension()->is_class(p_class)) { \
return true; \
} \
return (p_class == (#m_class)) ? true : m_inherits::is_class(p_class); \
return get_gdtype_static().get_name(); \
} \
\
protected: \
@@ -668,7 +666,7 @@ private:
Variant script; // Reference does not exist yet, store it in a Variant.
HashMap<StringName, Variant> metadata;
HashMap<StringName, Variant *> metadata_properties;
mutable const StringName *_class_name_ptr = nullptr;
mutable const GDType *_gdtype_ptr = nullptr;
void _add_user_signal(const String &p_name, const Array &p_args = Array());
bool _has_user_signal(const StringName &p_name) const;
@@ -774,9 +772,7 @@ protected:
Variant _call_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error);
Variant _call_deferred_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error);
virtual const StringName *_get_class_namev() const {
return &get_class_static();
}
virtual const GDType &_get_typev() const { return get_gdtype_static(); }
TypedArray<StringName> _get_meta_list_bind() const;
TypedArray<Dictionary> _get_property_list_bind() const;
@@ -842,26 +838,25 @@ public:
};
/* TYPE API */
static void assign_class_name_static(const Span<char> &p_name, StringName &r_target);
static void assign_type_static(GDType **type_ptr, const char *p_name, const GDType *super_type);
static const StringName &get_class_static() {
static StringName _class_name_static;
if (unlikely(!_class_name_static)) {
assign_class_name_static("Object", _class_name_static);
static const GDType &get_gdtype_static() {
static GDType *_class_static;
if (unlikely(!_class_static)) {
assign_type_static(&_class_static, "Object", nullptr);
}
return _class_name_static;
return *_class_static;
}
const GDType &get_gdtype() const;
static const StringName &get_class_static() { return get_gdtype_static().get_name(); }
_FORCE_INLINE_ String get_class() const { return get_class_name(); }
virtual String get_save_class() const { return get_class(); } //class stored when saving
virtual bool is_class(const String &p_class) const {
if (_extension && _extension->is_class(p_class)) {
return true;
}
return (p_class == "Object");
}
bool is_class(const String &p_class) const;
virtual bool is_class_ptr(void *p_ptr) const { return get_class_ptr_static() == p_ptr; }
template <typename T>