parameter.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152
  1. #include "__run.h"
  2. #define returnResult(result) do{ \
  3. if (!CHECK_RESULT(result)) { \
  4. goto return_; \
  5. } \
  6. }while(0)
  7. Argument *makeArgument(void){
  8. Argument *tmp = memCalloc(1, sizeof(Argument));
  9. tmp->type = value_arg;
  10. tmp->data.value = NULL;
  11. tmp->data.name = NULL;
  12. tmp->data.name_ = NULL;
  13. tmp->name_type = name_st;
  14. tmp->next = NULL;
  15. return tmp;
  16. }
  17. Argument *makeValueArgument(LinkValue *value){
  18. Argument *tmp = makeArgument();
  19. tmp->data.value = value;
  20. gc_addTmpLink(&value->gc_status);
  21. return tmp;
  22. }
  23. Argument *makeStatementNameArgument(LinkValue *value, Statement *name){
  24. Argument *tmp = makeArgument();
  25. tmp->type = name_arg;
  26. tmp->data.value = value;
  27. tmp->data.name = name;
  28. gc_addTmpLink(&value->gc_status);
  29. return tmp;
  30. }
  31. Argument *makeCharNameArgument(LinkValue *value, LinkValue *name_value, wchar_t *name) {
  32. Argument *tmp = makeArgument();
  33. tmp->type = name_arg;
  34. tmp->name_type = name_char;
  35. tmp->data.value = value;
  36. tmp->data.name_ = memWidecpy(name);
  37. tmp->data.name_value = name_value;
  38. gc_addTmpLink(&value->gc_status);
  39. gc_addTmpLink(&name_value->gc_status);
  40. return tmp;
  41. }
  42. Argument *connectArgument(Argument *new, Argument *base){
  43. Argument *tmp = base;
  44. if (base == NULL)
  45. return new;
  46. for (PASS; base->next != NULL; base = base->next)
  47. PASS;
  48. base->next = new;
  49. return tmp;
  50. }
  51. Argument *connectValueArgument(LinkValue *value, Argument *base){
  52. Argument *new = makeValueArgument(value);
  53. return connectArgument(new, base);
  54. }
  55. Argument *connectStatementNameArgument(LinkValue *value, Statement *name, Argument *base){
  56. Argument *new = makeStatementNameArgument(value, name);
  57. return connectArgument(new, base);
  58. }
  59. Argument *connectCharNameArgument(LinkValue *value, LinkValue *name_value, wchar_t *name, Argument *base) {
  60. Argument *new = makeCharNameArgument(value, name_value, name);
  61. return connectArgument(new, base);
  62. }
  63. void freeArgument(Argument *at, bool free_st) {
  64. for (Argument *tmp=NULL; at != NULL;at = tmp){
  65. tmp = at->next;
  66. if (free_st)
  67. freeStatement(at->data.name);
  68. memFree(at->data.name_);
  69. if (at->data.name_value != NULL)
  70. gc_freeTmpLink(&at->data.name_value->gc_status);
  71. if (at->data.value != NULL)
  72. gc_freeTmpLink(&at->data.value->gc_status);
  73. memFree(at);
  74. }
  75. }
  76. Parameter *makeParameter(void){
  77. Parameter *tmp = memCalloc(1, sizeof(Parameter));
  78. tmp->type = value_par;
  79. tmp->data.value = NULL;
  80. tmp->data.name = NULL;
  81. tmp->data.is_sep = false;
  82. tmp->next = NULL;
  83. return tmp;
  84. }
  85. Parameter *copyenOneParameter(Parameter *base){
  86. Parameter *tmp = makeParameter();
  87. tmp->data.value = copyStatement(base->data.value);
  88. tmp->data.name = copyStatement(base->data.name);
  89. tmp->data.is_sep = base->data.is_sep;
  90. tmp->type = base->type;
  91. return tmp;
  92. }
  93. Parameter *copyParameter(Parameter *base){
  94. Parameter *base_tmp = NULL;
  95. Parameter **tmp = &base_tmp;
  96. for (PASS; base != NULL; tmp = &(*tmp)->next,base = base->next)
  97. *tmp = copyenOneParameter(base);
  98. return base_tmp;
  99. }
  100. Parameter *makeValueParameter(Statement *st){
  101. Parameter *tmp = makeParameter();
  102. tmp->data.value = st;
  103. return tmp;
  104. }
  105. Parameter *makeNameParameter(Statement *value, Statement *name){
  106. Parameter *tmp = makeParameter();
  107. tmp->type = name_par;
  108. tmp->data.value = value;
  109. tmp->data.name = name;
  110. return tmp;
  111. }
  112. Parameter *makeArgsParameter(Statement *st){
  113. Parameter *tmp = makeParameter();
  114. tmp->type = args_par;
  115. tmp->data.value = st;
  116. return tmp;
  117. }
  118. Parameter *makeKwrgsParameter(Statement *st){
  119. Parameter *tmp = makeParameter();
  120. tmp->type = kwargs_par;
  121. tmp->data.value = st;
  122. return tmp;
  123. }
  124. Parameter *connectParameter(Parameter *new, Parameter *base){
  125. if (base == NULL)
  126. return new;
  127. Parameter *tmp = base;
  128. while (base->next != NULL)
  129. base = base->next;
  130. base->next = new;
  131. return tmp;
  132. }
  133. Parameter *connectValueParameter(Statement *st, Parameter *base, bool is_sep) {
  134. Parameter *new = makeValueParameter(st);
  135. new->data.is_sep = is_sep;
  136. return connectParameter(new, base);
  137. }
  138. Parameter *connectNameParameter(Statement *value, Statement *name, Parameter *base){
  139. Parameter *new = makeNameParameter(value, name);
  140. return connectParameter(new, base);
  141. }
  142. Parameter *connectArgsParameter(Statement *st, Parameter *base, bool is_sep) {
  143. Parameter *new = makeArgsParameter(st);
  144. new->data.is_sep = is_sep;
  145. return connectParameter(new, base);
  146. }
  147. Parameter *connectKwargsParameter(Statement *st, Parameter *base){
  148. Parameter *new = makeKwrgsParameter(st);
  149. return connectParameter(new, base);
  150. }
  151. void freeParameter(Parameter *pt, bool free_st) {
  152. for (Parameter *tmp=NULL;pt != NULL;pt = tmp){
  153. tmp = pt->next;
  154. if (free_st) {
  155. freeStatement(pt->data.value);
  156. freeStatement(pt->data.name);
  157. }
  158. memFree(pt);
  159. }
  160. }
  161. Argument *listToArgument(LinkValue *list_value, long line, char *file, FUNC_NT){
  162. Argument *at = NULL;
  163. LinkValue *iter = NULL;
  164. setResultCore(result);
  165. getIter(list_value, 1, line, file, CNEXT_NT);
  166. if (!CHECK_RESULT(result))
  167. return NULL;
  168. iter = result->value;
  169. result->value = NULL;
  170. while (true) {
  171. freeResult(result);
  172. getIter(iter, 0, line, file, CNEXT_NT);
  173. if (is_iterStop(result->value, inter)){
  174. freeResult(result);
  175. break;
  176. }
  177. else if (!CHECK_RESULT(result)) {
  178. freeArgument(at, true);
  179. at = NULL;
  180. goto return_;
  181. }
  182. at = connectValueArgument(result->value, at);
  183. }
  184. setResult(result, inter);
  185. return_:
  186. gc_freeTmpLink(&iter->gc_status);
  187. return at;
  188. }
  189. Argument *dictToArgument(LinkValue *dict_value, long line, char *file, FUNC_NT) {
  190. Argument *at = NULL;
  191. LinkValue *iter = NULL;
  192. setResultCore(result);
  193. getIter(dict_value, 1, line, file, CNEXT_NT);
  194. if (!CHECK_RESULT(result))
  195. return NULL;
  196. iter = result->value;
  197. result->value = NULL;
  198. while (true) {
  199. LinkValue *name_ = NULL;
  200. wchar_t *name = NULL;
  201. freeResult(result);
  202. getIter(iter, 0, line, file, CNEXT_NT);
  203. if (is_iterStop(result->value, inter)){
  204. freeResult(result);
  205. break;
  206. }
  207. else if (!CHECK_RESULT(result)) {
  208. freeArgument(at, true);
  209. at = NULL;
  210. goto return_;
  211. }
  212. name_ = result->value;
  213. result->value = NULL;
  214. freeResult(result);
  215. getElement(iter, name_, line, file, CNEXT_NT);
  216. if (!CHECK_RESULT(result)) {
  217. gc_freeTmpLink(&name_->gc_status);
  218. freeArgument(at, true);
  219. at = NULL;
  220. goto return_;
  221. }
  222. name = getNameFromValue(name_->value, inter->data.var_deep, inter);
  223. at = connectCharNameArgument(result->value, name_, name, at);
  224. gc_freeTmpLink(&name_->gc_status);
  225. memFree(name);
  226. }
  227. setResult(result, inter);
  228. return_:
  229. gc_freeTmpLink(&iter->gc_status);
  230. return at;
  231. }
  232. /**
  233. * 设置形式参数的默认值
  234. * 仅支持name_value
  235. * @param function_ad
  236. * @param inter
  237. * @param var_list
  238. * @param num
  239. * @return
  240. */
  241. ResultType defaultParameter(Parameter **function_ad, vint *num, FUNC_NT) {
  242. Parameter *function = *function_ad;
  243. setResultCore(result);
  244. for (*num = 0; function != NULL && function->type == name_par; (*num)++, function = function->next){
  245. LinkValue *value = NULL;
  246. if(operationSafeInterStatement(CFUNC(function->data.value, var_list, result, belong)))
  247. goto return_;
  248. value = result->value;
  249. result->value = NULL;
  250. freeResult(result);
  251. assCore(function->data.name, value, false, false, CNEXT_NT);
  252. gc_freeTmpLink(&value->gc_status);
  253. if (!CHECK_RESULT(result))
  254. goto return_;
  255. freeResult(result);
  256. }
  257. setResult(result, inter);
  258. return_:
  259. *function_ad = function;
  260. return result->type;
  261. }
  262. /**
  263. * 设置实际参数的默认值, 仅支持name_base_value
  264. * @param call_ad
  265. * @param inter
  266. * @param var_list
  267. * @param num
  268. * @return
  269. */
  270. ResultType argumentToVar(Argument **call_ad, vint *num, FUNC_NT) {
  271. Argument *call = *call_ad;
  272. setResultCore(result);
  273. for (*num = 0; call != NULL && call->type == name_arg; (*num)++, call = call->next){
  274. if (call->name_type == name_char){
  275. addFromVarList(call->data.name_, call->data.name_value, 0, call->data.value, CFUNC_CORE(var_list)); // 参数赋值不需要处理变量式参数
  276. continue;
  277. }
  278. freeResult(result);
  279. assCore(call->data.name, call->data.value, false, false, CNEXT_NT);
  280. if (!CHECK_RESULT(result))
  281. goto return_;
  282. }
  283. setResult(result, inter);
  284. return_:
  285. *call_ad = call;
  286. return result->type;
  287. }
  288. /**
  289. * 形式参数从变量空间中获取值
  290. * @param function_ad
  291. * @param function_var
  292. * @param inter
  293. * @param var_list
  294. * @param num
  295. * @return
  296. */
  297. ResultType parameterFromVar(Parameter **function_ad, VarList *function_var, vint *num, vint max, bool *status,
  298. FUNC_NT) {
  299. Parameter *function = *function_ad;
  300. bool get = true;
  301. setResultCore(result);
  302. for (*num = 0, *status = false; function != NULL; function = function->next){
  303. int int_times;
  304. wchar_t *str_name = NULL;
  305. Statement *name = function->type == name_par ? function->data.name : function->data.value;
  306. LinkValue *value = NULL;
  307. get = true;
  308. if (function->type == kwargs_par){
  309. makeDictValue(NULL, false, LINEFILE, CNEXT_NT);
  310. if (!CHECK_RESULT(result))
  311. return result->type;
  312. value = result->value;
  313. result->value = NULL;
  314. freeResult(result);
  315. value->value->data.dict.dict = var_list->hashtable;
  316. value->value->data.dict.size = max - *num;
  317. *status = true;
  318. gc_freeTmpLink(&value->gc_status);
  319. goto not_return;
  320. }
  321. getVarInfo(&str_name, &int_times, CFUNC(name, var_list, result, belong));
  322. if (!CHECK_RESULT(result)) {
  323. memFree(str_name);
  324. *function_ad = function;
  325. return result->type;
  326. }
  327. freeResult(result);
  328. value = findFromVarList(str_name, int_times, del_var, CFUNC_CORE(var_list)); // 形式参数取值不需要执行变量式函数
  329. memFree(str_name);
  330. if(value == NULL) {
  331. get = false;
  332. if (function->type == name_par && !operationSafeInterStatement(CFUNC(function->data.value, var_list, result, belong))) {
  333. value = result->value;
  334. goto not_return;
  335. }
  336. setResultErrorSt(E_ArgumentException, FEW_ARG, true, name, CNEXT_NT);
  337. goto return_;
  338. }
  339. else if (!checkAut(name->aut, value->aut, name->line, name->code_file, NULL, false, CNEXT_NT))
  340. goto return_;
  341. not_return:
  342. freeResult(result);
  343. assCore(name, value, false, false, CFUNC_NT(function_var, result, belong));
  344. if (!CHECK_RESULT(result)) {
  345. *function_ad = function;
  346. return result->type;
  347. }
  348. freeResult(result);
  349. if (get)
  350. (*num)++;
  351. }
  352. setResult(result, inter);
  353. return_:
  354. *function_ad = function;
  355. return result->type;
  356. }
  357. /**
  358. * 对位赋值
  359. * @param call_ad
  360. * @param function_ad
  361. * @param function_var
  362. * @param inter
  363. * @param var_list
  364. * @return
  365. */
  366. ResultType argumentToParameter(Argument **call_ad, Parameter **function_ad, VarList *function_var, FUNC_NT){
  367. Argument *call = *call_ad;
  368. Parameter *function = *function_ad;
  369. setResultCore(result);
  370. for (PASS; call != NULL && function != NULL && (call->type == value_arg) && function->type != args_par; call = call->next, function = function->next){
  371. Statement *name = function->type == value_par ? function->data.value : function->data.name;
  372. assCore(name, call->data.value, false, false, CFUNC_NT(function_var, result, belong));
  373. if (!CHECK_RESULT(result))
  374. goto return_;
  375. freeResult(result);
  376. }
  377. setResult(result, inter);
  378. return_:
  379. *call_ad = call;
  380. *function_ad = function;
  381. return result->type;
  382. }
  383. /**
  384. * 把所有实际参数的值计算出来
  385. * @param call_ad
  386. * @param inter
  387. * @param var_list
  388. * @return
  389. */
  390. ResultType iterParameter(Parameter *call, Argument **base_ad, bool is_dict, FUNC_NT){
  391. Argument *base = *base_ad;
  392. setResultCore(result);
  393. for (PASS; call != NULL; call = call->next){
  394. if(operationSafeInterStatement(CFUNC(call->data.value, var_list, result, belong)))
  395. goto return_;
  396. if (call->type == value_par)
  397. base = connectValueArgument(result->value, base);
  398. else if (call->type == name_par){
  399. if (is_dict){
  400. LinkValue *value = result->value;
  401. setResultCore(result);
  402. if(operationSafeInterStatement(CFUNC(call->data.name, var_list, result, belong))) {
  403. gc_freeTmpLink(&value->gc_status);
  404. goto return_;
  405. }
  406. wchar_t *name_str = getNameFromValue(result->value->value, inter->data.var_deep, inter);
  407. base = connectCharNameArgument(value, result->value, name_str, base);
  408. memFree(name_str);
  409. gc_freeTmpLink(&value->gc_status);
  410. }
  411. else
  412. base = connectStatementNameArgument(result->value, call->data.name, base);
  413. }
  414. else if (call->type == args_par){
  415. LinkValue *start = NULL;
  416. Argument *tmp_at = NULL;
  417. start = result->value;
  418. result->value = NULL;
  419. freeResult(result);
  420. tmp_at = listToArgument(start, LINEFILE, CNEXT_NT);
  421. gc_freeTmpLink(&start->gc_status);
  422. if (!CHECK_RESULT(result))
  423. goto return_;
  424. base = connectArgument(tmp_at, base);
  425. }
  426. else if (call->type == kwargs_par){
  427. LinkValue *start = NULL;
  428. Argument *tmp_at = NULL;
  429. start = result->value;
  430. result->value = NULL;
  431. freeResult(result);
  432. tmp_at = dictToArgument(start, LINEFILE, CNEXT_NT);
  433. gc_freeTmpLink(&start->gc_status);
  434. if (!CHECK_RESULT(result))
  435. goto return_;
  436. base = connectArgument(tmp_at, base);
  437. }
  438. freeResult(result);
  439. }
  440. setResult(result, inter);
  441. return_:
  442. *base_ad = base;
  443. return result->type;
  444. }
  445. Argument * getArgument(Parameter *call, bool is_dict, FUNC_NT) {
  446. Argument *new_arg = NULL;
  447. setResultCore(result);
  448. iterParameter(call, &new_arg, is_dict, CNEXT_NT);
  449. return new_arg;
  450. }
  451. bool checkIsSep(Parameter *pt) {
  452. for (PASS; pt != NULL; pt = pt->next) {
  453. if (pt->data.is_sep == true)
  454. return true;
  455. }
  456. return false;
  457. }
  458. /**
  459. * 参数表:
  460. |实参 \ 形参| name | value | arg | kwarg | null |
  461. ----------------------------------------
  462. |name | p_3 | p_3 | p_4 | p_3! | error |
  463. |value | p_1 | p_1 | p_4 | error | error |
  464. |null | p_2 | error | p_4 | p_5 | okay |
  465. ----------------------------------------
  466. * 注解: @p_1 match_status; @p_2 default_status; @p_3 self_ass; @p_4 mul_par; @p_5 pow_par; @p_3! 通过p_3处理**kwargs
  467. * @param call
  468. * @param function
  469. * @param func_var
  470. * @param inter
  471. * @param var_list
  472. * @return
  473. */
  474. ResultType setParameterCore(fline line, char *file, Argument *call, Parameter *function_base, VarList *function_var,
  475. FUNC_NT) {
  476. Parameter *function = NULL;
  477. Parameter *tmp_function = NULL; // 释放使用
  478. enum {
  479. match_status = 1,
  480. default_status = 2,
  481. self_ass = 3,
  482. mul_par = 4,
  483. space_kwargs = 5,
  484. error_to_less = -1,
  485. error_to_more = -2,
  486. error_kw = -3,
  487. error_unknown = -4,
  488. finished = 0,
  489. } status;
  490. function = copyParameter(function_base);
  491. tmp_function = function;
  492. setResultCore(result);
  493. gc_freeze(inter, function_var, NULL, true);
  494. gc_freeze(inter, var_list, NULL, true);
  495. while (true){
  496. if (call == NULL && function == NULL)
  497. status = finished;
  498. else if (call != NULL && function == NULL)
  499. status = error_to_more;
  500. else if ((call == NULL && function->type == value_par))
  501. status = error_to_less;
  502. else if (call != NULL && call->type == value_par && function->type == kwargs_par)
  503. status = error_kw;
  504. else if (call == NULL && function->type == name_par) // 根据前面的条件, 已经决定function不会为NULL
  505. status = default_status;
  506. else if (call == NULL && function->type == kwargs_par)
  507. status = space_kwargs;
  508. else if (function->type == args_par)
  509. status = mul_par;
  510. else if (call->type == value_arg) // 根据前面的条件, 已经决定call不会为NULL
  511. status = match_status;
  512. else if (call->type == name_arg) {
  513. if (checkIsSep(function))
  514. status = error_to_less;
  515. else
  516. status = self_ass;
  517. } else
  518. status = error_unknown;
  519. freeResult(result);
  520. switch (status) {
  521. case match_status: {
  522. argumentToParameter(&call, &function, function_var, CNEXT_NT);
  523. returnResult(result);
  524. break;
  525. }
  526. case default_status: {
  527. vint num = 0;
  528. defaultParameter(&function, &num, CFUNC_NT(function_var, result, belong));
  529. returnResult(result);
  530. break;
  531. }
  532. case self_ass: {
  533. vint set_num = 0;
  534. vint get_num = 0;
  535. bool dict_status = false;
  536. VarList *tmp = makeVarList(inter, true);
  537. argumentToVar(&call, &set_num, CFUNC_NT(tmp, result, belong));
  538. if (!CHECK_RESULT(result)) {
  539. freeVarList(tmp);
  540. goto return_;
  541. }
  542. freeResult(result);
  543. parameterFromVar(&function, function_var, &get_num, set_num, &dict_status, CFUNC_NT(tmp, result, belong));
  544. freeVarList(tmp);
  545. if (!CHECK_RESULT(result))
  546. goto return_;
  547. if (!dict_status && set_num > get_num)
  548. goto to_more;
  549. break;
  550. }
  551. case mul_par: {
  552. LinkValue *tmp;
  553. if (call != NULL) {
  554. Argument *backup;
  555. Argument *base = call;
  556. for (PASS; call->next != NULL && call->next->type == value_arg; call = call->next)
  557. PASS;
  558. backup = call->next;
  559. call->next = NULL;
  560. makeListValue(base, LINEFILE, L_tuple, CNEXT_NT);
  561. call->next = backup;
  562. call = backup;
  563. } else
  564. makeListValue(NULL, LINEFILE, L_tuple, CNEXT_NT);
  565. returnResult(result);
  566. tmp = result->value;
  567. result->value = NULL;
  568. freeResult(result);
  569. assCore(function->data.value, tmp, false, false, CFUNC_NT(function_var, result, belong));
  570. gc_freeTmpLink(&tmp->gc_status);
  571. returnResult(result);
  572. function = function->next;
  573. break;
  574. }
  575. case space_kwargs:{
  576. LinkValue *tmp;
  577. makeDictValue(NULL, true, LINEFILE, CNEXT_NT);
  578. returnResult(result);
  579. tmp = result->value;
  580. result->value = NULL;
  581. freeResult(result);
  582. assCore(function->data.value, tmp, false, false, CFUNC_NT(function_var, result, belong));
  583. gc_freeTmpLink(&tmp->gc_status);
  584. returnResult(result);
  585. function = function->next;
  586. break;
  587. }
  588. case error_to_less:
  589. setResultError(E_ArgumentException, FEW_ARG, line, file, true, CNEXT_NT);
  590. goto return_;
  591. case error_to_more:
  592. to_more:
  593. setResultError(E_ArgumentException, MANY_ARG, line, file, true, CNEXT_NT);
  594. goto return_;
  595. case error_kw:
  596. setResultError(E_ArgumentException, OBJ_NOTSUPPORT(**), line, file, true, CNEXT_NT);
  597. goto return_;
  598. case error_unknown:
  599. setResultError(E_ArgumentException, L"Argument Unknown Exception", line, file, true, CNEXT_NT);
  600. goto return_;
  601. default:
  602. goto break_;
  603. }
  604. }
  605. break_:
  606. setResult(result, inter);
  607. return_:
  608. gc_freeze(inter, function_var, NULL, false);
  609. gc_freeze(inter, var_list, NULL, false);
  610. freeParameter(tmp_function, true);
  611. return result->type;
  612. }
  613. Inherit *setFather(Argument *call) {
  614. Inherit *father_tmp = NULL;
  615. for (Argument *tmp = call; tmp != NULL && tmp->type == value_arg; tmp = tmp->next)
  616. if (tmp->data.value->value->type == V_class) {
  617. father_tmp = connectInherit(father_tmp, makeInherit(tmp->data.value));
  618. father_tmp = connectInherit(father_tmp, copyInherit(tmp->data.value->value->object.inherit));
  619. }
  620. return setFatherCore(father_tmp);
  621. }
  622. Inherit *setFatherCore(Inherit *father_tmp) {
  623. Inherit *base_father = NULL;
  624. while (father_tmp != NULL){
  625. Inherit *next = father_tmp->next;
  626. father_tmp->next = NULL;
  627. base_father = connectSafeInherit(base_father, father_tmp);
  628. father_tmp = next;
  629. }
  630. return base_father;
  631. }
  632. bool checkFormal(Parameter *pt) {
  633. enum {
  634. Formal_1,
  635. Formal_2,
  636. } status = Formal_1;
  637. for (PASS; pt != NULL; pt = pt->next){
  638. if (status == Formal_1 && (pt->type == name_par || pt->type == args_par))
  639. status = Formal_2;
  640. else if (status == Formal_2 && (pt->type == value_par || pt->type == args_par) || pt->type == kwargs_par && pt->next != NULL)
  641. return false;
  642. }
  643. return true;
  644. }
  645. int parserArgumentUnion(ArgumentParser ap[], Argument *arg, FUNC_NT){
  646. setResultCore(result);
  647. if (ap->type != only_name){
  648. ArgumentParser *bak = NULL;
  649. int status = 1;
  650. arg = parserValueArgument(ap, arg, &status, &bak);
  651. if (status != 1){
  652. setResultError(E_ArgumentException, FEW_ARG, LINEFILE, true, CNEXT_NT);
  653. return 0;
  654. }
  655. ap = bak;
  656. }
  657. if (ap->must != -1){
  658. ArgumentParser *bak = NULL;
  659. int status;
  660. if (arg != NULL && arg->type != name_arg) {
  661. setResultError(E_ArgumentException, MANY_ARG, LINEFILE, true, CNEXT_NT);
  662. return -6;
  663. }
  664. status = parserNameArgument(ap, arg, &bak, CNEXT_NT);
  665. if (!CHECK_RESULT(result))
  666. return -1;
  667. if (status == -3){
  668. if (parserArgumentNameDefault(ap)->must != -1){
  669. setResultError(E_ArgumentException, FEW_ARG, LINEFILE, true, CNEXT_NT);
  670. return -7;
  671. }
  672. }
  673. else if (status == 0){
  674. setResultError(E_ArgumentException, MANY_ARG, LINEFILE, true, CNEXT_NT);
  675. return -2;
  676. } else if (status == -4){
  677. setResultError(E_ArgumentException, FEW_ARG, LINEFILE, true, CNEXT_NT);
  678. return -3;
  679. }
  680. } else{
  681. if (arg != NULL) {
  682. setResultError(E_ArgumentException, MANY_ARG, LINEFILE, true, CNEXT_NT);
  683. return -4;
  684. }
  685. }
  686. return 1;
  687. }
  688. Argument *parserValueArgument(ArgumentParser *ap, Argument *arg, int *status, ArgumentParser **bak){
  689. *status = 1;
  690. for (PASS; ap->must != -1 && (ap->type == only_value || ap->type == name_value); ap++){
  691. if (arg == NULL || arg->name_type != value_arg) { // 形参进入key=value模式
  692. if ((ap = parserArgumentValueDefault(ap))->must != -1 && ap->type == only_value) // 检查剩余的是否.must=1
  693. *status = 0; // 存在.must=1则返回 0
  694. break; // 正常情况返回 1
  695. }
  696. arg = parserArgumentValueCore(arg, ap);
  697. }
  698. if (bak != NULL)
  699. *bak = ap;
  700. return arg;
  701. }
  702. int parserNameArgument(ArgumentParser ap[], Argument *arg, ArgumentParser **bak, FUNC_NT){
  703. VarList *tmp = NULL;
  704. vint set_num = 0;
  705. vint get_num = 0;
  706. int return_;
  707. setResultCore(result);
  708. gc_freeze(inter, var_list, NULL, true);
  709. for (PASS; arg != NULL && arg->type != name_arg; arg = arg->next)
  710. PASS;
  711. if (arg == NULL) {
  712. return_ = -3; // 参数缺失
  713. goto return_;
  714. }
  715. tmp = makeVarList(inter, true);
  716. argumentToVar(&arg, &set_num, CFUNC_NT(tmp, result, belong));
  717. if (!CHECK_RESULT(result)) {
  718. return_ = -1;
  719. goto return_;
  720. }
  721. setResult(result, inter);
  722. for (PASS; ap->must != -1 && (ap->type == only_name || ap->type == name_value); ap++) {
  723. int status = parserArgumentVar(ap, inter, tmp);
  724. if (status == 1)
  725. get_num ++;
  726. else{
  727. return_ = -2; // 参数缺失
  728. goto return_;
  729. }
  730. }
  731. return_ = (get_num < set_num) ? 0 : ((get_num > set_num) ? -4 : 1);
  732. return_:
  733. freeVarList(tmp);
  734. gc_freeze(inter, var_list, NULL, false);
  735. if (bak != NULL)
  736. *bak = ap;
  737. return return_;
  738. }
  739. Argument *parserArgumentValueCore(Argument *arg, ArgumentParser *ap){
  740. int count = 1;
  741. ap->arg = arg;
  742. ap->value = arg->data.value;
  743. arg = arg->next;
  744. if (ap->long_arg)
  745. for (PASS; arg != NULL && arg->type == value_arg; arg = arg->next, count++)
  746. PASS;
  747. ap->c_count = count;
  748. return arg;
  749. }
  750. int parserArgumentVar(ArgumentParser *ap, Inter *inter, VarList *var_list){
  751. LinkValue *value = NULL;
  752. findStrVarOnly(ap->name, false, CFUNC_CORE(var_list)); // 参数取值不执行变量式函数
  753. ap->value = value;
  754. if (value != NULL)
  755. return 1;
  756. else if (ap->must)
  757. return -1;
  758. return 0;
  759. }
  760. ArgumentParser *parserArgumentValueDefault(ArgumentParser *ap){
  761. for (PASS; ap->type == only_value && ap->must == 0; ap++) {
  762. ap->arg = NULL;
  763. ap->value = NULL;
  764. ap->c_count = 0;
  765. }
  766. return ap;
  767. }
  768. ArgumentParser *parserArgumentNameDefault(ArgumentParser *ap){
  769. for (PASS; ap->must == 0; ap++) {
  770. ap->arg = NULL;
  771. ap->value = NULL;
  772. ap->c_count = 0;
  773. }
  774. return ap;
  775. }
  776. void setArgumentFFICore(ArgumentFFI *af) {
  777. af->type = NULL;
  778. af->arg = NULL;
  779. af->arg_v = NULL;
  780. af->size = 0;
  781. af->b_va = 0;
  782. }
  783. void setArgumentFFI(ArgumentFFI *af, unsigned int size) {
  784. af->type = memCalloc((size_t)size, sizeof(enum ArgumentFFIType));
  785. af->arg = memCalloc((size_t)size, sizeof(ffi_type *));
  786. af->arg_v = memCalloc((size_t)size, sizeof(void *));
  787. af->size = size;
  788. af->b_va = size;
  789. memset(af->type, 0, (size_t)size);
  790. memset(af->arg, 0, (size_t)size);
  791. memset(af->arg_v, 0, (size_t)size);
  792. }
  793. void freeArgumentFFI(ArgumentFFI *af) {
  794. for (unsigned int i=0; i < af->size; i++) {
  795. switch (af->type[i]) { // TODO-szh 改为if-else分支
  796. case af_wstr:
  797. case af_str:
  798. if (af->arg_v[i] != NULL)
  799. memFree(*(void **)af->arg_v[i]);
  800. memFree(af->arg_v[i]);
  801. break;
  802. case af_void:
  803. break;
  804. default:
  805. memFree(af->arg_v[i]);
  806. break;
  807. }
  808. }
  809. memFree(af->type);
  810. memFree(af->arg);
  811. memFree(af->arg_v);
  812. }
  813. unsigned int checkArgument(Argument *arg, enum ArgumentType type) {
  814. unsigned int count;
  815. for (count = 0; arg != NULL; arg = arg->next, count ++) {
  816. if (arg->type != type)
  817. return -1;
  818. }
  819. return count;
  820. }
  821. bool listToArgumentFFI(ArgumentFFI *af, LinkValue **list, vint size, LinkValue **valist, vint vasize) {
  822. int i=0;
  823. if ((size + vasize) != af->size)
  824. return false;
  825. for (PASS; i < size; i++) {
  826. LinkValue *str = list[i];
  827. if (str->value->type != V_str)
  828. return false;
  829. af->arg[i] = getFFIType(str->value->data.str.str, af->type + i);
  830. if (af->arg[i] == NULL || af->type[i] == af_void)
  831. return false;
  832. }
  833. for (PASS; i < af->size; i++) { // 处理可变参数
  834. LinkValue *str = valist[i - size];
  835. if (str->value->type != V_str)
  836. return false;
  837. af->arg[i] = getFFITypeUp(str->value->data.str.str, af->type + i);
  838. if (af->arg[i] == NULL || af->type[i] == af_void)
  839. return false;
  840. }
  841. return true;
  842. }
  843. #define setFFIValue(v_t, ffi_t, af_t, type_, data_) case v_t: \
  844. af->arg[i] = &ffi_t; /* af->arg是ffi_type **arg, 即*arg[] */ \
  845. af->type[i] = af_t; \
  846. af->arg_v[i] = (type_ *)memCalloc(1, sizeof(type_)); /* af->arg_v是ffi_type **arg_v, 即 *arg_v[] */ \
  847. *(type_ *)(af->arg_v[i]) = (type_)(data_); \
  848. break
  849. static bool setFFIArgFromValue(ArgumentFFI *af, Argument *arg, unsigned int i) {
  850. switch (arg->data.value->value->type) {
  851. setFFIValue(V_int, ffi_type_sint32, af_int, int, arg->data.value->value->data.int_.num);
  852. setFFIValue(V_dou, ffi_type_double, af_double, double, arg->data.value->value->data.dou.num);
  853. setFFIValue(V_bool, ffi_type_sint32, af_int, double, arg->data.value->value->data.bool_.bool_);
  854. setFFIValue(V_str, ffi_type_pointer, af_str, char *, memWcsToStr(arg->data.value->value->data.str.str, false));
  855. setFFIValue(V_pointer, ffi_type_void, af_int, void *, arg->data.value->value->data.pointer.pointer);
  856. case V_ell:
  857. setFFIValue(V_none, ffi_type_sint32, af_int, int, 0);
  858. default:
  859. return false;
  860. }
  861. return true;
  862. }
  863. #undef setFFIValue
  864. #define setFFIArgFromTypeNumber(aft_type, type_) \
  865. case aft_type: \
  866. do { \
  867. af->arg_v[i] = memCalloc(1, sizeof(type_)); \
  868. switch (arg->data.value->value->type) { \
  869. case V_int: \
  870. *(type_ *)(af->arg_v[i]) = (type_)arg->data.value->value->data.int_.num; \
  871. break; \
  872. case V_dou: \
  873. *(type_ *)(af->arg_v[i]) = (type_)arg->data.value->value->data.dou.num; \
  874. break; \
  875. case V_ell: \
  876. case V_none: \
  877. *(type_ *)(af->arg_v[i]) = (type_)0; \
  878. break; \
  879. case V_bool: \
  880. *(type_ *)(af->arg_v[i]) = (type_)arg->data.value->value->data.bool_.bool_; \
  881. break; \
  882. case V_pointer: \
  883. *(type_ *)(af->arg_v[i]) = (type_)(vint)arg->data.value->value->data.pointer.pointer; \
  884. break; \
  885. default: \
  886. return false; \
  887. } } while(0); \
  888. break
  889. #define setFFIArgFromTypeChar(aft_type, type_) case aft_type: \
  890. af->arg_v[i] = memCalloc(1, sizeof(type_)); \
  891. if (arg->data.value->value->type == V_str && memWidelen(arg->data.value->value->data.str.str) == 1) \
  892. *(type_ *)(af->arg_v[i]) = (type_)(arg->data.value->value->data.str.str[0]); \
  893. else \
  894. return false; \
  895. break
  896. static bool setFFIArgFromType(ArgumentFFI *af, Argument *arg, unsigned int i) {
  897. switch (af->type[i]) {
  898. setFFIArgFromTypeNumber(af_sint, int16_t);
  899. setFFIArgFromTypeNumber(af_usint, u_int16_t);
  900. setFFIArgFromTypeNumber(af_int, int32_t);
  901. setFFIArgFromTypeNumber(af_uint, u_int32_t);
  902. setFFIArgFromTypeNumber(af_lint, int64_t);
  903. setFFIArgFromTypeNumber(af_ulint, u_int64_t);
  904. setFFIArgFromTypeNumber(af_float, float);
  905. setFFIArgFromTypeNumber(af_ldouble, long double);
  906. setFFIArgFromTypeNumber(af_double, double);
  907. case af_pointer:
  908. af->arg_v[i] = memCalloc(1, sizeof(void *));
  909. switch (arg->data.value->value->type) {
  910. case V_int:
  911. *(void **) (af->arg_v[i]) = (void *) arg->data.value->value->data.int_.num;
  912. break;
  913. case V_ell:
  914. case V_none:
  915. *(void **) (af->arg_v[i]) = NULL;
  916. break;
  917. case V_pointer:
  918. *(void **) (af->arg_v[i]) = (void *)arg->data.value->value->data.pointer.pointer;
  919. break;
  920. default:
  921. return 0;
  922. }
  923. break;
  924. setFFIArgFromTypeChar(af_char, int8_t);
  925. setFFIArgFromTypeChar(af_uchar, u_int8_t);
  926. case af_str:
  927. af->arg_v[i] = memCalloc(1, sizeof(char *)); // af->arg_v是ffi_type **arg_v, 即 *arg_v[]
  928. if (arg->data.value->value->type == V_str) {
  929. *(char **)(af->arg_v[i]) = memWcsToStr(arg->data.value->value->data.str.str, false);
  930. } else
  931. return false;
  932. break;
  933. case af_wstr:
  934. af->arg_v[i] = memCalloc(1, sizeof(wchar_t *)); // af->arg_v是ffi_type **arg_v, 即 *arg_v[]
  935. if (arg->data.value->value->type == V_str) {
  936. *(wchar_t **)(af->arg_v[i]) = memWidecpy(arg->data.value->value->data.str.str);
  937. } else
  938. return false;
  939. break;
  940. default:
  941. return false;
  942. }
  943. return true;
  944. }
  945. #undef setFFIArgFromTypeNumber
  946. #undef setFFIArgFromTypeChar
  947. bool setArgumentToFFI(ArgumentFFI *af, Argument *arg) {
  948. for (unsigned int i=0; arg != NULL && i < af->size; arg = arg->next, i++) {
  949. if (af->arg[i] == NULL) {
  950. if (!setFFIArgFromValue(af, arg, i))
  951. return false;
  952. } else{
  953. if (!setFFIArgFromType(af, arg, i))
  954. return false;
  955. }
  956. }
  957. return arg == NULL; // 若arg还没迭代完, 则证明有问题
  958. }
  959. ffi_type *getFFIType(wchar_t *str, enum ArgumentFFIType *aft) {
  960. ffi_type *return_ = NULL;
  961. if (eqWide(str, L"int")) {
  962. return_ = &ffi_type_sint32;
  963. *aft = af_int;
  964. } else if (eqWide(str, L"uint")) {
  965. return_ = &ffi_type_uint32;
  966. *aft = af_uint;
  967. } else if (eqWide(str, L"sint")) {
  968. return_ = &ffi_type_sint16;
  969. *aft = af_sint;
  970. } else if (eqWide(str, L"usint")) {
  971. return_ = &ffi_type_uint16;
  972. *aft = af_usint;
  973. } else if (eqWide(str, L"lint")) {
  974. return_ = &ffi_type_sint64;
  975. *aft = af_lint;
  976. } else if (eqWide(str, L"ulint")) {
  977. return_ = &ffi_type_uint64;
  978. *aft = af_ulint;
  979. } else if (eqWide(str, L"float")) {
  980. return_ = &ffi_type_float;
  981. *aft = af_float;
  982. } else if (eqWide(str, L"double")) {
  983. return_ = &ffi_type_double;
  984. *aft = af_double;
  985. } else if (eqWide(str, L"ldouble")) {
  986. return_ = &ffi_type_longdouble;
  987. *aft = af_ldouble;
  988. } else if (eqWide(str, L"str")) {
  989. return_ = &ffi_type_pointer;
  990. *aft = af_str;
  991. } else if (eqWide(str, L"wstr")) {
  992. return_ = &ffi_type_pointer;
  993. *aft = af_wstr;
  994. } else if (eqWide(str, L"char")) {
  995. return_ = &ffi_type_sint8;
  996. *aft = af_char;
  997. } else if (eqWide(str, L"uchar")) {
  998. return_ = &ffi_type_uint8;
  999. *aft = af_char;
  1000. } else if (eqWide(str, L"void")) {
  1001. return_ = &ffi_type_void;
  1002. *aft = af_void;
  1003. } else if (eqWide(str, L"pointer")) {
  1004. return_ = &ffi_type_pointer;
  1005. *aft = af_pointer;
  1006. }
  1007. return return_;
  1008. }
  1009. ffi_type *getFFITypeUp(wchar_t *str, enum ArgumentFFIType *aft) {
  1010. ffi_type *return_ = NULL;
  1011. if (eqWide(str, L"int") || eqWide(str, L"sint") || eqWide(str, L"char")) {
  1012. return_ = &ffi_type_sint32;
  1013. *aft = af_int;
  1014. } else if (eqWide(str, L"uint") || eqWide(str, L"usint") || eqWide(str, L"uchar")) {
  1015. return_ = &ffi_type_uint32;
  1016. *aft = af_uint;
  1017. } else if (eqWide(str, L"lint")) {
  1018. return_ = &ffi_type_sint64;
  1019. *aft = af_lint;
  1020. } else if (eqWide(str, L"ulint")) {
  1021. return_ = &ffi_type_uint64;
  1022. *aft = af_ulint;
  1023. } else if (eqWide(str, L"float") || eqWide(str, L"double")) {
  1024. return_ = &ffi_type_double;
  1025. *aft = af_double;
  1026. } else if (eqWide(str, L"ldouble")) {
  1027. return_ = &ffi_type_longdouble;
  1028. *aft = af_ldouble;
  1029. } else if (eqWide(str, L"str")) {
  1030. return_ = &ffi_type_pointer;
  1031. *aft = af_str;
  1032. } else if (eqWide(str, L"wstr")) {
  1033. return_ = &ffi_type_pointer;
  1034. *aft = af_wstr;
  1035. } else if (eqWide(str, L"void")) {
  1036. return_ = &ffi_type_void;
  1037. *aft = af_void;
  1038. } else if (eqWide(str, L"pointer")) {
  1039. return_ = &ffi_type_pointer;
  1040. *aft = af_pointer;
  1041. }
  1042. return return_;
  1043. }