33
44cimport cython
55
6- from .hazmat.gdapi cimport pythonscript_gdapi
7- from .hazmat.gdnative_interface cimport GDNativeObjectPtr
6+ from .hazmat.gdapi cimport *
7+ from .builtins cimport *
88{% for spec in api ["classes" ] %}
99
1010
1111cdef class {{ spec.name }}({{ spec.inherits or "" }}):
1212{% if spec .inherits is none %}
13+
14+ {# @staticmethod
15+ cpdef inline {{ spec.name}} new():
16+ raise NotImplementedError("TODO :'(") #}
17+
1318 def free(self):
14- gdobject_free(self)
19+ pythonscript_gdapi.object_destroy(self._gd_ptr)
20+ self._gd_ptr = NULL
1521
1622 def __init__(self):
1723 raise RuntimeError(
@@ -24,3 +30,68 @@ cdef class {{ spec.name }}({{ spec.inherits or "" }}):
2430 pass
2531{% endif %}
2632{% endfor %}
33+
34+
35+ cdef _load_singleton(name):
36+ cdef GDObject gdobj = GDObject.__new__(GDObject)
37+ gdobj._gd_ptr = pythonscript_gdapi.global_get_singleton(name)
38+ {% for spec in api ["singletons" ] %}
39+ cdef {{ spec.type.py_type }} singleton_{{ spec.name }} = {{ spec.type.py_type }}.__new__({{ spec.type.py_type }})
40+ singleton_{{ spec.name }}._gd_ptr = pythonscript_gdapi.global_get_singleton("{{ spec.original_name }}")
41+ globals()["{{ spec.name }}"] = singleton_{{ spec.name }}
42+ {% endfor %}
43+
44+
45+ cdef object _load_class(str name):
46+ # Load our good friend ClassDB
47+ cdef GDNativeObjectPtr classdb = pythonscript_gdapi.global_get_singleton("ClassDB")
48+ pythonscript_gdapi.print_error("AAAAAAAAAA", "_object_call", "", 0)
49+ cdef gd_variant_t meths = _object_call(classdb, "class_get_method_list", [name])
50+ pythonscript_gdapi.print_error("BBBB", "_object_call", "", 0)
51+ pythonscript_gdapi.print_error("GOOOOOOOOOOOOOOOD", "_object_call", "", 0)
52+
53+
54+ cdef object _object_call(GDNativeObjectPtr obj, str meth, args):
55+ cdef gd_variant_t ret
56+ cdef GDNativeCallError call_error
57+
58+ cdef GDNativeObjectPtr classdb = pythonscript_gdapi.global_get_singleton("ClassDB")
59+ cdef GDNativeMethodBindPtr Object_call = pythonscript_gdapi.classdb_get_method_bind("Object", "call", {{ api.get_class_meth_hash("Object", "call") }})
60+
61+ cdef GDNativeInt args_with_meth_len = len(args) + 1
62+ if args_with_meth_len > 9:
63+ # TODO: handle this
64+ pythonscript_gdapi.print_error("more than 8 params is not supported !", "_object_call", "", 0)
65+ return None
66+ cdef gd_variant_t[9] variant_args
67+ cdef (gd_variant_t*)[9] variant_args_ptrs
68+ for i in range(args_with_meth_len):
69+ variant_args_ptrs[i] = &variant_args[i]
70+
71+ cdef gd_string_t meth_gdstr = gdstring_from_unchecked_pystr(meth)
72+ cdef gd_string_name_t meth_gdstrname = gd_string_name_new_from_string(&meth_gdstr)
73+ gd_string_del(&meth_gdstr)
74+ variant_args[0] = gd_string_name_into_variant(&meth_gdstrname)
75+ # Into conversion steals the owneship, so no need to delete meth_gdstrname
76+
77+ for i, arg in enumerate(args, 1):
78+ # TODO: check return value
79+ pyobject_to_gdvariant(arg, &variant_args[i])
80+
81+ pythonscript_gdapi.object_method_bind_call(
82+ Object_call,
83+ classdb,
84+ <GDNativeVariantPtr * >&variant_args_ptrs,
85+ args_with_meth_len,
86+ &ret,
87+ &call_error, # TODO: check call_error
88+ )
89+ pythonscript_gdapi.print_error("after call", "<function >", "<file >", 0)
90+ for i in range(args_with_meth_len):
91+ gd_variant_del(&variant_args[i])
92+
93+ try:
94+ gd_print(&ret, 1)
95+ return gdvariant_to_pyobject(&ret)
96+ finally:
97+ gd_variant_del(&ret)
0 commit comments