1
0

parameter.c 37 KB

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