VSF Documented
vsf_pikapython.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_PIKAPYTHON_H__
19#define __VSF_PIKAPYTHON_H__
20
21/*============================ INCLUDES ======================================*/
22
23#include "PikaObj.h"
24#include "TinyObj.h"
25#include "PikaStdData_List.h"
26#include "PikaStdData_Dict.h"
27#include "PikaStdData_Tuple.h"
28#include "PikaStdData_FILEIO.h"
29
30/*============================ MACROS ========================================*/
31
32// features
33
34#ifndef VSF_PYAL_FEATURE_FUNCARG_NUM_CHECK
35# define VSF_PYAL_FEATURE_FUNCARG_NUM_CHECK 1
36#endif
37#define VSF_PYAL_FEATURE_MODULE_IS_DYN 1
38
39/*============================ MACROFIED FUNCTIONS ===========================*/
40
41// arg, used as element of list/dict etc
42
43typedef Arg * vsf_pyal_arg_t;
44#define VSF_PYAL_ARG_NULL NULL
45
46#define vsf_pyal_newarg_obj(__obj) arg_newObj(__obj)
47#define vsf_pyal_arg_is_int(__arg) (arg_getType(__arg) == ARG_TYPE_INT)
48#define vsf_pyal_arg_is_float(__arg) (arg_getType(__arg) == ARG_TYPE_FLOAT)
49#define vsf_pyal_arg_is_str(__arg) (arg_getType(__arg) == ARG_TYPE_STRING)
50#define vsf_pyal_arg_is_bool(__arg) (arg_getType(__arg) == ARG_TYPE_BOOL)
51#define vsf_pyal_arg_is_list(__arg) arg_isList(__arg)
52#define vsf_pyal_arg_is_tuple(__arg) arg_isTuple(__arg)
53#define vsf_pyal_arg_is_callable(__arg) arg_isCallable(__arg)
54#define vsf_pyal_arg_is_iterable(__arg) arg_isIterable(__arg)
55#define vsf_pyal_arg_is_class(__arg, __mod, __class) \
56 (vsf_pyal_arg_getobj(__arg)->constructor == New_ ## __mod ## _ ## __class)
57#define vsf_pyal_arg_getobj(__arg) arg_getObj(__arg)
58#define vsf_pyal_arg_free(__arg) arg_deinit(__arg)
59
60// TODO:
61#define vsf_pyal_arg_iter(__arg, ...)
62
63// int
64
65#define vsf_pyal_intvalue_t int64_t
66#define vsf_pyal_newarg_int(__value) arg_newInt(__value)
67#define vsf_pyal_arg_getint(__intarg) arg_getInt(__intarg)
68
69// float
70
71#define vsf_pyal_newarg_float(__value) arg_newFloat(__value)
72#define vsf_pyal_arg_getfloat(__floatarg) arg_getFloat(__floatarg)
73
74// str
75
76#define vsf_pyal_newarg_str(__str) arg_newStr(__str)
77#define vsf_pyal_newarg_str_ret(__str) \
78 ({ \
79 obj_setStr(selfobj, __FUNCTION__, (__str)); \
80 obj_getStr(selfobj, __FUNCTION__); \
81 })
82#define vsf_pyal_newarg_str_and_free(__str) \
83 ({ \
84 obj_setStr(selfobj, __FUNCTION__, (__str)); \
85 free(__str); \
86 obj_getStr(selfobj, __FUNCTION__); \
87 })
88#define vsf_pyal_arg_getstr(__str_arg) arg_getStr(__str_arg)
89
90// bytes
91
92#define vsf_pyal_newarg_bytes(__data, __len) arg_newBytes((uint8_t *)(__data), (__len))
93#define vsf_pyal_newarg_bytes_ret(__data, __len) \
94 ({ \
95 obj_setBytes(selfobj, __FUNCTION__, (uint8_t *)(__data), (__len)); \
96 obj_getBytes(selfobj, __FUNCTION__); \
97 })
98#define vsf_pyal_arg_getbytes(__bytesarg, __len_ptr) \
99 ({ \
100 if ((__len_ptr) != NULL) { \
101 *((uint32_t *)(__len_ptr)) = arg_getSize(__bytesarg) - sizeof(size_t) - 1;\
102 } \
103 arg_getBytes(__bytesarg); \
104 })
105
106#define vsf_pyal_newarg_bytes_ret_and_free(__data, __len) \
107 ({ \
108 vsf_pyal_arg_t VSF_MACRO_SAFE_NAME(arg) = vsf_pyal_newarg_bytes((__data), (__len));\
109 free(__data); \
110 VSF_MACRO_SAFE_NAME(arg); \
111 })
112#define vsf_pyal_newfuncarg_bytes_ret_and_free(__data, __len) \
113 ({ \
114 obj_setBytes(selfobj, __FUNCTION__, (uint8_t *)(__data), (__len)); \
115 free(__data); \
116 obj_getBytes(selfobj, __FUNCTION__); \
117 })
118#define vsf_pyal_newobj_bytes_ret_and_free(__data, __len) \
119 ({ \
120 vsf_pyal_arg_t VSF_MACRO_SAFE_NAME(arg) = vsf_pyal_newarg_bytes((__data), (__len));\
121 free(__data); \
122 vsf_pyal_arg_getobj(VSF_MACRO_SAFE_NAME(arg)); \
123 })
124
125// bool
126
127#define vsf_pyal_newarg_bool(__bool) arg_newBool(__bool)
128#define vsf_pyal_arg_getbool(__boolarg) arg_getBool(__boolarg)
129
130// object
131
132typedef PikaObj * vsf_pyal_obj_t;
133#define VSF_PYAL_OBJ_NULL NULL
134
135#define vsf_pyal_obj_lookup(__obj, __name) obj_getArg((__obj), VSF_STR(__name))
136
137// list
138
139#define vsf_pyal_newobj_list(__num, __args) \
140 ({ \
141 vsf_pyal_obj_t VSF_MACRO_SAFE_NAME(listobj) = New_PikaList(); \
142 for (int i = 0; i < (__num); i++) { \
143 PikaStdData_List_append(VSF_MACRO_SAFE_NAME(listobj), ((vsf_pyal_arg_t *)(__args))[i]);\
144 } \
145 VSF_MACRO_SAFE_NAME(listobj); \
146 })
147#define vsf_pyal_newarg_list(__num, __args_ptr) \
148 ({ \
149 vsf_pyal_obj_t listobj = vsf_pyal_newobj_list((__num), (__args_ptr)); \
150 vsf_pyal_newarg_obj(listobj); \
151 })
152#define vsf_pyal_listobj_append(__listobj, __arg) pikaList_append((__listobj), (__arg))
153
154#define vsf_pyal_listobj_getnum(__listobj) pikaList_getSize(__listobj)
155#define vsf_pyal_listobj_getarg(__listobj, __idx) pikaList_getArg((__listobj), (__idx))
156
157#define vsf_pyal_listarg_getnum(__listarg) vsf_pyal_listobj_getnum(arg_getObj(__listarg))
158#define vsf_pyal_listarg_getarg(__listarg, __idx) vsf_pyal_listobj_getarg(arg_getObj(__listarg), (__idx))
159
160// instance
161
162#define vsf_pyal_inst_base_def()
163// do not use __vsf_pyal_newobj_inst directly, because users MUST find all parents class
164// and call init for all these parent classes
165#define __vsf_pyal_newobj_inst(__mod, __class) newNormalObj(New_ ## __mod ## _ ## __class)
166#define vsf_pyal_newobj_inst(__mod, __class) not supported
167#define vsf_pyal_instobj_get(__instobj) arg_getBytes(obj_getArg((__instobj), "_self"))
168#define vsf_pyal_instarg_get(__instarg) vsf_pyal_instobj_get(vsf_pyal_arg_getobj(__instarg))
169#define vsf_pyal_instobj_strkey_addobj(__instobj, __key_str, __obj) \
170 ({ \
171 vsf_pyal_arg_t VSF_MACRO_SAFE_NAME(arg) = vsf_pyal_newarg_obj(__obj); \
172 obj_setArg_noCopy((__instobj), (__key_str), VSF_MACRO_SAFE_NAME(arg)); \
173 })
174
175// file
176
177#define vsf_pyal_newobj_file(__file, __is_text) \
178 ({ \
179 (void)(__is_text); \
180 vsf_pyal_obj_t VSF_MACRO_SAFE_NAME(fileobj) = newNormalObj(New_PikaStdData_FILEIO);\
181 obj_setPtr(VSF_MACRO_SAFE_NAME(fileobj), "_f", (__file)); \
182 obj_setStr(VSF_MACRO_SAFE_NAME(fileobj), "_mode", (__is_text) ? "t" : "b");\
183 VSF_MACRO_SAFE_NAME(fileobj); \
184 })
185
186#define vsf_pyal_newarg_file(__file, __is_text) \
187 ({ \
188 vsf_pyal_obj_t VSF_MACRO_SAFE_NAME(fileobj) = vsf_pyal_newobj_file((__file), (__is_text));\
189 arg_newObj(VSF_MACRO_SAFE_NAME(fileobj)); \
190 })
191#define vsf_pyal_filearg_getfile(__filearg) \
192 ({ \
193 vsf_pyal_obj_t VSF_MACRO_SAFE_NAME(fileobj) = arg_getObj(__filearg); \
194 (FILE *)obj_getPtr(VSF_MACRO_SAFE_NAME(fileobj), "_f"); \
195 })
196#define vsf_pyal_filearg_clear(__filearg) \
197 ({ \
198 vsf_pyal_obj_t VSF_MACRO_SAFE_NAME(fileobj) = arg_getObj(__filearg); \
199 obj_setPtr(VSF_MACRO_SAFE_NAME(fileobj), "_f", NULL); \
200 })
201
202#define vsf_pyal_arg_is_file(__arg) \
203 ({ \
204 vsf_pyal_obj_t VSF_MACRO_SAFE_NAME(fileobj) = arg_getObj(__arg); \
205 VSF_MACRO_SAFE_NAME(fileobj)->constructor == New_PikaStdData_FILEIO; \
206 })
207
208// tuple
209
210#define vsf_pyal_newobj_tuple(__num, __args) \
211 ({ \
212 vsf_pyal_obj_t VSF_MACRO_SAFE_NAME(tupleobj) = New_PikaTuple(); \
213 for (int i = 0; i < (__num); i++) { \
214 PikaStdData_List_append(VSF_MACRO_SAFE_NAME(tupleobj), (__args)[i]);\
215 } \
216 VSF_MACRO_SAFE_NAME(tupleobj); \
217 })
218#define vsf_pyal_tupleobj_getint(__tupleobj, __idx) pikaTuple_getInt((__tupleobj), (__idx))
219#define vsf_pyal_tupleobj_getstr(__tupleobj, __idx) pikaTuple_getStr((__tupleobj), (__idx))
220#define vsf_pyal_tupleobj_getarg(__tupleobj, __idx) pikaTuple_getArg((__tupleobj), (__idx))
221#define vsf_pyal_tupleobj_getnum(__tupleobj) pikaTuple_getSize(__tupleobj)
222
223#define vsf_pyal_newarg_tuple(__num, __args) \
224 ({ \
225 vsf_pyal_obj_t VSF_MACRO_SAFE_NAME(tupleobj) = vsf_pyal_newobj_tuple((__num), (vsf_pyal_arg_t *)(__args));\
226 arg_newObj(VSF_MACRO_SAFE_NAME(tupleobj)); \
227 })
228#define vsf_pyal_tuplearg_getint(__tuplearg, __idx) pikaTuple_getInt(arg_getObj(__tuplearg), (__idx))
229#define vsf_pyal_tuplearg_getstr(__tuplearg, __idx) pikaTuple_getStr(arg_getObj(__tuplearg), (__idx))
230#define vsf_pyal_tuplearg_getfloat(__tuplearg, __idx) pikaTuple_getFloat(arg_getObj(__tuplearg), (__idx))
231#define vsf_pyal_tuplearg_getarg(__tuplearg, __idx) pikaTuple_getArg(arg_getObj(__tuplearg), (__idx))
232#define vsf_pyal_tuplearg_getnum(__tuplearg) pikaTuple_getSize(arg_getObj(__tuplearg))
233
234// dict
235
236typedef char * vsf_pyal_dict_key_t;
237#define vsf_pyal_dictkey_getstr(__dict_key) (__dict_key)
238
239#define vsf_pyal_newobj_dict() New_PikaDict()
240
241#define vsf_pyal_dictobj_strkey_set(__dict_obj, __key_str, __value_arg) \
242 pikaDict_set((__dict_obj), __key_str, (__value_arg))
243
244// module
245
246#define vsf_pyal_module_addobj(__mod, __key_str, __obj) \
247 ({ \
248 vsf_pyal_arg_t VSF_MACRO_SAFE_NAME(arg) = vsf_pyal_newarg_obj(__obj); \
249 obj_setArg_noCopy(selfobj, (__key_str), VSF_MACRO_SAFE_NAME(arg)); \
250 })
251#define vsf_pyal_module_addstr(__mod, __name, __str) \
252 obj_setStr(selfobj, (__name), (__str))
253#define vsf_pyal_module_addint(__mod, __name, __value) \
254 obj_setInt(selfobj, (__name), (__value))
255
256#define vsf_pyal_funcarg_str_t char *
257#define vsf_pyal_funcarg_getstr(__arg) (__arg)
258#define vsf_pyal_newfuncarg_str(__str) obj_cacheStr(selfobj, (__str))
259
260#define vsf_pyal_funcarg_int_t int
261#define vsf_pyal_funcarg_getint(__arg) (__arg)
262#define vsf_pyal_newfuncarg_int(__value) (__value)
263#define vsf_pyal_funcarg_bool_t bool
264#define vsf_pyal_funcarg_getbool(__arg) (__arg)
265#define vsf_pyal_newfuncarg_bool(__bool) (__bool)
266#define vsf_pyal_funcarg_float_t float
267#define vsf_pyal_funcarg_getfloat(__arg) (__arg)
268#define vsf_pyal_newfuncarg_float(__value) (__value)
269#define vsf_pyal_funcarg_bytes_t uint8_t *
270#define vsf_pyal_funcarg_callable_t vsf_pyal_arg_t
271#define vsf_pyal_funcarg_tuple_t vsf_pyal_obj_t
272#define vsf_pyal_funcarg_tuple_getint(__tupleobj, __idx) vsf_pyal_tupleobj_getint((__tupleobj), (__idx))
273#define vsf_pyal_funcarg_tuple_getstr(__tupleobj, __idx) vsf_pyal_tupleobj_getstr((__tupleobj), (__idx))
274#define vsf_pyal_funcarg_tuple_getarg(__tupleobj, __idx) vsf_pyal_tupleobj_getarg((__tupleobj), (__idx))
275#define vsf_pyal_funcarg_var(__name) vsf_pyal_obj_t __name
276#define vsf_pyal_funcarg_var_for_call(__name) __name
277#define vsf_pyal_funcarg_var_num(__name) pikaTuple_getSize(__name)
278#define vsf_pyal_funcarg_var_is_str(__name, __idx) (pikaTuple_getType((__name), (__idx)) == ARG_TYPE_STRING)
279#define vsf_pyal_funcarg_var_getstr(__name, __idx) pikaTuple_getStr((__name), (__idx))
280#define vsf_pyal_funcarg_var_is_int(__name, __idx) (pikaTuple_getType((__name), (__idx)) == ARG_TYPE_INT)
281#define vsf_pyal_funcarg_var_getint(__name, __idx) pikaTuple_getInt((__name), (__idx))
282// use arg_getBool if added in pikascript
283//#define vsf_pyal_funcarg_var_getbool(__name, __idx)pikaTuple_getBool((__name), (__idx))
284#define vsf_pyal_funcarg_var_getbool(__name, __idx) arg_getBool(pikaTuple_getArg((__name), (__idx)))
285#define vsf_pyal_funcarg_var_is_tuple(__name, __idx)(pikaTuple_getType((__name), (__idx)) == ARG_TYPE_TUPLE)
286#define vsf_pyal_funcarg_var_getarg(__name, __idx) pikaTuple_getArg((__name), (__idx))
287#define vsf_pyal_funcarg_keyword(__name) vsf_pyal_obj_t __name ## _args
288#define vsf_pyal_funcarg_void
289#define vsf_pyal_class_func_var_arg_skip_self(__arg_name)
290#define vsf_pyal_class_func_var_arg_restore_self(__arg_name)
291
292#define vsf_pyal_func_void_return_t void
293#define vsf_pyal_func_void_return() return
294
295#define vsf_pyal_module_func_var_imp(__mod, __func, __ret_type, __min_arg, __max_arg, __arg_name)\
296 __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj, vsf_pyal_funcarg_var(__arg_name))
297
298#define VSF_PYAL_MODULE_FUNCARG_OBJ_0 0
299#define VSF_PYAL_MODULE_FUNCARG_OBJ_1 1
300#define VSF_PYAL_MODULE_FUNCARG_OBJ_2 2
301#define vsf_pyal_module_func_fix_imp(__mod, __func, __func_type, __ret_type, ...)\
302 __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj, ##__VA_ARGS__)
303
304#define vsf_pyal_keyword_is_str
305#define vsf_pyal_keyword(__key_name) VSF_STR(__key_name)
306// TODO: implement vsf_pyal_keyword_getxxx
307#define __vsf_pyal_keyword_getint(__arg_name, __key, __idx)
308#define __vsf_pyal_keyword_getbool(__arg_name, __key, __idx)
309#define __vsf_pyal_keyword_getarg(__arg_name, __key, __idx)
310#define __vsf_pyal_keyword_parser_arg(__arg_name) vsf_pyal_obj_t __name ## _args
312#define vsf_pyal_parse_tuple_keyword(__arg_name, ...) __vsf_pyal_parse_tuple_keyword(__arg_name ## _args, ##__VA_ARGS__)
313
314#define vsf_pyal_keyword_getint_forced(__arg_name, __key_name, __key_idx) \
315 ({ \
316 int result = 0; \
317 if (__arg_name ## _args_num <= (__key_idx)) { \
318 vsf_pyal_raise("invalie argument"); \
319 } else { \
320 result = vsf_pyal_arg_getint(pikaDict_getArgByidex(__arg_name ## _args, (__key_idx)));\
321 } \
322 result; \
323 })
324#define vsf_pyal_keyword_getbool_forced(__arg_name, __key_name, __key_idx) \
325 ({ \
326 bool result = false; \
327 if (__arg_name ## _args_num <= (__key_idx)) { \
328 vsf_pyal_raise("invalie argument"); \
329 } else { \
330 result = vsf_pyal_arg_getbool(pikaDict_getArgByidex(__arg_name ## _args, (__key_idx)));\
331 } \
332 result; \
333 })
334#define vsf_pyal_keyword_getarg_forced(__arg_name, __key_name, __key_idx) \
335 ({ \
336 vsf_pyal_arg_t result = VSF_PYAL_ARG_NULL; \
337 if (__arg_name ## _args_num <= (__key_idx)) { \
338 vsf_pyal_raise("invalie argument"); \
339 } else { \
340 result = pikaDict_getArgByidex(__arg_name ## _args, (__key_idx)); \
341 } \
342 result; \
343 })
344
345#define vsf_pyal_keyword_getint(__arg_name, __key_name, __key_idx, __default) \
346 (__arg_name ## _args_num <= (__key_idx)) ? (__default) : \
347 vsf_pyal_arg_getint(pikaDict_getArgByidex(__arg_name ## _args, (__key_idx)))
348#define vsf_pyal_keyword_getbool(__arg_name, __key_name, __key_idx, __default) \
349 (__arg_name ## _args_num <= (__key_idx)) ? (__default) : \
350 vsf_pyal_arg_getbool(pikaDict_getArgByidex(__arg_name ## _args, (__key_idx)))
351#define vsf_pyal_keyword_getarg(__arg_name, __key_name, __key_idx, __default) \
352 (__arg_name ## _args_num <= (__key_idx)) ? (__default) : \
353 pikaDict_getArgByidex(__arg_name ## _args, (__key_idx))
354
355#define vsf_pyal_module_func_keyword_imp(__mod, __func, __ret_type, __min_arg, __max_arg, __arg_name, ...)\
356 __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj, vsf_pyal_funcarg_keyword(__arg_name)) {\
357 int __arg_name ## _args_num = pikaDict_getSize(__arg_name ## _args);
358#define vsf_pyal_module_func_keyword_imp_end() }
359
360#define vsf_pyal_module_func_init_prototype(__mod) \
361 extern void __mod ## _ ## __init__(vsf_pyal_obj_t selfobj)
362#define vsf_pyal_module_func_init_declare(__mod) \
363 extern void __mod ## _ ## __init__(vsf_pyal_obj_t selfobj)
364#define vsf_pyal_module_func_init_imp(__mod) \
365 vsf_pyal_module_func_fix_imp(__mod, __init__, VSF_PYAL_MODULE_FUNCARG_OBJ_0, void)
366#define vsf_pyal_module_func_init_return()
367
368#define vsf_pyal_module_func_type(__mod, __func, __ret_type, ...) \
369 typedef __ret_type (*__mod ## _ ## __func ## _t)(vsf_pyal_obj_t selfobj, ##__VA_ARGS__)
370#define vsf_pyal_module_func_prototype(__mod, __func, __ret_type, ...) \
371 extern __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj, ##__VA_ARGS__)
372#define vsf_pyal_module_func_name(__mod, __func) \
373 __mod ## _ ## __func
374#define vsf_pyal_module_func_call(__func_full_name, ...) \
375 __func_full_name(selfobj, ##__VA_ARGS__)
376#define vsf_pyal_module_func_declare(__mod, __func, __ret_type, ...) \
377 extern __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj, ##__VA_ARGS__)
378
379#define vsf_pyal_module_func_type_noarg(__mod, __func, __ret_type) \
380 typedef __ret_type (*__mod ## _ ## __func ## _t)(vsf_pyal_obj_t selfobj)
381#define vsf_pyal_module_func_prototype_noarg(__mod, __func, __ret_type) \
382 extern __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj)
383#define vsf_pyal_module_func_declare_noarg(__mod, __func, __ret_type) \
384 extern __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj)
385
386// class
387
388#define vsf_pyal_class_getself_from_obj(__mod, __class, __name, __instobj) \
389 __mod ## _ ## __class ## _t *__name = (__mod ## _ ## __class ## _t *)vsf_pyal_instobj_get(__instobj)
390#define vsf_pyal_class_getself_from_arg(__mod, __class, __name, __instarg) \
391 __mod ## _ ## __class ## _t *__name = (__mod ## _ ## __class ## _t *)vsf_pyal_instarg_get(__instarg)
392#define vsf_pyal_class_arg_getself(__mod, __class, __name) \
393 __mod ## _ ## __class ## _t *__name = (__mod ## _ ## __class ## _t *)vsf_pyal_instobj_get(selfobj)
394
395// vsf_pyal_class_new will create class as in python
396#define vsf_pyal_class_new(__mod, __class, __args_num, __args) \
397 ({ \
398 vsf_pyal_obj_t VSF_MACRO_SAFE_NAME(tupleobj) = vsf_pyal_newobj_tuple(__args_num, __args);\
399 vsf_pyal_obj_t VSF_MACRO_SAFE_NAME(selfobj) = __vsf_pyal_newobj_inst(__mod, __class);\
400 __mod ## _ ## __class ## ___init__(VSF_MACRO_SAFE_NAME(selfobj), VSF_MACRO_SAFE_NAME(tupleobj));\
401 VSF_MACRO_SAFE_NAME(selfobj); \
402 })
403
404// vsf_pyal_class_newc will create class in C, user can set a exsize and get a C pinter
405#define vsf_pyal_class_newc(__mod, __class, __exsize, __obj_ptr) \
406 ({ \
407 vsf_pyal_arg_t VSF_MACRO_SAFE_NAME(instarg) = arg_newBytes(NULL, sizeof(__mod ## _ ## __class ## _t) + (__exsize));\
408 vsf_pyal_obj_t VSF_MACRO_SAFE_NAME(selfobj) = __vsf_pyal_newobj_inst(__mod, __class);\
409 obj_setArg_noCopy(VSF_MACRO_SAFE_NAME(selfobj), "_self", VSF_MACRO_SAFE_NAME(instarg));\
410 *(__obj_ptr) = VSF_MACRO_SAFE_NAME(selfobj); \
411 (__mod ## _ ## __class ## _t *)arg_getBytes(VSF_MACRO_SAFE_NAME(instarg));\
412 })
413
414#define vsf_pyal_class_new_keyword_func(__mod, __class, __arg_name, ...) \
415 void __mod ## _ ## __class ## ___init__(vsf_pyal_obj_t selfobj, vsf_pyal_funcarg_keyword(__arg_name)) {\
416 int __arg_name ## _args_num = pikaDict_getSize(__arg_name ## _args); \
417 __mod ## _ ## __class ## _t *self = NULL;
418
419#define vsf_pyal_class_new_func(__mod, __class, __arg_name) \
420 void __mod ## _ ## __class ## ___init__(vsf_pyal_obj_t selfobj, vsf_pyal_funcarg_var(__arg_name ## _args)) {\
421 __mod ## _ ## __class ## _t *self = NULL;
422
423#define vsf_pyal_class_new_create(__mod, __class, __exsize) \
424 ({ \
425 vsf_pyal_arg_t VSF_MACRO_SAFE_NAME(instarg) = arg_newBytes(NULL, sizeof(__mod ## _ ## __class ## _t) + (__exsize));\
426 obj_setArg_noCopy(selfobj, "_self", VSF_MACRO_SAFE_NAME(instarg)); \
427 (__mod ## _ ## __class ## _t *)arg_getBytes(VSF_MACRO_SAFE_NAME(instarg));\
428 })
429#define vsf_pyal_class_new_del(__mod, __class, __exsize, __ptr) \
430 obj_removeArg(selfobj, "_self")
431#define vsf_pyal_class_new_fail(__mod, __class, __fmt, ...) \
432 vsf_pyal_raise((__fmt), ##__VA_ARGS__); \
433 return;
434#define vsf_pyal_class_new_arg_num(__name) vsf_pyal_funcarg_var_num(__name ## _args)
435#define vsf_pyal_class_new_is_int(__name, __idx) vsf_pyal_funcarg_var_is_int(__name ## _args, __idx)
436#define vsf_pyal_class_new_getint(__name, __idx) vsf_pyal_funcarg_var_getint(__name ## _args, __idx)
437#define vsf_pyal_class_new_getstr(__name, __idx) vsf_pyal_funcarg_var_getstr(__name ## _args, __idx)
438#define vsf_pyal_class_new_getarg(__name, __idx) vsf_pyal_funcarg_var_getarg(__name ## _args, __idx)
439#define vsf_pyal_class_new_func_end() \
440 return; \
441 }
442
443#define vsf_pyal_class_del_func(__mod, __class) \
444 void __mod ## _ ## __class ## ___del__(vsf_pyal_obj_t selfobj) { \
445 __mod ## _ ## __class ## _t *self = (__mod ## _ ## __class ## _t *)vsf_pyal_instobj_get(selfobj);
446#define vsf_pyal_class_del_func_end() \
447 vsf_pyal_func_void_return(); \
448 }
449
450#define vsf_pyal_class_print_func(__mod, __class) \
451 vsf_pyal_funcarg_str_t __mod ## _ ## __class ## ___str__(vsf_pyal_obj_t selfobj)
452#define vsf_pyal_class_print_func_fmt(__mod, __class, __fmt, ...) \
453 vsf_pyal_funcarg_str_t __mod ## _ ## __class ## ___str__(vsf_pyal_obj_t selfobj) {\
454 vsf_pyal_class_arg_getself(__mod, __class, self); \
455 int len = snprintf(NULL, 0, (__fmt), ##__VA_ARGS__); \
456 extern vsf_pyal_arg_t arg_set(vsf_pyal_arg_t selfarg, char *name, \
457 ArgType type, uint8_t *content, uint32_t size); \
458 vsf_pyal_arg_t strarg = arg_set(NULL, "", ARG_TYPE_STRING, NULL, len + 1);\
459 obj_setStr(selfobj, "_buf", arg_getStr(strarg)); \
460 arg_deinit(strarg); \
461 char *result = obj_getStr(selfobj, "_buf"); \
462 snprintf(result, len + 1, (__fmt), ##__VA_ARGS__); \
463 return result; \
464 }
465
466#define vsf_pyal_class_attr_func(__mod, __class, __arg_name) \
467 extern vsf_pyal_arg_t __mod ## _ ## __class ## _attr(vsf_pyal_obj_t selfobj,\
468 vsf_pyal_funcarg_str_t __arg_name ## keyobj, vsf_pyal_arg_t __arg_name ## valuearg,\
469 bool __arg_name ## is_del); \
470 vsf_pyal_class_func_fix_imp(__mod ## _ ## __class, __getattr__, VSF_PYAL_MODULE_FUNCARG_OBJ_2,\
471 vsf_pyal_arg_t, vsf_pyal_funcarg_str_t keyobj) \
472 { \
473 return __mod ## _ ## __class ## _attr(selfobj, keyobj, VSF_PYAL_ARG_NULL, false);\
474 } \
475 vsf_pyal_class_func_fix_imp(__mod ## _ ## __class, __delattr__, VSF_PYAL_MODULE_FUNCARG_OBJ_2,\
476 vsf_pyal_arg_t, vsf_pyal_funcarg_str_t keyobj) \
477 { \
478 return __mod ## _ ## __class ## _attr(selfobj, keyobj, VSF_PYAL_ARG_NULL, true);\
479 } \
480 vsf_pyal_class_func_fix_imp(__mod ## _ ## __class, __setattr__, VSF_PYAL_MODULE_FUNCARG_OBJ_3,\
481 vsf_pyal_func_void_return_t, vsf_pyal_funcarg_str_t keyobj, vsf_pyal_arg_t arg)\
482 { \
483 __mod ## _ ## __class ## _attr(selfobj, keyobj, arg, false); \
484 vsf_pyal_func_void_return(); \
485 } \
486 vsf_pyal_arg_t __mod ## _ ## __class ## _attr(vsf_pyal_obj_t selfobj, \
487 vsf_pyal_funcarg_str_t __arg_name ## keyobj, vsf_pyal_arg_t __arg_name ## valuearg,\
488 bool __arg_name ## is_del)
489
490//#define vsf_pyal_class_attr_get_attr(__arg_name) vsf_pyal_hash_string(__arg_name ## keyobj)
491//#define vsf_pyal_class_attr_const_attr(__attr) constexpr vsf_pyal_hash_string(VSF_STR(__attr))
492#define vsf_pyal_class_attr_is_load(__arg_name) ((VSF_PYAL_ARG_NULL == __arg_name ## valuearg) && !__arg_name ## is_del)
493#define vsf_pyal_class_attr_is_store(__arg_name) (__arg_name ## valuearg != VSF_PYAL_ARG_NULL)
494#define vsf_pyal_class_attr_is_delete(__arg_name) (__arg_name ## is_del)
495#define vsf_pyal_class_attr_get_valuearg(__arg_name)(__arg_name ## valuearg)
496#define vsf_pyal_class_attr_ret_load_fail(__arg_name) \
497 return VSF_PYAL_OBJ_NULL
498#define vsf_pyal_class_attr_ret_load_obj(__arg_name, __obj) \
499 return (__obj)
500#define vsf_pyal_class_attr_ret_load_method(__arg_name, __method) \
501 return (__method)
502#define vsf_pyal_class_attr_ret_fail(__arg_name) \
503 return VSF_PYAL_OBJ_NULL
504#define vsf_pyal_class_attr_ret_success(__arg_name) \
505 return VSF_PYAL_OBJ_NULL
506
507#define vsf_pyal_class_func_var_private_imp(__mod, __func, __ret_type, __min_arg, __max_arg, __arg_name)\
508 __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj, vsf_pyal_funcarg_var(__arg_name))
509#define vsf_pyal_class_func_var_imp(__mod, __func, __ret_type, __min_arg, __max_arg, __arg_name)\
510 __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj, vsf_pyal_funcarg_var(__arg_name))
511#define vsf_pyal_class_func_fix_imp(__mod, __func, __func_type, __ret_type, ...)\
512 __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj, ##__VA_ARGS__)
513#define vsf_pyal_class_func_keyword_imp(__mod, __func, __ret_type, __min_arg, __max_arg, __arg_name, ...)\
514 __ret_type __mod ## _ ## __func(vsf_pyal_obj_t selfobj, vsf_pyal_funcarg_keyword(__arg_name)) {\
515 int __arg_name ## _args_num = pikaDict_getSize(__arg_name ## _args);
516#define vsf_pyal_class_func_keyword_imp_end() }
517
518#define vsf_pyal_class_func_call_var(__mod, __func, __instobj, arg) \
519 __mod ## _ ## __func(__instobj, vsf_pyal_funcarg_var_for_call(arg))
520#define vsf_pyal_class_func_call_fix(__mod, __func, __instobj, ...) \
521 __mod ## _ ## __func(__instobj, ##__VA_ARGS__)
522
523#define vsf_pyal_class_declare(__mod, __class) \
524 extern void __mod ## _ ## __class ## ___init__(vsf_pyal_obj_t unused, vsf_pyal_funcarg_var(__arg_name ## _args));\
525 extern vsf_pyal_obj_t New_ ## __mod ## _ ## __class(Args *args); \
526 extern const NativeProperty __mod ## _ ## __class ## NativeProp
527
528// APIs
529
530#define vsf_pyal_hash_string(__str) hash_time33(__str)
531
532#define vsf_pyal_raise(__fmt, ...) \
533 ({ \
534 pika_platform_printf((__fmt), ##__VA_ARGS__); \
535 obj_setErrorCode(selfobj, -1); \
536 })
537
538/*============================ TYPES =========================================*/
539/*============================ GLOBAL VARIABLES ==============================*/
540/*============================ PROTOTYPES ====================================*/
541
542
543#endif
544/* EOF */
int __vsf_pyal_parse_tuple_keyword(__vsf_pyal_keyword_parser_arg(arg), const char *format,...)
Definition vsf_python_al.c:36
char * vsf_pyal_dict_key_t
Definition vsf_pikapython.h:236
PikaObj * vsf_pyal_obj_t
Definition vsf_pikapython.h:132
Arg * vsf_pyal_arg_t
Definition vsf_pikapython.h:43
#define __vsf_pyal_keyword_parser_arg(__arg_name)
Definition vsf_pikapython.h:310
SDL_PixelFormat format
Definition vsf_sdl2_pixelformat.c:32