Преглед изворни кода

Fix variant call compiler error

Co-authored-by: David Snopek <[email protected]>
Matthew Murphy пре 2 година
родитељ
комит
ca3e25de04
5 измењених фајлова са 32 додато и 8 уклоњено
  1. 14 6
      include/godot_cpp/variant/variant.hpp
  2. 2 2
      src/variant/variant.cpp
  3. 7 0
      test/project/main.gd
  4. 6 0
      test/src/example.cpp
  5. 3 0
      test/src/example.h

+ 14 - 6
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;
 	}
 

+ 2 - 2
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);
 }
 

+ 7 - 0
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)

+ 6 - 0
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;
 }

+ 3 - 0
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