Browse Source

Callable: add callv method

This method can be called from GDExtension.
Ricardo Buring 2 years ago
parent
commit
0c2055d15d
4 changed files with 24 additions and 0 deletions
  1. 15 0
      core/variant/callable.cpp
  2. 1 0
      core/variant/callable.h
  3. 1 0
      core/variant/variant_call.cpp
  4. 7 0
      doc/classes/Callable.xml

+ 15 - 0
core/variant/callable.cpp

@@ -63,6 +63,21 @@ void Callable::callp(const Variant **p_arguments, int p_argcount, Variant &r_ret
 	}
 	}
 }
 }
 
 
+Variant Callable::callv(const Array &p_arguments) const {
+	int argcount = p_arguments.size();
+	const Variant **argptrs = nullptr;
+	if (argcount) {
+		argptrs = (const Variant **)alloca(sizeof(Variant *) * argcount);
+		for (int i = 0; i < argcount; i++) {
+			argptrs[i] = &p_arguments[i];
+		}
+	}
+	CallError ce;
+	Variant ret;
+	callp(argptrs, argcount, ret, ce);
+	return ret;
+}
+
 Error Callable::rpcp(int p_id, const Variant **p_arguments, int p_argcount, CallError &r_call_error) const {
 Error Callable::rpcp(int p_id, const Variant **p_arguments, int p_argcount, CallError &r_call_error) const {
 	if (is_null()) {
 	if (is_null()) {
 		r_call_error.error = CallError::CALL_ERROR_INSTANCE_IS_NULL;
 		r_call_error.error = CallError::CALL_ERROR_INSTANCE_IS_NULL;

+ 1 - 0
core/variant/callable.h

@@ -71,6 +71,7 @@ public:
 
 
 	void callp(const Variant **p_arguments, int p_argcount, Variant &r_return_value, CallError &r_call_error) const;
 	void callp(const Variant **p_arguments, int p_argcount, Variant &r_return_value, CallError &r_call_error) const;
 	void call_deferredp(const Variant **p_arguments, int p_argcount) const;
 	void call_deferredp(const Variant **p_arguments, int p_argcount) const;
+	Variant callv(const Array &p_arguments) const;
 
 
 	Error rpcp(int p_id, const Variant **p_arguments, int p_argcount, CallError &r_call_error) const;
 	Error rpcp(int p_id, const Variant **p_arguments, int p_argcount, CallError &r_call_error) const;
 
 

+ 1 - 0
core/variant/variant_call.cpp

@@ -1859,6 +1859,7 @@ static void _register_variant_builtin_methods() {
 
 
 	/* Callable */
 	/* Callable */
 
 
+	bind_method(Callable, callv, sarray("arguments"), varray());
 	bind_method(Callable, is_null, sarray(), varray());
 	bind_method(Callable, is_null, sarray(), varray());
 	bind_method(Callable, is_custom, sarray(), varray());
 	bind_method(Callable, is_custom, sarray(), varray());
 	bind_method(Callable, is_standard, sarray(), varray());
 	bind_method(Callable, is_standard, sarray(), varray());

+ 7 - 0
doc/classes/Callable.xml

@@ -81,6 +81,13 @@
 				[/codeblock]
 				[/codeblock]
 			</description>
 			</description>
 		</method>
 		</method>
+		<method name="callv" qualifiers="const">
+			<return type="Variant" />
+			<param index="0" name="arguments" type="Array" />
+			<description>
+				Calls the method represented by this [Callable]. Contrary to [method call], this method does not take a variable number of arguments but expects all arguments to be passed via a single [Array].
+			</description>
+		</method>
 		<method name="get_method" qualifiers="const">
 		<method name="get_method" qualifiers="const">
 			<return type="StringName" />
 			<return type="StringName" />
 			<description>
 			<description>