statement.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. #include "__virtualmath.h"
  2. Statement *makeStatement(fline line, char *file) {
  3. Statement *tmp = memCalloc(1, sizeof(Statement));
  4. tmp->type = start;
  5. tmp->next = NULL;
  6. tmp->aut = auto_aut;
  7. tmp->line = line;
  8. tmp->code_file = memStrcpy(file);
  9. setRunInfo(tmp);
  10. return tmp;
  11. }
  12. void setRunInfo(Statement *st){
  13. st->info.have_info = false;
  14. st->info.node = NULL;
  15. st->info.var_list = NULL;
  16. st->info.branch.sl_node = NULL;
  17. st->info.branch.status = info_vl_branch;
  18. st->info.branch.with_.value = NULL;
  19. st->info.branch.with_._exit_ = NULL;
  20. st->info.branch.with_._enter_ = NULL;
  21. st->info.branch.for_.iter = NULL;
  22. }
  23. void freeRunInfo(Statement *st) {
  24. if (st->info.var_list != NULL) {
  25. gc_freeTmpLink(&st->info.var_list->hashtable->gc_status);
  26. freeVarList(st->info.var_list);
  27. }
  28. if (st->info.branch.with_.value != NULL)
  29. gc_freeTmpLink(&st->info.branch.with_.value->gc_status);
  30. if (st->info.branch.with_._exit_ != NULL)
  31. gc_freeTmpLink(&st->info.branch.with_._exit_->gc_status);
  32. if (st->info.branch.with_._enter_ != NULL)
  33. gc_freeTmpLink(&st->info.branch.with_._enter_->gc_status);
  34. if (st->info.branch.for_.iter != NULL)
  35. gc_freeTmpLink(&st->info.branch.for_.iter->gc_status);
  36. setRunInfo(st);
  37. }
  38. Token *setOperationFromToken(Statement **st_ad, struct Token *left, struct Token *right, enum OperationType type, bool is_right) {
  39. Token *new_token = NULL;
  40. Statement *st = *st_ad, *left_st = left->data.st;
  41. if (is_right && left->data.st->type == operation &&
  42. left_st->u.operation.OperationType == st->u.operation.OperationType){
  43. st->u.operation.left = left_st->u.operation.right;
  44. left_st->u.operation.right = st;
  45. st->u.operation.right = right->data.st;
  46. st = left_st; // left_st是主中心
  47. }
  48. else{
  49. st->u.operation.left = left_st;
  50. st->u.operation.right = right->data.st;
  51. }
  52. new_token = makeToken(0);
  53. new_token->token_type = type;
  54. new_token->data.st = st;
  55. st->line = left->line;
  56. freeToken(left, false);
  57. freeToken(right, false);
  58. *st_ad = st;
  59. return new_token;
  60. }
  61. Statement *makeBaseLinkValueStatement(LinkValue *value, fline line, char *file) {
  62. Statement *tmp = makeStatement(line, file);
  63. tmp->type = base_value;
  64. tmp->u.base_value.type = link_value;
  65. tmp->u.base_value.value = value;
  66. tmp->u.base_value.str = NULL;
  67. gc_addStatementLink(&value->gc_status);
  68. return tmp;
  69. }
  70. Statement *makeBaseStrValueStatement(wchar_t *value, enum BaseValueType type, fline line, char *file){
  71. Statement *tmp = makeStatement(line, file);
  72. tmp->type = base_value;
  73. tmp->u.base_value.type = type;
  74. tmp->u.base_value.value = NULL;
  75. tmp->u.base_value.str = memWidecpy(value);
  76. return tmp;
  77. }
  78. Statement *makeBaseValueStatement(enum BaseValueType type, fline line, char *file) {
  79. Statement *tmp = makeStatement(line, file);
  80. tmp->type = base_value;
  81. tmp->u.base_value.type = type;
  82. tmp->u.base_value.value = NULL;
  83. tmp->u.base_value.str = NULL;
  84. return tmp;
  85. }
  86. Statement *makeBaseVarStatement(wchar_t *name, Statement *times, fline line, char *file){
  87. Statement *tmp = makeStatement(line, file);
  88. tmp->type = base_var;
  89. tmp->u.base_var.name = memWidecpy(name);
  90. tmp->u.base_var.times = times;
  91. return tmp;
  92. }
  93. Statement *makeBaseSVarStatement(Statement *name, Statement *times){
  94. Statement *tmp = makeStatement(name->line, name->code_file);
  95. tmp->type = base_svar;
  96. tmp->u.base_svar.name = name;
  97. tmp->u.base_svar.times = times;
  98. return tmp;
  99. }
  100. Statement *makeBaseDictStatement(Parameter *pt, fline line, char *file){
  101. Statement *tmp = makeStatement(line, file);
  102. tmp->type = base_dict;
  103. tmp->u.base_dict.dict = pt;
  104. return tmp;
  105. }
  106. Statement *makeOperationBaseStatement(enum OperationType type, fline line, char *file){
  107. Statement *tmp = makeStatement(line, file);
  108. tmp->type = operation;
  109. tmp->u.operation.OperationType = type;
  110. tmp->u.operation.left = NULL;
  111. tmp->u.operation.right = NULL;
  112. return tmp;
  113. }
  114. Statement *makeOperationStatement(enum OperationType type, Statement *left, Statement *right){
  115. Statement *tmp = makeOperationBaseStatement(type, left->line, left->code_file);
  116. tmp->u.operation.left = left;
  117. tmp->u.operation.right = right;
  118. return tmp;
  119. }
  120. Statement *makeTupleStatement(Parameter *pt, enum ListType type, fline line, char *file) {
  121. Statement *tmp = makeStatement(line, file);
  122. tmp->type = base_list;
  123. tmp->u.base_list.type = type;
  124. tmp->u.base_list.list = pt;
  125. return tmp;
  126. }
  127. Statement *makeClassStatement(Statement *name, Statement *function, Parameter *pt) {
  128. Statement *tmp = makeStatement(name->line, name->code_file);
  129. tmp->type = set_class;
  130. tmp->u.set_class.name = name;
  131. tmp->u.set_class.st = function;
  132. tmp->u.set_class.father = pt;
  133. tmp->u.set_class.decoration = NULL;
  134. return tmp;
  135. }
  136. Statement *makeFunctionStatement(Statement *name, Statement *function, Parameter *pt) {
  137. Statement *tmp = makeStatement(name->line, name->code_file);
  138. tmp->type = set_function;
  139. tmp->u.set_function.name = name;
  140. tmp->u.set_function.function = function;
  141. tmp->u.set_function.parameter = pt;
  142. tmp->u.set_function.decoration = NULL;
  143. tmp->u.set_function.first_do = NULL;
  144. return tmp;
  145. }
  146. Statement *makeLambdaStatement(Statement *function, Parameter *pt) {
  147. Statement *tmp = makeStatement(function->line, function->code_file);
  148. tmp->type = base_lambda;
  149. tmp->u.base_lambda.function = function;
  150. tmp->u.base_lambda.parameter = pt;
  151. return tmp;
  152. }
  153. Statement *makeCallStatement(Statement *function, Parameter *pt) {
  154. Statement *tmp = makeStatement(function->line, function->code_file);
  155. tmp->type = call_function;
  156. tmp->u.call_function.function = function;
  157. tmp->u.call_function.parameter = pt;
  158. return tmp;
  159. }
  160. Statement *makeSliceStatement(Statement *element, Parameter *index, enum SliceType type) {
  161. Statement *tmp = makeStatement(element->line, element->code_file);
  162. tmp->type = slice_;
  163. tmp->u.slice_.element = element;
  164. tmp->u.slice_.index = index;
  165. tmp->u.slice_.type = type;
  166. return tmp;
  167. }
  168. Statement *makeForStatement(fline line, char *file) {
  169. Statement *tmp = makeStatement(line, file);
  170. tmp->type = for_branch;
  171. tmp->u.for_branch.after_do = NULL;
  172. tmp->u.for_branch.first_do = NULL;
  173. tmp->u.for_branch.for_list = NULL;
  174. tmp->u.for_branch.else_list = NULL;
  175. tmp->u.for_branch.finally = NULL;
  176. return tmp;
  177. }
  178. Statement *makeIfStatement(fline line, char *file) {
  179. Statement *tmp = makeStatement(line, file);
  180. tmp->type = if_branch;
  181. tmp->u.if_branch.if_list = NULL;
  182. tmp->u.if_branch.else_list = NULL;
  183. tmp->u.if_branch.finally = NULL;
  184. return tmp;
  185. }
  186. Statement *makeWhileStatement(fline line, char *file) {
  187. Statement *tmp = makeStatement(line, file);
  188. tmp->type = while_branch;
  189. tmp->u.while_branch.type = while_;
  190. tmp->u.while_branch.while_list = NULL;
  191. tmp->u.while_branch.else_list = NULL;
  192. tmp->u.while_branch.finally = NULL;
  193. tmp->u.while_branch.first = NULL;
  194. tmp->u.while_branch.after = NULL;
  195. return tmp;
  196. }
  197. Statement *makeTryStatement(fline line, char *file) {
  198. Statement *tmp = makeStatement(line, file);
  199. tmp->type = try_branch;
  200. tmp->u.try_branch.except_list = NULL;
  201. tmp->u.try_branch.else_list = NULL;
  202. tmp->u.try_branch.finally = NULL;
  203. tmp->u.try_branch.try = NULL;
  204. return tmp;
  205. }
  206. Statement *makeWithStatement(fline line, char *file) {
  207. Statement *tmp = makeStatement(line, file);
  208. tmp->type = with_branch;
  209. tmp->u.with_branch.with_list = NULL;
  210. tmp->u.with_branch.else_list = NULL;
  211. tmp->u.with_branch.finally = NULL;
  212. return tmp;
  213. }
  214. Statement *makeBreakStatement(Statement *times, fline line, char *file){
  215. Statement *tmp = makeStatement(line, file);
  216. tmp->type = break_cycle;
  217. tmp->u.break_cycle.times = times;
  218. return tmp;
  219. }
  220. Statement *makeContinueStatement(Statement *times, fline line, char *file){
  221. Statement *tmp = makeStatement(line, file);
  222. tmp->type = continue_cycle;
  223. tmp->u.continue_cycle.times = times;
  224. return tmp;
  225. }
  226. Statement *makeRegoStatement(Statement *times, fline line, char *file){
  227. Statement *tmp = makeStatement(line, file);
  228. tmp->type = rego_if;
  229. tmp->u.rego_if.times = times;
  230. return tmp;
  231. }
  232. Statement *makeRestartStatement(Statement *times, fline line, char *file){
  233. Statement *tmp = makeStatement(line, file);
  234. tmp->type = restart;
  235. tmp->u.restart.times = times;
  236. return tmp;
  237. }
  238. Statement *makeReturnStatement(Statement *value, fline line, char *file){
  239. Statement *tmp = makeStatement(line, file);
  240. tmp->type = return_code;
  241. tmp->u.return_code.value = value;
  242. return tmp;
  243. }
  244. Statement *makeYieldStatement(Statement *value, fline line, char *file){
  245. Statement *tmp = makeStatement(line, file);
  246. tmp->type = yield_code;
  247. tmp->u.yield_code.value = value;
  248. return tmp;
  249. }
  250. Statement *makeRaiseStatement(Statement *value, fline line, char *file){
  251. Statement *tmp = makeStatement(line, file);
  252. tmp->type = raise_code;
  253. tmp->u.raise_code.value = value;
  254. return tmp;
  255. }
  256. Statement *makeAssertStatement(Statement *conditions, fline line, char *file){
  257. Statement *tmp = makeStatement(line, file);
  258. tmp->type = assert;
  259. tmp->u.assert.conditions = conditions;
  260. return tmp;
  261. }
  262. Statement *makeIncludeStatement(Statement *file, fline line, char *file_dir){
  263. Statement *tmp = makeStatement(line, file_dir);
  264. tmp->type = include_file;
  265. tmp->u.include_file.file = file;
  266. return tmp;
  267. }
  268. Statement *makeImportStatement(Statement *file, Statement *as, bool is_lock) {
  269. Statement *tmp = makeStatement(file->line, file->code_file);
  270. tmp->type = import_file;
  271. tmp->u.import_file.file = file;
  272. tmp->u.import_file.as = as;
  273. tmp->u.import_file.is_lock = is_lock;
  274. return tmp;
  275. }
  276. Statement *makeFromImportStatement(Statement *file, Parameter *as, Parameter *pt, bool is_lock) {
  277. Statement *tmp = makeStatement(file->line, file->code_file);
  278. tmp->type = from_import_file;
  279. tmp->u.from_import_file.file = file;
  280. tmp->u.from_import_file.as = as;
  281. tmp->u.from_import_file.pt = pt;
  282. tmp->u.from_import_file.is_lock = is_lock;
  283. return tmp;
  284. }
  285. Statement *makeDefaultVarStatement(Parameter *var, fline line, char *file_dir, enum DefaultType type) {
  286. Statement *tmp = makeStatement(line, file_dir);
  287. tmp->type = default_var;
  288. tmp->u.default_var.var = var;
  289. tmp->u.default_var.default_type = type;
  290. return tmp;
  291. }
  292. Statement *makeLabelStatement(Statement *var, Statement *command, wchar_t *label, fline line, char *file_dir) {
  293. Statement *tmp = makeStatement(line, file_dir);
  294. tmp->type = label_;
  295. tmp->u.label_.as = var;
  296. tmp->u.label_.command = command;
  297. tmp->u.label_.label = memWidecpy(label);
  298. return tmp;
  299. }
  300. Statement *makeGotoStatement(Statement *return_, Statement *times, Statement *label, fline line, char *file_dir) {
  301. Statement *tmp = makeStatement(line, file_dir);
  302. tmp->type = goto_;
  303. tmp->u.goto_.return_ = return_;
  304. tmp->u.goto_.times = times;
  305. tmp->u.goto_.label = label;
  306. return tmp;
  307. }
  308. Statement *makeDelStatement(Statement *var, fline line, char *file_dir) {
  309. Statement *tmp = makeStatement(line, file_dir);
  310. tmp->type = del_;
  311. tmp->u.del_.var = var;
  312. return tmp;
  313. }
  314. void connectStatement(Statement *base, Statement *new){
  315. for (PASS; base->next != NULL; base = base->next)
  316. PASS;
  317. base->next = new;
  318. }
  319. void freeStatement(Statement *st){
  320. Statement *next_tmp = NULL;
  321. FREE_BASE(st, return_);
  322. for (PASS; st != NULL; st = next_tmp){
  323. next_tmp = st->next;
  324. switch (st->type) {
  325. case operation:
  326. freeStatement(st->u.operation.right);
  327. freeStatement(st->u.operation.left);
  328. break;
  329. case base_value:
  330. if (st->u.base_value.type == link_value)
  331. gc_freeStatementLink(&st->u.base_value.value->gc_status);
  332. else
  333. memFree(st->u.base_value.str);
  334. break;
  335. case base_var:
  336. memFree(st->u.base_var.name);
  337. freeStatement(st->u.base_var.times);
  338. break;
  339. case del_:
  340. freeStatement(st->u.del_.var);
  341. break;
  342. case base_svar:
  343. freeStatement(st->u.base_svar.name);
  344. freeStatement(st->u.base_svar.times);
  345. break;
  346. case base_lambda:
  347. freeStatement(st->u.base_lambda.function);
  348. freeParameter(st->u.base_lambda.parameter, true);
  349. break;
  350. case set_function:
  351. freeStatement(st->u.set_function.name);
  352. freeStatement(st->u.set_function.function);
  353. freeParameter(st->u.set_function.parameter, true);
  354. freeDecorationStatement(st->u.set_function.decoration);
  355. freeStatement(st->u.set_function.first_do);
  356. break;
  357. case set_class:
  358. freeStatement(st->u.set_class.name);
  359. freeStatement(st->u.set_class.st);
  360. freeParameter(st->u.set_class.father, true);
  361. freeDecorationStatement(st->u.set_class.decoration);
  362. break;
  363. case call_function:
  364. freeStatement(st->u.call_function.function);
  365. freeParameter(st->u.call_function.parameter, true);
  366. break;
  367. case slice_:
  368. freeStatement(st->u.slice_.element);
  369. freeParameter(st->u.slice_.index, true);
  370. break;
  371. case base_list:
  372. freeParameter(st->u.base_list.list, true);
  373. break;
  374. case base_dict:
  375. freeParameter(st->u.base_dict.dict, true);
  376. break;
  377. case if_branch:
  378. freeStatementList(st->u.if_branch.if_list);
  379. freeStatement(st->u.if_branch.finally);
  380. freeStatement(st->u.if_branch.else_list);
  381. break;
  382. case while_branch:
  383. freeStatementList(st->u.while_branch.while_list);
  384. freeStatement(st->u.while_branch.first);
  385. freeStatement(st->u.while_branch.after);
  386. freeStatement(st->u.while_branch.else_list);
  387. freeStatement(st->u.while_branch.finally);
  388. break;
  389. case for_branch:
  390. freeStatementList(st->u.for_branch.for_list);
  391. freeStatement(st->u.for_branch.after_do);
  392. freeStatement(st->u.for_branch.first_do);
  393. freeStatement(st->u.for_branch.else_list);
  394. freeStatement(st->u.for_branch.finally);
  395. break;
  396. case try_branch:
  397. freeStatementList(st->u.try_branch.except_list);
  398. freeStatement(st->u.try_branch.try);
  399. freeStatement(st->u.try_branch.else_list);
  400. freeStatement(st->u.try_branch.finally);
  401. break;
  402. case with_branch:
  403. freeStatementList(st->u.with_branch.with_list);
  404. freeStatement(st->u.with_branch.else_list);
  405. freeStatement(st->u.with_branch.finally);
  406. break;
  407. case break_cycle:
  408. freeStatement(st->u.break_cycle.times);
  409. break;
  410. case continue_cycle:
  411. freeStatement(st->u.continue_cycle.times);
  412. break;
  413. case rego_if:
  414. freeStatement(st->u.rego_if.times);
  415. break;
  416. case restart:
  417. freeStatement(st->u.restart.times);
  418. break;
  419. case return_code:
  420. freeStatement(st->u.return_code.value);
  421. break;
  422. case yield_code:
  423. freeStatement(st->u.yield_code.value);
  424. break;
  425. case raise_code:
  426. freeStatement(st->u.raise_code.value);
  427. break;
  428. case include_file:
  429. freeStatement(st->u.include_file.file);
  430. break;
  431. case import_file:
  432. freeStatement(st->u.import_file.file);
  433. freeStatement(st->u.import_file.as);
  434. break;
  435. case from_import_file:
  436. freeStatement(st->u.from_import_file.file);
  437. freeParameter(st->u.from_import_file.as, true);
  438. freeParameter(st->u.from_import_file.pt, true);
  439. break;
  440. case default_var:
  441. freeParameter(st->u.default_var.var, true);
  442. break;
  443. case assert:
  444. freeStatement(st->u.assert.conditions);
  445. break;
  446. case label_:
  447. freeStatement(st->u.label_.command);
  448. freeStatement(st->u.label_.as);
  449. memFree(st->u.label_.label);
  450. break;
  451. case goto_:
  452. freeStatement(st->u.goto_.return_);
  453. freeStatement(st->u.goto_.times);
  454. freeStatement(st->u.goto_.label);
  455. break;
  456. default:
  457. break;
  458. }
  459. freeRunInfo(st);
  460. memFree(st->code_file);
  461. memFree(st);
  462. }
  463. return_:
  464. return;
  465. }
  466. Statement *copyStatement(Statement *st){
  467. Statement *base_tmp = NULL;
  468. Statement **tmp = &base_tmp;
  469. for (PASS; st != NULL; st = st->next, tmp = &(*tmp)->next)
  470. *tmp = copyStatementCore(st);
  471. return base_tmp;
  472. }
  473. Statement *copyStatementCore(Statement *st){
  474. Statement *new = makeStatement(st->line, st->code_file);
  475. new->type = st->type;
  476. new->aut = st->aut;
  477. new->next = NULL;
  478. switch (st->type) {
  479. case base_value:
  480. new->u.base_value.type = st->u.base_value.type;
  481. new->u.base_value.value = NULL;
  482. new->u.base_value.str = NULL;
  483. if (new->u.base_value.type == link_value) {
  484. new->u.base_value.value = st->u.base_value.value;
  485. gc_addStatementLink(&new->u.base_value.value->gc_status);
  486. }
  487. else if (new->u.base_value.type == string_str || new->u.base_value.type == number_str)
  488. new->u.base_value.str = memWidecpy(st->u.base_value.str);
  489. break;
  490. case operation:
  491. new->u.operation.OperationType = st->u.operation.OperationType;
  492. new->u.operation.right = copyStatement(st->u.operation.right);
  493. new->u.operation.left = copyStatement(st->u.operation.left);
  494. break;
  495. case base_var:
  496. new->u.base_var.name = memWidecpy(st->u.base_var.name);
  497. new->u.base_var.times = copyStatement(st->u.base_var.times);
  498. break;
  499. case del_:
  500. new->u.del_.var = copyStatement(st->u.del_.var);
  501. break;
  502. case base_svar:
  503. new->u.base_svar.name = copyStatement(st->u.base_svar.name);
  504. new->u.base_svar.times = copyStatement(st->u.base_svar.times);
  505. break;
  506. case base_lambda:
  507. new->u.base_lambda.function = copyStatement(st->u.base_lambda.function);
  508. new->u.base_lambda.parameter = copyParameter(st->u.base_lambda.parameter);
  509. break;
  510. case set_function:
  511. new->u.set_function.name = copyStatement(st->u.set_function.name);
  512. new->u.set_function.function = copyStatement(st->u.set_function.function);
  513. new->u.set_function.parameter = copyParameter(st->u.set_function.parameter);
  514. new->u.set_function.decoration = copyDecorationStatement(st->u.set_function.decoration);
  515. new->u.set_function.first_do = copyStatement(st->u.set_function.first_do);
  516. break;
  517. case set_class:
  518. new->u.set_class.name = copyStatement(st->u.set_class.name);
  519. new->u.set_class.st = copyStatement(st->u.set_class.st);
  520. new->u.set_class.father = copyParameter(st->u.set_class.father);
  521. new->u.set_class.decoration = copyDecorationStatement(st->u.set_class.decoration);
  522. break;
  523. case call_function:
  524. new->u.call_function.function = copyStatement(st->u.call_function.function);
  525. new->u.call_function.parameter = copyParameter(st->u.call_function.parameter);
  526. break;
  527. case slice_:
  528. new->u.slice_.element = copyStatement(st->u.slice_.element);
  529. new->u.slice_.index = copyParameter(st->u.slice_.index);
  530. break;
  531. case base_list:
  532. new->u.base_list.type = st->u.base_list.type;
  533. new->u.base_list.list = copyParameter(st->u.base_list.list);
  534. break;
  535. case base_dict:
  536. new->u.base_dict.dict = copyParameter(st->u.base_dict.dict);
  537. break;
  538. case if_branch:
  539. new->u.if_branch.if_list = copyStatementList(st->u.if_branch.if_list);
  540. new->u.if_branch.finally = copyStatement(st->u.if_branch.finally);
  541. new->u.if_branch.else_list = copyStatement(st->u.if_branch.else_list);
  542. break;
  543. case while_branch:
  544. new->u.while_branch.type = st->u.while_branch.type;
  545. new->u.while_branch.while_list = copyStatementList(st->u.while_branch.while_list);
  546. new->u.while_branch.first = copyStatement(st->u.while_branch.first);
  547. new->u.while_branch.after = copyStatement(st->u.while_branch.after);
  548. new->u.while_branch.else_list = copyStatement(st->u.while_branch.else_list);
  549. new->u.while_branch.finally = copyStatement(st->u.while_branch.finally);
  550. break;
  551. case for_branch:
  552. new->u.for_branch.for_list = copyStatementList(st->u.for_branch.for_list);
  553. new->u.for_branch.after_do = copyStatement(st->u.for_branch.after_do);
  554. new->u.for_branch.first_do = copyStatement(st->u.for_branch.first_do);
  555. new->u.for_branch.else_list = copyStatement(st->u.for_branch.else_list);
  556. new->u.for_branch.finally = copyStatement(st->u.for_branch.finally);
  557. break;
  558. case try_branch:
  559. new->u.try_branch.except_list = copyStatementList(st->u.try_branch.except_list);
  560. new->u.try_branch.try = copyStatement(st->u.try_branch.try);
  561. new->u.try_branch.else_list = copyStatement(st->u.try_branch.else_list);
  562. new->u.try_branch.finally = copyStatement(st->u.try_branch.finally);
  563. break;
  564. case with_branch:
  565. new->u.with_branch.with_list = copyStatementList(st->u.with_branch.with_list);
  566. new->u.with_branch.else_list = copyStatement(st->u.with_branch.else_list);
  567. new->u.with_branch.finally = copyStatement(st->u.with_branch.finally);
  568. break;
  569. case break_cycle:
  570. new->u.break_cycle.times = copyStatement(st->u.break_cycle.times);
  571. break;
  572. case continue_cycle:
  573. new->u.continue_cycle.times = copyStatement(st->u.continue_cycle.times);
  574. break;
  575. case rego_if:
  576. new->u.rego_if.times = copyStatement(st->u.rego_if.times);
  577. break;
  578. case restart:
  579. new->u.restart.times = copyStatement(st->u.restart.times);
  580. break;
  581. case return_code:
  582. new->u.return_code.value = copyStatement(st->u.return_code.value);
  583. break;
  584. case yield_code:
  585. new->u.yield_code.value = copyStatement(st->u.yield_code.value);
  586. break;
  587. case raise_code:
  588. new->u.raise_code.value = copyStatement(st->u.raise_code.value);
  589. break;
  590. case include_file:
  591. new->u.include_file.file = copyStatement(st->u.include_file.file);
  592. break;
  593. case import_file:
  594. new->u.import_file.file = copyStatement(st->u.import_file.file);
  595. new->u.import_file.as = copyStatement(st->u.import_file.as);
  596. new->u.import_file.is_lock = st->u.import_file.is_lock;
  597. break;
  598. case from_import_file:
  599. new->u.from_import_file.file = copyStatement(st->u.from_import_file.file);
  600. new->u.from_import_file.as = copyParameter(st->u.from_import_file.as);
  601. new->u.from_import_file.pt = copyParameter(st->u.from_import_file.pt);
  602. new->u.from_import_file.is_lock = st->u.from_import_file.is_lock;
  603. break;
  604. case default_var:
  605. new->u.default_var.var = copyParameter(st->u.default_var.var);
  606. break;
  607. case assert:
  608. new->u.assert.conditions = copyStatement(st->u.assert.conditions);
  609. break;
  610. case label_:
  611. new->u.label_.command = copyStatement(st->u.label_.command);
  612. new->u.label_.as = copyStatement(st->u.label_.as);
  613. new->u.label_.label = memWidecpy(st->u.label_.label);
  614. break;
  615. case goto_:
  616. new->u.goto_.times = copyStatement(st->u.goto_.times);
  617. new->u.goto_.return_ = copyStatement(st->u.goto_.return_);
  618. new->u.goto_.label = copyStatement(st->u.goto_.label);
  619. break;
  620. default:
  621. break;
  622. }
  623. return new;
  624. }
  625. StatementList *makeStatementList(Statement *condition, Statement *var, Statement *code, int type) {
  626. StatementList *tmp = memCalloc(1, sizeof(StatementList));
  627. tmp->condition = condition;
  628. tmp->var = var;
  629. tmp->code = code;
  630. tmp->type = type;
  631. tmp->next = NULL;
  632. return tmp;
  633. }
  634. StatementList *connectStatementList(StatementList *base, StatementList *new){
  635. StatementList **tmp = &base;
  636. for (PASS; *tmp != NULL; tmp = &(*tmp)->next)
  637. PASS;
  638. *tmp = new;
  639. return base;
  640. }
  641. void freeStatementList(StatementList *base){
  642. StatementList *next = NULL;
  643. for (PASS; base != NULL; base = next){
  644. next = base->next;
  645. freeStatement(base->condition);
  646. freeStatement(base->code);
  647. freeStatement(base->var);
  648. memFree(base);
  649. }
  650. }
  651. StatementList *copyStatementList(StatementList *sl){
  652. StatementList *base_tmp = NULL;
  653. StatementList **tmp = &base_tmp;
  654. for (PASS; sl != NULL; sl = sl->next, tmp = &(*tmp)->next)
  655. *tmp = makeStatementList(copyStatement(sl->condition), copyStatement(sl->var), copyStatement(sl->code), sl->type);
  656. return base_tmp;
  657. }
  658. DecorationStatement *makeDecorationStatement(){
  659. DecorationStatement *tmp;
  660. tmp = memCalloc(1, sizeof(DecorationStatement));
  661. tmp->decoration = NULL;
  662. tmp->next = NULL;
  663. return tmp;
  664. }
  665. DecorationStatement *connectDecorationStatement(Statement *decoration, DecorationStatement *base){
  666. DecorationStatement *tmp = makeDecorationStatement();
  667. tmp->decoration = decoration;
  668. tmp->next = base;
  669. return tmp;
  670. }
  671. void freeDecorationStatement(DecorationStatement *base){
  672. for (DecorationStatement *next; base != NULL; base = next) {
  673. next = base->next;
  674. freeStatement(base->decoration);
  675. memFree(base);
  676. }
  677. }
  678. DecorationStatement *copyDecorationStatement(DecorationStatement *ds){
  679. DecorationStatement *base = NULL;
  680. DecorationStatement **tmp = &base;
  681. for (PASS; ds != NULL; tmp = &(*tmp)->next, ds = ds->next)
  682. *tmp = copyDecorationStatementCore(ds);
  683. return base;
  684. }
  685. DecorationStatement *copyDecorationStatementCore(DecorationStatement *base){
  686. DecorationStatement *tmp = makeDecorationStatement();
  687. tmp->decoration = copyStatement(base->decoration);
  688. return tmp;
  689. }