Skip to content

Commit 5183654

Browse files
committed
starting to clean up the binding code generator script.
Lots and lots of work to do... This is going to take a while to finish.
1 parent 9407a6a commit 5183654

28 files changed

+4587
-0
lines changed

gen/api_gen/__init__.py

Whitespace-only changes.

gen/api_gen/code_gen.py

Lines changed: 3107 additions & 0 deletions
Large diffs are not rendered by default.

gen/api_gen/main.py

Whitespace-only changes.

gen/api_gen/templates/__init__.py

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
2+
3+
4+
5+
6+
class __DynamicLoader:
7+
8+
class __DynamicAttribute:
9+
10+
def __init__(self, data):
11+
self._data = data
12+
13+
def __get__(self, instance, owner):
14+
return Template(self._data)
15+
16+
def __init__(self):
17+
import sys
18+
19+
mod = sys.modules[__name__]
20+
21+
for key, value in mod.__dict__.items():
22+
23+
if key.startswith('__') and key.endswith('__'):
24+
setattr(self, key, value)
25+
26+
self.__original__module__ = mod
27+
28+
sys.modules[__name__] = self
29+
30+
def __getattr__(self, item):
31+
if item in self.__dict__:
32+
return self.__dict__[item]
33+
34+
if item + '.c' in os.listdir(BASE_PATH):
35+
value = Template(file_name=item + '.c')
36+
setattr(self, item, value)
37+
return value
38+
39+
raise AttributeError(item)
40+
41+
@staticmethod
42+
def c_name(*args) -> str:
43+
return '_'.join(list(args))
44+
45+
MP_DEFINE_STR_OBJ = __DynamicAttribute('MP_DEFINE_STR_OBJ(mp_{0}, {1});')
46+
MP_ROM_INT = __DynamicAttribute('MP_ROM_INT({0})')
47+
sizeof = __DynamicAttribute('sizeof({0})')
48+
pointer = __DynamicAttribute('{0} *')
49+
const_pointer = __DynamicAttribute('const {0} *')
50+
const = __DynamicAttribute('const {0}')
51+
mp_read_byref = __DynamicAttribute('mp_read_byref_{0}')
52+
mp_read = __DynamicAttribute('mp_read_{0}')
53+
mp_write = __DynamicAttribute('mp_write_{0}')
54+
mp_read_ptr = __DynamicAttribute('mp_read_ptr_{0}')
55+
mp_write_ptr = __DynamicAttribute('mp_write_ptr_{0}')
56+
typedef_typeof = __DynamicAttribute('typedef __typeof__( (({0}*)(0))->{1} ) {2};')
57+
mp_lv = __DynamicAttribute('mp_lv_{0}')
58+
59+
cb_decl = __DynamicAttribute('static {0} {1}({2});')
60+
cb_arg_conv = __DynamicAttribute('mp_args[{0}] = {1}({2}arg{0});')
61+
mp_arr_to = __DynamicAttribute('mp_arr_to_{0}')
62+
mp_arr_from = __DynamicAttribute('mp_arr_from_{0}')
63+
64+
func_ptr_name = __DynamicAttribute('funcptr_{0}')
65+
func_ptr_macro = __DynamicAttribute('#define {0} NULL\n')
66+
func_ptr_def = __DynamicAttribute('static inline mp_obj_t mp_lv_{0}(void *func){{ return mp_lv_funcptr(&mp_{0}_mpobj, func, NULL, MP_QSTR_, NULL); }}\n')
67+
68+
cast_member = __DynamicAttribute('{ MP_ROM_QSTR(MP_QSTR___cast__), MP_ROM_PTR(&cast_obj_class_method) }')
69+
member = __DynamicAttribute('{{ MP_ROM_QSTR(MP_QSTR_{0}), MP_ROM_PTR(&mp_{1}_mpobj) }}')
70+
enum_member = __DynamicAttribute('{{ MP_ROM_QSTR(MP_QSTR_{0}), MP_ROM_PTR({1}) }}')
71+
enum_type_member = __DynamicAttribute('{{ MP_ROM_QSTR(MP_QSTR_{0}), MP_ROM_PTR(&mp_lv_{1}_type_base) }}')
72+
size_member = __DynamicAttribute('{{ MP_ROM_QSTR(MP_QSTR___SIZE__), MP_ROM_PTR(MP_ROM_INT(sizeof({0}{1}))) }},')
73+
func_member = __DynamicAttribute('{{ MP_ROM_QSTR(MP_QSTR_{0}), MP_ROM_PTR(&mp_{1}_mpobj) }}')
74+
75+
76+
__dynamic_loader = __DynamicLoader()
77+
78+
79+
import os # NOQA
80+
81+
BASE_PATH = os.path.dirname(__file__)
82+
83+
84+
class Template(str):
85+
86+
def __init__(self, value='', file_name=''):
87+
pass
88+
89+
def __new__(cls, value='', file_name=''):
90+
if file_name:
91+
with open(os.path.join(BASE_PATH, file_name), 'r') as f:
92+
value = f.read()
93+
94+
if '/*#~' in value:
95+
value = value.replace('{', '{{').replace('}', '}}')
96+
value = value.replace('/*#~', '{').replace('~#*/', '}')
97+
98+
super().__init__(cls, value)
99+
100+
def __call__(self, *args, **kwargs):
101+
return self.format(*args, **kwargs)
102+
103+
104+
if __name__ == '__main__':
105+
helper_functions: Template = ...
106+
objects: Template = ...
107+
headers: Template = ...
108+
struct: Template = ...
109+
110+
MP_ROM_INT: Template = ...
111+
MP_DEFINE_STR_OBJ: Template = ...
112+
sizeof: Template = ...
113+
pointer: Template = ...
114+
const_pointer: Template = ...
115+
const: Template = ...
116+
mp_read_byref: Template = ...
117+
mp_read: Template = ...
118+
mp_write: Template = ...
119+
mp_read_ptr: Template = ...
120+
mp_write_ptr: Template = ...
121+
typedef_typeof: Template = ...
122+
mp_lv: Template = ...
123+
124+
cb_decl: Template = ...
125+
cb_arg_conv: Template = ...
126+
127+
write_case_cb: Template = ...
128+
write_case: Template = ...
129+
write_case_array: Template = ...
130+
131+
read_case_cb: Template = ...
132+
read_case: Template = ...
133+
read_case_array: Template = ...
134+
135+
mp_arr_to: Template = ...
136+
mp_arr_from: Template = ...
137+
138+
array_conv_dim: Template = ...
139+
array_conv_no_dim: Template = ...
140+
array_conv: Template = ...
141+
142+
func_ptr_name: Template = ...
143+
func_ptr_macro: Template = ...
144+
func_ptr_def: Template = ...
145+
146+
helper_struct: Template = ...
147+
148+
cast_member: Template = ...
149+
150+
151+
def member(method_name: str, method: str, /) -> str:
152+
...
153+
154+
155+
def enum_member(enum_member_name: str, enum_member_value: str, /) -> str:
156+
...
157+
158+
159+
def enum_type_member(name: str, type_: str, /) -> str:
160+
...
161+
162+
163+
def callback_func(func_name: str, func_prototype: str, func_args: str, num_args: int,
164+
return_type: str, return_value: str, return_value_assignment: str,
165+
build_args: str, user_data: str, /) -> str:
166+
...
167+
168+
def func_arg_conv_1(arg_name: str, index: int, callback_name: str, full_user_data: str,
169+
containing_struct: str, user_data_getter: str, user_data_setter: str, /) -> str:
170+
...
171+
172+
173+
def func_arg_conv_2(var_name: str, cast: str, convertor: str, index: int, /) -> str:
174+
...
175+
176+
177+
def func_obj_decl(func_name: str, func_obj_name: str, func_ptr: str,
178+
param_count: int, builtin_macro: str, /) -> str:
179+
...
180+
181+
182+
def extension_def(module_name: str, print_func: str, func: str, build_args: str, build_result: str,
183+
func_ptr: str, send_args: str, build_return_value: str, /) -> str:
184+
...
185+
186+
def func_error(problem: str, method: str, /) -> str:
187+
...
188+
189+
def ctor(obj: str, ctor_name: str, /) -> str:
190+
...
191+
192+
def object_def(module_name: str, obj: str, locals_dict_entries: str, ctor: str, make_new: str,
193+
binary_op: str, buffer: str, parent: str, lv_class: str, /) -> str:
194+
...
195+
196+
def global_def(module_name: str, global_name: str, struct_name: str, cast: str, /) -> str:
197+
...
198+
199+
def size_member(struct_tag: str, struct_name: str, /) -> str:
200+
...
201+
202+
def size_attr(sanitized_struct_name: str, struct_size: str, functions: str, /) -> str:
203+
...
204+
205+
def func_member(name: str, func: str, /) -> str:
206+
...
207+
208+
209+
def c_name(*args) -> str:
210+
...
211+

