You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-12 13:20:55 +00:00
Add ValidatedCall to MethodBind
* This should optimize GDScript function calling _enormously_. * It also should simplify the GDScript VM considerably. NOTE: GDExtension calling performance has most likely been affected until going via ptrcall is fixed.
This commit is contained in:
@@ -112,6 +112,8 @@ public:
|
||||
_FORCE_INLINE_ int get_argument_count() const { return argument_count; };
|
||||
|
||||
virtual Variant call(Object *p_object, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) const = 0;
|
||||
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const = 0;
|
||||
|
||||
virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const = 0;
|
||||
|
||||
StringName get_name() const;
|
||||
@@ -162,8 +164,12 @@ public:
|
||||
}
|
||||
#endif
|
||||
|
||||
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const override {
|
||||
ERR_FAIL_MSG("Validated call can't be used with vararg methods. This is a bug.");
|
||||
}
|
||||
|
||||
virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override {
|
||||
ERR_FAIL(); // Can't call.
|
||||
ERR_FAIL_MSG("ptrcall can't be used with vararg methods. This is a bug.");
|
||||
}
|
||||
|
||||
virtual bool is_const() const { return false; }
|
||||
@@ -253,6 +259,7 @@ public:
|
||||
virtual Variant call(Object *p_object, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) const override {
|
||||
return (static_cast<T *>(p_object)->*MethodBindVarArgBase<MethodBindVarArgTR<T, R>, T, R, true>::method)(p_args, p_arg_count, r_error);
|
||||
}
|
||||
|
||||
#if defined(SANITIZERS_ENABLED) && defined(__GNUC__) && !defined(__clang__)
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
@@ -326,6 +333,14 @@ public:
|
||||
return Variant();
|
||||
}
|
||||
|
||||
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const override {
|
||||
#ifdef TYPED_METHOD_BIND
|
||||
call_with_validated_object_instance_args(static_cast<T *>(p_object), method, p_args);
|
||||
#else
|
||||
call_with_validated_object_instance_args(reinterpret_cast<MB_T *>(p_object), method, p_args);
|
||||
#endif
|
||||
}
|
||||
|
||||
virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override {
|
||||
#ifdef TYPED_METHOD_BIND
|
||||
call_with_ptr_args<T, P...>(static_cast<T *>(p_object), method, p_args);
|
||||
@@ -393,6 +408,14 @@ public:
|
||||
return Variant();
|
||||
}
|
||||
|
||||
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const override {
|
||||
#ifdef TYPED_METHOD_BIND
|
||||
call_with_validated_object_instance_argsc(static_cast<T *>(p_object), method, p_args);
|
||||
#else
|
||||
call_with_validated_object_instance_argsc(reinterpret_cast<MB_T *>(p_object), method, p_args);
|
||||
#endif
|
||||
}
|
||||
|
||||
virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override {
|
||||
#ifdef TYPED_METHOD_BIND
|
||||
call_with_ptr_argsc<T, P...>(static_cast<T *>(p_object), method, p_args);
|
||||
@@ -471,6 +494,14 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const override {
|
||||
#ifdef TYPED_METHOD_BIND
|
||||
call_with_validated_object_instance_args_ret(static_cast<T *>(p_object), method, p_args, r_ret);
|
||||
#else
|
||||
call_with_validated_object_instance_args_ret(reinterpret_cast<MB_T *>(p_object), method, p_args, r_ret);
|
||||
#endif
|
||||
}
|
||||
|
||||
virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override {
|
||||
#ifdef TYPED_METHOD_BIND
|
||||
call_with_ptr_args_ret<T, R, P...>(static_cast<T *>(p_object), method, p_args, r_ret);
|
||||
@@ -550,6 +581,14 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const override {
|
||||
#ifdef TYPED_METHOD_BIND
|
||||
call_with_validated_object_instance_args_retc(static_cast<T *>(p_object), method, p_args, r_ret);
|
||||
#else
|
||||
call_with_validated_object_instance_args_retc(reinterpret_cast<MB_T *>(p_object), method, p_args, r_ret);
|
||||
#endif
|
||||
}
|
||||
|
||||
virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override {
|
||||
#ifdef TYPED_METHOD_BIND
|
||||
call_with_ptr_args_retc<T, R, P...>(static_cast<T *>(p_object), method, p_args, r_ret);
|
||||
@@ -614,6 +653,10 @@ public:
|
||||
return Variant();
|
||||
}
|
||||
|
||||
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const override {
|
||||
call_with_validated_variant_args_static_method(function, p_args);
|
||||
}
|
||||
|
||||
virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override {
|
||||
(void)p_object;
|
||||
(void)r_ret;
|
||||
@@ -677,6 +720,10 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
virtual void validated_call(Object *p_object, const Variant **p_args, Variant *r_ret) const override {
|
||||
call_with_validated_variant_args_static_method_ret(function, p_args, r_ret);
|
||||
}
|
||||
|
||||
virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override {
|
||||
(void)p_object;
|
||||
call_with_ptr_args_static_method_ret(function, p_args, r_ret);
|
||||
|
||||
Reference in New Issue
Block a user