|
@@ -40,14 +40,12 @@
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name) {
|
|
MethodDefinition D_METHOD(const char *p_name) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
return md;
|
|
return md;
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.push_back(StaticCString::create(p_arg1));
|
|
md.args.push_back(StaticCString::create(p_arg1));
|
|
@@ -55,7 +53,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1) {
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(2);
|
|
md.args.resize(2);
|
|
@@ -65,7 +62,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(3);
|
|
md.args.resize(3);
|
|
@@ -76,7 +72,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(4);
|
|
md.args.resize(4);
|
|
@@ -88,7 +83,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(5);
|
|
md.args.resize(5);
|
|
@@ -101,7 +95,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(6);
|
|
md.args.resize(6);
|
|
@@ -115,7 +108,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(7);
|
|
md.args.resize(7);
|
|
@@ -130,7 +122,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(8);
|
|
md.args.resize(8);
|
|
@@ -146,7 +137,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(9);
|
|
md.args.resize(9);
|
|
@@ -163,7 +153,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(10);
|
|
md.args.resize(10);
|
|
@@ -181,7 +170,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(11);
|
|
md.args.resize(11);
|
|
@@ -200,7 +188,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11, const char *p_arg12) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11, const char *p_arg12) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(12);
|
|
md.args.resize(12);
|
|
@@ -220,7 +207,6 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
}
|
|
}
|
|
|
|
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11, const char *p_arg12, const char *p_arg13) {
|
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11, const char *p_arg12, const char *p_arg13) {
|
|
-
|
|
|
|
MethodDefinition md;
|
|
MethodDefinition md;
|
|
md.name = StaticCString::create(p_name);
|
|
md.name = StaticCString::create(p_name);
|
|
md.args.resize(13);
|
|
md.args.resize(13);
|
|
@@ -245,12 +231,10 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|
ClassDB::APIType ClassDB::current_api = API_CORE;
|
|
ClassDB::APIType ClassDB::current_api = API_CORE;
|
|
|
|
|
|
void ClassDB::set_current_api(APIType p_api) {
|
|
void ClassDB::set_current_api(APIType p_api) {
|
|
-
|
|
|
|
current_api = p_api;
|
|
current_api = p_api;
|
|
}
|
|
}
|
|
|
|
|
|
ClassDB::APIType ClassDB::get_current_api() {
|
|
ClassDB::APIType ClassDB::get_current_api() {
|
|
-
|
|
|
|
return current_api;
|
|
return current_api;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -259,13 +243,11 @@ HashMap<StringName, StringName> ClassDB::resource_base_extensions;
|
|
HashMap<StringName, StringName> ClassDB::compat_classes;
|
|
HashMap<StringName, StringName> ClassDB::compat_classes;
|
|
|
|
|
|
bool ClassDB::is_parent_class(const StringName &p_class, const StringName &p_inherits) {
|
|
bool ClassDB::is_parent_class(const StringName &p_class, const StringName &p_inherits) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
StringName inherits = p_class;
|
|
StringName inherits = p_class;
|
|
|
|
|
|
while (inherits.operator String().length()) {
|
|
while (inherits.operator String().length()) {
|
|
-
|
|
|
|
if (inherits == p_inherits)
|
|
if (inherits == p_inherits)
|
|
return true;
|
|
return true;
|
|
inherits = get_parent_class(inherits);
|
|
inherits = get_parent_class(inherits);
|
|
@@ -274,13 +256,11 @@ bool ClassDB::is_parent_class(const StringName &p_class, const StringName &p_inh
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
void ClassDB::get_class_list(List<StringName> *p_classes) {
|
|
void ClassDB::get_class_list(List<StringName> *p_classes) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
const StringName *k = nullptr;
|
|
const StringName *k = nullptr;
|
|
|
|
|
|
while ((k = classes.next(k))) {
|
|
while ((k = classes.next(k))) {
|
|
-
|
|
|
|
p_classes->push_back(*k);
|
|
p_classes->push_back(*k);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -288,33 +268,28 @@ void ClassDB::get_class_list(List<StringName> *p_classes) {
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::get_inheriters_from_class(const StringName &p_class, List<StringName> *p_classes) {
|
|
void ClassDB::get_inheriters_from_class(const StringName &p_class, List<StringName> *p_classes) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
const StringName *k = nullptr;
|
|
const StringName *k = nullptr;
|
|
|
|
|
|
while ((k = classes.next(k))) {
|
|
while ((k = classes.next(k))) {
|
|
-
|
|
|
|
if (*k != p_class && is_parent_class(*k, p_class))
|
|
if (*k != p_class && is_parent_class(*k, p_class))
|
|
p_classes->push_back(*k);
|
|
p_classes->push_back(*k);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::get_direct_inheriters_from_class(const StringName &p_class, List<StringName> *p_classes) {
|
|
void ClassDB::get_direct_inheriters_from_class(const StringName &p_class, List<StringName> *p_classes) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
const StringName *k = nullptr;
|
|
const StringName *k = nullptr;
|
|
|
|
|
|
while ((k = classes.next(k))) {
|
|
while ((k = classes.next(k))) {
|
|
-
|
|
|
|
if (*k != p_class && get_parent_class(*k) == p_class)
|
|
if (*k != p_class && get_parent_class(*k) == p_class)
|
|
p_classes->push_back(*k);
|
|
p_classes->push_back(*k);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
StringName ClassDB::get_parent_class_nocheck(const StringName &p_class) {
|
|
StringName ClassDB::get_parent_class_nocheck(const StringName &p_class) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
@@ -324,7 +299,6 @@ StringName ClassDB::get_parent_class_nocheck(const StringName &p_class) {
|
|
}
|
|
}
|
|
|
|
|
|
StringName ClassDB::get_compatibility_remapped_class(const StringName &p_class) {
|
|
StringName ClassDB::get_compatibility_remapped_class(const StringName &p_class) {
|
|
-
|
|
|
|
if (classes.has(p_class)) {
|
|
if (classes.has(p_class)) {
|
|
return p_class;
|
|
return p_class;
|
|
}
|
|
}
|
|
@@ -337,7 +311,6 @@ StringName ClassDB::get_compatibility_remapped_class(const StringName &p_class)
|
|
}
|
|
}
|
|
|
|
|
|
StringName ClassDB::get_parent_class(const StringName &p_class) {
|
|
StringName ClassDB::get_parent_class(const StringName &p_class) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
@@ -346,7 +319,6 @@ StringName ClassDB::get_parent_class(const StringName &p_class) {
|
|
}
|
|
}
|
|
|
|
|
|
ClassDB::APIType ClassDB::get_api_type(const StringName &p_class) {
|
|
ClassDB::APIType ClassDB::get_api_type(const StringName &p_class) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
@@ -356,7 +328,6 @@ ClassDB::APIType ClassDB::get_api_type(const StringName &p_class) {
|
|
}
|
|
}
|
|
|
|
|
|
uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|
uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
|
|
|
|
@@ -367,14 +338,12 @@ uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|
const StringName *k = nullptr;
|
|
const StringName *k = nullptr;
|
|
|
|
|
|
while ((k = classes.next(k))) {
|
|
while ((k = classes.next(k))) {
|
|
-
|
|
|
|
names.push_back(*k);
|
|
names.push_back(*k);
|
|
}
|
|
}
|
|
//must be alphabetically sorted for hash to compute
|
|
//must be alphabetically sorted for hash to compute
|
|
names.sort_custom<StringName::AlphCompare>();
|
|
names.sort_custom<StringName::AlphCompare>();
|
|
|
|
|
|
for (List<StringName>::Element *E = names.front(); E; E = E->next()) {
|
|
for (List<StringName>::Element *E = names.front(); E; E = E->next()) {
|
|
-
|
|
|
|
ClassInfo *t = classes.getptr(E->get());
|
|
ClassInfo *t = classes.getptr(E->get());
|
|
ERR_FAIL_COND_V_MSG(!t, 0, "Cannot get class '" + String(E->get()) + "'.");
|
|
ERR_FAIL_COND_V_MSG(!t, 0, "Cannot get class '" + String(E->get()) + "'.");
|
|
if (t->api != p_api || !t->exposed)
|
|
if (t->api != p_api || !t->exposed)
|
|
@@ -389,7 +358,6 @@ uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|
k = nullptr;
|
|
k = nullptr;
|
|
|
|
|
|
while ((k = t->method_map.next(k))) {
|
|
while ((k = t->method_map.next(k))) {
|
|
-
|
|
|
|
String name = k->operator String();
|
|
String name = k->operator String();
|
|
|
|
|
|
ERR_CONTINUE(name.empty());
|
|
ERR_CONTINUE(name.empty());
|
|
@@ -403,7 +371,6 @@ uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|
snames.sort_custom<StringName::AlphCompare>();
|
|
snames.sort_custom<StringName::AlphCompare>();
|
|
|
|
|
|
for (List<StringName>::Element *F = snames.front(); F; F = F->next()) {
|
|
for (List<StringName>::Element *F = snames.front(); F; F = F->next()) {
|
|
-
|
|
|
|
MethodBind *mb = t->method_map[F->get()];
|
|
MethodBind *mb = t->method_map[F->get()];
|
|
hash = hash_djb2_one_64(mb->get_name().hash(), hash);
|
|
hash = hash_djb2_one_64(mb->get_name().hash(), hash);
|
|
hash = hash_djb2_one_64(mb->get_argument_count(), hash);
|
|
hash = hash_djb2_one_64(mb->get_argument_count(), hash);
|
|
@@ -436,14 +403,12 @@ uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|
k = nullptr;
|
|
k = nullptr;
|
|
|
|
|
|
while ((k = t->constant_map.next(k))) {
|
|
while ((k = t->constant_map.next(k))) {
|
|
-
|
|
|
|
snames.push_back(*k);
|
|
snames.push_back(*k);
|
|
}
|
|
}
|
|
|
|
|
|
snames.sort_custom<StringName::AlphCompare>();
|
|
snames.sort_custom<StringName::AlphCompare>();
|
|
|
|
|
|
for (List<StringName>::Element *F = snames.front(); F; F = F->next()) {
|
|
for (List<StringName>::Element *F = snames.front(); F; F = F->next()) {
|
|
-
|
|
|
|
hash = hash_djb2_one_64(F->get().hash(), hash);
|
|
hash = hash_djb2_one_64(F->get().hash(), hash);
|
|
hash = hash_djb2_one_64(t->constant_map[F->get()], hash);
|
|
hash = hash_djb2_one_64(t->constant_map[F->get()], hash);
|
|
}
|
|
}
|
|
@@ -456,14 +421,12 @@ uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|
k = nullptr;
|
|
k = nullptr;
|
|
|
|
|
|
while ((k = t->signal_map.next(k))) {
|
|
while ((k = t->signal_map.next(k))) {
|
|
-
|
|
|
|
snames.push_back(*k);
|
|
snames.push_back(*k);
|
|
}
|
|
}
|
|
|
|
|
|
snames.sort_custom<StringName::AlphCompare>();
|
|
snames.sort_custom<StringName::AlphCompare>();
|
|
|
|
|
|
for (List<StringName>::Element *F = snames.front(); F; F = F->next()) {
|
|
for (List<StringName>::Element *F = snames.front(); F; F = F->next()) {
|
|
-
|
|
|
|
MethodInfo &mi = t->signal_map[F->get()];
|
|
MethodInfo &mi = t->signal_map[F->get()];
|
|
hash = hash_djb2_one_64(F->get().hash(), hash);
|
|
hash = hash_djb2_one_64(F->get().hash(), hash);
|
|
for (int i = 0; i < mi.arguments.size(); i++) {
|
|
for (int i = 0; i < mi.arguments.size(); i++) {
|
|
@@ -479,14 +442,12 @@ uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|
k = nullptr;
|
|
k = nullptr;
|
|
|
|
|
|
while ((k = t->property_setget.next(k))) {
|
|
while ((k = t->property_setget.next(k))) {
|
|
-
|
|
|
|
snames.push_back(*k);
|
|
snames.push_back(*k);
|
|
}
|
|
}
|
|
|
|
|
|
snames.sort_custom<StringName::AlphCompare>();
|
|
snames.sort_custom<StringName::AlphCompare>();
|
|
|
|
|
|
for (List<StringName>::Element *F = snames.front(); F; F = F->next()) {
|
|
for (List<StringName>::Element *F = snames.front(); F; F = F->next()) {
|
|
-
|
|
|
|
PropertySetGet *psg = t->property_setget.getptr(F->get());
|
|
PropertySetGet *psg = t->property_setget.getptr(F->get());
|
|
ERR_FAIL_COND_V(!psg, 0);
|
|
ERR_FAIL_COND_V(!psg, 0);
|
|
|
|
|
|
@@ -498,7 +459,6 @@ uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|
|
|
|
|
//property list
|
|
//property list
|
|
for (List<PropertyInfo>::Element *F = t->property_list.front(); F; F = F->next()) {
|
|
for (List<PropertyInfo>::Element *F = t->property_list.front(); F; F = F->next()) {
|
|
-
|
|
|
|
hash = hash_djb2_one_64(F->get().name.hash(), hash);
|
|
hash = hash_djb2_one_64(F->get().name.hash(), hash);
|
|
hash = hash_djb2_one_64(F->get().type, hash);
|
|
hash = hash_djb2_one_64(F->get().type, hash);
|
|
hash = hash_djb2_one_64(F->get().hint, hash);
|
|
hash = hash_djb2_one_64(F->get().hint, hash);
|
|
@@ -514,19 +474,16 @@ uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|
}
|
|
}
|
|
|
|
|
|
bool ClassDB::class_exists(const StringName &p_class) {
|
|
bool ClassDB::class_exists(const StringName &p_class) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
return classes.has(p_class);
|
|
return classes.has(p_class);
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::add_compatibility_class(const StringName &p_class, const StringName &p_fallback) {
|
|
void ClassDB::add_compatibility_class(const StringName &p_class, const StringName &p_fallback) {
|
|
-
|
|
|
|
OBJTYPE_WLOCK;
|
|
OBJTYPE_WLOCK;
|
|
compat_classes[p_class] = p_fallback;
|
|
compat_classes[p_class] = p_fallback;
|
|
}
|
|
}
|
|
|
|
|
|
Object *ClassDB::instance(const StringName &p_class) {
|
|
Object *ClassDB::instance(const StringName &p_class) {
|
|
-
|
|
|
|
ClassInfo *ti;
|
|
ClassInfo *ti;
|
|
{
|
|
{
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
@@ -549,7 +506,6 @@ Object *ClassDB::instance(const StringName &p_class) {
|
|
return ti->creation_func();
|
|
return ti->creation_func();
|
|
}
|
|
}
|
|
bool ClassDB::can_instance(const StringName &p_class) {
|
|
bool ClassDB::can_instance(const StringName &p_class) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
@@ -563,7 +519,6 @@ bool ClassDB::can_instance(const StringName &p_class) {
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::_add_class2(const StringName &p_class, const StringName &p_inherits) {
|
|
void ClassDB::_add_class2(const StringName &p_class, const StringName &p_inherits) {
|
|
-
|
|
|
|
OBJTYPE_WLOCK;
|
|
OBJTYPE_WLOCK;
|
|
|
|
|
|
const StringName &name = p_class;
|
|
const StringName &name = p_class;
|
|
@@ -577,7 +532,6 @@ void ClassDB::_add_class2(const StringName &p_class, const StringName &p_inherit
|
|
ti.api = current_api;
|
|
ti.api = current_api;
|
|
|
|
|
|
if (ti.inherits) {
|
|
if (ti.inherits) {
|
|
-
|
|
|
|
ERR_FAIL_COND(!classes.has(ti.inherits)); //it MUST be registered.
|
|
ERR_FAIL_COND(!classes.has(ti.inherits)); //it MUST be registered.
|
|
ti.inherits_ptr = &classes[ti.inherits];
|
|
ti.inherits_ptr = &classes[ti.inherits];
|
|
|
|
|
|
@@ -587,15 +541,12 @@ void ClassDB::_add_class2(const StringName &p_class, const StringName &p_inherit
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::get_method_list(StringName p_class, List<MethodInfo> *p_methods, bool p_no_inheritance, bool p_exclude_from_properties) {
|
|
void ClassDB::get_method_list(StringName p_class, List<MethodInfo> *p_methods, bool p_no_inheritance, bool p_exclude_from_properties) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
|
|
|
|
while (type) {
|
|
while (type) {
|
|
-
|
|
|
|
if (type->disabled) {
|
|
if (type->disabled) {
|
|
-
|
|
|
|
if (p_no_inheritance)
|
|
if (p_no_inheritance)
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -606,12 +557,10 @@ void ClassDB::get_method_list(StringName p_class, List<MethodInfo> *p_methods, b
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
|
|
|
|
for (List<MethodInfo>::Element *E = type->virtual_methods.front(); E; E = E->next()) {
|
|
for (List<MethodInfo>::Element *E = type->virtual_methods.front(); E; E = E->next()) {
|
|
-
|
|
|
|
p_methods->push_back(E->get());
|
|
p_methods->push_back(E->get());
|
|
}
|
|
}
|
|
|
|
|
|
for (List<StringName>::Element *E = type->method_order.front(); E; E = E->next()) {
|
|
for (List<StringName>::Element *E = type->method_order.front(); E; E = E->next()) {
|
|
-
|
|
|
|
MethodBind *method = type->method_map.get(E->get());
|
|
MethodBind *method = type->method_map.get(E->get());
|
|
MethodInfo minfo;
|
|
MethodInfo minfo;
|
|
minfo.name = E->get();
|
|
minfo.name = E->get();
|
|
@@ -621,7 +570,6 @@ void ClassDB::get_method_list(StringName p_class, List<MethodInfo> *p_methods, b
|
|
continue;
|
|
continue;
|
|
|
|
|
|
for (int i = 0; i < method->get_argument_count(); i++) {
|
|
for (int i = 0; i < method->get_argument_count(); i++) {
|
|
-
|
|
|
|
//Variant::Type t=method->get_argument_type(i);
|
|
//Variant::Type t=method->get_argument_type(i);
|
|
|
|
|
|
minfo.arguments.push_back(method->get_argument_info(i));
|
|
minfo.arguments.push_back(method->get_argument_info(i));
|
|
@@ -643,7 +591,6 @@ void ClassDB::get_method_list(StringName p_class, List<MethodInfo> *p_methods, b
|
|
const StringName *K = nullptr;
|
|
const StringName *K = nullptr;
|
|
|
|
|
|
while ((K = type->method_map.next(K))) {
|
|
while ((K = type->method_map.next(K))) {
|
|
-
|
|
|
|
MethodBind *m = type->method_map[*K];
|
|
MethodBind *m = type->method_map[*K];
|
|
MethodInfo mi;
|
|
MethodInfo mi;
|
|
mi.name = m->get_name();
|
|
mi.name = m->get_name();
|
|
@@ -660,13 +607,11 @@ void ClassDB::get_method_list(StringName p_class, List<MethodInfo> *p_methods, b
|
|
}
|
|
}
|
|
|
|
|
|
MethodBind *ClassDB::get_method(StringName p_class, StringName p_name) {
|
|
MethodBind *ClassDB::get_method(StringName p_class, StringName p_name) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
|
|
|
|
while (type) {
|
|
while (type) {
|
|
-
|
|
|
|
MethodBind **method = type->method_map.getptr(p_name);
|
|
MethodBind **method = type->method_map.getptr(p_name);
|
|
if (method && *method)
|
|
if (method && *method)
|
|
return *method;
|
|
return *method;
|
|
@@ -676,7 +621,6 @@ MethodBind *ClassDB::get_method(StringName p_class, StringName p_name) {
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::bind_integer_constant(const StringName &p_class, const StringName &p_enum, const StringName &p_name, int p_constant) {
|
|
void ClassDB::bind_integer_constant(const StringName &p_class, const StringName &p_enum, const StringName &p_name, int p_constant) {
|
|
-
|
|
|
|
OBJTYPE_WLOCK;
|
|
OBJTYPE_WLOCK;
|
|
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
@@ -684,7 +628,6 @@ void ClassDB::bind_integer_constant(const StringName &p_class, const StringName
|
|
ERR_FAIL_COND(!type);
|
|
ERR_FAIL_COND(!type);
|
|
|
|
|
|
if (type->constant_map.has(p_name)) {
|
|
if (type->constant_map.has(p_name)) {
|
|
-
|
|
|
|
ERR_FAIL();
|
|
ERR_FAIL();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -713,13 +656,11 @@ void ClassDB::bind_integer_constant(const StringName &p_class, const StringName
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::get_integer_constant_list(const StringName &p_class, List<String> *p_constants, bool p_no_inheritance) {
|
|
void ClassDB::get_integer_constant_list(const StringName &p_class, List<String> *p_constants, bool p_no_inheritance) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
|
|
|
|
while (type) {
|
|
while (type) {
|
|
-
|
|
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
for (List<StringName>::Element *E = type->constant_order.front(); E; E = E->next())
|
|
for (List<StringName>::Element *E = type->constant_order.front(); E; E = E->next())
|
|
p_constants->push_back(E->get());
|
|
p_constants->push_back(E->get());
|
|
@@ -739,16 +680,13 @@ void ClassDB::get_integer_constant_list(const StringName &p_class, List<String>
|
|
}
|
|
}
|
|
|
|
|
|
int ClassDB::get_integer_constant(const StringName &p_class, const StringName &p_name, bool *p_success) {
|
|
int ClassDB::get_integer_constant(const StringName &p_class, const StringName &p_name, bool *p_success) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
|
|
|
|
while (type) {
|
|
while (type) {
|
|
-
|
|
|
|
int *constant = type->constant_map.getptr(p_name);
|
|
int *constant = type->constant_map.getptr(p_name);
|
|
if (constant) {
|
|
if (constant) {
|
|
-
|
|
|
|
if (p_success)
|
|
if (p_success)
|
|
*p_success = true;
|
|
*p_success = true;
|
|
return *constant;
|
|
return *constant;
|
|
@@ -764,16 +702,13 @@ int ClassDB::get_integer_constant(const StringName &p_class, const StringName &p
|
|
}
|
|
}
|
|
|
|
|
|
StringName ClassDB::get_integer_constant_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance) {
|
|
StringName ClassDB::get_integer_constant_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
|
|
|
|
while (type) {
|
|
while (type) {
|
|
-
|
|
|
|
const StringName *k = nullptr;
|
|
const StringName *k = nullptr;
|
|
while ((k = type->enum_map.next(k))) {
|
|
while ((k = type->enum_map.next(k))) {
|
|
-
|
|
|
|
List<StringName> &constants_list = type->enum_map.get(*k);
|
|
List<StringName> &constants_list = type->enum_map.get(*k);
|
|
const List<StringName>::Element *found = constants_list.find(p_name);
|
|
const List<StringName>::Element *found = constants_list.find(p_name);
|
|
if (found)
|
|
if (found)
|
|
@@ -790,13 +725,11 @@ StringName ClassDB::get_integer_constant_enum(const StringName &p_class, const S
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::get_enum_list(const StringName &p_class, List<StringName> *p_enums, bool p_no_inheritance) {
|
|
void ClassDB::get_enum_list(const StringName &p_class, List<StringName> *p_enums, bool p_no_inheritance) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
|
|
|
|
while (type) {
|
|
while (type) {
|
|
-
|
|
|
|
const StringName *k = nullptr;
|
|
const StringName *k = nullptr;
|
|
while ((k = type->enum_map.next(k))) {
|
|
while ((k = type->enum_map.next(k))) {
|
|
p_enums->push_back(*k);
|
|
p_enums->push_back(*k);
|
|
@@ -810,13 +743,11 @@ void ClassDB::get_enum_list(const StringName &p_class, List<StringName> *p_enums
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::get_enum_constants(const StringName &p_class, const StringName &p_enum, List<StringName> *p_constants, bool p_no_inheritance) {
|
|
void ClassDB::get_enum_constants(const StringName &p_class, const StringName &p_enum, List<StringName> *p_constants, bool p_no_inheritance) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
|
|
|
|
while (type) {
|
|
while (type) {
|
|
-
|
|
|
|
const List<StringName> *constants = type->enum_map.getptr(p_enum);
|
|
const List<StringName> *constants = type->enum_map.getptr(p_enum);
|
|
|
|
|
|
if (constants) {
|
|
if (constants) {
|
|
@@ -833,7 +764,6 @@ void ClassDB::get_enum_constants(const StringName &p_class, const StringName &p_
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::add_signal(StringName p_class, const MethodInfo &p_signal) {
|
|
void ClassDB::add_signal(StringName p_class, const MethodInfo &p_signal) {
|
|
-
|
|
|
|
OBJTYPE_WLOCK;
|
|
OBJTYPE_WLOCK;
|
|
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
@@ -853,7 +783,6 @@ void ClassDB::add_signal(StringName p_class, const MethodInfo &p_signal) {
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::get_signal_list(StringName p_class, List<MethodInfo> *p_signals, bool p_no_inheritance) {
|
|
void ClassDB::get_signal_list(StringName p_class, List<MethodInfo> *p_signals, bool p_no_inheritance) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
@@ -862,10 +791,8 @@ void ClassDB::get_signal_list(StringName p_class, List<MethodInfo> *p_signals, b
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
|
|
|
|
while (check) {
|
|
while (check) {
|
|
-
|
|
|
|
const StringName *S = nullptr;
|
|
const StringName *S = nullptr;
|
|
while ((S = check->signal_map.next(S))) {
|
|
while ((S = check->signal_map.next(S))) {
|
|
-
|
|
|
|
p_signals->push_back(check->signal_map[*S]);
|
|
p_signals->push_back(check->signal_map[*S]);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -877,7 +804,6 @@ void ClassDB::get_signal_list(StringName p_class, List<MethodInfo> *p_signals, b
|
|
}
|
|
}
|
|
|
|
|
|
bool ClassDB::has_signal(StringName p_class, StringName p_signal) {
|
|
bool ClassDB::has_signal(StringName p_class, StringName p_signal) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
@@ -891,7 +817,6 @@ bool ClassDB::has_signal(StringName p_class, StringName p_signal) {
|
|
}
|
|
}
|
|
|
|
|
|
bool ClassDB::get_signal(StringName p_class, StringName p_signal, MethodInfo *r_signal) {
|
|
bool ClassDB::get_signal(StringName p_class, StringName p_signal, MethodInfo *r_signal) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
@@ -909,7 +834,6 @@ bool ClassDB::get_signal(StringName p_class, StringName p_signal, MethodInfo *r_
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::add_property_group(StringName p_class, const String &p_name, const String &p_prefix) {
|
|
void ClassDB::add_property_group(StringName p_class, const String &p_name, const String &p_prefix) {
|
|
-
|
|
|
|
OBJTYPE_WLOCK;
|
|
OBJTYPE_WLOCK;
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ERR_FAIL_COND(!type);
|
|
ERR_FAIL_COND(!type);
|
|
@@ -918,7 +842,6 @@ void ClassDB::add_property_group(StringName p_class, const String &p_name, const
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::add_property_subgroup(StringName p_class, const String &p_name, const String &p_prefix) {
|
|
void ClassDB::add_property_subgroup(StringName p_class, const String &p_name, const String &p_prefix) {
|
|
-
|
|
|
|
OBJTYPE_WLOCK;
|
|
OBJTYPE_WLOCK;
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ERR_FAIL_COND(!type);
|
|
ERR_FAIL_COND(!type);
|
|
@@ -927,7 +850,6 @@ void ClassDB::add_property_subgroup(StringName p_class, const String &p_name, co
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::add_property(StringName p_class, const PropertyInfo &p_pinfo, const StringName &p_setter, const StringName &p_getter, int p_index) {
|
|
void ClassDB::add_property(StringName p_class, const PropertyInfo &p_pinfo, const StringName &p_setter, const StringName &p_getter, int p_index) {
|
|
-
|
|
|
|
lock->read_lock();
|
|
lock->read_lock();
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
lock->read_unlock();
|
|
lock->read_unlock();
|
|
@@ -948,7 +870,6 @@ void ClassDB::add_property(StringName p_class, const PropertyInfo &p_pinfo, cons
|
|
|
|
|
|
MethodBind *mb_get = nullptr;
|
|
MethodBind *mb_get = nullptr;
|
|
if (p_getter) {
|
|
if (p_getter) {
|
|
-
|
|
|
|
mb_get = get_method(p_class, p_getter);
|
|
mb_get = get_method(p_class, p_getter);
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
|
|
|
|
@@ -993,15 +914,12 @@ void ClassDB::set_property_default_value(StringName p_class, const StringName &p
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::get_property_list(StringName p_class, List<PropertyInfo> *p_list, bool p_no_inheritance, const Object *p_validator) {
|
|
void ClassDB::get_property_list(StringName p_class, List<PropertyInfo> *p_list, bool p_no_inheritance, const Object *p_validator) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
while (check) {
|
|
while (check) {
|
|
-
|
|
|
|
for (List<PropertyInfo>::Element *E = check->property_list.front(); E; E = E->next()) {
|
|
for (List<PropertyInfo>::Element *E = check->property_list.front(); E; E = E->next()) {
|
|
-
|
|
|
|
if (p_validator) {
|
|
if (p_validator) {
|
|
PropertyInfo pi = E->get();
|
|
PropertyInfo pi = E->get();
|
|
p_validator->_validate_property(pi);
|
|
p_validator->_validate_property(pi);
|
|
@@ -1017,13 +935,11 @@ void ClassDB::get_property_list(StringName p_class, List<PropertyInfo> *p_list,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
bool ClassDB::set_property(Object *p_object, const StringName &p_property, const Variant &p_value, bool *r_valid) {
|
|
bool ClassDB::set_property(Object *p_object, const StringName &p_property, const Variant &p_value, bool *r_valid) {
|
|
-
|
|
|
|
ClassInfo *type = classes.getptr(p_object->get_class_name());
|
|
ClassInfo *type = classes.getptr(p_object->get_class_name());
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
while (check) {
|
|
while (check) {
|
|
const PropertySetGet *psg = check->property_setget.getptr(p_property);
|
|
const PropertySetGet *psg = check->property_setget.getptr(p_property);
|
|
if (psg) {
|
|
if (psg) {
|
|
-
|
|
|
|
if (!psg->setter) {
|
|
if (!psg->setter) {
|
|
if (r_valid)
|
|
if (r_valid)
|
|
*r_valid = false;
|
|
*r_valid = false;
|
|
@@ -1063,7 +979,6 @@ bool ClassDB::set_property(Object *p_object, const StringName &p_property, const
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
bool ClassDB::get_property(Object *p_object, const StringName &p_property, Variant &r_value) {
|
|
bool ClassDB::get_property(Object *p_object, const StringName &p_property, Variant &r_value) {
|
|
-
|
|
|
|
ClassInfo *type = classes.getptr(p_object->get_class_name());
|
|
ClassInfo *type = classes.getptr(p_object->get_class_name());
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
while (check) {
|
|
while (check) {
|
|
@@ -1079,10 +994,8 @@ bool ClassDB::get_property(Object *p_object, const StringName &p_property, Varia
|
|
r_value = p_object->call(psg->getter, arg, 1, ce);
|
|
r_value = p_object->call(psg->getter, arg, 1, ce);
|
|
|
|
|
|
} else {
|
|
} else {
|
|
-
|
|
|
|
Callable::CallError ce;
|
|
Callable::CallError ce;
|
|
if (psg->_getptr) {
|
|
if (psg->_getptr) {
|
|
-
|
|
|
|
r_value = psg->_getptr->call(p_object, nullptr, 0, ce);
|
|
r_value = psg->_getptr->call(p_object, nullptr, 0, ce);
|
|
} else {
|
|
} else {
|
|
r_value = p_object->call(psg->getter, nullptr, 0, ce);
|
|
r_value = p_object->call(psg->getter, nullptr, 0, ce);
|
|
@@ -1093,7 +1006,6 @@ bool ClassDB::get_property(Object *p_object, const StringName &p_property, Varia
|
|
|
|
|
|
const int *c = check->constant_map.getptr(p_property); //constants count
|
|
const int *c = check->constant_map.getptr(p_property); //constants count
|
|
if (c) {
|
|
if (c) {
|
|
-
|
|
|
|
r_value = *c;
|
|
r_value = *c;
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -1115,13 +1027,11 @@ bool ClassDB::get_property(Object *p_object, const StringName &p_property, Varia
|
|
}
|
|
}
|
|
|
|
|
|
int ClassDB::get_property_index(const StringName &p_class, const StringName &p_property, bool *r_is_valid) {
|
|
int ClassDB::get_property_index(const StringName &p_class, const StringName &p_property, bool *r_is_valid) {
|
|
-
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
while (check) {
|
|
while (check) {
|
|
const PropertySetGet *psg = check->property_setget.getptr(p_property);
|
|
const PropertySetGet *psg = check->property_setget.getptr(p_property);
|
|
if (psg) {
|
|
if (psg) {
|
|
-
|
|
|
|
if (r_is_valid)
|
|
if (r_is_valid)
|
|
*r_is_valid = true;
|
|
*r_is_valid = true;
|
|
|
|
|
|
@@ -1137,13 +1047,11 @@ int ClassDB::get_property_index(const StringName &p_class, const StringName &p_p
|
|
}
|
|
}
|
|
|
|
|
|
Variant::Type ClassDB::get_property_type(const StringName &p_class, const StringName &p_property, bool *r_is_valid) {
|
|
Variant::Type ClassDB::get_property_type(const StringName &p_class, const StringName &p_property, bool *r_is_valid) {
|
|
-
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
while (check) {
|
|
while (check) {
|
|
const PropertySetGet *psg = check->property_setget.getptr(p_property);
|
|
const PropertySetGet *psg = check->property_setget.getptr(p_property);
|
|
if (psg) {
|
|
if (psg) {
|
|
-
|
|
|
|
if (r_is_valid)
|
|
if (r_is_valid)
|
|
*r_is_valid = true;
|
|
*r_is_valid = true;
|
|
|
|
|
|
@@ -1159,13 +1067,11 @@ Variant::Type ClassDB::get_property_type(const StringName &p_class, const String
|
|
}
|
|
}
|
|
|
|
|
|
StringName ClassDB::get_property_setter(StringName p_class, const StringName &p_property) {
|
|
StringName ClassDB::get_property_setter(StringName p_class, const StringName &p_property) {
|
|
-
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
while (check) {
|
|
while (check) {
|
|
const PropertySetGet *psg = check->property_setget.getptr(p_property);
|
|
const PropertySetGet *psg = check->property_setget.getptr(p_property);
|
|
if (psg) {
|
|
if (psg) {
|
|
-
|
|
|
|
return psg->setter;
|
|
return psg->setter;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1176,13 +1082,11 @@ StringName ClassDB::get_property_setter(StringName p_class, const StringName &p_
|
|
}
|
|
}
|
|
|
|
|
|
StringName ClassDB::get_property_getter(StringName p_class, const StringName &p_property) {
|
|
StringName ClassDB::get_property_getter(StringName p_class, const StringName &p_property) {
|
|
-
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
while (check) {
|
|
while (check) {
|
|
const PropertySetGet *psg = check->property_setget.getptr(p_property);
|
|
const PropertySetGet *psg = check->property_setget.getptr(p_property);
|
|
if (psg) {
|
|
if (psg) {
|
|
-
|
|
|
|
return psg->getter;
|
|
return psg->getter;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1193,7 +1097,6 @@ StringName ClassDB::get_property_getter(StringName p_class, const StringName &p_
|
|
}
|
|
}
|
|
|
|
|
|
bool ClassDB::has_property(const StringName &p_class, const StringName &p_property, bool p_no_inheritance) {
|
|
bool ClassDB::has_property(const StringName &p_class, const StringName &p_property, bool p_no_inheritance) {
|
|
-
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
while (check) {
|
|
while (check) {
|
|
@@ -1209,7 +1112,6 @@ bool ClassDB::has_property(const StringName &p_class, const StringName &p_proper
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::set_method_flags(StringName p_class, StringName p_method, int p_flags) {
|
|
void ClassDB::set_method_flags(StringName p_class, StringName p_method, int p_flags) {
|
|
-
|
|
|
|
OBJTYPE_WLOCK;
|
|
OBJTYPE_WLOCK;
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
@@ -1219,7 +1121,6 @@ void ClassDB::set_method_flags(StringName p_class, StringName p_method, int p_fl
|
|
}
|
|
}
|
|
|
|
|
|
bool ClassDB::has_method(StringName p_class, StringName p_method, bool p_no_inheritance) {
|
|
bool ClassDB::has_method(StringName p_class, StringName p_method, bool p_no_inheritance) {
|
|
-
|
|
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
while (check) {
|
|
while (check) {
|
|
@@ -1282,7 +1183,6 @@ MethodBind *ClassDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind, const c
|
|
|
|
|
|
defvals.resize(p_defcount);
|
|
defvals.resize(p_defcount);
|
|
for (int i = 0; i < p_defcount; i++) {
|
|
for (int i = 0; i < p_defcount; i++) {
|
|
-
|
|
|
|
defvals.write[i] = *p_defs[p_defcount - i - 1];
|
|
defvals.write[i] = *p_defs[p_defcount - i - 1];
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1306,7 +1206,6 @@ void ClassDB::add_virtual_method(const StringName &p_class, const MethodInfo &p_
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::get_virtual_methods(const StringName &p_class, List<MethodInfo> *p_methods, bool p_no_inheritance) {
|
|
void ClassDB::get_virtual_methods(const StringName &p_class, List<MethodInfo> *p_methods, bool p_no_inheritance) {
|
|
-
|
|
|
|
ERR_FAIL_COND_MSG(!classes.has(p_class), "Request for nonexistent class '" + p_class + "'.");
|
|
ERR_FAIL_COND_MSG(!classes.has(p_class), "Request for nonexistent class '" + p_class + "'.");
|
|
|
|
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
#ifdef DEBUG_METHODS_ENABLED
|
|
@@ -1314,7 +1213,6 @@ void ClassDB::get_virtual_methods(const StringName &p_class, List<MethodInfo> *p
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *type = classes.getptr(p_class);
|
|
ClassInfo *check = type;
|
|
ClassInfo *check = type;
|
|
while (check) {
|
|
while (check) {
|
|
-
|
|
|
|
for (List<MethodInfo>::Element *E = check->virtual_methods.front(); E; E = E->next()) {
|
|
for (List<MethodInfo>::Element *E = check->virtual_methods.front(); E; E = E->next()) {
|
|
p_methods->push_back(E->get());
|
|
p_methods->push_back(E->get());
|
|
}
|
|
}
|
|
@@ -1328,7 +1226,6 @@ void ClassDB::get_virtual_methods(const StringName &p_class, List<MethodInfo> *p
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::set_class_enabled(StringName p_class, bool p_enable) {
|
|
void ClassDB::set_class_enabled(StringName p_class, bool p_enable) {
|
|
-
|
|
|
|
OBJTYPE_WLOCK;
|
|
OBJTYPE_WLOCK;
|
|
|
|
|
|
ERR_FAIL_COND_MSG(!classes.has(p_class), "Request for nonexistent class '" + p_class + "'.");
|
|
ERR_FAIL_COND_MSG(!classes.has(p_class), "Request for nonexistent class '" + p_class + "'.");
|
|
@@ -1336,7 +1233,6 @@ void ClassDB::set_class_enabled(StringName p_class, bool p_enable) {
|
|
}
|
|
}
|
|
|
|
|
|
bool ClassDB::is_class_enabled(StringName p_class) {
|
|
bool ClassDB::is_class_enabled(StringName p_class) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
@@ -1351,7 +1247,6 @@ bool ClassDB::is_class_enabled(StringName p_class) {
|
|
}
|
|
}
|
|
|
|
|
|
bool ClassDB::is_class_exposed(StringName p_class) {
|
|
bool ClassDB::is_class_exposed(StringName p_class) {
|
|
-
|
|
|
|
OBJTYPE_RLOCK;
|
|
OBJTYPE_RLOCK;
|
|
|
|
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
ClassInfo *ti = classes.getptr(p_class);
|
|
@@ -1360,7 +1255,6 @@ bool ClassDB::is_class_exposed(StringName p_class) {
|
|
}
|
|
}
|
|
|
|
|
|
StringName ClassDB::get_category(const StringName &p_node) {
|
|
StringName ClassDB::get_category(const StringName &p_node) {
|
|
-
|
|
|
|
ERR_FAIL_COND_V(!classes.has(p_node), StringName());
|
|
ERR_FAIL_COND_V(!classes.has(p_node), StringName());
|
|
#ifdef DEBUG_ENABLED
|
|
#ifdef DEBUG_ENABLED
|
|
return classes[p_node].category;
|
|
return classes[p_node].category;
|
|
@@ -1370,7 +1264,6 @@ StringName ClassDB::get_category(const StringName &p_node) {
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::add_resource_base_extension(const StringName &p_extension, const StringName &p_class) {
|
|
void ClassDB::add_resource_base_extension(const StringName &p_extension, const StringName &p_class) {
|
|
-
|
|
|
|
if (resource_base_extensions.has(p_extension))
|
|
if (resource_base_extensions.has(p_extension))
|
|
return;
|
|
return;
|
|
|
|
|
|
@@ -1378,17 +1271,14 @@ void ClassDB::add_resource_base_extension(const StringName &p_extension, const S
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::get_resource_base_extensions(List<String> *p_extensions) {
|
|
void ClassDB::get_resource_base_extensions(List<String> *p_extensions) {
|
|
-
|
|
|
|
const StringName *K = nullptr;
|
|
const StringName *K = nullptr;
|
|
|
|
|
|
while ((K = resource_base_extensions.next(K))) {
|
|
while ((K = resource_base_extensions.next(K))) {
|
|
-
|
|
|
|
p_extensions->push_back(*K);
|
|
p_extensions->push_back(*K);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::get_extensions_for_type(const StringName &p_class, List<String> *p_extensions) {
|
|
void ClassDB::get_extensions_for_type(const StringName &p_class, List<String> *p_extensions) {
|
|
-
|
|
|
|
const StringName *K = nullptr;
|
|
const StringName *K = nullptr;
|
|
|
|
|
|
while ((K = resource_base_extensions.next(K))) {
|
|
while ((K = resource_base_extensions.next(K))) {
|
|
@@ -1402,9 +1292,7 @@ HashMap<StringName, HashMap<StringName, Variant>> ClassDB::default_values;
|
|
Set<StringName> ClassDB::default_values_cached;
|
|
Set<StringName> ClassDB::default_values_cached;
|
|
|
|
|
|
Variant ClassDB::class_get_default_property_value(const StringName &p_class, const StringName &p_property, bool *r_valid) {
|
|
Variant ClassDB::class_get_default_property_value(const StringName &p_class, const StringName &p_property, bool *r_valid) {
|
|
-
|
|
|
|
if (!default_values_cached.has(p_class)) {
|
|
if (!default_values_cached.has(p_class)) {
|
|
-
|
|
|
|
if (!default_values.has(p_class)) {
|
|
if (!default_values.has(p_class)) {
|
|
default_values[p_class] = HashMap<StringName, Variant>();
|
|
default_values[p_class] = HashMap<StringName, Variant>();
|
|
}
|
|
}
|
|
@@ -1421,12 +1309,10 @@ Variant ClassDB::class_get_default_property_value(const StringName &p_class, con
|
|
}
|
|
}
|
|
|
|
|
|
if (c) {
|
|
if (c) {
|
|
-
|
|
|
|
List<PropertyInfo> plist;
|
|
List<PropertyInfo> plist;
|
|
c->get_property_list(&plist);
|
|
c->get_property_list(&plist);
|
|
for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) {
|
|
for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) {
|
|
if (E->get().usage & (PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR)) {
|
|
if (E->get().usage & (PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR)) {
|
|
-
|
|
|
|
if (!default_values[p_class].has(E->get().name)) {
|
|
if (!default_values[p_class].has(E->get().name)) {
|
|
Variant v = c->get(E->get().name);
|
|
Variant v = c->get(E->get().name);
|
|
default_values[p_class][E->get().name] = v;
|
|
default_values[p_class][E->get().name] = v;
|
|
@@ -1462,29 +1348,24 @@ Variant ClassDB::class_get_default_property_value(const StringName &p_class, con
|
|
RWLock *ClassDB::lock = nullptr;
|
|
RWLock *ClassDB::lock = nullptr;
|
|
|
|
|
|
void ClassDB::init() {
|
|
void ClassDB::init() {
|
|
-
|
|
|
|
lock = RWLock::create();
|
|
lock = RWLock::create();
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::cleanup_defaults() {
|
|
void ClassDB::cleanup_defaults() {
|
|
-
|
|
|
|
default_values.clear();
|
|
default_values.clear();
|
|
default_values_cached.clear();
|
|
default_values_cached.clear();
|
|
}
|
|
}
|
|
|
|
|
|
void ClassDB::cleanup() {
|
|
void ClassDB::cleanup() {
|
|
-
|
|
|
|
//OBJTYPE_LOCK; hah not here
|
|
//OBJTYPE_LOCK; hah not here
|
|
|
|
|
|
const StringName *k = nullptr;
|
|
const StringName *k = nullptr;
|
|
|
|
|
|
while ((k = classes.next(k))) {
|
|
while ((k = classes.next(k))) {
|
|
-
|
|
|
|
ClassInfo &ti = classes[*k];
|
|
ClassInfo &ti = classes[*k];
|
|
|
|
|
|
const StringName *m = nullptr;
|
|
const StringName *m = nullptr;
|
|
while ((m = ti.method_map.next(m))) {
|
|
while ((m = ti.method_map.next(m))) {
|
|
-
|
|
|
|
memdelete(ti.method_map[*m]);
|
|
memdelete(ti.method_map[*m]);
|
|
}
|
|
}
|
|
}
|
|
}
|