gen/api_gen/templates/array_conv.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
// Array convertors for /*#~0~#*/
3+
4+
GENMPY_UNUSED static /*#~1~#*//*#~2~#*/ */*#~3~#*/(mp_obj_t mp_arr)
5+
{
6+
mp_obj_t mp_len = mp_obj_len_maybe(mp_arr);
7+
8+
if (mp_len == MP_OBJ_NULL) return mp_to_ptr(mp_arr);
9+
10+
mp_int_t len = mp_obj_get_int(mp_len);
11+
/*#~4~#*/
12+
/*#~1~#*//*#~2~#*/ *lv_arr = (/*#~1~#*//*#~2~#*/*)m_malloc(len * sizeof(/*#~1~#*//*#~2~#*/));
13+
mp_obj_t iter = mp_getiter(mp_arr, NULL);
14+
mp_obj_t item;
15+
size_t i = 0;
16+
17+
while ((item = mp_iternext(iter)) != MP_OBJ_STOP_ITERATION) {
18+
lv_arr[i++] = /*#~5~#*/(item);
19+
}
20+
21+
return (/*#~1~#*//*#~2~#*/ *)lv_arr;
22+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
3+
GENMPY_UNUSED static mp_obj_t /*#~0~#*/(/*#~1~#*/ *arr)
4+
{
5+
mp_obj_t obj_arr[/*#~3~#*/];
6+
for (size_t i=0; i</*#~3~#*/; i++){{
7+
obj_arr[i] = /*#~2~#*/(arr[i]);
8+
}}
9+
return mp_obj_new_list(/*#~3~#*/, obj_arr); // TODO: return custom iterable object!
10+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
3+
GENMPY_UNUSED static mp_obj_t /*#~0~#*/(/*#~1~#*/ *arr)
4+
{
5+
return /*#~2~#*/((void*)arr);
6+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
// Callback function /*#~0~#*/
3+
// /*#~1~#*/
4+
5+
GENMPY_UNUSED static /*#~4~#*/ /*#~0~#*/_callback(/*#~2~#*/)
6+
{
7+
mp_obj_t mp_args[/*#~3~#*/];
8+
/*#~7~#*/
9+
mp_obj_t callbacks = get_callback_dict_from_user_data(/*#~8~#*/);
10+
_nesting++;
11+
/*#~6~#*/mp_call_function_n_kw(mp_obj_dict_get(callbacks, MP_OBJ_NEW_QSTR(MP_QSTR_/*#~0~#*/)) , /*#~3~#*/, 0, mp_args);
12+
_nesting--;
13+
return/*#~5~#*/;
14+
}

gen/api_gen/templates/ctor.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
static mp_obj_t /*#~0~#*/_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args)
2+
{
3+
return make_new(&mp_/*#~1~#*/_mpobj, type, n_args, n_kw, args);
4+
}
5+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
// /*#~0~#*/ extension definition for:
3+
// /*#~1~#*/
4+
5+
static mp_obj_t mp_/*#~2~#*/(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr)
6+
{
7+
/*#~3~#*/
8+
/*#~4~#*/((/*#~5~#*/)lv_func_ptr)(/*#~6~#*/);
9+
return /*#~7~#*/;
10+
}

0 commit comments

Comments
 (0)