summaryrefslogtreecommitdiffstats
path: root/modules/gdscript
diff options
context:
space:
mode:
authorDanil Alexeev <danil@alexeev.xyz>2023-10-04 07:54:03 +0300
committerDanil Alexeev <danil@alexeev.xyz>2023-10-04 19:44:32 +0300
commited0b3c08e15ee6345ece4b135a5e99870a8fc79f (patch)
treeac8fe0ff0c7dcb8d10e660c631946c8a3f58a6ee /modules/gdscript
parentbfd78bb917887cfc1fd842ba23570394cad8bedb (diff)
downloadredot-engine-ed0b3c08e15ee6345ece4b135a5e99870a8fc79f.tar.gz
Core: Fix `Object::has_method()` for script static methods
Diffstat (limited to 'modules/gdscript')
-rw-r--r--modules/gdscript/gdscript.cpp4
-rw-r--r--modules/gdscript/gdscript.h1
-rw-r--r--modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.gd12
-rw-r--r--modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.out3
4 files changed, 20 insertions, 0 deletions
diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp
index f10ed0df29..a0213f05dd 100644
--- a/modules/gdscript/gdscript.cpp
+++ b/modules/gdscript/gdscript.cpp
@@ -346,6 +346,10 @@ bool GDScript::has_method(const StringName &p_method) const {
return member_functions.has(p_method);
}
+bool GDScript::has_static_method(const StringName &p_method) const {
+ return member_functions.has(p_method) && member_functions[p_method]->is_static();
+}
+
MethodInfo GDScript::get_method_info(const StringName &p_method) const {
HashMap<StringName, GDScriptFunction *>::ConstIterator E = member_functions.find(p_method);
if (!E) {
diff --git a/modules/gdscript/gdscript.h b/modules/gdscript/gdscript.h
index 50ccfabcc1..eb8e95025a 100644
--- a/modules/gdscript/gdscript.h
+++ b/modules/gdscript/gdscript.h
@@ -266,6 +266,7 @@ public:
virtual void get_script_method_list(List<MethodInfo> *p_list) const override;
virtual bool has_method(const StringName &p_method) const override;
+ virtual bool has_static_method(const StringName &p_method) const override;
virtual MethodInfo get_method_info(const StringName &p_method) const override;
virtual void get_script_property_list(List<PropertyInfo> *p_list) const override;
diff --git a/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.gd b/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.gd
new file mode 100644
index 0000000000..f6aa58737f
--- /dev/null
+++ b/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.gd
@@ -0,0 +1,12 @@
+# GH-79521
+
+class_name TestStaticMethodAsCallable
+
+static func static_func() -> String:
+ return "Test"
+
+func test():
+ var a: Callable = TestStaticMethodAsCallable.static_func
+ var b: Callable = static_func
+ prints(a.call(), a.is_valid())
+ prints(b.call(), b.is_valid())
diff --git a/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.out b/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.out
new file mode 100644
index 0000000000..e6d461b8f9
--- /dev/null
+++ b/modules/gdscript/tests/scripts/runtime/features/static_method_as_callable.out
@@ -0,0 +1,3 @@
+GDTEST_OK
+Test true
+Test true