Skip to content

Commit 69235b2

Browse files
committed
some fix
1 parent edbe966 commit 69235b2

File tree

4 files changed

+23
-8
lines changed

4 files changed

+23
-8
lines changed

demo/MyScript.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from godot import *
2-
from godot.classes import Node, TileSet, Vector2
2+
from godot.classes import Node, TileSet, Vector2, Vector3, Color, PhysicsRayQueryParameters3D
33

44
import test
55

@@ -22,6 +22,9 @@ def _ready(self):
2222
print('==>', self.owner, self.owner.script)
2323
print('==>', self.x, self.y, self.z, self.w)
2424
print('==> path:', self.owner.get_path())
25+
# test @staticmethod
26+
print('==> color:', Color.from_hsv(0.307, 0.4589, 0.8118, 0.5))
27+
print('==> ray3d:', PhysicsRayQueryParameters3D.create(Vector3(1, 2, 3), Vector3(1, 2, 3)))
2528
print('==> vector2:', Vector2(1.5, 2.5))
2629
print('==> vector2:', Vector2(1.5, 2.5).angle())
2730

src/lang/Bindings.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ void setup_python_bindings() {
9292
pyctx()->lock.clear();
9393
pyctx()->names.__init__ = py_name("__init__");
9494
pyctx()->names.__name__ = py_name("__name__");
95+
pyctx()->names.__call__ = py_name("__call__");
9596
pyctx()->names.script = py_name("script");
9697

9798
py_callbacks()->gc_mark = PythonScriptInstance::gc_mark_instances;
@@ -157,7 +158,6 @@ void setup_python_bindings() {
157158
py_tphookattributes(pyctx()->tp_GDNativeClass, GDNativeClass_getattribute, NULL, NULL, GDNativeClass_getunboundmethod);
158159

159160
py_bindmethod(pyctx()->tp_GDNativeClass, "__call__", [](int argc, py_Ref argv) -> bool {
160-
PY_CHECK_ARG_TYPE(0, pyctx()->tp_GDNativeClass);
161161
GDNativeClass *p = (GDNativeClass *)py_totrivial(argv);
162162
StringName clazz = python_name_to_godot(p->name);
163163

src/lang/BindingsHooks.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ bool GDNativeClass_getattribute(py_Ref self, py_Name name) {
8787

8888
bool 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:

src/lang/Common.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ struct PythonContext {
8585
struct {
8686
py_Name __init__;
8787
py_Name __name__;
88+
py_Name __call__;
8889
py_Name script;
8990
} names;
9091
};

0 commit comments

Comments
 (0)