PikaObj.h 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  1. /*
  2. * This file is part of the PikaPython project.
  3. * http://github.com/pikastech/pikapython
  4. *
  5. * MIT License
  6. *
  7. * Copyright (c) 2021 lyon liang6516@outlook.com
  8. * Copyright (c) 2023 Gorgon Meducer embedded_zhuroan@hotmail.com
  9. *
  10. * Permission is hereby granted, free of charge, to any person obtaining a
  11. * copy of this software and associated documentation files (the "Software"),
  12. * to deal in the Software without restriction, including without limitation
  13. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  14. * and/or sell copies of the Software, and to permit persons to whom the
  15. * Software is furnished to do so, subject to the following conditions:
  16. *
  17. * The above copyright notice and this permission notice shall be included in
  18. * all copies or substantial portions of the Software.
  19. *
  20. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  23. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  24. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  25. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  26. * DEALINGS IN THE SOFTWARE.
  27. */
  28. #include <stdint.h>
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. #ifndef _Process__H
  33. #define _Process__H
  34. #include "dataArgs.h"
  35. #include "dataLink.h"
  36. #include "dataMemory.h"
  37. #include "dataQueue.h"
  38. #include "dataStack.h"
  39. #include "dataStrs.h"
  40. typedef struct InstructUnit InstructUnit;
  41. struct InstructUnit {
  42. uint8_t deepth;
  43. uint8_t isNewLine_instruct;
  44. uint16_t const_pool_index;
  45. };
  46. typedef struct ConstPool ConstPool;
  47. struct ConstPool {
  48. Arg* arg_buff;
  49. uint32_t content_offset_now;
  50. uint32_t size;
  51. void* content_start;
  52. void (*output_redirect_fun)(ConstPool* self, char* content);
  53. FILE* output_f;
  54. };
  55. typedef struct InstructArray InstructArray;
  56. struct InstructArray {
  57. Arg* arg_buff;
  58. uint32_t content_offset_now;
  59. uint32_t size;
  60. void* content_start;
  61. void (*output_redirect_fun)(InstructArray* self, InstructUnit* ins_unit);
  62. FILE* output_f;
  63. };
  64. typedef struct ByteCodeFrame ByteCodeFrame;
  65. struct ByteCodeFrame {
  66. char* name;
  67. Hash name_hash;
  68. ConstPool const_pool;
  69. InstructArray instruct_array;
  70. int32_t label_pc;
  71. };
  72. typedef struct NativeProperty NativeProperty;
  73. struct NativeProperty {
  74. const NativeProperty* super;
  75. const Arg* methodGroup;
  76. uint32_t methodGroupCount;
  77. };
  78. enum InstructIndex {
  79. #define __INS_ENUM
  80. #include "__instruction_table.h"
  81. __INSTRUCTION_CNT,
  82. __INSTRUCTION_INDEX_MAX = 0xFFFF,
  83. __INSTRUCTION_UNKNOWN = 0xFFFF,
  84. };
  85. typedef enum {
  86. VM_JMP_EXIT = -999,
  87. VM_JMP_CONTINUE = -997,
  88. VM_JMP_BREAK = -998,
  89. VM_JMP_RAISE = -996,
  90. } VM_JMP;
  91. #define VM_PC_EXIT (-99999)
  92. typedef enum {
  93. TRY_STATE_NONE = 0,
  94. TRY_STATE_INNER,
  95. } TRY_STATE;
  96. typedef enum {
  97. TRY_RESULT_NONE = 0,
  98. TRY_RESULT_RAISE,
  99. } TRY_RESULT;
  100. typedef struct PikaVMError PikaVMError;
  101. struct PikaVMError {
  102. int8_t code;
  103. int8_t line_code;
  104. PikaVMError* next;
  105. };
  106. typedef struct PikaVMThread PikaVMThread;
  107. struct PikaVMThread {
  108. TRY_STATE try_state;
  109. TRY_RESULT try_result;
  110. PikaVMError* error_stack;
  111. PikaVMError* exception_stack;
  112. uint32_t error_stack_deepth;
  113. uint32_t error_stack_deepth_max;
  114. uint8_t invoke_deepth;
  115. uint64_t thread_id;
  116. struct PikaVMThread* next;
  117. uint8_t is_sub_thread;
  118. };
  119. typedef PikaObj VMParameters;
  120. typedef struct PikaVMFrame PikaVMFrame;
  121. struct PikaVMFrame {
  122. VMParameters* locals;
  123. VMParameters* globals;
  124. Stack stack;
  125. int32_t jmp;
  126. int32_t pc;
  127. ByteCodeFrame* bytecode_frame;
  128. uint8_t loop_deepth;
  129. uint32_t ins_cnt;
  130. pika_bool in_super;
  131. uint8_t super_invoke_deepth;
  132. PikaVMThread* vm_thread;
  133. pika_bool ireg[PIKA_REGIST_SIZE];
  134. PikaObj* oreg[16];
  135. pika_bool in_repl;
  136. PikaVMError error;
  137. };
  138. typedef PikaObj* (*NewFun)(Args* args);
  139. struct PikaObj {
  140. Args* list;
  141. NewFun constructor;
  142. #if PIKA_GC_MARK_SWEEP_ENABLE
  143. PikaObj* gcNext;
  144. #endif
  145. #if PIKA_KERNAL_DEBUG_ENABLE
  146. char* name;
  147. Arg* aName;
  148. PikaObj* parent;
  149. pika_bool isAlive;
  150. pika_bool isGCRoot;
  151. #endif
  152. #if PIKA_GC_MARK_SWEEP_ENABLE && PIKA_KERNAL_DEBUG_ENABLE
  153. PikaObj* gcRoot;
  154. #endif
  155. uint8_t refcnt;
  156. uint16_t flag;
  157. PikaVMFrame* vmFrame;
  158. };
  159. typedef struct PikaGC PikaGC;
  160. typedef int (*pikaGC_hook)(PikaGC* gc);
  161. struct PikaGC {
  162. uint32_t markDeepth;
  163. pikaGC_hook onMarkObj;
  164. PikaObj* oThis;
  165. };
  166. typedef struct RangeData RangeData;
  167. struct RangeData {
  168. int64_t start;
  169. int64_t end;
  170. int64_t step;
  171. int64_t i;
  172. };
  173. typedef struct PikaObjState PikaObjState;
  174. struct PikaObjState {
  175. Arg* helpModulesCmodule;
  176. pika_bool inRootObj;
  177. #if PIKA_GC_MARK_SWEEP_ENABLE
  178. PikaObj* gcChain;
  179. uint32_t objCnt;
  180. uint32_t objCntMax;
  181. uint32_t objCntLastGC;
  182. uint32_t markSweepBusy;
  183. #endif
  184. };
  185. #define OBJ_FLAG_PROXY_GETATTRIBUTE 1 << 0
  186. #define OBJ_FLAG_PROXY_GETATTR 1 << 1
  187. #define OBJ_FLAG_PROXY_SETATTR 1 << 2
  188. #define OBJ_FLAG_ALREADY_INIT 1 << 3
  189. #define OBJ_FLAG_RUN_AS 1 << 4
  190. #define OBJ_FLAG_GLOBALS 1 << 5
  191. #define OBJ_FLAG_GC_MARKED 1 << 6
  192. #define OBJ_FLAG_GC_ROOT 1 << 7
  193. #define OBJ_FLAG_PROXY_METHOD 1 << 8
  194. #define OBJ_FLAG_IN_DEL 1 << 9
  195. #define PIKA_KEY_UP 0x41
  196. #define PIKA_KEY_DOWN 0x42
  197. #define PIKA_KEY_RIGHT 0x43
  198. #define PIKA_KEY_LEFT 0x44
  199. static inline uint8_t obj_getFlag(PikaObj* self, uint16_t flag) {
  200. pika_assert(self);
  201. return (self->flag & flag) == flag;
  202. }
  203. static inline void obj_setFlag(PikaObj* self, uint16_t flag) {
  204. pika_assert(self);
  205. self->flag |= flag;
  206. #if PIKA_KERNAL_DEBUG_ENABLE
  207. if (flag == OBJ_FLAG_GC_ROOT) {
  208. self->isGCRoot = pika_true;
  209. }
  210. #endif
  211. }
  212. static inline void obj_clearFlag(PikaObj* self, uint16_t flag) {
  213. self->flag &= ~flag;
  214. #if PIKA_KERNAL_DEBUG_ENABLE
  215. if (flag == OBJ_FLAG_GC_ROOT) {
  216. self->isGCRoot = pika_false;
  217. }
  218. #endif
  219. }
  220. typedef PikaObj* (*InitFun)(PikaObj* self, Args* args);
  221. typedef void (*Method)(PikaObj* self, Args* args);
  222. typedef struct MethodInfo MethodInfo;
  223. struct MethodInfo {
  224. char* name;
  225. char* dec;
  226. char* ptr;
  227. char* typelist;
  228. PikaObj* def_context;
  229. ArgType type;
  230. ByteCodeFrame* bytecode_frame;
  231. };
  232. typedef struct MethodProp {
  233. void* ptr;
  234. char* type_list;
  235. char* name;
  236. ByteCodeFrame* bytecode_frame;
  237. PikaObj* def_context;
  238. PikaObj* host_obj;
  239. char* declareation;
  240. } MethodProp;
  241. typedef struct MethodPropNative {
  242. void* ptr;
  243. char* type_list;
  244. #if !PIKA_NANO_ENABLE
  245. char* name;
  246. #endif
  247. } MethodPropNative;
  248. typedef PikaObj LibObj;
  249. typedef PikaObj PikaMaker;
  250. /* operation */
  251. int32_t obj_deinit(PikaObj* self);
  252. int obj_GC(PikaObj* self);
  253. int32_t obj_init(PikaObj* self, Args* args);
  254. int32_t obj_update(PikaObj* self);
  255. int32_t obj_enable(PikaObj* self);
  256. int32_t obj_disable(PikaObj* self);
  257. // arg type operations
  258. PIKA_RES obj_setInt(PikaObj* self, char* argPath, int64_t val);
  259. PIKA_RES obj_setObj(PikaObj* self, char* argPath, PikaObj* obj);
  260. PIKA_RES obj_setRef(PikaObj* self, char* argPath, PikaObj* pointer);
  261. PIKA_RES obj_setPtr(PikaObj* self, char* argPath, void* pointer);
  262. PIKA_RES obj_setFloat(PikaObj* self, char* argPath, pika_float value);
  263. PIKA_RES obj_setStr(PikaObj* self, char* argPath, char* str);
  264. PIKA_RES obj_setNone(PikaObj* self, char* argPath);
  265. PIKA_RES obj_setArg(PikaObj* self, char* argPath, Arg* arg);
  266. PIKA_RES obj_setArg_noCopy(PikaObj* self, char* argPath, Arg* arg);
  267. PIKA_RES obj_setBytes(PikaObj* self, char* argPath, uint8_t* src, size_t size);
  268. void* obj_getPtr(PikaObj* self, char* argPath);
  269. PikaObj* obj_getBuiltins(void);
  270. pika_float obj_getFloat(PikaObj* self, char* argPath);
  271. char* obj_getStr(PikaObj* self, char* argPath);
  272. int64_t obj_getInt(PikaObj* self, char* argPath);
  273. int64_t obj_getSize(PikaObj* arg_obj);
  274. pika_bool obj_getBool(PikaObj* self, char* argPath);
  275. Arg* obj_getArg(PikaObj* self, char* argPath);
  276. uint8_t* obj_getBytes(PikaObj* self, char* argPath);
  277. size_t obj_getBytesSize(PikaObj* self, char* argPath);
  278. size_t obj_loadBytes(PikaObj* self, char* argPath, uint8_t* out_buff);
  279. char* obj_print(PikaObj* self, char* name);
  280. // args operations
  281. int32_t obj_load(PikaObj* self, Args* args, char* name);
  282. // subObject
  283. int32_t obj_addOther(PikaObj* self, char* subObjectName, void* new_projcetFun);
  284. PikaObj* obj_getObj(PikaObj* self, char* objPath);
  285. PikaObj* obj_getHostObj(PikaObj* self, char* objPath);
  286. PikaObj* obj_getHostObjWithIsTemp(PikaObj* self,
  287. char* objPath,
  288. pika_bool* pIsClass);
  289. // subProcess
  290. int32_t obj_freeObj(PikaObj* self, char* subObjectName);
  291. /* method */
  292. int32_t class_defineMethod(PikaObj* self,
  293. char* name,
  294. char* typelist,
  295. Method methodPtr);
  296. int32_t class_defineObjectMethod(PikaObj* self,
  297. char* declareation,
  298. Method methodPtr,
  299. PikaObj* def_context,
  300. ByteCodeFrame* bytecode_frame);
  301. int32_t class_defineStaticMethod(PikaObj* self,
  302. char* declareation,
  303. Method methodPtr,
  304. PikaObj* def_context,
  305. ByteCodeFrame* bytecode_frame);
  306. int32_t class_defineConstructor(PikaObj* self,
  307. char* name,
  308. char* typelist,
  309. Method methodPtr);
  310. int32_t class_defineRunTimeConstructor(PikaObj* self,
  311. char* declareation,
  312. Method methodPtr,
  313. PikaObj* def_context,
  314. ByteCodeFrame* bytecode_frame);
  315. int32_t obj_removeArg(PikaObj* self, char* argPath);
  316. pika_bool obj_isArgExist(PikaObj* self, char* argPath);
  317. pika_bool obj_isMethodExist(PikaObj* self, char* method);
  318. PikaObj* obj_newObjFromConstructor(PikaObj* self,
  319. char* name,
  320. NewFun newClassFun);
  321. PikaObj* newRootObj(char* name, NewFun newObjFun);
  322. PikaObj* obj_getClassObj(PikaObj* obj);
  323. Arg* obj_getMethodArg(PikaObj* obj, char* methodName);
  324. Arg* obj_getMethodArg_noalloc(PikaObj* obj, char* methodName, Arg* arg_reg);
  325. Arg* obj_getMethodArgWithFullPath(PikaObj* obj, char* methodPath);
  326. Arg* obj_getMethodArgWithFullPath_noalloc(PikaObj* obj,
  327. char* methodPath,
  328. Arg* arg_reg);
  329. void obj_setErrorCode(PikaObj* self, int32_t errCode);
  330. void obj_setSysOut(PikaObj* self, char* fmt, ...);
  331. uint8_t obj_getAnyArg(PikaObj* self,
  332. char* targetArgName,
  333. char* sourceArgPath,
  334. Args* targetArgs);
  335. void method_returnStr(Args* args, char* val);
  336. void method_returnInt(Args* args, int64_t val);
  337. void method_returnBool(Args* args, pika_bool val);
  338. void method_returnFloat(Args* args, pika_float val);
  339. void method_returnPtr(Args* args, void* val);
  340. void method_returnObj(Args* args, void* val);
  341. int64_t method_getInt(Args* args, char* argName);
  342. pika_float method_getFloat(Args* args, char* argName);
  343. char* method_getStr(Args* args, char* argName);
  344. void method_returnArg(Args* args, Arg* arg);
  345. MethodProp* methodArg_getProp(Arg* method_arg);
  346. char* methodArg_getDec(Arg* method_arg);
  347. char* methodArg_getTypeList(Arg* method_arg, char* buffs, size_t size);
  348. char* methodArg_getName(Arg* method_arg, char* buffs, size_t size);
  349. Arg* methodArg_setHostObj(Arg* method_arg, PikaObj* host_obj);
  350. Arg* methodArg_super(Arg* aThis, NativeProperty** p_prop);
  351. PikaObj* methodArg_getHostObj(Arg* method_arg);
  352. ByteCodeFrame* methodArg_getBytecodeFrame(Arg* method_arg);
  353. Method methodArg_getPtr(Arg* method_arg);
  354. VMParameters* obj_run(PikaObj* self, char* cmd);
  355. Arg* pika_runFunction0(Arg* functionArg);
  356. Arg* pika_runFunction1(Arg* methodArg, Arg* arg1);
  357. Arg* pika_runFunction2(Arg* methodArg, Arg* arg1, Arg* arg2);
  358. Arg* obj_runMethodArg0(PikaObj* self, Arg* methodArg);
  359. Arg* obj_runMethodArg1(PikaObj* self, Arg* methodArg, Arg* arg1);
  360. Arg* obj_runMethodArg2(PikaObj* self, Arg* methodArg, Arg* arg1, Arg* arg2);
  361. Arg* obj_runMethod0(PikaObj* self, char* methodName);
  362. Arg* obj_runMethod1(PikaObj* self, char* methodName, Arg* arg1);
  363. Arg* obj_runMethod2(PikaObj* self, char* methodName, Arg* arg1, Arg* arg2);
  364. PikaObj* New_PikaObj(Args* args);
  365. PikaObj* New_PikaObj_noGC(void);
  366. /* tools */
  367. int64_t fast_atoi(char* src);
  368. PIKA_RES fast_atoi_safe(char* src, int64_t* out);
  369. char* fast_itoa(char* buf, uint32_t val);
  370. /* shell */
  371. void pikaPythonShell(PikaObj* self);
  372. void pikaShellSetEcho(pika_bool enable_echo);
  373. enum shellCTRL { SHELL_CTRL_CONTINUE, SHELL_CTRL_EXIT };
  374. typedef struct ShellConfig ShellConfig;
  375. typedef enum shellCTRL (*sh_handler)(PikaObj*, char*, ShellConfig*);
  376. typedef char (*sh_getchar)(void);
  377. int shConfig_deinit(ShellConfig* self);
  378. #if PIKA_SHELL_FILTER_ENABLE
  379. typedef struct FilterFIFO {
  380. ByteQueue queue;
  381. uint8_t ignore_mask;
  382. uint8_t buffer[PIKA_SHELL_FILTER_FIFO_SIZE];
  383. } FilterFIFO;
  384. typedef struct FilterItem FilterItem;
  385. typedef pika_bool FilterMessageHandler(FilterItem* msg,
  386. PikaObj* self,
  387. ShellConfig* shell);
  388. struct FilterItem {
  389. FilterMessageHandler* handler;
  390. const uint8_t* message;
  391. uint16_t size;
  392. uint8_t is_visible : 1;
  393. uint8_t is_case_insensitive : 1;
  394. uint8_t : 6;
  395. uint8_t ignore_mask;
  396. uintptr_t target;
  397. };
  398. #endif
  399. typedef struct {
  400. int max_size;
  401. int current;
  402. int count;
  403. int last_offset;
  404. char** history;
  405. int cached_current;
  406. } ShellHistory;
  407. struct ShellConfig {
  408. #if PIKA_SHELL_FILTER_ENABLE
  409. FilterFIFO filter_fifo;
  410. FilterItem* messages;
  411. uint16_t message_count;
  412. uint16_t : 16; /* padding to suppress warning*/
  413. #endif
  414. char* prefix;
  415. sh_handler handler;
  416. void* context;
  417. char lineBuff[PIKA_LINE_BUFF_SIZE];
  418. size_t line_position;
  419. size_t line_curpos;
  420. char* blockBuffName;
  421. pika_bool inBlock;
  422. char lastChar;
  423. sh_getchar fn_getchar;
  424. uint8_t stat;
  425. #if PIKA_SHELL_HISTORY_ENABLE
  426. ShellHistory* history;
  427. #endif
  428. pika_bool no_echo;
  429. PikaObj* locals;
  430. PikaObj* globals;
  431. };
  432. #if PIKA_SHELL_HISTORY_ENABLE
  433. ShellHistory* shHistory_create(int max_size);
  434. void shHistory_destroy(ShellHistory* self);
  435. void shHistory_add(ShellHistory* self, char* command);
  436. void shHistory_setMaxSize(ShellHistory* self, int max_size);
  437. char* shHistory_get(ShellHistory* self, int index);
  438. char* shHistory_getPrev(ShellHistory* self);
  439. char* shHistory_getNext(ShellHistory* self);
  440. #endif
  441. void _do_pikaScriptShell(PikaObj* self, ShellConfig* cfg);
  442. void _temp__do_pikaScriptShell(PikaObj* self, ShellConfig* cfg);
  443. /*
  444. need implament :
  445. pika_platform_fopen()
  446. pika_platform_fwrite()
  447. pika_platform_fclose()
  448. */
  449. Method obj_getNativeMethod(PikaObj* self, char* method_name);
  450. PIKA_RES obj_runNativeMethod(PikaObj* self, char* method_name, Args* args);
  451. Arg* obj_newObjInPackage(NewFun newObjFun);
  452. /* A helper function to create a new tuple PikaObj and append the given
  453. * arguments (of type Arg*) to it. */
  454. PikaObj* _pika_tuple_new(int num_args, ...);
  455. /* A helper function to create a new list PikaObj and append the given
  456. * arguments (of type Arg*) to it. */
  457. PikaObj* _pika_list_new(int num_args, ...);
  458. PikaObj* _pika_dict_new(int num_args, ...);
  459. /* Macro to create a new tuple PikaObj with the given arguments (of type Arg*).
  460. */
  461. #define New_PikaTupleFromVarArgs(...) \
  462. _pika_tuple_new(sizeof((Arg*[]){__VA_ARGS__}) / sizeof(Arg*), __VA_ARGS__)
  463. /* Macro to create a new list PikaObj with the given arguments (of type Arg*).
  464. */
  465. #define New_PikaListFromVarArgs(...) \
  466. _pika_list_new(sizeof((Arg*[]){__VA_ARGS__}) / sizeof(Arg*), __VA_ARGS__)
  467. /* Macro to create a new dict PikaObj with the given arguments (of type
  468. * Arg*).
  469. */
  470. #define New_PikaDictFromVarArgs(...) \
  471. _pika_dict_new(sizeof((Arg*[]){__VA_ARGS__, NULL}) / sizeof(Arg*) - 1, \
  472. __VA_ARGS__)
  473. PikaObj* newNormalObj(NewFun newObjFun);
  474. Arg* arg_setRef(Arg* self, char* name, PikaObj* obj);
  475. Arg* arg_setObj(Arg* self, char* name, PikaObj* obj);
  476. Arg* arg_setWeakRef(Arg* self, char* name, PikaObj* obj);
  477. PikaObj* arg_getObj(Arg* self);
  478. pika_bool arg_isList(Arg* arg);
  479. pika_bool arg_isDict(Arg* arg);
  480. pika_bool arg_isTuple(Arg* arg);
  481. static inline void arg_setObjFlag(Arg* self, uint8_t flag) {
  482. if (!arg_isObject(self)) {
  483. return;
  484. }
  485. obj_setFlag((PikaObj*)arg_getPtr(self), flag);
  486. }
  487. static inline void arg_clearObjFlag(Arg* self, uint8_t flag) {
  488. if (!arg_isObject(self)) {
  489. return;
  490. }
  491. obj_clearFlag((PikaObj*)arg_getPtr(self), flag);
  492. }
  493. static inline Arg* arg_newObj(PikaObj* obj) {
  494. return arg_setObj(NULL, (char*)"", (obj));
  495. }
  496. static inline Arg* arg_newRef(PikaObj* obj) {
  497. return arg_setRef(NULL, (char*)"", (obj));
  498. }
  499. uint8_t* pika_getByteCodeFromModule(char* module_name);
  500. LibObj* pika_getLibObj(void);
  501. PikaObj* obj_importModuleWithByteCodeFrame(PikaObj* self,
  502. char* name,
  503. ByteCodeFrame* bytecode_frame);
  504. PikaObj* obj_importModuleWithByteCode(PikaObj* self,
  505. char* name,
  506. uint8_t* byteCode);
  507. int32_t obj_newObj(PikaObj* self,
  508. char* objName,
  509. char* className,
  510. NewFun newFunPtr);
  511. Arg* arg_newMetaObj(NewFun objPtr);
  512. PikaObj* obj_linkLibObj(PikaObj* self, LibObj* library);
  513. PikaObj* obj_linkLibrary(PikaObj* self, uint8_t* library_bytes);
  514. int obj_importModule(PikaObj* self, char* module_name);
  515. int32_t obj_newMetaObj(PikaObj* self, char* objName, NewFun newFunPtr);
  516. int32_t obj_newDirectObj(PikaObj* self, char* objName, NewFun newFunPtr);
  517. int32_t obj_newHostObj(PikaObj* self, char* objName);
  518. int obj_runModule(PikaObj* self, char* module_name);
  519. PikaObj* obj_runFile(PikaObj* self, char* file_name);
  520. PikaObj* obj_runSingleFile(PikaObj* self, char* file_name);
  521. char* obj_toStr(PikaObj* self);
  522. Arg* arg_newDirectObj(NewFun new_obj_fun);
  523. enum shellCTRL obj_runChar(PikaObj* self, char inputChar);
  524. #define PIKA_PYTHON_BEGIN
  525. #define PIKA_PYTHON(x)
  526. #define PIKA_PYTHON_END
  527. typedef PikaObj PikaEventListener;
  528. void pika_eventListener_registEventHandler(PikaEventListener* self,
  529. uintptr_t eventId,
  530. PikaObj* eventHandleObj);
  531. void pika_eventListener_registEventCallback(PikaEventListener* listener_p,
  532. uintptr_t eventId,
  533. Arg* eventCallback);
  534. void pika_eventListener_removeEvent(PikaEventListener* self, uintptr_t eventId);
  535. PIKA_RES _do_pika_eventListener_send(PikaEventListener* self,
  536. uintptr_t eventId,
  537. Arg* eventData,
  538. int eventSignal,
  539. pika_bool pickupWhenNoVM);
  540. PIKA_RES pika_eventListener_sendSignal(PikaEventListener* self,
  541. uintptr_t eventId,
  542. int eventSignal);
  543. Arg* pika_eventListener_sendSignalAwaitResult(PikaEventListener* self,
  544. uintptr_t eventId,
  545. int eventSignal);
  546. PIKA_RES pika_eventListener_send(PikaEventListener* self,
  547. uintptr_t eventId,
  548. Arg* eventData);
  549. Arg* pika_eventListener_syncSendAwaitResult(PikaEventListener* self,
  550. uintptr_t eventId,
  551. Arg* eventData);
  552. PIKA_RES pika_eventListener_syncSend(PikaEventListener* self,
  553. uintptr_t eventId,
  554. Arg* eventData);
  555. PIKA_RES pika_eventListener_syncSendSignal(PikaEventListener* self,
  556. uintptr_t eventId,
  557. int eventSignal);
  558. Arg* pika_eventListener_syncSendSignalAwaitResult(PikaEventListener* self,
  559. uintptr_t eventId,
  560. int eventSignal);
  561. void pika_eventListener_init(PikaEventListener** p_self);
  562. void pika_eventListener_deinit(PikaEventListener** p_self);
  563. PikaObj* methodArg_getDefContext(Arg* method_arg);
  564. int obj_linkLibraryFile(PikaObj* self, char* input_file_name);
  565. NewFun obj_getClass(PikaObj* obj);
  566. void pika_printVersion(void);
  567. void pika_getVersion(char* buff);
  568. void* obj_getStruct(PikaObj* self, char* name);
  569. static inline void obj_refcntDec(PikaObj* self) {
  570. self->refcnt--;
  571. }
  572. static inline void obj_refcntInc(PikaObj* self) {
  573. self->refcnt++;
  574. }
  575. static inline uint8_t obj_refcntNow(PikaObj* self) {
  576. return self->refcnt;
  577. }
  578. #define obj_setStruct(PikaObj_p_self, char_p_name, struct_) \
  579. args_setStruct(((PikaObj_p_self)->list), char_p_name, struct_)
  580. #define PIKA_ERR_STRING_SYNTAX_ERROR \
  581. ANSI_COLOR_RED "SyntaxError: invalid syntax" ANSI_COLOR_RESET
  582. #define ABSTRACT_METHOD_NEED_OVERRIDE_ERROR(_) \
  583. obj_setErrorCode(self, 1); \
  584. obj_setSysOut( \
  585. self, \
  586. ANSI_COLOR_RED \
  587. "Error: abstract method `%s()` need override." ANSI_COLOR_RESET, \
  588. __FUNCTION__)
  589. char* obj_cacheStr(PikaObj* self, char* str);
  590. PikaObj* _arg_to_obj(Arg* self, pika_bool* pIsTemp);
  591. Arg* arg_toStrArg(Arg* arg);
  592. #define PIKASCRIPT_VERSION_TO_NUM(majer, minor, micro) \
  593. majer * 100 * 100 + minor * 100 + micro
  594. #define PIKASCRIPT_VERSION_NUM \
  595. PIKASCRIPT_VERSION_TO_NUM(PIKA_VERSION_MAJOR, PIKA_VERSION_MINOR, \
  596. PIKA_VERSION_MICRO)
  597. #define PIKASCRIPT_VERSION_REQUIRE_MINIMUN(majer, minor, micro) \
  598. (PIKASCRIPT_VERSION_NUM >= PIKASCRIPT_VERSION_TO_NUM(majer, minor, micro))
  599. /* [example]
  600. const MethodProp floatMethod = {
  601. .ptr = (void*)builtins_floatMethod,
  602. .bytecode_frame = NULL,
  603. .def_context = NULL,
  604. .declareation = "float(arg)",
  605. .type_list = "arg",
  606. .name = "float",
  607. };
  608. */
  609. #if !PIKA_NANO_ENABLE
  610. #define method_typedef(_method, _name, _typelist) \
  611. const MethodPropNative _method##Prop = { \
  612. .ptr = (void*)_method##Method, \
  613. .type_list = _typelist, \
  614. .name = _name, \
  615. };
  616. #else
  617. #define method_typedef(_method, _name, _typelist) \
  618. const MethodPropNative _method##Prop = { \
  619. .ptr = (void*)_method##Method, \
  620. .type_list = _typelist, \
  621. };
  622. #endif
  623. #if PIKA_ARG_CACHE_ENABLE
  624. #define _ARG_HEAP_SIZE_DEF() .heap_size = 0,
  625. #else
  626. #define _ARG_HEAP_SIZE_DEF()
  627. #endif
  628. #if PIKA_KERNAL_DEBUG_ENABLE
  629. #define _ARG_VALUE_DEF(_method) \
  630. .name = (char*)&_method##Prop, .value = (_arg_value*)&_method##Prop, \
  631. .str = (char*)&_method##Prop, .bytes = (uint8_t*)&_method##Prop, \
  632. ._name_buff = ""
  633. #else
  634. #define _ARG_VALUE_DEF(_method)
  635. #endif
  636. /* clang-format off */
  637. #define _method_def(_method, _hash, _type) \
  638. { \
  639. ._ = \
  640. { \
  641. .buffer = (uint8_t*)&_method##Prop \
  642. }, \
  643. .size = sizeof(MethodPropNative), \
  644. _ARG_HEAP_SIZE_DEF() \
  645. .type = _type, \
  646. .flag = 0, \
  647. .name_hash = _hash, \
  648. _ARG_VALUE_DEF(_method) \
  649. }
  650. #if defined(_WIN32) || \
  651. (defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 6000000)) || defined(__IAR_SYSTEMS_ICC__)
  652. #define __BEFORE_MOETHOD_DEF \
  653. { \
  654. ._ = \
  655. { \
  656. .buffer = NULL \
  657. }, \
  658. .size = 0, \
  659. .type = ARG_TYPE_NONE, \
  660. .flag = 0, \
  661. .name_hash = 0 \
  662. },
  663. #else
  664. #define __BEFORE_MOETHOD_DEF
  665. #endif
  666. /* clang-format on */
  667. #define method_def(_method, _hash) \
  668. _method_def(_method, _hash, ARG_TYPE_METHOD_NATIVE)
  669. #define constructor_def(_method, _hash) \
  670. _method_def(_method, _hash, ARG_TYPE_METHOD_NATIVE_CONSTRUCTOR)
  671. #define class_def(_class) const ConstArg _class##Collect[] =
  672. #define class_inhert(_class, _super) \
  673. extern const NativeProperty _super##NativeProp; \
  674. const NativeProperty _class##NativeProp = { \
  675. .super = &_super##NativeProp, \
  676. .methodGroup = (Arg*)_class##Collect, \
  677. .methodGroupCount = \
  678. sizeof(_class##Collect) / sizeof(_class##Collect[0]), \
  679. }
  680. #define pika_class(_method) _method##NativeProp
  681. void _obj_updateProxyFlag(PikaObj* self);
  682. #define obj_setClass(_self, _method) \
  683. obj_setPtr((_self), "@p_", (void*)&pika_class(_method)); \
  684. _obj_updateProxyFlag((_self))
  685. Arg* _obj_getPropArg(PikaObj* obj, char* name);
  686. Arg* __eventListener_runEvent(PikaEventListener* lisener,
  687. uintptr_t eventId,
  688. Arg* eventData);
  689. void obj_printModules(PikaObj* self);
  690. #if PIKA_DEBUG_ENABLE
  691. #define pika_debug(fmt, ...) \
  692. pika_platform_printf(ANSI_COLOR_GREEN "[PikaDBG] " fmt \
  693. "\r\n" ANSI_COLOR_RESET, \
  694. ##__VA_ARGS__)
  695. #define pika_debug_raw(fmt, ...) \
  696. pika_platform_printf(ANSI_COLOR_GREEN fmt ANSI_COLOR_RESET, ##__VA_ARGS__)
  697. #else
  698. #define pika_debug(...) \
  699. do { \
  700. } while (0)
  701. #define pika_debug_raw(...) \
  702. do { \
  703. } while (0)
  704. #endif
  705. void pika_debug_bytes(uint8_t* buff, size_t len);
  706. #define pika_assert_arg_alive(__arg) \
  707. do { \
  708. if (NULL != (__arg)) { \
  709. if (arg_isObject((__arg))) { \
  710. pika_assert(obj_checkAlive(arg_getPtr((__arg)))); \
  711. } \
  712. } \
  713. } while (0)
  714. #define pika_assert_obj_alive(__obj) \
  715. do { \
  716. pika_assert(obj_checkAlive((__obj))); \
  717. } while (0)
  718. void obj_appendGcChain(PikaObj* self);
  719. void obj_removeGcChain(PikaObj* self);
  720. void obj_enableGC(PikaObj* self);
  721. pika_bool obj_checkAlive(PikaObj* self);
  722. void obj_setName(PikaObj* self, char* name);
  723. void pikaGC_mark(void);
  724. void pikaGC_markDump(void);
  725. void pikaGC_lock(void);
  726. void pikaGC_unlock(void);
  727. pika_bool pikaGC_islock(void);
  728. uint32_t pikaGC_count(void);
  729. uint32_t pikaGC_countMarked(void);
  730. uint32_t pikaGC_markSweep(void);
  731. uint32_t pikaGC_printFreeList(void);
  732. int pika_GIL_EXIT(void);
  733. int pika_GIL_ENTER(void);
  734. int pika_GIL_getBareLock(void);
  735. int32_t pika_debug_find_break_point_pc(char* pyFile, uint32_t pyLine);
  736. typedef PikaObj PikaList;
  737. typedef PikaObj PikaTuple;
  738. typedef PikaObj PikaDict;
  739. pika_bool pika_GIL_isInit(void);
  740. int pika_GIL_deinit(void);
  741. pika_bool _bytes_contains(Arg* self, Arg* others);
  742. /* builtins */
  743. PikaObj* New_builtins(Args* args);
  744. void pika_sleep_ms(uint32_t ms);
  745. PIKA_RES _transeBool(Arg* arg, pika_bool* res);
  746. #define _OBJ2LIST(_obj) ((Args*)obj_getPtr((_obj), "list"))
  747. #define _OBJ2DICT(_obj) ((Args*)obj_getPtr((_obj), "dict"))
  748. #define _OBJ2KEYS(_obj) ((Args*)obj_getPtr((_obj), "_keys"))
  749. /* list api */
  750. PikaList* New_PikaList(void);
  751. #define New_PikaListFrom New_PikaListFromVarArgs
  752. PIKA_RES pikaList_append(PikaList* self, Arg* arg);
  753. PIKA_RES pikaList_set(PikaList* self, int index, Arg* arg);
  754. void pikaList_init(PikaObj* self);
  755. int pikaList_getInt(PikaList* self, int index);
  756. pika_bool pikaList_getBool(PikaList* self, int index);
  757. pika_bool pikaTuple_getBool(PikaTuple* self, int index);
  758. pika_float pikaList_getFloat(PikaList* self, int index);
  759. char* pikaList_getStr(PikaList* self, int index);
  760. void* pikaList_getPtr(PikaList* self, int index);
  761. PikaObj* pikaList_getObj(PikaList* self, int index);
  762. Arg* pikaList_get(PikaList* self, int index);
  763. #define pikaList_getArg pikaList_get
  764. size_t pikaList_getSize(PikaList* self);
  765. void pikaList_reverse(PikaList* self);
  766. PIKA_RES pikaList_insert(PikaList* self, int index, Arg* arg);
  767. Arg* pikaList_pop(PikaList* list);
  768. Arg* pikaList_pop_withIndex(PikaList* list, int index);
  769. PIKA_RES pikaList_remove(PikaList* list, Arg* arg);
  770. void pikaList_deinit(PikaList* self);
  771. ArgType pikaList_getType(PikaList* self, int index);
  772. int32_t pikaList_forEach(PikaObj* self,
  773. int32_t (*eachHandle)(PikaObj* self,
  774. int itemIndex,
  775. Arg* itemEach,
  776. void* context),
  777. void* context);
  778. /* tuple api */
  779. PikaTuple* New_PikaTuple(void);
  780. #define New_PikaTupleFrom New_PikaTupleFromVarArgs
  781. #define pikaTuple_forEach pikaList_forEach
  782. void pikaTuple_deinit(PikaTuple* self);
  783. Arg* pikaTuple_getArg(PikaTuple* self, int index);
  784. #define pikaTuple_get pikaTuple_getArg
  785. size_t pikaTuple_getSize(PikaTuple* self);
  786. int64_t pikaTuple_getInt(PikaTuple* self, int index);
  787. pika_float pikaTuple_getFloat(PikaTuple* self, int index);
  788. char* pikaTuple_getStr(PikaTuple* self, int index);
  789. void* pikaTuple_getPtr(PikaTuple* self, int index);
  790. ArgType pikaTuple_getType(PikaTuple* self, int index);
  791. /* dict api */
  792. PikaDict* New_PikaDict(void);
  793. #define New_PikaDictFrom New_PikaDictFromVarArgs
  794. PIKA_RES _pikaDict_setVal(PikaDict* self, Arg* val);
  795. PIKA_RES pikaDict_setInt(PikaDict* self, char* name, int64_t val);
  796. pika_bool pikaDict_setBool(PikaDict* self, char* name, pika_bool val);
  797. PIKA_RES pikaDict_setFloat(PikaDict* self, char* name, pika_float val);
  798. PIKA_RES pikaDict_setStr(PikaDict* self, char* name, char* val);
  799. PIKA_RES pikaDict_setPtr(PikaDict* self, char* name, void* val);
  800. PIKA_RES pikaDict_set(PikaDict* self, char* name, Arg* val);
  801. #define pikaDict_setArg pikaDict_set
  802. PIKA_RES pikaDict_removeArg(PikaDict* self, Arg* val);
  803. PIKA_RES pikaDict_reverse(PikaDict* self);
  804. PIKA_RES pikaDict_setBytes(PikaDict* self,
  805. char* name,
  806. uint8_t* val,
  807. size_t size);
  808. int64_t pikaDict_getInt(PikaDict* self, char* name);
  809. pika_bool pikaDict_getBool(PikaDict* self, char* name);
  810. pika_float pikaDict_getFloat(PikaDict* self, char* name);
  811. char* pikaDict_getStr(PikaDict* self, char* name);
  812. void* pikaDict_getPtr(PikaDict* self, char* name);
  813. PikaObj* pikaDict_getObj(PikaDict* self, char* name);
  814. int pikaDict_getSize(PikaDict* self);
  815. Arg* pikaDict_getArgByindex(PikaDict* self, int index);
  816. Arg* pikaDict_get(PikaDict* self, char* name);
  817. #define pikaDict_getArg pikaDict_get
  818. int32_t pikaDict_isArgExist(PikaDict* self, char* name);
  819. uint8_t* pikaDict_getBytes(PikaDict* self, char* name);
  820. ArgType pikaDict_getType(PikaDict* self, char* name);
  821. size_t pikaDict_getBytesSize(PikaDict* self, char* name);
  822. int32_t pikaDict_forEach(PikaObj* self,
  823. int32_t (*eachHandle)(PikaObj* self,
  824. Arg* keyEach,
  825. Arg* valEach,
  826. void* context),
  827. void* context);
  828. void pikaDict_init(PikaObj* self);
  829. void pikaDict_deinit(PikaDict* self);
  830. PikaTuple* args_getTuple(Args* self, char* name);
  831. PikaDict* args_getDict(Args* self, char* name);
  832. char* strsFormatList(Args* out_buffs, char* fmt, PikaList* list);
  833. PIKA_RES obj_setEventCallback(PikaObj* self,
  834. uintptr_t eventId,
  835. Arg* eventCallback,
  836. PikaEventListener* eventListener);
  837. #if 1
  838. #define _RETURN_WHEN_NOT_ZERO(_stmt_, _ret_) \
  839. do { \
  840. if (0 != (_stmt_)) { \
  841. return _ret_; \
  842. } \
  843. } while (0)
  844. #else
  845. #define _RETURN_WHEN_NOT_ZERO(_stmt_, _ret_) (_stmt_)
  846. #endif
  847. #endif
  848. #ifdef __cplusplus
  849. }
  850. #endif