diff options
author | Matthew Murphy <mashumafi@users.noreply.github.com> | 2023-01-27 23:43:01 -0500 |
---|---|---|
committer | David Snopek <dsnopek@gmail.com> | 2023-09-09 11:30:29 -0500 |
commit | ca3e25de040c87de1a9bb332c62cfaef0d44fe75 (patch) | |
tree | 0bb7bee521c1cdc93649f97fcf9f0b954d7197b3 | |
parent | 82e960a810257b4502603a3541ec5e0921129150 (diff) | |
download | redot-cpp-ca3e25de040c87de1a9bb332c62cfaef0d44fe75.tar.gz |
Fix variant call compiler error
Co-authored-by: David Snopek <dsnopek@gmail.com>
-rw-r--r-- | include/godot_cpp/variant/variant.hpp | 20 | ||||
-rw-r--r-- | src/variant/variant.cpp | 4 | ||||
-rw-r--r-- | test/project/main.gd | 7 | ||||
-rw-r--r-- | test/src/example.cpp | 6 | ||||
-rw-r--r-- | test/src/example.h | 3 |
5 files changed, 32 insertions, 8 deletions
diff --git a/include/godot_cpp/variant/variant.hpp b/include/godot_cpp/variant/variant.hpp index 3b5ca56..3e8738c 100644 --- a/include/godot_cpp/variant/variant.hpp +++ b/include/godot_cpp/variant/variant.hpp @@ -255,25 +255,33 @@ public: bool operator!=(const Variant &other) const; bool operator<(const Variant &other) const; - void call(const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error); + void callp(const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error); template <class... Args> Variant call(const StringName &method, Args... args) { + std::array<Variant, sizeof...(args)> vargs = { args... }; + std::array<const Variant *, sizeof...(args)> argptrs; + for (size_t i = 0; i < vargs.size(); i++) { + argptrs[i] = &vargs[i]; + } Variant result; GDExtensionCallError error; - std::array<GDExtensionConstVariantPtr, sizeof...(Args)> call_args = { Variant(args)... }; - call(method, call_args.data(), call_args.size(), result, error); + callp(method, argptrs.data(), argptrs.size(), result, error); return result; } - static void call_static(Variant::Type type, const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error); + static void callp_static(Variant::Type type, const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error); template <class... Args> static Variant call_static(Variant::Type type, const StringName &method, Args... args) { + std::array<Variant, sizeof...(args)> vargs = { args... }; + std::array<const Variant *, sizeof...(args)> argptrs; + for (size_t i = 0; i < vargs.size(); i++) { + argptrs[i] = &vargs[i]; + } Variant result; GDExtensionCallError error; - std::array<GDExtensionConstVariantPtr, sizeof...(Args)> call_args = { Variant(args)... }; - call_static(type, method, call_args.data(), call_args.size(), result, error); + callp_static(type, method, argptrs.data(), argptrs.size(), sizeof...(args), result, error); return result; } diff --git a/src/variant/variant.cpp b/src/variant/variant.cpp index a73db74..641f59c 100644 --- a/src/variant/variant.cpp +++ b/src/variant/variant.cpp @@ -549,11 +549,11 @@ bool Variant::operator<(const Variant &other) const { return result.operator bool(); } -void Variant::call(const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error) { +void Variant::callp(const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error) { internal::gdextension_interface_variant_call(_native_ptr(), method._native_ptr(), reinterpret_cast<GDExtensionConstVariantPtr *>(args), argcount, r_ret._native_ptr(), &r_error); } -void Variant::call_static(Variant::Type type, const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error) { +void Variant::callp_static(Variant::Type type, const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error) { internal::gdextension_interface_variant_call_static(static_cast<GDExtensionVariantType>(type), method._native_ptr(), reinterpret_cast<GDExtensionConstVariantPtr *>(args), argcount, r_ret._native_ptr(), &r_error); } diff --git a/test/project/main.gd b/test/project/main.gd index 473c15f..7a8f92b 100644 --- a/test/project/main.gd +++ b/test/project/main.gd @@ -2,6 +2,9 @@ extends "res://test_base.gd" var custom_signal_emitted = null +class TestClass: + func test(p_msg: String) -> String: + return p_msg + " world" func _ready(): var example: Example = $Example @@ -140,6 +143,10 @@ func _ready(): assert_equal(new_tilemap.tile_set, new_tileset) new_tilemap.queue_free() + # Test variant call. + var test_obj = TestClass.new() + assert_equal(example.test_variant_call(test_obj), "hello world") + # Constants. assert_equal(Example.FIRST, 0) assert_equal(Example.ANSWER_TO_EVERYTHING, 42) diff --git a/test/src/example.cpp b/test/src/example.cpp index 8a761a4..4a1f83e 100644 --- a/test/src/example.cpp +++ b/test/src/example.cpp @@ -153,6 +153,8 @@ void Example::_bind_methods() { ClassDB::bind_method(D_METHOD("test_add_child", "node"), &Example::test_add_child); ClassDB::bind_method(D_METHOD("test_set_tileset", "tilemap", "tileset"), &Example::test_set_tileset); + ClassDB::bind_method(D_METHOD("test_variant_call", "variant"), &Example::test_variant_call); + ClassDB::bind_method(D_METHOD("test_bitfield", "flags"), &Example::test_bitfield); ClassDB::bind_method(D_METHOD("test_rpc", "value"), &Example::test_rpc); @@ -402,6 +404,10 @@ void Example::test_set_tileset(TileMap *p_tilemap, const Ref<TileSet> &p_tileset p_tilemap->set_tileset(p_tileset); } +Variant Example::test_variant_call(Variant p_variant) { + return p_variant.call("test", "hello"); +} + BitField<Example::Flags> Example::test_bitfield(BitField<Flags> flags) { return flags; } diff --git a/test/src/example.h b/test/src/example.h index 6e00b7f..f847ecc 100644 --- a/test/src/example.h +++ b/test/src/example.h @@ -21,6 +21,7 @@ #include <godot_cpp/classes/tile_map.hpp> #include <godot_cpp/classes/tile_set.hpp> #include <godot_cpp/classes/viewport.hpp> +#include <godot_cpp/variant/variant.hpp> #include <godot_cpp/core/binder_common.hpp> @@ -134,6 +135,8 @@ public: void test_add_child(Node *p_node); void test_set_tileset(TileMap *p_tilemap, const Ref<TileSet> &p_tileset) const; + Variant test_variant_call(Variant p_variant); + BitField<Flags> test_bitfield(BitField<Flags> flags); // RPC |