Skip to content

Commit

Permalink
Fix variant call compiler error
Browse files Browse the repository at this point in the history
Co-authored-by: David Snopek <[email protected]>
  • Loading branch information
mashumafi and dsnopek committed Sep 9, 2023
1 parent 82e960a commit 4c088eb
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 8 deletions.
20 changes: 14 additions & 6 deletions include/godot_cpp/variant/variant.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -255,25 +255,33 @@ class Variant {
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;
}

Expand Down
4 changes: 2 additions & 2 deletions src/variant/variant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
7 changes: 7 additions & 0 deletions test/project/main.gd
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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(test_obj), "hello world")

# Constants.
assert_equal(Example.FIRST, 0)
assert_equal(Example.ANSWER_TO_EVERYTHING, 42)
Expand Down
6 changes: 6 additions & 0 deletions test/src/example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down
3 changes: 3 additions & 0 deletions test/src/example.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down Expand Up @@ -134,6 +135,8 @@ class Example : public Control {
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
Expand Down

0 comments on commit 4c088eb

Please sign in to comment.