@@ -87,6 +87,10 @@ bool GDNativeClass_getattribute(py_Ref self, py_Name name) {
8787
8888bool GDNativeClass_getunboundmethod (py_Ref self, py_Name name) {
8989 GDNativeClass *p = (GDNativeClass *)py_totrivial (self);
90+ if (name == pyctx ()->names .__call__ ) {
91+ py_assign (py_retval (), py_tpfindname (pyctx ()->tp_GDNativeClass , name));
92+ return true ;
93+ }
9094 pythreadctx ()->pending_nativecalls .append (std::make_pair (*p, name));
9195 py_newnativefunc (py_retval (), [](int argc, py_Ref argv) -> bool {
9296 Vector<std::pair<GDNativeClass, py_Name>> *stack = &pythreadctx ()->pending_nativecalls ;
@@ -95,18 +99,24 @@ bool GDNativeClass_getunboundmethod(py_Ref self, py_Name name) {
9599 stack->remove_at (last_idx);
96100
97101 InternalArguments args;
98- for (int i = 1 ; i < argc; i++) {
99- args.append (py_tovariant (&argv[i]));
100- }
101102
102103 Variant r_ret;
103104 GDExtensionCallError r_error;
104105 StringName method = python_name_to_godot (pair.second );
105106 if (pair.first .type == Variant::OBJECT) {
106- static GDExtensionMethodBindPtr _gde_method_bind = internal::gdextension_interface_classdb_get_method_bind (ClassDBSingleton::get_class_static ()._native_ptr (), StringName (" class_call_static" )._native_ptr (), 3344196419 );
107+ args.append (python_name_to_godot (pair.first .name ));
108+ args.append (method);
109+ for (int i = 1 ; i < argc; i++) {
110+ args.append (py_tovariant (&argv[i]));
111+ }
112+ ClassDBSingleton *singleton = ClassDBSingleton::get_singleton ();
113+ static GDExtensionMethodBindPtr _gde_method_bind = internal::gdextension_interface_classdb_get_method_bind (singleton->get_class_static ()._native_ptr (), StringName (" class_call_static" )._native_ptr (), 3344196419 );
107114 CHECK_METHOD_BIND_RET (_gde_method_bind, (Variant ()));
108- internal::gdextension_interface_object_method_bind_call (_gde_method_bind, nullptr , args.ptr (), args.size (), &r_ret, &r_error);
115+ internal::gdextension_interface_object_method_bind_call (_gde_method_bind, singleton-> _owner , args.ptr (), args.size (), &r_ret, &r_error);
109116 } else {
117+ for (int i = 1 ; i < argc; i++) {
118+ args.append (py_tovariant (&argv[i]));
119+ }
110120 godot::internal::gdextension_interface_variant_call_static (
111121 (GDExtensionVariantType)pair.first .type , &method, args.ptr (), args.size (), &r_ret, &r_error);
112122 }
@@ -129,8 +139,9 @@ bool handle_gde_call_error(GDExtensionCallError error) {
129139 case GDEXTENSION_CALL_ERROR_INVALID_ARGUMENT:
130140 return ValueError (" GDEXTENSION_CALL_ERROR_INVALID_ARGUMENT" );
131141 case GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS:
142+ return TypeError (" GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS" );
132143 case GDEXTENSION_CALL_ERROR_TOO_FEW_ARGUMENTS:
133- return TypeError (" expected %d arguments, got %d " , error. expected , error. argument );
144+ return TypeError (" GDEXTENSION_CALL_ERROR_TOO_FEW_ARGUMENTS " );
134145 case GDEXTENSION_CALL_ERROR_INSTANCE_IS_NULL:
135146 return RuntimeError (" GDEXTENSION_CALL_ERROR_INSTANCE_IS_NULL" );
136147 case GDEXTENSION_CALL_ERROR_METHOD_NOT_CONST:
0 commit comments