statement.c 27 KB

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