VSF Documented
vsf_micropython.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#ifndef __VSF_MICROPYTHON_H__
19#define __VSF_MICROPYTHON_H__
20
21/*============================ INCLUDES ======================================*/
22
23#include "py/runtime.h"
24#include "py/objstr.h"
25#include "py/objtype.h"
26#include "py/mperrno.h"
27#include "py/runtime.h"
28
29// for VSF_MFOREACH and VSF_VA_NUM_ARGS
31
32/*============================ MACROS ========================================*/
33
34// features
35
36#undef VSF_PYAL_FEATURE_FUNCARG_NUM_CHECK
37#define VSF_PYAL_FEATURE_FUNCARG_NUM_CHECK 0
38#define VSF_PYAL_FEATURE_MODULE_IS_DYN 0
39
40/*============================ MACROFIED FUNCTIONS ===========================*/
41
42// buffer
43
44#define vsf_pyal_buffer_t vstr_t
45#define vsf_pyal_new_buffer(__size) \
46 ({ \
47 vstr_t VSF_MACRO_SAFE_NAME(vstr); \
48 vstr_init_len(&VSF_MACRO_SAFE_NAME(vstr), (__size)); \
49 VSF_MACRO_SAFE_NAME(vstr); \
50 })
51#define vsf_pyal_buffer_getptr(__buffer) (__buffer).buf
52#define vsf_pyal_buffer_getlen(__buffer) (__buffer).len
53#define vsf_pyal_buffer_setlen(__buffer, __len) ((__buffer).len = (__len))
54#define vsf_pyal_buffer_free(__buffer) vstr_clear(&(__buffer))
55
56// arg, used as element of list/dict etc
57
58typedef mp_obj_t vsf_pyal_arg_t;
59#define VSF_PYAL_ARG_NULL MP_OBJ_NULL
60
61#define vsf_pyal_arg_is_int(__arg) mp_obj_is_int(__arg)
62#define vsf_pyal_arg_is_float(__arg) mp_obj_is_float(__arg)
63#define vsf_pyal_arg_is_str(__arg) mp_obj_is_str(__arg)
64#define vsf_pyal_arg_is_bool(__arg) mp_obj_is_bool(__arg)
65#define vsf_pyal_arg_is_list(__arg) (mp_obj_get_type(__arg) == &mp_type_list)
66#define vsf_pyal_arg_is_tuple(__arg) (mp_obj_get_type(__arg) == &mp_type_tuple)
67#define vsf_pyal_arg_is_callable(__arg) mp_obj_is_callable(__arg)
68#define vsf_pyal_arg_is_iterable(__arg) mp_obj_is_iterable(__arg)
69#define vsf_pyal_arg_is_class(__arg, __mod, __class)mp_obj_is_exact_type((__arg), &mp_type_ ## __mod ## _ ## __class)
70#define vsf_pyal_arg_getobj(__arg) (__arg)
71#define vsf_pyal_arg_free(__arg)
72
73#define vsf_pyal_arg_is_child_of(__arg, __mod, __class) \
74 mp_obj_is_subclass_fast(mp_obj_get_type(__arg), &mp_type_ ## __mod ## _ ## __class)
75#define vsf_pyal_arg_getobj_parent(__arg, __parent_mod, __parent_class) \
76 mp_obj_cast_to_native_base((__arg), (mp_const_obj_t)&mp_type_ ## __parent_mod ## _ ## __parent_class)
77
78#define vsf_pyal_arg_iter(__arg, ...) \
79 { \
80 mp_obj_iter_buf_t iter_buf; \
81 vsf_pyal_arg_t _, iterable = mp_getiter((__arg), &iter_buf); \
82 while ((_ = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) { \
83 __VA_ARGS__ \
84 } \
85 }
86
87// callable
88
89#define vsf_pyal_call(__func, __arg_num, __kw_num, __args) \
90 mp_call_function_n_kw((__func), (__arg_num), (__kw_num), (__args))
91
92// int
93
94#define vsf_pyal_intvalue_t mp_int_t
95#define vsf_pyal_newobj_int(__value) mp_obj_new_int(__value)
96#define vsf_pyal_newarg_int(__value) mp_obj_new_int(__value)
97#define vsf_pyal_arg_getint(__intarg) mp_obj_get_int(__intarg)
98
99// float
100
101#define vsf_pyal_newobj_float(__value) mp_obj_new_float(__value)
102#define vsf_pyal_newarg_float(__value) mp_obj_new_float(__value)
103#define vsf_pyal_arg_getfloat(__floatarg) mp_obj_get_float(__floatarg)
104
105// str
106
107#define vsf_pyal_newarg_str(__str) mp_obj_new_str((const char *)(__str), strlen(__str))
108#define vsf_pyal_newarg_str_ret(__str) vsf_pyal_newarg_str(__str)
109#define vsf_pyal_newarg_str_ret_and_free(__str) \
110 ({ \
111 vsf_pyal_arg_t VSF_MACRO_SAFE_NAME(arg) = vsf_pyal_newarg_str(__str); \
112 free(__str); \
113 VSF_MACRO_SAFE_NAME(arg); \
114 })
115#define vsf_pyal_arg_getstr(__str_arg) mp_obj_str_get_str(__str_arg)
116
117// bytes
118
119#define vsf_pyal_newarg_bytes(__data, __len) mp_obj_new_bytes((const byte *)(__data), __len)
120#define vsf_pyal_newarg_bytes_ret(__data, __len) vsf_pyal_newarg_bytes((__data), (__len))
121#define vsf_pyal_newarg_bytes_ret_from_buffer(__buffer, __length) \
122 ({ \
123 vsf_pyal_buffer_setlen((__buffer), (__length)); \
124 mp_obj_new_bytes_from_vstr(&(__buffer)); \
125 })
126#define vsf_pyal_arg_getbytes(__bytesarg, __len_ptr) \
127 (uint8_t *)mp_obj_str_get_data((__bytesarg), (size_t *)(__len_ptr))
128
129#define vsf_pyal_newarg_bytes_ret_and_free(__data, __len) \
130 ({ \
131 vsf_pyal_arg_t VSF_MACRO_SAFE_NAME(arg) = vsf_pyal_newarg_bytes((__data), (__len));\
132 free(__data); \
133 VSF_MACRO_SAFE_NAME(arg); \
134 })
135#define vsf_pyal_newobj_bytes_ret_and_free(__data, __len) \
136 ({ \
137 vsf_pyal_arg_t VSF_MACRO_SAFE_NAME(arg) = vsf_pyal_newarg_bytes_ret_and_free((__data), (__len));\
138 vsf_pyal_arg_getobj(VSF_MACRO_SAFE_NAME(arg)); \
139 })
140#define vsf_pyal_newfuncarg_bytes_ret_and_free(__data, __len) \
141 ({ \
142 vsf_pyal_arg_t VSF_MACRO_SAFE_NAME(arg) = vsf_pyal_newarg_bytes((__data), (__len));\
143 free(__data); \
144 VSF_MACRO_SAFE_NAME(arg); \
145 })
146#define vsf_pyal_newobj_bytes_ret_from_buffer(__buffer, __length) \
147 ({ \
148 vsf_pyal_buffer_setlen((__buffer), (__length)); \
149 mp_obj_new_bytes_from_vstr(&(__buffer)); \
150 })
151
152// bool
153
154#define vsf_pyal_newarg_bool(__bool) ({ (__bool) ? mp_const_true : mp_const_false; })
155#define vsf_pyal_arg_getbool(__boolarg) mp_obj_is_true(__boolarg)
156
157// object
158
159typedef mp_obj_t vsf_pyal_obj_t;
160#define VSF_PYAL_OBJ_NULL MP_OBJ_NULL
161#define vsf_pyal_obj_lookup(__obj, __name) \
162 ({ \
163 mp_map_elem_t *elem = NULL; \
164 size_t qstr = MP_QSTR_ ## __name; \
165 if (mp_obj_is_instance_type(mp_obj_get_type(__obj))) { \
166 mp_obj_instance_t *self = vsf_pyal_instobj_get(__obj); \
167 elem = mp_map_lookup(&self->members, MP_OBJ_NEW_QSTR(qstr), MP_MAP_LOOKUP);\
168 } \
169 elem != NULL ? elem->value : mp_load_attr(__obj, qstr); \
170 })
171
172// list
173
174#define vsf_pyal_newarg_list(__num, __args_ptr) mp_obj_new_list((__num), (__args_ptr))
175#define vsf_pyal_newobj_list(__num, __args_ptr) mp_obj_new_list((__num), (__args_ptr))
176#define vsf_pyal_listobj_contain(__listobj, __arg) \
177 ({ \
178 bool result = false; \
179 vsf_pyal_arg_iter((__listobj), if (_ == (__arg)) { result = true; break; })\
180 result; \
181 })
182#define vsf_pyal_listobj_append(__listobj, __arg) mp_obj_list_append((__listobj), (__arg))
183#define vsf_pyal_listobj_remove(__listobj, __arg) mp_obj_list_remove((__listobj), (__arg))
184#define vsf_pyal_listobj_contain_obj(__listobj, __obj) vsf_pyal_listobj_contain((__listobj), (__obj))
185#define vsf_pyal_listobj_append_obj(__listobj, __obj) mp_obj_list_append((__listobj), (__obj))
186#define vsf_pyal_listobj_remove_obj(__listobj, __obj) mp_obj_list_remove((__listobj), (__obj))
187
188extern size_t vsf_pyal_listobj_getnum(vsf_pyal_obj_t self_in);
190
191#define vsf_pyal_listarg_getnum vsf_pyal_listobj_getnum
192#define vsf_pyal_listarg_getarg vsf_pyal_listobj_getarg
193
194// instance
195
196#define vsf_pyal_inst_base_init(__mod, __class) \
197 .base = &mp_type_ ## __mod ## _ ## __class,
198#define vsf_pyal_inst_base_def() mp_obj_base_t base;
199#define vsf_pyal_instobj_get(__instobj) MP_OBJ_TO_PTR(__instobj)
200#define vsf_pyal_instarg_get(__instarg) MP_OBJ_TO_PTR(__instarg)
201#define vsf_pyal_inst_to_obj(__inst) MP_OBJ_FROM_PTR(__inst)
202#define vsf_pyal_inst_to_arg(__inst) MP_OBJ_FROM_PTR(__inst)
203
204// file
205
206typedef struct _mp_obj_file_t {
208 union {
209 FILE *f;
210 int fd;
211 };
213extern const mp_obj_type_t mp_type_fileio;
214extern const mp_obj_type_t mp_type_textio;
215#define vsf_pyal_newobj_file(__file, __is_text) \
216 ({ \
217 mp_obj_file_t *VSF_MACRO_SAFE_NAME(fileobj) = m_new_obj_with_finaliser(mp_obj_file_t);\
218 VSF_MACRO_SAFE_NAME(fileobj)->base.type = (__is_text) ? &mp_type_textio : & mp_type_fileio;\
219 VSF_MACRO_SAFE_NAME(fileobj)->f = (__file); \
220 vsf_pyal_inst_to_obj(VSF_MACRO_SAFE_NAME(fileobj)); \
221 })
222
223#define vsf_pyal_newarg_file(__file, __is_text) vsf_pyal_newobj_file((__file), (__is_text))
224#define vsf_pyal_filearg_getfile(__filearg) ((mp_obj_file_t *)(__filearg))->f
225#define vsf_pyal_filearg_clear(__filearg) ((mp_obj_file_t *)(__filearg))->f = NULL
226
227#define vsf_pyal_arg_is_file(__arg) ((mp_obj_get_type(__arg) == &mp_type_fileio) || (mp_obj_get_type(__arg) == &mp_type_textio))
228
229// tuple
230
231#define vsf_pyal_newobj_tuple(__num, __args) mp_obj_new_tuple((__num), (__args))
232#define vsf_pyal_tupleobj_getint(__tupleobj, __idx) vsf_pyal_arg_getint(vsf_pyal_tupleobj_getarg((__tupleobj), (__idx)))
233#define vsf_pyal_tupleobj_getstr(__tupleobj, __idx) vsf_pyal_arg_getstr(vsf_pyal_tupleobj_getarg((__tupleobj), (__idx)))
235extern int vsf_pyal_tupleobj_getnum(vsf_pyal_obj_t self_in);
236
237#define vsf_pyal_newarg_tuple(__num, __args) mp_obj_new_tuple((__num), (__args))
238#define vsf_pyal_tuplearg_getnum vsf_pyal_tupleobj_getnum
239#define vsf_pyal_tuplearg_getint(__tuplearg, __idx) vsf_pyal_arg_getint(vsf_pyal_tuplearg_getarg((__tuplearg), (__idx)))
240#define vsf_pyal_tuplearg_getstr(__tuplearg, __idx) vsf_pyal_arg_getstr(vsf_pyal_tuplearg_getarg((__tuplearg), (__idx)))
241#define vsf_pyal_tuplearg_getfloat(__tuplearg, __idx) vsf_pyal_arg_getfloat(vsf_pyal_tuplearg_getarg((__tuplearg), (__idx)))
242#define vsf_pyal_tuplearg_getarg vsf_pyal_tupleobj_getarg
243
244// dict
245
246#define vsf_pyal_dict_type mp_type_dict
247#define vsf_pyal_static_dict_t mp_obj_dict_t
248#define vsf_pyal_static_dict_init(__type) \
249 { \
250 .base = { \
251 .type = &(__type), \
252 }, \
253 .map = { \
254 .all_keys_are_qstrs = 1, \
255 }, \
256 }
257#define vsf_pyal_static_dict(__name) \
258 vsf_pyal_static_dict_t __name MICROPY_OBJ_BASE_ALIGNMENT = vsf_pyal_static_dict_init(vsf_pyal_dict_type)
259#define vsf_pyal_static_dict_type(__name, __type) \
260 vsf_pyal_static_dict_t __name MICROPY_OBJ_BASE_ALIGNMENT = vsf_pyal_static_dict_init(__type)
261
262typedef mp_obj_t vsf_pyal_dict_key_t;
263#define vsf_pyal_dictkey_getstr(__dictkey) vsf_pyal_arg_getstr(__dictkey)
264
265#define vsf_pyal_newobj_dict() mp_obj_new_dict(0)
266#define vsf_pyal_dictobj_strkey_set(__dictobj, __key_str, __value_arg) \
267 mp_obj_dict_store((__dictobj), vsf_pyal_newarg_str(__key_str), (__value_arg))
268#define vsf_pyal_dictobj_strkey_get(__dictobj, __key_str) mp_obj_dict_get((__dictobj), vsf_pyal_newarg_str(__key_str))
269#define vsf_pyal_dictobj_strkey_del(__dictobj, __key_str) mp_obj_dict_delete((__dictobj), vsf_pyal_newarg_str(__key_str))
270#define vsf_pyal_dictobj_objkey_set(__dictobj, __keyobj, __value_arg) mp_obj_dict_store((__dictobj), (__keyobj), (__value_arg))
271#define vsf_pyal_dictobj_objkey_get(__dictobj, __keyobj) mp_obj_dict_get((__dictobj), (__keyobj))
272#define vsf_pyal_dictobj_objkey_del(__dictobj, __keyobj) mp_obj_dict_delete((__dictobj), (__keyobj))
273
274#define vsf_pyal_newarg_dict() mp_obj_new_dict(0)
275#define vsf_pyal_dictarg_set(__dictarg, __key_str, __value_arg) \
276 mp_obj_dict_store((__dictarg), vsf_pyal_newarg_str(__key_str), (__value_arg))
277#define vsf_pyal_dictarg_get(__dictarg, __key_str) mp_obj_dict_get((__dictarg), vsf_pyal_newarg_str(__key_str))
278#define vsf_pyal_dictarg_del(__dictarg, __key_str) mp_obj_dict_delete((__dictarg), vsf_pyal_newarg_str(__key_str))
279
280// module
281
282#define vsf_pyal_funcarg_str_t vsf_pyal_arg_t
283#define vsf_pyal_funcarg_getstr(__arg) vsf_pyal_arg_getstr(__arg)
284#define vsf_pyal_newfuncarg_str(__str) vsf_pyal_newarg_str(__str)
285#define vsf_pyal_funcarg_int_t vsf_pyal_arg_t
286#define vsf_pyal_funcarg_getint(__arg) vsf_pyal_arg_getint(__arg)
287#define vsf_pyal_newfuncarg_int(__value) vsf_pyal_newarg_int(__value)
288#define vsf_pyal_funcarg_bool_t vsf_pyal_arg_t
289#define vsf_pyal_funcarg_getbool(__arg) vsf_pyal_arg_getbool(__arg)
290#define vsf_pyal_newfuncarg_bool(__bool) vsf_pyal_newarg_bool(__bool)
291#define vsf_pyal_funcarg_float_t vsf_pyal_arg_t
292#define vsf_pyal_funcarg_getfloat(__arg) vsf_pyal_arg_getfloat(__arg)
293#define vsf_pyal_newfuncarg_float(__value) vsf_pyal_newarg_float(__value)
294#define vsf_pyal_funcarg_bytes_t vsf_pyal_arg_t
295#define vsf_pyal_funcarg_callable_t vsf_pyal_arg_t
296#define vsf_pyal_funcarg_tuple_t vsf_pyal_arg_t
297#define vsf_pyal_funcarg_tuple_getint(__tuplearg, __idx) vsf_pyal_tuplearg_getint((__tuplearg), (__idx))
298#define vsf_pyal_funcarg_tuple_getstr(__tuplearg, __idx) vsf_pyal_tuplearg_getstr((__tuplearg), (__idx))
299#define vsf_pyal_funcarg_tuple_getarg(__tuplearg, __idx) vsf_pyal_tuplearg_getarg((__tuplearg), (__idx))
300#define vsf_pyal_funcarg_var(__name) size_t __name ## _num, const vsf_pyal_arg_t *__name ## _arr
301#define vsf_pyal_funcarg_var_for_call(__name) __name ## _num, __name ## _arr
302#define vsf_pyal_funcarg_var_num(__name) __name ## _num
303#define vsf_pyal_funcarg_var_is_str(__name, __idx) vsf_pyal_arg_is_str((__name ## _arr)[__idx])
304#define vsf_pyal_funcarg_var_getstr(__name, __idx) vsf_pyal_arg_getstr((__name ## _arr)[__idx])
305#define vsf_pyal_funcarg_var_is_int(__name, __idx) vsf_pyal_arg_is_int((__name ## _arr)[__idx])
306#define vsf_pyal_funcarg_var_getint(__name, __idx) vsf_pyal_arg_getint((__name ## _arr)[__idx])
307#define vsf_pyal_funcarg_var_getbool(__name, __idx) vsf_pyal_arg_getbool((__name ## _arr)[__idx])
308#define vsf_pyal_funcarg_var_is_tuple(__name, __idx)vsf_pyal_arg_is_tuple((__name ## _arr)[__idx])
309#define vsf_pyal_funcarg_var_is_iterable(__name, __idx) \
310 vsf_pyal_arg_is_iterable((__name ## _arr)[__idx])
311#define vsf_pyal_funcarg_var_getarg(__name, __idx) ((__name ## _arr)[__idx])
312#define vsf_pyal_funcarg_keyword(__name) size_t __name ## _num, const vsf_pyal_arg_t *__name ## _arr, mp_map_t *__name ## _map
313#define vsf_pyal_funcarg_void void
314#define vsf_pyal_class_func_var_arg_skip_self(__arg_name) \
315 vsf_pyal_obj_t selfobj = ((__arg_name ## _arr)[0]); \
316 VSF_UNUSED_PARAM(selfobj); \
317 __arg_name ## _arr++; \
318 __arg_name ## _num--
319#define vsf_pyal_class_func_var_arg_restore_self(__arg_name) \
320 __arg_name ## _arr--; \
321 __arg_name ## _num++
322
323#define vsf_pyal_func_void_return_t vsf_pyal_arg_t
324#define vsf_pyal_func_void_return() return mp_const_none
325
326#define vsf_pyal_module_func_var_imp(__mod, __func, __ret_type, __min_arg, __max_arg, __arg_name)\
327 __ret_type __mod ## _ ## __func(vsf_pyal_funcarg_var(__arg_name)); \
328 MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_ ## __mod ## _ ## __func ## _obj, __min_arg, __max_arg, __mod ## _ ## __func);\
329 __ret_type __mod ## _ ## __func(vsf_pyal_funcarg_var(__arg_name))
330
331#define vsf_pyal_keyword_is_int
332#define vsf_pyal_keyword(__key_name) ARG_ ## __key_name
333// called in __vsf_pyal_parse_tuple_keyword only
334#define __vsf_pyal_keyword_getint(__arg_name, __key, __idx) __arg_name ## _val[__key].u_int
335#define __vsf_pyal_keyword_getbool(__arg_name, __key, __idx) __arg_name ## _val[__key].u_bool
336#define __vsf_pyal_keyword_getarg(__arg_name, __key, __idx) __arg_name ## _val[__key].u_obj
337#define __vsf_pyal_keyword_parser_arg(__arg_name) mp_arg_val_t *__arg_name ## _val
339#define vsf_pyal_parse_tuple_keyword(__arg_name, ...) __vsf_pyal_parse_tuple_keyword(__arg_name ## _val, ##__VA_ARGS__)
340
341#define __vsf_pyal_keyword_enum(__arg_name, __key_name) \
342 ARG_ ## __key_name,
343#define VSF_PYAL_KEYWORD_ONLY MP_ARG_KW_ONLY
344#define VSF_PYAL_KEYWORD_REQUIRED MP_ARG_REQUIRED
345#define vsf_pyal_keyword_prepare_int(__key_name, __key_feature, __default) \
346 [ARG_ ## __key_name] = { MP_QSTR_ ## __key_name, (__key_feature) | MP_ARG_INT, {.u_int = (__default)} }
347#define vsf_pyal_keyword_prepare_bool(__key_name, __key_feature, __default) \
348 [ARG_ ## __key_name] = { MP_QSTR_ ## __key_name, (__key_feature) | MP_ARG_BOOL, {.u_bool = (__default)} }
349#define vsf_pyal_keyword_prepare_arg(__key_name, __key_feature, __default) \
350 [ARG_ ## __key_name] = { MP_QSTR_ ## __key_name, (__key_feature) | MP_ARG_OBJ, {.u_rom_obj = (__default)} }
351#define vsf_pyal_keyword_prepare(__arg_name, ...) \
352 STATIC const mp_arg_t __arg_name ## _args[] = { __VA_ARGS__ }; \
353 mp_arg_parse_all(__arg_name ## _num, __arg_name ## _arr, __arg_name ## _map,\
354 MP_ARRAY_SIZE(__arg_name ## _args), __arg_name ## _args, __arg_name ## _val)
355#define vsf_pyal_keyword_getint_forced(__arg_name, __key_name, __key_idx) \
356 __arg_name ## _val[ARG_ ## __key_name].u_int
357#define vsf_pyal_keyword_getbool_forced(__arg_name, __key_name, __key_idx) \
358 __arg_name ## _val[ARG_ ## __key_name].u_bool
359#define vsf_pyal_keyword_getarg_forced(__arg_name, __key_name, __key_idx) \
360 __arg_name ## _val[ARG_ ## __key_name].u_obj
361#define vsf_pyal_keyword_getint(__arg_name, __key_name, __key_idx, __default) \
362 __arg_name ## _val[ARG_ ## __key_name].u_int
363#define vsf_pyal_keyword_getbool(__arg_name, __key_name, __key_idx, __default) \
364 __arg_name ## _val[ARG_ ## __key_name].u_bool
365#define vsf_pyal_keyword_getarg(__arg_name, __key_name, __key_idx, __default) \
366 __arg_name ## _val[ARG_ ## __key_name].u_obj
367
368#define vsf_pyal_module_func_keyword_imp(__mod, __func, __ret_type, __min_arg, __max_arg, __arg_name, ...)\
369 __ret_type __mod ## _ ## __func(vsf_pyal_funcarg_keyword(__arg_name)); \
370 MP_DEFINE_CONST_FUN_OBJ_KW(mp_ ## __mod ## _ ## __func ## _obj, 0, __mod ## _ ## __func);\
371 __ret_type __mod ## _ ## __func(vsf_pyal_funcarg_keyword(__arg_name)) { \
372 enum { VSF_MFOREACH_ARG1(__vsf_pyal_keyword_enum, __arg_name, __VA_ARGS__) };\
373 mp_arg_val_t __arg_name ## _val[VSF_VA_NUM_ARGS(__VA_ARGS__)];
374#define vsf_pyal_module_func_keyword_imp_end() }
375
376#define VSF_PYAL_MODULE_FUNCARG_OBJ_0 MP_DEFINE_CONST_FUN_OBJ_0
377#define VSF_PYAL_MODULE_FUNCARG_OBJ_1 MP_DEFINE_CONST_FUN_OBJ_1
378#define VSF_PYAL_MODULE_FUNCARG_OBJ_2 MP_DEFINE_CONST_FUN_OBJ_2
379#define VSF_PYAL_MODULE_FUNCARG_OBJ_3 MP_DEFINE_CONST_FUN_OBJ_3
380#define vsf_pyal_module_func_fix_imp(__mod, __func, __func_type, __ret_type, ...)\
381 __ret_type __mod ## _ ## __func(__VA_ARGS__); \
382 __func_type(mp_ ## __mod ## _ ## __func ## _obj, __mod ## _ ## __func); \
383 __ret_type __mod ## _ ## __func(__VA_ARGS__)
384
385#define vsf_pyal_module_func_init_prototype(__mod) \
386 extern vsf_pyal_obj_t __mod ## _ ## __init__(void)
387#define vsf_pyal_module_func_init_declare(__mod) \
388 extern mp_rom_obj_t mp_ ## __mod ## _ ## __init__ ## _obj; \
389 extern vsf_pyal_obj_t __mod ## _ ## __init__(void)
390#define vsf_pyal_module_func_init_imp(__mod) \
391 vsf_pyal_module_func_fix_imp(__mod, __init__, VSF_PYAL_MODULE_FUNCARG_OBJ_0, vsf_pyal_obj_t, void)
392#define vsf_pyal_module_func_init_return() vsf_pyal_func_void_return()
393
394#define vsf_pyal_module_func_type(__mod, __func, __ret_type, ...) \
395 typedef __ret_type (*__mod ## _ ## __func ## _t)(__VA_ARGS__)
396#define vsf_pyal_module_func_prototype(__mod, __func, __ret_type, ...) \
397 extern __ret_type __mod ## _ ## __func(__VA_ARGS__)
398#define vsf_pyal_module_func_name(__mod, __func) \
399 __mod ## _ ## __func
400#define vsf_pyal_module_func_call(__func_full_name, ...) \
401 __func_full_name(__VA_ARGS__)
402#define vsf_pyal_module_func_declare(__mod, __func, __ret_type, ...) \
403 extern mp_rom_obj_t mp_ ## __mod ## _ ## __func ## _obj; \
404 extern __ret_type __mod ## _ ## __func(__VA_ARGS__)
405
406#define vsf_pyal_module_func_type_noarg(__mod, __func, __ret_type) \
407 typedef __ret_type (*__mod ## _ ## __func ## _t)(void)
408#define vsf_pyal_module_func_prototype_noarg(__mod, __func, __ret_type) \
409 extern __ret_type __mod ## _ ## __func(void)
410#define vsf_pyal_module_func_declare_noarg(__mod, __func, __ret_type) \
411 extern mp_rom_obj_t mp_ ## __mod ## _ ## __func ## _obj; \
412 extern __ret_type __mod ## _ ## __func(void)
413
414#define vsf_pyal_module_selfobj(__mod) &mp_module_ ## __mod
415#define vsf_pyal_module_declare(__mod) extern const mp_obj_module_t mp_module_ ## __mod
416
417#define vsf_pyal_module_int(__mod, __name, __value) { MP_ROM_QSTR(MP_QSTR_ ## __name), MP_ROM_INT(__value) }
418#define vsf_pyal_module_str(__mod, __name, __str) { MP_ROM_QSTR(MP_QSTR_ ## __name), MP_ROM_QSTR(MP_QSTR_ ## __str) }
419#define vsf_pyal_module_func(__mod, __name) { MP_ROM_QSTR(MP_QSTR_ ## __name), MP_ROM_PTR(&mp_ ## __mod ## _ ## __name ## _obj) }
420#define vsf_pyal_module_inst(__mod, __name, __inst) { MP_ROM_QSTR(MP_QSTR_ ## __name), MP_ROM_PTR(&__inst) }
421#define vsf_pyal_module_dict(__mod, __name, __dict) { MP_ROM_QSTR(MP_QSTR_ ## __name), MP_ROM_PTR(&__dict) }
422#define vsf_pyal_module_class(__mod, __name) { MP_ROM_QSTR(MP_QSTR_ ## __name), MP_ROM_PTR(&mp_type_ ## __mod ## _ ## __name) }
423#define vsf_pyal_module_submod(__mod, __name) { MP_ROM_QSTR(MP_QSTR_ ## __name), MP_ROM_PTR(&(mp_module_ ## __mod ## _ ## __name)) }
424#define vsf_pyal_module(__name, ...) \
425 STATIC const mp_rom_map_elem_t __name ## _module_globals_table[] = { \
426 { MP_ROM_QSTR(MP_QSTR_ ## __name__), MP_ROM_QSTR(MP_QSTR_ ## __name) }, \
427 __VA_ARGS__ \
428 }; \
429 STATIC MP_DEFINE_CONST_DICT(__name ## _module_globals, __name ## _module_globals_table);\
430 const mp_obj_module_t mp_module_ ## __name = { \
431 .base = { &mp_type_module }, \
432 .globals = (mp_obj_dict_t *)&(__name ## _module_globals), \
433 };
434#define vsf_pyal_submodule(__mod, __name, ...) \
435 STATIC const mp_rom_map_elem_t __mod ## _ ## __name ## _module_globals_table[] = {\
436 { MP_ROM_QSTR(MP_QSTR_ ## __name__), MP_ROM_QSTR(MP_QSTR_ ## __name) }, \
437 __VA_ARGS__ \
438 }; \
439 STATIC MP_DEFINE_CONST_DICT(__mod ## _ ## __name ## _module_globals, __mod ## _ ## __name ## _module_globals_table);\
440 const mp_obj_module_t mp_module_ ## __mod ## _ ## __name = { \
441 .base = { &mp_type_module }, \
442 .globals = (mp_obj_dict_t *)&(__mod ## _ ## __name ## _module_globals), \
443 };
444
445// class
446
447#define vsf_pyal_builtinclass_declare(__class) \
448 extern const mp_obj_type_t mp_type_ ## __class;
449
450#define vsf_pyal_class_getself_from_obj(__mod, __class, __name, __instobj) \
451 __mod ## _ ## __class ## _t *__name = vsf_pyal_instobj_get(__instobj)
452#define vsf_pyal_class_getself_from_arg(__mod, __class, __name, __instarg) \
453 __mod ## _ ## __class ## _t *__name = vsf_pyal_instobj_get(__instarg)
454#define vsf_pyal_class_arg_getself(__mod, __class, __name) \
455 __mod ## _ ## __class ## _t *__name = vsf_pyal_instobj_get(selfobj)
456
457// vsf_pyal_class_new will create class as normal python class
458#define vsf_pyal_class_new(__mod, __class, __args_num, __args) \
459 __mod ## _ ## __class ## _make_new(NULL, (__args_num), 0, (__args))
460
461// vsf_pyal_class_newc will create class in C, user can set a exsize and get a C pointer
462#define vsf_pyal_class_newc(__mod, __class, __exsize, __obj_ptr) \
463 ({ \
464 __mod ## _ ## __class ## _t *VSF_MACRO_SAFE_NAME(inst) = (__mod ## _ ## __class ## _t *)m_malloc_with_finaliser(sizeof(__mod ## _ ## __class ## _t) + (__exsize));\
465 VSF_MACRO_SAFE_NAME(inst)->base.type = &mp_type_ ## __mod ## _ ## __class;\
466 *(__obj_ptr) = vsf_pyal_inst_to_obj(VSF_MACRO_SAFE_NAME(inst)); \
467 VSF_MACRO_SAFE_NAME(inst); \
468 })
469
470#define vsf_pyal_class_new_keyword_func(__mod, __class, __arg_name, ...) \
471 vsf_pyal_obj_t __mod ## _ ## __class ## _make_new(const mp_obj_type_t *type, size_t __arg_name ## _arg_num, size_t __arg_name ## _kw_num, const vsf_pyal_arg_t *__arg_name ## _arr) {\
472 enum { VSF_MFOREACH_ARG1(__vsf_pyal_keyword_enum, __arg_name, __VA_ARGS__) };\
473 mp_arg_val_t __arg_name ## _val[VSF_VA_NUM_ARGS(__VA_ARGS__)]; \
474 __mod ## _ ## __class ## _t *self = NULL; \
475 VSF_UNUSED_PARAM(__arg_name ## _val); \
476 VSF_UNUSED_PARAM(self);
477#define vsf_pyal_class_new_func_keyword_prepare(__arg_name, ...) \
478 STATIC const mp_arg_t __arg_name ## _args[] = { __VA_ARGS__ }; \
479 mp_arg_parse_all_kw_array(__arg_name ## _arg_num, __arg_name ## _kw_num, __arg_name ## _arr,\
480 MP_ARRAY_SIZE(__arg_name ## _args), __arg_name ## _args, __arg_name ## _val)
481
482#define vsf_pyal_class_new_func(__mod, __class, __arg_name) \
483 vsf_pyal_obj_t __mod ## _ ## __class ## _make_new(const mp_obj_type_t *type, size_t __arg_name ## _arg_num, size_t n_kw, const vsf_pyal_arg_t *__arg_name ## _args) {\
484 __mod ## _ ## __class ## _t *self = NULL; \
485 VSF_UNUSED_PARAM(self);
486
487#define vsf_pyal_class_new_create(__mod, __class, __exsize) \
488 ({ \
489 __mod ## _ ## __class ## _t *VSF_MACRO_SAFE_NAME(inst) = (__mod ## _ ## __class ## _t *)m_malloc_with_finaliser(sizeof(__mod ## _ ## __class ## _t) + (__exsize));\
490 VSF_MACRO_SAFE_NAME(inst)->base.type = &mp_type_ ## __mod ## _ ## __class;\
491 VSF_MACRO_SAFE_NAME(inst); \
492 })
493#define vsf_pyal_class_new_del(__mod, __class, __exsize, __ptr) \
494 m_free((__ptr), sizeof(__mod ## _ ## __class ## _t) + (__exsize))
495#define vsf_pyal_class_new_fail(__mod, __class, __fmt, ...) \
496 vsf_pyal_raise((__fmt), ##__VA_ARGS__); \
497 return VSF_PYAL_OBJ_NULL;
498#define vsf_pyal_class_new_arg_num(__name) __name ## _arg_num
499#define vsf_pyal_class_new_is_int(__name, __idx) vsf_pyal_arg_is_int((__name ## _args)[__idx])
500#define vsf_pyal_class_new_getint(__name, __idx) vsf_pyal_arg_getint((__name ## _args)[__idx])
501#define vsf_pyal_class_new_getstr(__name, __idx) vsf_pyal_arg_getstr((__name ## _args)[__idx])
502#define vsf_pyal_class_new_getarg(__name, __idx) ((__name ## _args)[__idx])
503#define vsf_pyal_class_new_func_end() \
504 return vsf_pyal_inst_to_obj(self); \
505 }
506
507#define vsf_pyal_class_del_func_declare(__mod, __class) \
508 extern vsf_pyal_obj_t __mod ## _ ## __class ## ___del__(vsf_pyal_obj_t selfobj)
509#define vsf_pyal_class_del_func_call(__mod, __class, __selfobj) \
510 __mod ## _ ## __class ## ___del__(selfobj)
511#define vsf_pyal_class_del_func(__mod, __class) \
512 vsf_pyal_obj_t __mod ## _ ## __class ## ___del__(vsf_pyal_obj_t selfobj); \
513 VSF_PYAL_MODULE_FUNCARG_OBJ_1(mp_ ## __mod ## _ ## __class ## ___del___obj, __mod ## _ ## __class ## ___del__);\
514 vsf_pyal_obj_t __mod ## _ ## __class ## ___del__(vsf_pyal_obj_t selfobj) { \
515 __mod ## _ ## __class ## _t *self = (__mod ## _ ## __class ## _t *)vsf_pyal_instobj_get(selfobj);\
516 VSF_UNUSED_PARAM(self);
517#define vsf_pyal_class_del_func_end() \
518 vsf_pyal_func_void_return(); \
519 }
520
521#define vsf_pyal_class_print_func(__mod, __class) \
522 void __mod ## _ ## __class ## _print(const mp_print_t *print, vsf_pyal_obj_t selfobj, mp_print_kind_t kind)
523#define vsf_pyal_class_print_func_fmt(__mod, __class, __fmt, ...) \
524 void __mod ## _ ## __class ## _print(const mp_print_t *VSF_MACRO_SAFE_NAME(print), vsf_pyal_obj_t selfobj, mp_print_kind_t VSF_MACRO_SAFE_NAME(kind)) {\
525 VSF_UNUSED_PARAM(VSF_MACRO_SAFE_NAME(kind)); \
526 vsf_pyal_class_arg_getself(__mod, __class, self); \
527 mp_printf(VSF_MACRO_SAFE_NAME(print), (__fmt), ##__VA_ARGS__); \
528 }
529#define vsf_pyal_class_print_declare(__mod, __class) \
530 void __mod ## _ ## __class ## _print(const mp_print_t *VSF_MACRO_SAFE_NAME(print), vsf_pyal_obj_t selfobj, mp_print_kind_t VSF_MACRO_SAFE_NAME(kind))
531// vsf_pyal_class_print_call can only be used in vsf_pyal_class_print_func
532#define vsf_pyal_class_print_call(__mod, __class) \
533 __mod ## _ ## __class ## _print(print, selfobj, kind)
534
535#define vsf_pyal_class_iterator_func(__mod, __class) \
536 vsf_pyal_obj_t __mod ## _ ## __class ## _iter(vsf_pyal_obj_t selfobj, mp_obj_iter_buf_t *iter_buf)
537
538#define vsf_pyal_class_unary_func(__mod, __class) \
539 vsf_pyal_obj_t __mod ## _ ## __class ## _unary_op(mp_unary_op_t op, vsf_pyal_obj_t selfobj)
540#define vsf_pyal_class_binary_func(__mod, __class) \
541 vsf_pyal_obj_t __mod ## _ ## __class ## _binary_op(mp_binary_op_t op, vsf_pyal_obj_t selfobj, vsf_pyal_obj_t valueobj)
542
543#define vsf_pyal_class_attr_func(__mod, __class, __arg_name) \
544 void __mod ## _ ## __class ## _attr(vsf_pyal_obj_t selfobj, qstr __arg_name ## _attr, vsf_pyal_arg_t *__arg_name ## _args)
545#define vsf_pyal_class_attr_get_attr(__arg_name) (__arg_name ## _attr)
546#define vsf_pyal_class_attr_const_attr(__attr) (MP_QSTR_ ## __attr)
547#define vsf_pyal_class_attr_is_load(__arg_name) (MP_OBJ_NULL == __arg_name ## _args[0])
548#define vsf_pyal_class_attr_is_store(__arg_name) ((MP_OBJ_SENTINEL == __arg_name ## _args[0]) && (__arg_name ## _args[1] != MP_OBJ_NULL))
549#define vsf_pyal_class_attr_is_delete(__arg_name) ((MP_OBJ_SENTINEL == __arg_name ## _args[0]) && (__arg_name ## _args[1] == MP_OBJ_NULL))
550#define vsf_pyal_class_attr_get_valuearg(__arg_name)(__arg_name ## _args[1])
551#define vsf_pyal_class_attr_ret_load_fail(__arg_name) \
552 __arg_name ## _args[1] = MP_OBJ_SENTINEL; return
553#define vsf_pyal_class_attr_ret_load_obj(__arg_name, __arg) \
554 __arg_name ## _args[0] = (__arg); return
555#define vsf_pyal_class_attr_ret_load_method(__arg_name, __method) \
556 __arg_name ## _args[0] = (__method); __arg_name ## _args[1] = (selfobj); return
557#define vsf_pyal_class_attr_ret_fail(__arg_name) \
558 return
559#define vsf_pyal_class_attr_ret_success(__arg_name) \
560 __arg_name ## _args[0] = MP_OBJ_NULL; return
561
562#define vsf_pyal_class_subscript_is_load(__arg_name) (MP_OBJ_SENTINEL == vsf_pyal_class_subscript_valuearg(__arg_name))
563#define vsf_pyal_class_subscript_is_store(__arg_name) ((vsf_pyal_class_subscript_valuearg(__arg_name) != MP_OBJ_SENTINEL) && (vsf_pyal_class_subscript_valuearg(__arg_name) != MP_OBJ_NULL))
564#define vsf_pyal_class_subscript_is_delete(__arg_name) (MP_OBJ_NULL == vsf_pyal_class_subscript_valuearg(__arg_name))
565#define vsf_pyal_class_subscript_idxarg(__arg_name) __arg_name ## _idxarg
566#define vsf_pyal_class_subscript_valuearg(__arg_name) __arg_name ## _valuearg
567#define vsf_pyal_class_subscript_func(__mod, __class, __arg_name) \
568 vsf_pyal_obj_t __mod ## _ ## __class ## _subscr(vsf_pyal_obj_t selfobj, \
569 vsf_pyal_arg_t vsf_pyal_class_subscript_idxarg(__arg_name), \
570 vsf_pyal_arg_t vsf_pyal_class_subscript_valuearg(__arg_name))
571
572#define vsf_pyal_class_func_var_private_imp(__mod, __func, __ret_type, __min_arg, __max_arg, __arg_name)\
573 __ret_type __mod ## _ ## __func(vsf_pyal_funcarg_var(__arg_name))
574#define vsf_pyal_class_func_var_imp(__mod, __func, __ret_type, __min_arg, __max_arg, __arg_name)\
575 __ret_type __mod ## _ ## __func(vsf_pyal_funcarg_var(__arg_name)); \
576 MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_ ## __mod ## _ ## __func ## _obj, __min_arg, __max_arg, __mod ## _ ## __func);\
577 __ret_type __mod ## _ ## __func(vsf_pyal_funcarg_var(__arg_name))
578#define vsf_pyal_class_func_fix_imp(__mod, __func, __func_type, __ret_type, ...)\
579 __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj, ##__VA_ARGS__); \
580 __func_type(mp_ ## __mod ## _ ## __func ## _obj, __mod ## _ ## __func); \
581 __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj, ##__VA_ARGS__)
582#define vsf_pyal_class_func_keyword_imp_noarg(__mod, __func, __ret_type, __min_arg, __max_arg, __arg_name)\
583 __ret_type __mod ## _ ## __func(vsf_pyal_funcarg_keyword(__arg_name)); \
584 MP_DEFINE_CONST_FUN_OBJ_KW(mp_ ## __mod ## _ ## __func ## _obj, 0, __mod ## _ ## __func);\
585 __ret_type __mod ## _ ## __func(vsf_pyal_funcarg_keyword(__arg_name))
586#define vsf_pyal_class_func_keyword_imp(__mod, __func, __ret_type, __min_arg, __max_arg, __arg_name, ...)\
587 __ret_type __mod ## _ ## __func(vsf_pyal_funcarg_keyword(__arg_name)); \
588 MP_DEFINE_CONST_FUN_OBJ_KW(mp_ ## __mod ## _ ## __func ## _obj, 0, __mod ## _ ## __func);\
589 __ret_type __mod ## _ ## __func(vsf_pyal_funcarg_keyword(__arg_name)) { \
590 enum { VSF_MFOREACH_ARG1(__vsf_pyal_keyword_enum, __arg_name, __VA_ARGS__) };\
591 mp_arg_val_t __arg_name ## _val[VSF_VA_NUM_ARGS(__VA_ARGS__)]; \
592 VSF_UNUSED_PARAM(__arg_name ## _val);
593#define vsf_pyal_class_func_keyword_imp_end() }
594
595#define vsf_pyal_class_func_call_var(__mod, __func, __instobj, arg) \
596 __mod ## _ ## __func(vsf_pyal_funcarg_var_for_call(arg))
597#define vsf_pyal_class_func_call_fix(__mod, __func, __instobj, ...) \
598 __mod ## _ ## __func(__instobj, ##__VA_ARGS__)
599
600#define vsf_pyal_class_int(__class, __name, __value){ MP_ROM_QSTR(MP_QSTR_ ## __name), MP_ROM_INT(__value) }
601#define vsf_pyal_class_str(__class, __name, __str) { MP_ROM_QSTR(MP_QSTR_ ## __name), MP_ROM_QSTR(MP_QSTR_ ## __str) }
602#define vsf_pyal_class_func(__class, __name) { MP_ROM_QSTR(MP_QSTR_ ## __name), MP_ROM_PTR(&mp_ ## __class ## _ ## __name ## _obj) }
603
604#define __vsf_pyal_class_feature(__mod, __class, __feature) \
605 __feature, &__mod ## _ ## __class ## _ ## __feature
606#define vsf_pyal_class_feature_new(__mod, __class) \
607 __vsf_pyal_class_feature(__mod, __class, make_new)
608#define vsf_pyal_class_feature_attr(__mod, __class) \
609 __vsf_pyal_class_feature(__mod, __class, attr)
610#define vsf_pyal_class_feature_entry(__mod, __class) \
611 __vsf_pyal_class_feature(__mod, __class, locals_dict)
612#define vsf_pyal_class_feature_subscript(__mod, __class) \
613 __vsf_pyal_class_feature(__mod, __class, subscr)
614#define vsf_pyal_class_feature_print(__mod, __class) \
615 __vsf_pyal_class_feature(__mod, __class, print)
616#define vsf_pyal_class_feature_unary(__mod, __class) \
617 __vsf_pyal_class_feature(__mod, __class, unary_op)
618#define vsf_pyal_class_feature_binary(__mod, __class) \
619 __vsf_pyal_class_feature(__mod, __class, binary_op)
620#define vsf_pyal_class_feature_iterator(__mod, __class) \
621 __vsf_pyal_class_feature(__mod, __class, iter)
622#define vsf_pyal_class_feature_parent(__mod, __class, __parent_mod, __parent_class)\
623 parent, &mp_type_ ## __parent_mod ## _ ## __parent_class
624
625#define vsf_pyal_class_inherit_func_call(__mod, __class, __builtinclass) \
626 __mod ## _ ## __class ## _inherit_from_ ## __builtinclass()
627
628#define __vsf_pyal_class_call_builtin_feature(__builtinclass, __feature) \
629 mp_type_ ## __builtinclass.slots[mp_type_ ## __builtinclass.slot_index_ ## __feature - 1]
630#define vsf_pyal_class_call_builtin_feathre_new(__builtinclass, __arg_name) \
631 ((mp_make_new_fun_t)__vsf_pyal_class_call_builtin_feature(__builtinclass, make_new))(type, __arg_name ## _arg_num, n_kw, __arg_name ## _args)
632#define vsf_pyal_class_call_builtin_feature_attr(__builtinclass, __arg_name) \
633 ((mp_attr_fun_t)__vsf_pyal_class_call_builtin_feature(__builtinclass, attr))(selfobj, __target_attr, __arg_name ## _args)
634#define vsf_pyal_class_call_builtin_feature_subscript(__builtinclass, __arg_name)\
635 ((mp_subscr_fun_t)__vsf_pyal_class_call_builtin_feature(__builtinclass, subscr))(selfobj, __arg_name ## _idxarg, __arg_name ## _valuearg)
636#define vsf_pyal_class_call_builtin_feature_unary(__builtinclass, __arg_name) \
637 ((mp_unary_op_fun_t)__vsf_pyal_class_call_builtin_feature(__builtinclass, unary_op))(op, selfobj)
638#define vsf_pyal_class_call_builtin_feature_binary(__builtinclass, __arg_name) \
639 ((mp_binary_op_fun_t)__vsf_pyal_class_call_builtin_feature(__builtinclass, binary_op))(op, selfobj, valueobj)
640
641#define vsf_pyal_class_inherit_builtin_feature(__mod, __class, __builtinclass, __feature)\
642 vsf_pyal_class_inherit_builtin_feature_ ## __feature(__mod, __class, __builtinclass);
643#define vsf_pyal_class_inherit_func(__mod, __class, __builtinclass, ...) \
644 void __mod ## _ ## __class ## _inherit_from_ ## __builtinclass(void) { \
645 vsf_pyal_class_inherit_builtin(__mod, __class, __builtinclass); \
646 VSF_MFOREACH_ARG3(vsf_pyal_class_inherit_builtin_feature, __mod, __class, __builtinclass, __VA_ARGS__)\
647 }
648#define vsf_pyal_class_inherit_builtin(__mod, __class, __builtinclass) \
649 vsf_pyal_class_type(__mod, __class).flags = mp_type_ ## __builtinclass.flags
650#define __vsf_pyal_class_inherit_builtin_feature(__mod, __class, __builtinclass, __feature)\
651 vsf_pyal_class_type(__mod, __class).slots[vsf_pyal_class_type(__mod, __class).slot_index_ ## __feature - 1] =\
652 mp_type_ ## __builtinclass.slots[mp_type_ ## __builtinclass.slot_index_ ## __feature - 1]
653#define vsf_pyal_class_inherit_builtin_feathre_new(__mod, __class, __builtinclass)\
654 __vsf_pyal_class_inherit_builtin_feature(__mod, __class, __builtinclass, make_new)
655#define vsf_pyal_class_inherit_builtin_feature_attr(__mod, __class, __builtinclass)\
656 __vsf_pyal_class_inherit_builtin_feature(__mod, __class, __builtinclass, attr)
657#define vsf_pyal_class_inherit_builtin_feature_entry(__mod, __class, __builtinclass)\
658 __vsf_pyal_class_inherit_builtin_feature(__mod, __class, __builtinclass, locals_dict)
659#define vsf_pyal_class_inherit_builtin_feature_subscript(__mod, __class, __builtinclass)\
660 __vsf_pyal_class_inherit_builtin_feature(__mod, __class, __builtinclass, subscr)
661#define vsf_pyal_class_inherit_builtin_feature_print(__mod, __class, __builtinclass)\
662 __vsf_pyal_class_inherit_builtin_feature(__mod, __class, __builtinclass, print)
663#define vsf_pyal_class_inherit_builtin_feature_unary(__mod, __class, __builtinclass)\
664 __vsf_pyal_class_inherit_builtin_feature(__mod, __class, __builtinclass, unary_op)
665#define vsf_pyal_class_inherit_builtin_feature_binary(__mod, __class, __builtinclass)\
666 __vsf_pyal_class_inherit_builtin_feature(__mod, __class, __builtinclass, binary_op)
667#define vsf_pyal_class_inherit_builtin_feature_iterator(__mod, __class, __builtinclass)\
668 __vsf_pyal_class_inherit_builtin_feature(__mod, __class, __builtinclass, iter)
669#define vsf_pyal_class_begin_for_inherit(__mod, __class, __builtinclass)
670#define vsf_pyal_class_declare_for_inherit(__mod, __class, __builtinclass) \
671 extern mp_obj_type_t mp_type_ ## __mod ## _ ## __class; \
672 extern vsf_pyal_obj_t __mod ## _ ## __class ## _make_new(const mp_obj_type_t *type, size_t arg_num, size_t n_kw, const vsf_pyal_arg_t *args);\
673 extern void __mod ## _ ## __class ## _inherit_from_ ## __builtinclass(void)
674#define vsf_pyal_class_end_for_inherit(__mod, __class, __builtinclass, ...) \
675 MP_DEFINE_OBJ_TYPE( \
676 mp_type_ ## __mod ## _ ## __class, MP_QSTR_ ## __class, MP_TYPE_FLAG_NONE,\
677 __VA_ARGS__ \
678 );
679
680#define vsf_pyal_class_begin(__mod, __class)
681#define vsf_pyal_class_entry(__mod, __class, ...) \
682 STATIC const mp_rom_map_elem_t __ ## __class ## _locals_dict_table[] = { \
683 __VA_ARGS__ \
684 }; \
685 STATIC MP_DEFINE_CONST_DICT(__mod ## _ ## __class ## _locals_dict, __ ## __class ## _locals_dict_table);
686#define vsf_pyal_class_end(__mod, __class, ...) \
687 MP_DEFINE_CONST_OBJ_TYPE( \
688 mp_type_ ## __mod ## _ ## __class, MP_QSTR_ ## __class, MP_TYPE_FLAG_NONE,\
689 __VA_ARGS__ \
690 );
691
692#define vsf_pyal_class_declare(__mod, __class) \
693 typedef struct __mod ## _ ## __class ## _t __mod ## _ ## __class ## _t; \
694 extern const mp_obj_type_t mp_type_ ## __mod ## _ ## __class; \
695 extern vsf_pyal_obj_t __mod ## _ ## __class ## _make_new(const mp_obj_type_t *type, size_t arg_num, size_t n_kw, const vsf_pyal_arg_t *args)
696#define vsf_pyal_class_type(__mod, __class) \
697 mp_type_ ## __mod ## _ ## __class
698
699// APIs
700
701#define vsf_pyal_raise(__fmt, ...) mp_raise_msg_varg(&mp_type_TypeError, MP_ERROR_TEXT(__fmt), ##__VA_ARGS__)
702
703#define mp_obj_is_iterable(o) MP_OBJ_TYPE_HAS_SLOT(mp_obj_get_type(o), iter)
704
705// enhancement to original implementation
706
707// for non-const object type, can be used to inherit from builtin class
708#define MP_DEFINE_OBJ_TYPE_EXPAND(x) x
709
710#define MP_DEFINE_OBJ_TYPE_NARGS_0(_struct_type, _typename, _name, _flags) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags }
711#define MP_DEFINE_OBJ_TYPE_NARGS_1(_struct_type, _typename, _name, _flags, f1, v1) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slots = { v1, } }
712#define MP_DEFINE_OBJ_TYPE_NARGS_2(_struct_type, _typename, _name, _flags, f1, v1, f2, v2) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slot_index_##f2 = 2, .slots = { v1, v2, } }
713#define MP_DEFINE_OBJ_TYPE_NARGS_3(_struct_type, _typename, _name, _flags, f1, v1, f2, v2, f3, v3) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slot_index_##f2 = 2, .slot_index_##f3 = 3, .slots = { v1, v2, v3, } }
714#define MP_DEFINE_OBJ_TYPE_NARGS_4(_struct_type, _typename, _name, _flags, f1, v1, f2, v2, f3, v3, f4, v4) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slot_index_##f2 = 2, .slot_index_##f3 = 3, .slot_index_##f4 = 4, .slots = { v1, v2, v3, v4, } }
715#define MP_DEFINE_OBJ_TYPE_NARGS_5(_struct_type, _typename, _name, _flags, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slot_index_##f2 = 2, .slot_index_##f3 = 3, .slot_index_##f4 = 4, .slot_index_##f5 = 5, .slots = { v1, v2, v3, v4, v5, } }
716#define MP_DEFINE_OBJ_TYPE_NARGS_6(_struct_type, _typename, _name, _flags, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slot_index_##f2 = 2, .slot_index_##f3 = 3, .slot_index_##f4 = 4, .slot_index_##f5 = 5, .slot_index_##f6 = 6, .slots = { v1, v2, v3, v4, v5, v6, } }
717#define MP_DEFINE_OBJ_TYPE_NARGS_7(_struct_type, _typename, _name, _flags, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slot_index_##f2 = 2, .slot_index_##f3 = 3, .slot_index_##f4 = 4, .slot_index_##f5 = 5, .slot_index_##f6 = 6, .slot_index_##f7 = 7, .slots = { v1, v2, v3, v4, v5, v6, v7, } }
718#define MP_DEFINE_OBJ_TYPE_NARGS_8(_struct_type, _typename, _name, _flags, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slot_index_##f2 = 2, .slot_index_##f3 = 3, .slot_index_##f4 = 4, .slot_index_##f5 = 5, .slot_index_##f6 = 6, .slot_index_##f7 = 7, .slot_index_##f8 = 8, .slots = { v1, v2, v3, v4, v5, v6, v7, v8, } }
719#define MP_DEFINE_OBJ_TYPE_NARGS_9(_struct_type, _typename, _name, _flags, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slot_index_##f2 = 2, .slot_index_##f3 = 3, .slot_index_##f4 = 4, .slot_index_##f5 = 5, .slot_index_##f6 = 6, .slot_index_##f7 = 7, .slot_index_##f8 = 8, .slot_index_##f9 = 9, .slots = { v1, v2, v3, v4, v5, v6, v7, v8, v9, } }
720#define MP_DEFINE_OBJ_TYPE_NARGS_10(_struct_type, _typename, _name, _flags, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10, v10) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slot_index_##f2 = 2, .slot_index_##f3 = 3, .slot_index_##f4 = 4, .slot_index_##f5 = 5, .slot_index_##f6 = 6, .slot_index_##f7 = 7, .slot_index_##f8 = 8, .slot_index_##f9 = 9, .slot_index_##f10 = 10, .slots = { v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, } }
721#define MP_DEFINE_OBJ_TYPE_NARGS_11(_struct_type, _typename, _name, _flags, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10, v10, f11, v11) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slot_index_##f2 = 2, .slot_index_##f3 = 3, .slot_index_##f4 = 4, .slot_index_##f5 = 5, .slot_index_##f6 = 6, .slot_index_##f7 = 7, .slot_index_##f8 = 8, .slot_index_##f9 = 9, .slot_index_##f10 = 10, .slot_index_##f11 = 11, .slots = { v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, } }
722#define MP_DEFINE_OBJ_TYPE_NARGS_12(_struct_type, _typename, _name, _flags, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10, v10, f11, v11, f12, v12) _struct_type _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .slot_index_##f1 = 1, .slot_index_##f2 = 2, .slot_index_##f3 = 3, .slot_index_##f4 = 4, .slot_index_##f5 = 5, .slot_index_##f6 = 6, .slot_index_##f7 = 7, .slot_index_##f8 = 8, .slot_index_##f9 = 9, .slot_index_##f10 = 10, .slot_index_##f11 = 11, .slot_index_##f12 = 12, .slots = { v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, } }
723
724#define MP_DEFINE_OBJ_TYPE_NARGS(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, N, ...) MP_DEFINE_OBJ_TYPE_NARGS_##N
725#define MP_DEFINE_OBJ_TYPE(...) MP_DEFINE_OBJ_TYPE_EXPAND(MP_DEFINE_OBJ_TYPE_NARGS(__VA_ARGS__, _INV, 12, _INV, 11, _INV, 10, _INV, 9, _INV, 8, _INV, 7, _INV, 6, _INV, 5, _INV, 4, _INV, 3, _INV, 2, _INV, 1, _INV, 0)(mp_obj_type_t, __VA_ARGS__))
726
727#define vsf_pyal_root_strkey_addobj(__key_str, __obj) vsf_pyal_dictobj_strkey_set(&MP_STATE_VM(dict_main), (__key_str), (__obj))
728#define vsf_pyal_root_strkey_getobj(__key_str) vsf_pyal_dictobj_strkey_get(&MP_STATE_VM(dict_main), (__key_str))
729#define vsf_pyal_root_strkey_del(__key_str) vsf_pyal_dictobj_strkey_del(&MP_STATE_VM(dict_main), (__key_str))
730
731#define vsf_pyal_root_objkey_addobj(__keyobj, __obj) vsf_pyal_dictobj_objkey_set(&MP_STATE_VM(dict_main), (__keyobj), (__obj))
732#define vsf_pyal_root_objkey_getobj(__keyobj) vsf_pyal_dictobj_objkey_get(&MP_STATE_VM(dict_main), (__keyobj))
733#define vsf_pyal_root_objkey_del(__keyobj) vsf_pyal_dictobj_objkey_del(&MP_STATE_VM(dict_main), (__keyobj))
734
735/*============================ TYPES =========================================*/
736/*============================ GLOBAL VARIABLES ==============================*/
737/*============================ PROTOTYPES ====================================*/
738
739
740#endif
741/* EOF */
int FILE
Definition stdio.h:141
Definition vsf_micropython.h:206
vsf_pyal_inst_base_def() union
Definition vsf_micropython.h:207
int __vsf_pyal_parse_tuple_keyword(__vsf_pyal_keyword_parser_arg(arg), const char *format,...)
Definition vsf_python_al.c:36
const mp_obj_type_t mp_type_textio
mp_obj_t vsf_pyal_dict_key_t
Definition vsf_micropython.h:262
struct _mp_obj_file_t mp_obj_file_t
mp_obj_t vsf_pyal_arg_t
Definition vsf_micropython.h:58
mp_obj_t vsf_pyal_obj_t
Definition vsf_micropython.h:159
const mp_obj_type_t mp_type_fileio
#define __vsf_pyal_keyword_parser_arg(__arg_name)
Definition vsf_micropython.h:337
#define vsf_pyal_listobj_getarg(__listobj, __idx)
Definition vsf_pikapython.h:155
#define vsf_pyal_listobj_getnum(__listobj)
Definition vsf_pikapython.h:154
#define vsf_pyal_tupleobj_getarg(__tupleobj, __idx)
Definition vsf_pikapython.h:220
#define vsf_pyal_tupleobj_getnum(__tupleobj)
Definition vsf_pikapython.h:221
SDL_PixelFormat format
Definition vsf_sdl2_pixelformat.c:32