finsh_compiler.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2010-03-22 Bernard first version
  9. */
  10. #include <finsh.h>
  11. #include "finsh_node.h"
  12. #include "finsh_error.h"
  13. #include "finsh_var.h"
  14. #include "finsh_ops.h"
  15. union finsh_value* finsh_compile_sp; /* stack pointer */
  16. uint8_t* finsh_compile_pc; /* PC */
  17. #define finsh_code_byte(x) do { *finsh_compile_pc = (x); finsh_compile_pc ++; } while(0)
  18. #define finsh_code_word(x) do { FINSH_SET16(finsh_compile_pc, x); finsh_compile_pc +=2; } while(0)
  19. #define finsh_code_dword(x) do { FINSH_SET32(finsh_compile_pc, x); finsh_compile_pc +=4; } while(0)
  20. static int finsh_compile(struct finsh_node* node)
  21. {
  22. if (node != NULL)
  23. {
  24. /* compile child node */
  25. if (finsh_node_child(node) != NULL)
  26. finsh_compile(finsh_node_child(node));
  27. /* compile current node */
  28. switch (node->node_type)
  29. {
  30. case FINSH_NODE_ID:
  31. {
  32. /* identifier::syscall */
  33. if (node->idtype & FINSH_IDTYPE_SYSCALL)
  34. {
  35. /* load address */
  36. finsh_code_byte(FINSH_OP_LD_DWORD);
  37. finsh_code_dword((long)node->id.syscall->func);
  38. }
  39. /* identifier::sysvar */
  40. else if (node->idtype & FINSH_IDTYPE_SYSVAR)
  41. {
  42. struct finsh_sysvar* sysvar;
  43. sysvar = node->id.sysvar;
  44. if (sysvar != NULL)
  45. {
  46. switch (sysvar->type)
  47. {
  48. case finsh_type_char:
  49. case finsh_type_uchar:
  50. if (node->idtype & FINSH_IDTYPE_ADDRESS)
  51. {
  52. /* load address */
  53. finsh_code_byte(FINSH_OP_LD_DWORD);
  54. }
  55. else
  56. {
  57. /* load value */
  58. finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
  59. }
  60. finsh_code_dword((long)(sysvar->var));
  61. break;
  62. case finsh_type_short:
  63. case finsh_type_ushort:
  64. if (node->idtype & FINSH_IDTYPE_ADDRESS)
  65. {
  66. /* load address */
  67. finsh_code_byte(FINSH_OP_LD_DWORD);
  68. }
  69. else
  70. {
  71. /* load value */
  72. finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
  73. }
  74. finsh_code_dword((long)(sysvar->var));
  75. break;
  76. case finsh_type_int:
  77. case finsh_type_uint:
  78. case finsh_type_long:
  79. case finsh_type_ulong:
  80. case finsh_type_charp:
  81. case finsh_type_shortp:
  82. case finsh_type_intp:
  83. case finsh_type_longp:
  84. if (node->idtype & FINSH_IDTYPE_ADDRESS)
  85. {
  86. /* load address */
  87. finsh_code_byte(FINSH_OP_LD_DWORD);
  88. }
  89. else
  90. {
  91. /* load value */
  92. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
  93. }
  94. finsh_code_dword((long)(sysvar->var));
  95. break;
  96. }
  97. }
  98. }
  99. /* identifier::var */
  100. else
  101. {
  102. struct finsh_var* var;
  103. var = node->id.var;
  104. if (var != NULL)
  105. {
  106. switch (var->type)
  107. {
  108. case finsh_type_char:
  109. case finsh_type_uchar:
  110. if (node->idtype & FINSH_IDTYPE_ADDRESS)
  111. {
  112. /* load address */
  113. finsh_code_byte(FINSH_OP_LD_DWORD);
  114. }
  115. else
  116. {
  117. /* load value */
  118. finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
  119. }
  120. finsh_code_dword((long)&(var->value.char_value));
  121. break;
  122. case finsh_type_short:
  123. case finsh_type_ushort:
  124. if (node->idtype & FINSH_IDTYPE_ADDRESS)
  125. {
  126. /* load address */
  127. finsh_code_byte(FINSH_OP_LD_DWORD);
  128. }
  129. else
  130. {
  131. /* load value */
  132. finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
  133. }
  134. finsh_code_dword((long)&(var->value.short_value));
  135. break;
  136. case finsh_type_int:
  137. case finsh_type_uint:
  138. case finsh_type_long:
  139. case finsh_type_ulong:
  140. case finsh_type_charp:
  141. case finsh_type_shortp:
  142. case finsh_type_intp:
  143. case finsh_type_longp:
  144. if (node->idtype & FINSH_IDTYPE_ADDRESS)
  145. {
  146. /* load address */
  147. finsh_code_byte(FINSH_OP_LD_DWORD);
  148. }
  149. else
  150. {
  151. /* load value */
  152. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
  153. }
  154. finsh_code_dword((long)&(var->value.long_value));
  155. break;
  156. }
  157. }
  158. }
  159. }
  160. break;
  161. /* load const */
  162. case FINSH_NODE_VALUE_CHAR:
  163. finsh_code_byte(FINSH_OP_LD_BYTE);
  164. finsh_code_byte(node->value.char_value);
  165. break;
  166. case FINSH_NODE_VALUE_INT:
  167. case FINSH_NODE_VALUE_LONG:
  168. finsh_code_byte(FINSH_OP_LD_DWORD);
  169. finsh_code_dword(node->value.long_value);
  170. break;
  171. case FINSH_NODE_VALUE_NULL:
  172. case FINSH_NODE_VALUE_STRING:
  173. finsh_code_byte(FINSH_OP_LD_DWORD);
  174. finsh_code_dword((uint32_t)node->value.ptr);
  175. break;
  176. /* arithmetic operation */
  177. case FINSH_NODE_SYS_ADD:
  178. if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_ADD_BYTE);
  179. else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_ADD_WORD);
  180. else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_ADD_DWORD);
  181. break;
  182. case FINSH_NODE_SYS_SUB:
  183. if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_SUB_BYTE);
  184. else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_SUB_WORD);
  185. else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_SUB_DWORD);
  186. break;
  187. case FINSH_NODE_SYS_MUL:
  188. if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_MUL_BYTE);
  189. else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_MUL_WORD);
  190. else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_MUL_DWORD);
  191. break;
  192. case FINSH_NODE_SYS_DIV:
  193. if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_DIV_BYTE);
  194. else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_DIV_WORD);
  195. else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_DIV_DWORD);
  196. break;
  197. case FINSH_NODE_SYS_MOD:
  198. if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_MOD_BYTE);
  199. else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_MOD_WORD);
  200. else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_MOD_DWORD);
  201. break;
  202. /* bit operation */
  203. case FINSH_NODE_SYS_AND:
  204. if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_AND_BYTE);
  205. else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_AND_WORD);
  206. else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_AND_DWORD);
  207. break;
  208. case FINSH_NODE_SYS_OR:
  209. if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_OR_BYTE);
  210. else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_OR_WORD);
  211. else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_OR_DWORD);
  212. break;
  213. case FINSH_NODE_SYS_XOR:
  214. if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_XOR_BYTE);
  215. else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_XOR_WORD);
  216. else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_XOR_DWORD);
  217. break;
  218. case FINSH_NODE_SYS_BITWISE:
  219. if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_BITWISE_BYTE);
  220. else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_BITWISE_WORD);
  221. else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_BITWISE_DWORD);
  222. break;
  223. case FINSH_NODE_SYS_SHL:
  224. if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_SHL_BYTE);
  225. else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_SHL_WORD);
  226. else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_SHL_DWORD);
  227. break;
  228. case FINSH_NODE_SYS_SHR:
  229. if (node->data_type == FINSH_DATA_TYPE_BYTE) finsh_code_byte(FINSH_OP_SHR_BYTE);
  230. else if (node->data_type == FINSH_DATA_TYPE_WORD) finsh_code_byte(FINSH_OP_SHR_WORD);
  231. else if (node->data_type == FINSH_DATA_TYPE_DWORD) finsh_code_byte(FINSH_OP_SHR_DWORD);
  232. break;
  233. /* syscall */
  234. case FINSH_NODE_SYS_FUNC:
  235. {
  236. int parameters;
  237. struct finsh_node* sibling;
  238. parameters = 0;
  239. if (finsh_node_child(node) != NULL)
  240. {
  241. sibling = finsh_node_sibling(finsh_node_child(node));
  242. while (sibling != NULL)
  243. {
  244. parameters ++;
  245. sibling = finsh_node_sibling(sibling);
  246. }
  247. /* load address of function */
  248. // finsh_code_dword((long)&(node->var->value.ptr));
  249. /* syscall parameters */
  250. finsh_code_byte(FINSH_OP_SYSCALL);
  251. finsh_code_byte(parameters);
  252. }
  253. }
  254. break;
  255. /* assign expression */
  256. case FINSH_NODE_SYS_ASSIGN:
  257. if (finsh_node_child(node) && finsh_node_child(node)->node_type == FINSH_NODE_ID)
  258. {
  259. switch (finsh_node_child(node)->data_type)
  260. {
  261. case FINSH_DATA_TYPE_BYTE:
  262. finsh_code_byte(FINSH_OP_ST_BYTE);
  263. /* load value again */
  264. finsh_code_byte(FINSH_OP_LD_VALUE_BYTE_STACK);
  265. break;
  266. case FINSH_DATA_TYPE_WORD:
  267. finsh_code_byte(FINSH_OP_ST_WORD);
  268. /* load value again */
  269. finsh_code_byte(FINSH_OP_LD_VALUE_WORD_STACK);
  270. break;
  271. case FINSH_DATA_TYPE_DWORD:
  272. finsh_code_byte(FINSH_OP_ST_DWORD);
  273. /* load value again */
  274. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK);
  275. break;
  276. default:
  277. finsh_error_set(FINSH_ERROR_UNKNOWN_TYPE);
  278. }
  279. }
  280. else if (finsh_node_child(node)->node_type == FINSH_NODE_SYS_GETVALUE)
  281. {
  282. switch ((finsh_node_child(node)->data_type) & 0x0F)
  283. {
  284. case FINSH_DATA_TYPE_BYTE:
  285. finsh_code_byte(FINSH_OP_ST_BYTE);
  286. /* load value again */
  287. finsh_code_byte(FINSH_OP_LD_VALUE_BYTE_STACK);
  288. break;
  289. case FINSH_DATA_TYPE_WORD:
  290. finsh_code_byte(FINSH_OP_ST_WORD);
  291. /* load value again */
  292. finsh_code_byte(FINSH_OP_LD_VALUE_WORD_STACK);
  293. break;
  294. case FINSH_DATA_TYPE_DWORD:
  295. finsh_code_byte(FINSH_OP_ST_DWORD);
  296. /* load value again */
  297. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK);
  298. break;
  299. default:
  300. finsh_error_set(FINSH_ERROR_UNKNOWN_TYPE);
  301. }
  302. }
  303. break;
  304. /* pre-increase */
  305. case FINSH_NODE_SYS_PREINC:
  306. if (finsh_node_child(node) && finsh_node_child(node)->node_type == FINSH_NODE_ID)
  307. {
  308. struct finsh_var* var;
  309. var = finsh_node_child(node)->id.var;
  310. /* ld_dword &id */
  311. // finsh_code_byte(FINSH_OP_LD_DWORD);
  312. switch (node->data_type)
  313. {
  314. case FINSH_DATA_TYPE_BYTE:
  315. /* address */
  316. // finsh_code_dword((long)&(var->value.char_value));
  317. /* ld_value_byte &id */
  318. finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
  319. finsh_code_dword((long)&(var->value.char_value));
  320. /* ld_byte 1 */
  321. finsh_code_byte(FINSH_OP_LD_BYTE);
  322. finsh_code_byte(1);
  323. /* add_byte */
  324. finsh_code_byte(FINSH_OP_ADD_BYTE);
  325. /* st_byte */
  326. finsh_code_byte(FINSH_OP_ST_BYTE);
  327. /* load value again */
  328. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK);
  329. break;
  330. case FINSH_DATA_TYPE_WORD:
  331. /* address */
  332. // finsh_code_dword((long)&(var->value.short_value));
  333. /* ld_value_word &id */
  334. finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
  335. finsh_code_dword((long)&(var->value.short_value));
  336. /* ld_word 1 */
  337. finsh_code_byte(FINSH_OP_LD_WORD);
  338. finsh_code_word(1);
  339. /* add_word */
  340. finsh_code_byte(FINSH_OP_ADD_WORD);
  341. /* st_word */
  342. finsh_code_byte(FINSH_OP_ST_WORD);
  343. /* load value again */
  344. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK);
  345. break;
  346. case FINSH_DATA_TYPE_DWORD:
  347. /* address */
  348. // finsh_code_dword((long)&(var->value.long_value));
  349. /* ld_dword &id */
  350. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
  351. finsh_code_dword((long)&(var->value.long_value));
  352. /* ld_dword 1 */
  353. finsh_code_byte(FINSH_OP_LD_DWORD);
  354. finsh_code_dword(1);
  355. /* add_dword */
  356. finsh_code_byte(FINSH_OP_ADD_DWORD);
  357. /* st_dword */
  358. finsh_code_byte(FINSH_OP_ST_DWORD);
  359. /* load value again */
  360. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK);
  361. break;
  362. }
  363. }
  364. break;
  365. /* pre-decrease */
  366. case FINSH_NODE_SYS_PREDEC:
  367. if (finsh_node_child(node) && finsh_node_child(node)->node_type == FINSH_NODE_ID)
  368. {
  369. struct finsh_var* var;
  370. var = finsh_node_child(node)->id.var;
  371. /* ld_dword &id */
  372. // finsh_code_byte(FINSH_OP_LD_DWORD);
  373. switch (node->data_type)
  374. {
  375. case FINSH_DATA_TYPE_BYTE:
  376. /* address */
  377. // finsh_code_dword((long)&(var->value.char_value));
  378. /* ld_value_byte &id */
  379. finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
  380. finsh_code_dword((long)&(var->value.char_value));
  381. /* ld_byte 1 */
  382. finsh_code_byte(FINSH_OP_LD_BYTE);
  383. finsh_code_byte(1);
  384. /* add_byte */
  385. finsh_code_byte(FINSH_OP_SUB_BYTE);
  386. /* st_byte */
  387. finsh_code_byte(FINSH_OP_ST_BYTE);
  388. /* load value again */
  389. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK);
  390. break;
  391. case FINSH_DATA_TYPE_WORD:
  392. /* address */
  393. // finsh_code_dword((long)&(var->value.short_value));
  394. /* ld_value_word &id */
  395. finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
  396. finsh_code_dword((long)&(var->value.short_value));
  397. /* ld_word 1 */
  398. finsh_code_byte(FINSH_OP_LD_WORD);
  399. finsh_code_word(1);
  400. /* add_word */
  401. finsh_code_byte(FINSH_OP_SUB_WORD);
  402. /* st_word */
  403. finsh_code_byte(FINSH_OP_ST_WORD);
  404. /* load value again */
  405. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK);
  406. break;
  407. case FINSH_DATA_TYPE_DWORD:
  408. /* address */
  409. // finsh_code_dword((long)&(var->value.long_value));
  410. /* ld_dword &id */
  411. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
  412. finsh_code_dword((long)&(var->value.long_value));
  413. /* ld_dword 1 */
  414. finsh_code_byte(FINSH_OP_LD_DWORD);
  415. finsh_code_dword(1);
  416. /* add_dword */
  417. finsh_code_byte(FINSH_OP_SUB_DWORD);
  418. /* st_dword */
  419. finsh_code_byte(FINSH_OP_ST_DWORD);
  420. /* load value again */
  421. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK);
  422. break;
  423. }
  424. }
  425. break;
  426. /* increase */
  427. case FINSH_NODE_SYS_INC:
  428. if (finsh_node_child(node) && finsh_node_child(node)->node_type == FINSH_NODE_ID)
  429. {
  430. struct finsh_var* var;
  431. var = finsh_node_child(node)->id.var;
  432. switch (node->data_type)
  433. {
  434. case FINSH_DATA_TYPE_BYTE:
  435. /* ld_value_byte &id */
  436. // finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
  437. // finsh_code_dword((long)&(var->value.char_value));
  438. /* ld_dword &id */
  439. finsh_code_byte(FINSH_OP_LD_DWORD);
  440. finsh_code_dword((long)&(var->value.char_value));
  441. /* ld_value_byte &id */
  442. finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
  443. finsh_code_dword((long)&(var->value.char_value));
  444. /* ld_byte 1 */
  445. finsh_code_byte(FINSH_OP_LD_BYTE);
  446. finsh_code_byte(1);
  447. /* add_byte */
  448. finsh_code_byte(FINSH_OP_ADD_BYTE);
  449. /* get byte */
  450. finsh_code_byte(FINSH_OP_ST_BYTE);
  451. /* pop */
  452. finsh_code_byte(FINSH_OP_POP);
  453. break;
  454. case FINSH_DATA_TYPE_WORD:
  455. /* ld_value_word &id */
  456. // finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
  457. // finsh_code_dword((long)&(var->value.short_value));
  458. /* ld_dword &id */
  459. finsh_code_byte(FINSH_OP_LD_DWORD);
  460. finsh_code_dword((long)&(var->value.short_value));
  461. /* ld_value_word &id */
  462. finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
  463. finsh_code_dword((long)&(var->value.short_value));
  464. /* ld_word 1 */
  465. finsh_code_byte(FINSH_OP_LD_WORD);
  466. finsh_code_word(1);
  467. /* add_byte */
  468. finsh_code_byte(FINSH_OP_ADD_WORD);
  469. /* get byte */
  470. finsh_code_byte(FINSH_OP_ST_WORD);
  471. /* pop */
  472. finsh_code_byte(FINSH_OP_POP);
  473. break;
  474. case FINSH_DATA_TYPE_DWORD:
  475. /* ld_value_dword &id */
  476. // finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
  477. // finsh_code_dword((long)&(var->value.long_value));
  478. /* ld_dword &id */
  479. finsh_code_byte(FINSH_OP_LD_DWORD);
  480. finsh_code_dword((long)&(var->value.long_value));
  481. /* ld_value_dword &id */
  482. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
  483. finsh_code_dword((long)&(var->value.long_value));
  484. /* ld_dword 1 */
  485. finsh_code_byte(FINSH_OP_LD_DWORD);
  486. finsh_code_dword(1);
  487. /* add_byte */
  488. finsh_code_byte(FINSH_OP_ADD_DWORD);
  489. /* get byte */
  490. finsh_code_byte(FINSH_OP_ST_DWORD);
  491. /* pop */
  492. finsh_code_byte(FINSH_OP_POP);
  493. break;
  494. }
  495. }
  496. break;
  497. /* decrease */
  498. case FINSH_NODE_SYS_DEC:
  499. if (finsh_node_child(node) && finsh_node_child(node)->node_type == FINSH_NODE_ID)
  500. {
  501. struct finsh_var* var;
  502. var = finsh_node_child(node)->id.var;
  503. switch (node->data_type)
  504. {
  505. case FINSH_DATA_TYPE_BYTE:
  506. /* ld_value_byte &id */
  507. // finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
  508. // finsh_code_dword((long)&(var->value.char_value));
  509. /* ld_dword &id */
  510. finsh_code_byte(FINSH_OP_LD_DWORD);
  511. finsh_code_dword((long)&(var->value.char_value));
  512. /* ld_value_byte &id */
  513. finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
  514. finsh_code_dword((long)&(var->value.char_value));
  515. /* ld_byte 1 */
  516. finsh_code_byte(FINSH_OP_LD_BYTE);
  517. finsh_code_byte(1);
  518. /* add_byte */
  519. finsh_code_byte(FINSH_OP_SUB_BYTE);
  520. /* get byte */
  521. finsh_code_byte(FINSH_OP_ST_BYTE);
  522. /* pop */
  523. finsh_code_byte(FINSH_OP_POP);
  524. break;
  525. case FINSH_DATA_TYPE_WORD:
  526. /* ld_value_word &id */
  527. // finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
  528. // finsh_code_dword((long)&(var->value.short_value));
  529. /* ld_dword &id */
  530. finsh_code_byte(FINSH_OP_LD_DWORD);
  531. finsh_code_dword((long)&(var->value.short_value));
  532. /* ld_value_word &id */
  533. finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
  534. finsh_code_dword((long)&(var->value.short_value));
  535. /* ld_word 1 */
  536. finsh_code_byte(FINSH_OP_LD_WORD);
  537. finsh_code_word(1);
  538. /* add_byte */
  539. finsh_code_byte(FINSH_OP_SUB_WORD);
  540. /* get byte */
  541. finsh_code_byte(FINSH_OP_ST_WORD);
  542. /* pop */
  543. finsh_code_byte(FINSH_OP_POP);
  544. break;
  545. case FINSH_DATA_TYPE_DWORD:
  546. /* ld_value_dword &id */
  547. // finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
  548. // finsh_code_dword((long)&(var->value.long_value));
  549. /* ld_dword &id */
  550. finsh_code_byte(FINSH_OP_LD_DWORD);
  551. finsh_code_dword((long)&(var->value.long_value));
  552. /* ld_value_dword &id */
  553. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
  554. finsh_code_dword((long)&(var->value.long_value));
  555. /* ld_dword 1 */
  556. finsh_code_byte(FINSH_OP_LD_DWORD);
  557. finsh_code_dword(1);
  558. /* add_byte */
  559. finsh_code_byte(FINSH_OP_SUB_DWORD);
  560. /* get byte */
  561. finsh_code_byte(FINSH_OP_ST_DWORD);
  562. /* pop */
  563. finsh_code_byte(FINSH_OP_POP);
  564. break;
  565. }
  566. }
  567. break;
  568. case FINSH_NODE_SYS_NULL:
  569. finsh_code_dword(0);
  570. break;
  571. case FINSH_NODE_SYS_GETVALUE:
  572. if (node->idtype & FINSH_IDTYPE_ADDRESS)
  573. {
  574. /* nothing will be generated */
  575. }
  576. else
  577. {
  578. switch (node->data_type)
  579. {
  580. case FINSH_DATA_TYPE_BYTE:
  581. finsh_code_byte(FINSH_OP_LD_VALUE_BYTE_STACK);
  582. break;
  583. case FINSH_DATA_TYPE_WORD:
  584. finsh_code_byte(FINSH_OP_LD_VALUE_WORD_STACK);
  585. break;
  586. case FINSH_DATA_TYPE_DWORD:
  587. finsh_code_byte(FINSH_OP_LD_VALUE_DWORD_STACK);
  588. break;
  589. default:
  590. break;
  591. }
  592. }
  593. break;
  594. case FINSH_NODE_SYS_GETADDR:
  595. /* nothing will be generated */
  596. break;
  597. default:
  598. finsh_error_set(FINSH_ERROR_UNKNOWN_NODE);
  599. break;
  600. }
  601. /* compile sibling node */
  602. if (finsh_node_sibling(node) != NULL)
  603. finsh_compile(finsh_node_sibling(node));
  604. }
  605. return 0;
  606. }
  607. static int finsh_type_check(struct finsh_node* node, uint8_t is_addr)
  608. {
  609. if (node != NULL)
  610. {
  611. /* address & value */
  612. if (node->node_type == FINSH_NODE_SYS_ASSIGN ||
  613. node->node_type == FINSH_NODE_SYS_PREINC ||
  614. node->node_type == FINSH_NODE_SYS_PREDEC ||
  615. node->node_type == FINSH_NODE_SYS_GETADDR)
  616. {
  617. /* address */
  618. finsh_type_check(finsh_node_child(node), FINSH_IDTYPE_ADDRESS);
  619. }
  620. else if (node->node_type == FINSH_NODE_SYS_GETVALUE && is_addr)
  621. {
  622. /* change the attribute of getvalue in left expr */
  623. finsh_type_check(finsh_node_child(node), 0);
  624. }
  625. else
  626. {
  627. /* transfer 'av' to child node */
  628. finsh_type_check(finsh_node_child(node), is_addr);
  629. }
  630. /* always does not load address in sibling */
  631. finsh_type_check(finsh_node_sibling(node), FINSH_NODE_VALUE);
  632. /** set attribute of current node */
  633. /* make sure the current node is address or value */
  634. if (node->idtype != FINSH_IDTYPE_SYSCALL) node->idtype |= is_addr;
  635. if (finsh_node_child(node) != NULL)
  636. {
  637. node->data_type = finsh_node_child(node)->data_type;
  638. return 0;
  639. }
  640. if (node->node_type == FINSH_NODE_ID)
  641. {
  642. if (node->idtype & FINSH_IDTYPE_VAR)
  643. {
  644. struct finsh_var* var;
  645. var = node->id.var;
  646. if (var != NULL)
  647. {
  648. switch (var->type)
  649. {
  650. case finsh_type_void:
  651. node->data_type = FINSH_DATA_TYPE_VOID;
  652. break;
  653. case finsh_type_char:
  654. case finsh_type_uchar:
  655. node->data_type = FINSH_DATA_TYPE_BYTE;
  656. break;
  657. case finsh_type_short:
  658. case finsh_type_ushort:
  659. node->data_type = FINSH_DATA_TYPE_WORD;
  660. break;
  661. case finsh_type_int:
  662. case finsh_type_uint:
  663. case finsh_type_long:
  664. case finsh_type_ulong:
  665. node->data_type = FINSH_DATA_TYPE_DWORD;
  666. break;
  667. case finsh_type_charp:
  668. case finsh_type_voidp:
  669. case finsh_type_shortp:
  670. case finsh_type_intp:
  671. case finsh_type_longp:
  672. node->data_type = FINSH_DATA_TYPE_DWORD;
  673. break;
  674. default:
  675. finsh_error_set(FINSH_ERROR_UNKNOWN_TYPE);
  676. break;
  677. }
  678. }
  679. }
  680. else if (node->idtype & FINSH_IDTYPE_SYSVAR)
  681. {
  682. struct finsh_sysvar *sysvar;
  683. sysvar = node->id.sysvar;
  684. if (sysvar != NULL)
  685. {
  686. switch (sysvar->type)
  687. {
  688. case finsh_type_void:
  689. node->data_type = FINSH_DATA_TYPE_VOID;
  690. break;
  691. case finsh_type_char:
  692. case finsh_type_uchar:
  693. node->data_type = FINSH_DATA_TYPE_BYTE;
  694. break;
  695. case finsh_type_short:
  696. case finsh_type_ushort:
  697. node->data_type = FINSH_DATA_TYPE_WORD;
  698. break;
  699. case finsh_type_int:
  700. case finsh_type_uint:
  701. case finsh_type_long:
  702. case finsh_type_ulong:
  703. node->data_type = FINSH_DATA_TYPE_DWORD;
  704. break;
  705. case finsh_type_charp:
  706. case finsh_type_voidp:
  707. case finsh_type_shortp:
  708. case finsh_type_intp:
  709. case finsh_type_longp:
  710. node->data_type = FINSH_DATA_TYPE_DWORD;
  711. break;
  712. default:
  713. finsh_error_set(FINSH_ERROR_UNKNOWN_TYPE);
  714. break;
  715. }
  716. }
  717. }
  718. }
  719. else if (node->node_type == FINSH_NODE_VALUE_CHAR)
  720. {
  721. node->data_type = FINSH_DATA_TYPE_BYTE;
  722. }
  723. else if (node->node_type == FINSH_NODE_VALUE_INT ||
  724. node->node_type == FINSH_NODE_VALUE_LONG ||
  725. node->node_type == FINSH_NODE_VALUE_STRING ||
  726. node->node_type == FINSH_NODE_VALUE_NULL)
  727. {
  728. node->data_type = FINSH_DATA_TYPE_DWORD;
  729. }
  730. }
  731. return 0;
  732. }
  733. int finsh_compiler_run(struct finsh_node* node)
  734. {
  735. struct finsh_node* sibling;
  736. /* type check */
  737. finsh_type_check(node, FINSH_NODE_VALUE);
  738. /* clean text segment and vm stack */
  739. memset(&text_segment[0], 0, sizeof(text_segment));
  740. memset(&finsh_vm_stack[0], 0, sizeof(finsh_vm_stack[0]));
  741. /* reset compile stack pointer and pc */
  742. finsh_compile_sp = &finsh_vm_stack[0];
  743. finsh_compile_pc = &text_segment[0];
  744. /* compile node */
  745. sibling = node;
  746. while (sibling != NULL)
  747. {
  748. struct finsh_node* current_node;
  749. current_node = sibling;
  750. /* get sibling node */
  751. sibling = current_node->sibling;
  752. /* clean sibling node */
  753. current_node->sibling = NULL;
  754. finsh_compile(current_node);
  755. /* pop current value */
  756. if (sibling != NULL) finsh_code_byte(FINSH_OP_POP);
  757. }
  758. return 0;
  759. }