Просмотр исходного кода

Add test for Reference passing/returning.

Fabio Alessandrelli 3 лет назад
Родитель
Сommit
b28853aff1
3 измененных файлов с 13 добавлено и 0 удалено
  1. 2 0
      test/demo/main.gd
  2. 10 0
      test/src/example.cpp
  3. 1 0
      test/src/example.h

+ 2 - 0
test/demo/main.gd

@@ -10,6 +10,8 @@ func _ready():
 	prints("returned", $Example.return_something("some string"))
 	prints("returned", $Example.return_something("some string"))
 	prints("returned const", $Example.return_something_const())
 	prints("returned const", $Example.return_something_const())
 	prints("returned ref", $Example.return_extended_ref())
 	prints("returned ref", $Example.return_extended_ref())
+	var ref = ExampleRef.new()
+	prints("sending ref: ", ref.get_instance_id(), "returned ref: ", $Example.extended_ref_checks(ref).get_instance_id())
 	prints("vararg args", $Example.varargs_func("some", "arguments", "to", "test"))
 	prints("vararg args", $Example.varargs_func("some", "arguments", "to", "test"))
 
 
 	# Use properties.
 	# Use properties.

+ 10 - 0
test/src/example.cpp

@@ -53,6 +53,7 @@ void Example::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("return_something"), &Example::return_something);
 	ClassDB::bind_method(D_METHOD("return_something"), &Example::return_something);
 	ClassDB::bind_method(D_METHOD("return_something_const"), &Example::return_something_const);
 	ClassDB::bind_method(D_METHOD("return_something_const"), &Example::return_something_const);
 	ClassDB::bind_method(D_METHOD("return_extended_ref"), &Example::return_extended_ref);
 	ClassDB::bind_method(D_METHOD("return_extended_ref"), &Example::return_extended_ref);
+	ClassDB::bind_method(D_METHOD("extended_ref_checks"), &Example::extended_ref_checks);
 
 
 	{
 	{
 		MethodInfo mi;
 		MethodInfo mi;
@@ -107,6 +108,15 @@ ExampleRef *Example::return_extended_ref() const {
 	return memnew(ExampleRef());
 	return memnew(ExampleRef());
 }
 }
 
 
+Ref<ExampleRef> Example::extended_ref_checks(Ref<ExampleRef> p_ref) const {
+	Ref<ExampleRef> ref;
+	ref.instantiate();
+	// TODO the returned value gets dereferenced too early and return a null object otherwise.
+	ref->reference();
+	UtilityFunctions::print("Example ref checks called with value: ", p_ref->get_instance_id(), ", returning value: ", ref->get_instance_id());
+	return ref;
+}
+
 Variant Example::varargs_func(const Variant **args, GDNativeInt arg_count, GDNativeCallError &error) {
 Variant Example::varargs_func(const Variant **args, GDNativeInt arg_count, GDNativeCallError &error) {
 	UtilityFunctions::print("Varargs called with ", String::num(arg_count), " arguments");
 	UtilityFunctions::print("Varargs called with ", String::num(arg_count), " arguments");
 	return arg_count;
 	return arg_count;

+ 1 - 0
test/src/example.h

@@ -76,6 +76,7 @@ public:
 	String return_something(const String &base);
 	String return_something(const String &base);
 	Viewport *return_something_const() const;
 	Viewport *return_something_const() const;
 	ExampleRef *return_extended_ref() const;
 	ExampleRef *return_extended_ref() const;
+	Ref<ExampleRef> extended_ref_checks(Ref<ExampleRef> p_ref) const;
 	Variant varargs_func(const Variant **args, GDNativeInt arg_count, GDNativeCallError &error);
 	Variant varargs_func(const Variant **args, GDNativeInt arg_count, GDNativeCallError &error);
 	void emit_custom_signal(const String &name, int value);
 	void emit_custom_signal(const String &name, int value);