Add methods to get argument count of methods
Added to: * `Callable`s * `Object`s * `ClassDB` * `Script(Instance)`s
This commit is contained in:
@ -59,6 +59,8 @@ class CallableCustomExtension : public CallableCustom {
|
||||
|
||||
GDExtensionCallableCustomToString to_string_func;
|
||||
|
||||
GDExtensionCallableCustomGetArgumentCount get_argument_count_func;
|
||||
|
||||
uint32_t _hash;
|
||||
|
||||
static bool default_compare_equal(const CallableCustom *p_a, const CallableCustom *p_b) {
|
||||
@ -143,6 +145,21 @@ public:
|
||||
return object;
|
||||
}
|
||||
|
||||
int get_argument_count(bool &r_is_valid) const override {
|
||||
if (get_argument_count_func != nullptr) {
|
||||
GDExtensionBool is_valid = false;
|
||||
|
||||
GDExtensionInt ret = get_argument_count_func(userdata, &is_valid);
|
||||
|
||||
if (is_valid) {
|
||||
r_is_valid = true;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
r_is_valid = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *get_userdata(void *p_token) const {
|
||||
return (p_token == token) ? userdata : nullptr;
|
||||
}
|
||||
@ -157,6 +174,7 @@ public:
|
||||
r_call_error.expected = error.expected;
|
||||
}
|
||||
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
CallableCustomExtension(GDExtensionCallableCustomInfo *p_info) {
|
||||
userdata = p_info->callable_userdata;
|
||||
token = p_info->token;
|
||||
@ -172,6 +190,35 @@ public:
|
||||
|
||||
to_string_func = p_info->to_string_func;
|
||||
|
||||
get_argument_count_func = nullptr;
|
||||
|
||||
// Pre-calculate the hash.
|
||||
if (p_info->hash_func != nullptr) {
|
||||
_hash = p_info->hash_func(userdata);
|
||||
} else {
|
||||
_hash = hash_murmur3_one_64((uint64_t)call_func);
|
||||
_hash = hash_murmur3_one_64((uint64_t)userdata, _hash);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
CallableCustomExtension(GDExtensionCallableCustomInfo2 *p_info) {
|
||||
userdata = p_info->callable_userdata;
|
||||
token = p_info->token;
|
||||
|
||||
object = p_info->object_id;
|
||||
|
||||
call_func = p_info->call_func;
|
||||
is_valid_func = p_info->is_valid_func;
|
||||
free_func = p_info->free_func;
|
||||
|
||||
equal_func = p_info->equal_func;
|
||||
less_than_func = p_info->less_than_func;
|
||||
|
||||
to_string_func = p_info->to_string_func;
|
||||
|
||||
get_argument_count_func = p_info->get_argument_count_func;
|
||||
|
||||
// Pre-calculate the hash.
|
||||
if (p_info->hash_func != nullptr) {
|
||||
_hash = p_info->hash_func(userdata);
|
||||
@ -1378,9 +1425,15 @@ static GDExtensionScriptInstancePtr gdextension_object_get_script_instance(GDExt
|
||||
return script_instance_extension->instance;
|
||||
}
|
||||
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
static void gdextension_callable_custom_create(GDExtensionUninitializedTypePtr r_callable, GDExtensionCallableCustomInfo *p_custom_callable_info) {
|
||||
memnew_placement(r_callable, Callable(memnew(CallableCustomExtension(p_custom_callable_info))));
|
||||
}
|
||||
#endif
|
||||
|
||||
static void gdextension_callable_custom_create2(GDExtensionUninitializedTypePtr r_callable, GDExtensionCallableCustomInfo2 *p_custom_callable_info) {
|
||||
memnew_placement(r_callable, Callable(memnew(CallableCustomExtension(p_custom_callable_info))));
|
||||
}
|
||||
|
||||
static void *gdextension_callable_custom_get_userdata(GDExtensionTypePtr p_callable, void *p_token) {
|
||||
const Callable &callable = *reinterpret_cast<const Callable *>(p_callable);
|
||||
@ -1595,7 +1648,10 @@ void gdextension_setup_interface() {
|
||||
REGISTER_INTERFACE_FUNC(placeholder_script_instance_create);
|
||||
REGISTER_INTERFACE_FUNC(placeholder_script_instance_update);
|
||||
REGISTER_INTERFACE_FUNC(object_get_script_instance);
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
REGISTER_INTERFACE_FUNC(callable_custom_create);
|
||||
#endif // DISABLE_DEPRECATED
|
||||
REGISTER_INTERFACE_FUNC(callable_custom_create2);
|
||||
REGISTER_INTERFACE_FUNC(callable_custom_get_userdata);
|
||||
REGISTER_INTERFACE_FUNC(classdb_construct_object);
|
||||
REGISTER_INTERFACE_FUNC(classdb_get_method_bind);
|
||||
|
||||
@ -442,6 +442,8 @@ typedef GDExtensionBool (*GDExtensionCallableCustomLessThan)(void *callable_user
|
||||
|
||||
typedef void (*GDExtensionCallableCustomToString)(void *callable_userdata, GDExtensionBool *r_is_valid, GDExtensionStringPtr r_out);
|
||||
|
||||
typedef GDExtensionInt (*GDExtensionCallableCustomGetArgumentCount)(void *callable_userdata, GDExtensionBool *r_is_valid);
|
||||
|
||||
typedef struct {
|
||||
/* Only `call_func` and `token` are strictly required, however, `object_id` should be passed if its not a static method.
|
||||
*
|
||||
@ -471,7 +473,40 @@ typedef struct {
|
||||
GDExtensionCallableCustomLessThan less_than_func;
|
||||
|
||||
GDExtensionCallableCustomToString to_string_func;
|
||||
} GDExtensionCallableCustomInfo;
|
||||
} GDExtensionCallableCustomInfo; // Deprecated. Use GDExtensionCallableCustomInfo2 instead.
|
||||
|
||||
typedef struct {
|
||||
/* Only `call_func` and `token` are strictly required, however, `object_id` should be passed if its not a static method.
|
||||
*
|
||||
* `token` should point to an address that uniquely identifies the GDExtension (for example, the
|
||||
* `GDExtensionClassLibraryPtr` passed to the entry symbol function.
|
||||
*
|
||||
* `hash_func`, `equal_func`, and `less_than_func` are optional. If not provided both `call_func` and
|
||||
* `callable_userdata` together are used as the identity of the callable for hashing and comparison purposes.
|
||||
*
|
||||
* The hash returned by `hash_func` is cached, `hash_func` will not be called more than once per callable.
|
||||
*
|
||||
* `is_valid_func` is necessary if the validity of the callable can change before destruction.
|
||||
*
|
||||
* `free_func` is necessary if `callable_userdata` needs to be cleaned up when the callable is freed.
|
||||
*/
|
||||
void *callable_userdata;
|
||||
void *token;
|
||||
|
||||
GDObjectInstanceID object_id;
|
||||
|
||||
GDExtensionCallableCustomCall call_func;
|
||||
GDExtensionCallableCustomIsValid is_valid_func;
|
||||
GDExtensionCallableCustomFree free_func;
|
||||
|
||||
GDExtensionCallableCustomHash hash_func;
|
||||
GDExtensionCallableCustomEqual equal_func;
|
||||
GDExtensionCallableCustomLessThan less_than_func;
|
||||
|
||||
GDExtensionCallableCustomToString to_string_func;
|
||||
|
||||
GDExtensionCallableCustomGetArgumentCount get_argument_count_func;
|
||||
} GDExtensionCallableCustomInfo2;
|
||||
|
||||
/* SCRIPT INSTANCE EXTENSION */
|
||||
|
||||
@ -2510,6 +2545,7 @@ typedef GDExtensionScriptInstanceDataPtr (*GDExtensionInterfaceObjectGetScriptIn
|
||||
/**
|
||||
* @name callable_custom_create
|
||||
* @since 4.2
|
||||
* @deprecated in Godot 4.3. Use `callable_custom_create2` instead.
|
||||
*
|
||||
* Creates a custom Callable object from a function pointer.
|
||||
*
|
||||
@ -2520,6 +2556,19 @@ typedef GDExtensionScriptInstanceDataPtr (*GDExtensionInterfaceObjectGetScriptIn
|
||||
*/
|
||||
typedef void (*GDExtensionInterfaceCallableCustomCreate)(GDExtensionUninitializedTypePtr r_callable, GDExtensionCallableCustomInfo *p_callable_custom_info);
|
||||
|
||||
/**
|
||||
* @name callable_custom_create2
|
||||
* @since 4.3
|
||||
*
|
||||
* Creates a custom Callable object from a function pointer.
|
||||
*
|
||||
* Provided struct can be safely freed once the function returns.
|
||||
*
|
||||
* @param r_callable A pointer that will receive the new Callable.
|
||||
* @param p_callable_custom_info The info required to construct a Callable.
|
||||
*/
|
||||
typedef void (*GDExtensionInterfaceCallableCustomCreate2)(GDExtensionUninitializedTypePtr r_callable, GDExtensionCallableCustomInfo2 *p_callable_custom_info);
|
||||
|
||||
/**
|
||||
* @name callable_custom_get_userdata
|
||||
* @since 4.2
|
||||
|
||||
Reference in New Issue
Block a user