parameter.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. #include "__run.h"
  2. #define returnResult(result) do{ \
  3. if (!run_continue(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, char *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_ = memStrcpy(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, char *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->next = NULL;
  82. return tmp;
  83. }
  84. Parameter *copyenOneParameter(Parameter *base){
  85. Parameter *tmp = makeParameter();
  86. tmp->data.value = copyStatement(base->data.value);
  87. tmp->data.name = copyStatement(base->data.name);
  88. tmp->type = base->type;
  89. return tmp;
  90. }
  91. Parameter *copyParameter(Parameter *base){
  92. Parameter *base_tmp = NULL;
  93. Parameter **tmp = &base_tmp;
  94. for (PASS; base != NULL; tmp = &(*tmp)->next,base = base->next)
  95. *tmp = copyenOneParameter(base);
  96. return base_tmp;
  97. }
  98. Parameter *makeValueParameter(Statement *st){
  99. Parameter *tmp = makeParameter();
  100. tmp->data.value = st;
  101. return tmp;
  102. }
  103. Parameter *makeNameParameter(Statement *value, Statement *name){
  104. Parameter *tmp = makeParameter();
  105. tmp->type = name_par;
  106. tmp->data.value = value;
  107. tmp->data.name = name;
  108. return tmp;
  109. }
  110. Parameter *makeArgsParameter(Statement *st){
  111. Parameter *tmp = makeParameter();
  112. tmp->type = args_par;
  113. tmp->data.value = st;
  114. return tmp;
  115. }
  116. Parameter *makeKwrgsParameter(Statement *st){
  117. Parameter *tmp = makeParameter();
  118. tmp->type = kwargs_par;
  119. tmp->data.value = st;
  120. return tmp;
  121. }
  122. Parameter *connectParameter(Parameter *new, Parameter *base){
  123. if (base == NULL)
  124. return new;
  125. Parameter *tmp = base;
  126. while (base->next != NULL)
  127. base = base->next;
  128. base->next = new;
  129. return tmp;
  130. }
  131. Parameter *connectValueParameter(Statement *st, Parameter *base){
  132. Parameter *new = makeValueParameter(st);
  133. return connectParameter(new, base);
  134. }
  135. Parameter *connectNameParameter(Statement *value, Statement *name, Parameter *base){
  136. Parameter *new = makeNameParameter(value, name);
  137. return connectParameter(new, base);
  138. }
  139. Parameter *connectArgsParameter(Statement *st, Parameter *base){
  140. Parameter *new = makeArgsParameter(st);
  141. return connectParameter(new, base);
  142. }
  143. Parameter *connectKwargsParameter(Statement *st, Parameter *base){
  144. Parameter *new = makeKwrgsParameter(st);
  145. return connectParameter(new, base);
  146. }
  147. void freeParameter(Parameter *pt, bool free_st) {
  148. for (Parameter *tmp=NULL;pt != NULL;pt = tmp){
  149. tmp = pt->next;
  150. if (free_st) {
  151. freeStatement(pt->data.value);
  152. freeStatement(pt->data.name);
  153. }
  154. memFree(pt);
  155. }
  156. }
  157. Argument *listToArgument(LinkValue *list_value, long line, char *file, INTER_FUNCTIONSIG_NOT_ST){
  158. Argument *at = NULL;
  159. LinkValue *iter = NULL;
  160. setResultCore(result);
  161. getIter(list_value, 1, line, file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  162. if (!run_continue(result))
  163. return NULL;
  164. iter = result->value;
  165. result->value = NULL;
  166. while (true) {
  167. freeResult(result);
  168. getIter(iter, 0, line, file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  169. if (!run_continue(result)) {
  170. freeResult(result);
  171. break;
  172. }
  173. at = connectValueArgument(result->value, at);
  174. }
  175. gc_freeTmpLink(&iter->gc_status);
  176. setResult(result, inter, belong);
  177. return at;
  178. }
  179. Argument *dictToArgument(LinkValue *dict_value, INTER_FUNCTIONSIG_CORE){
  180. Argument *at = NULL;
  181. Var *tmp = NULL;
  182. for (int i = 0; i < MAX_SIZE; i++)
  183. for (tmp = dict_value->value->data.dict.dict->hashtable[i]; tmp != NULL; tmp = tmp->next)
  184. at = connectCharNameArgument(tmp->value, tmp->name_, tmp->name, at);
  185. return at;
  186. }
  187. /**
  188. * 设置形式参数的默认值
  189. * 仅支持name_value
  190. * @param function_ad
  191. * @param inter
  192. * @param var_list
  193. * @param num
  194. * @return
  195. */
  196. ResultType defaultParameter(Parameter **function_ad, NUMBER_TYPE *num, INTER_FUNCTIONSIG_NOT_ST) {
  197. Parameter *function = *function_ad;
  198. setResultCore(result);
  199. for (*num = 0; function != NULL && function->type == name_par; (*num)++, function = function->next){
  200. LinkValue *value = NULL;
  201. if(operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(function->data.value, var_list, result, belong)))
  202. goto return_;
  203. value = result->value;
  204. freeResult(result);
  205. assCore(function->data.name, value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  206. if (!run_continue(result))
  207. goto return_;
  208. }
  209. setResult(result, inter, belong);
  210. return_:
  211. *function_ad = function;
  212. return result->type;
  213. }
  214. /**
  215. * 设置实际参数的默认值, 仅支持name_base_value
  216. * @param call_ad
  217. * @param inter
  218. * @param var_list
  219. * @param num
  220. * @return
  221. */
  222. ResultType argumentToVar(Argument **call_ad, NUMBER_TYPE *num, INTER_FUNCTIONSIG_NOT_ST) {
  223. Argument *call = *call_ad;
  224. setResultCore(result);
  225. for (*num = 0; call != NULL && call->type == name_arg; (*num)++, call = call->next){
  226. if (call->name_type == name_char){
  227. addFromVarList(call->data.name_, call->data.name_value, 0, call->data.value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  228. continue;
  229. }
  230. freeResult(result);
  231. assCore(call->data.name, call->data.value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  232. if (!run_continue(result))
  233. goto return_;
  234. }
  235. setResult(result, inter, belong);
  236. return_:
  237. *call_ad = call;
  238. return result->type;
  239. }
  240. /**
  241. * 形式参数从变量空间中获取值
  242. * @param function_ad
  243. * @param function_var
  244. * @param inter
  245. * @param var_list
  246. * @param num
  247. * @return
  248. */
  249. ResultType parameterFromVar(Parameter **function_ad, VarList *function_var, NUMBER_TYPE *num, NUMBER_TYPE max, bool *status,
  250. INTER_FUNCTIONSIG_NOT_ST) {
  251. Parameter *function = *function_ad;
  252. bool get = true;
  253. setResultCore(result);
  254. for (*num = 0, *status = false; function != NULL; function = function->next){
  255. int int_times;
  256. char *str_name = NULL;
  257. Statement *name = function->type == name_par ? function->data.name : function->data.value;
  258. LinkValue *value = NULL;
  259. get = true;
  260. if (function->type == kwargs_par){
  261. value = makeLinkValue(makeDictValue(NULL, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, NULL, belong)), belong, inter);
  262. value->value->data.dict.dict = var_list->hashtable;
  263. value->value->data.dict.size = max - *num;
  264. *status = true;
  265. goto not_return;
  266. }
  267. freeResult(result);
  268. getVarInfo(&str_name, &int_times, CALL_INTER_FUNCTIONSIG(name, var_list, result, belong));
  269. if (!run_continue(result)) {
  270. memFree(str_name);
  271. *function_ad = function;
  272. return result->type;
  273. }
  274. freeResult(result);
  275. value = findFromVarList(str_name, int_times, 1, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  276. memFree(str_name);
  277. if(value == NULL) {
  278. get = false;
  279. if (function->type == name_par && !operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(function->data.value, var_list, result, belong))) {
  280. value = result->value;
  281. goto not_return;
  282. }
  283. setResultErrorSt(result, inter, "ArgumentException", "Too less Argument", name, belong, true);
  284. goto reutnr_;
  285. }
  286. else if ((name->aut == public_aut || name->aut == auto_aut) && (value->aut != public_aut && value->aut != auto_aut)) {
  287. setResultErrorSt(result, inter, "PermissionsException", "Wrong Permissions: access Argument as public",
  288. name,
  289. belong, true);
  290. goto reutnr_;
  291. }
  292. else if ((name->aut == protect_aut) && (value->aut == private_aut)) {
  293. setResultErrorSt(result, inter, "PermissionsException", "Wrong Permissions: access variables as protect",
  294. name, belong, true);
  295. goto reutnr_;
  296. }
  297. not_return:
  298. freeResult(result);
  299. assCore(name, value, CALL_INTER_FUNCTIONSIG_NOT_ST(function_var, result, belong));
  300. if (!run_continue(result)) {
  301. *function_ad = function;
  302. return result->type;
  303. }
  304. else
  305. freeResult(result);
  306. if (get)
  307. (*num)++;
  308. }
  309. setResult(result, inter, belong);
  310. reutnr_:
  311. *function_ad = function;
  312. return result->type;
  313. }
  314. /**
  315. * 对位赋值
  316. * @param call_ad
  317. * @param function_ad
  318. * @param function_var
  319. * @param inter
  320. * @param var_list
  321. * @return
  322. */
  323. ResultType argumentToParameter(Argument **call_ad, Parameter **function_ad, VarList *function_var, INTER_FUNCTIONSIG_NOT_ST){
  324. Argument *call = *call_ad;
  325. Parameter *function = *function_ad;
  326. setResultCore(result);
  327. for (PASS; call != NULL && function != NULL && (call->type == value_arg) && function->type != args_par; call = call->next, function = function->next){
  328. Statement *name = function->type == value_par ? function->data.value : function->data.name;
  329. assCore(name, call->data.value, CALL_INTER_FUNCTIONSIG_NOT_ST(function_var, result, belong));
  330. if (!run_continue(result))
  331. goto return_;
  332. freeResult(result);
  333. }
  334. setResult(result, inter, belong);
  335. return_:
  336. *call_ad = call;
  337. *function_ad = function;
  338. return result->type;
  339. }
  340. /**
  341. * 把所有实际参数的值计算出来
  342. * @param call_ad
  343. * @param inter
  344. * @param var_list
  345. * @return
  346. */
  347. ResultType iterParameter(Parameter *call, Argument **base_ad, bool is_dict, INTER_FUNCTIONSIG_NOT_ST){
  348. Argument *base = *base_ad;
  349. setResultCore(result);
  350. for (PASS; call != NULL; call = call->next){
  351. if(operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(call->data.value, var_list, result, belong)))
  352. goto return_;
  353. if (call->type == value_par)
  354. base = connectValueArgument(result->value, base);
  355. else if (call->type == name_par){
  356. if (is_dict){
  357. LinkValue *value = result->value;
  358. setResultCore(result);
  359. if(operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(call->data.name, var_list, result, belong))) {
  360. gc_freeTmpLink(&value->gc_status);
  361. goto return_;
  362. }
  363. char *name_str = getNameFromValue(result->value->value, inter);
  364. base = connectCharNameArgument(value, result->value, name_str, base);
  365. memFree(name_str);
  366. gc_freeTmpLink(&value->gc_status);
  367. }
  368. else
  369. base = connectStatementNameArgument(result->value, call->data.name, base);
  370. }
  371. else if (call->type == args_par){
  372. LinkValue *start = NULL;
  373. Argument *tmp_at = NULL;
  374. start = result->value;
  375. result->value = NULL;
  376. freeResult(result);
  377. tmp_at = listToArgument(start, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  378. gc_freeTmpLink(&start->gc_status);
  379. base = connectArgument(tmp_at, base);
  380. }
  381. else if (call->type == kwargs_par){
  382. Argument *tmp_at = dictToArgument(result->value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  383. base = connectArgument(tmp_at, base);
  384. }
  385. freeResult(result);
  386. }
  387. setResult(result, inter, belong);
  388. return_:
  389. *base_ad = base;
  390. return result->type;
  391. }
  392. Argument * getArgument(Parameter *call, bool is_dict, INTER_FUNCTIONSIG_NOT_ST) {
  393. Argument *new_arg = NULL;
  394. setResultCore(result);
  395. iterParameter(call, &new_arg, is_dict, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  396. return new_arg;
  397. }
  398. /**
  399. * 参数表:
  400. |实参 \ 形参| name | value | arg | kwarg | null |
  401. ----------------------------------------
  402. |name | p_3 | p_3 | p_4 | p_3! | error |
  403. |value | p_1 | p_1 | p_4 | error | error |
  404. |null | p_2 | error | p_4 | p_5 | okay |
  405. ----------------------------------------
  406. * 注解: @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
  407. * @param call
  408. * @param function
  409. * @param function_var
  410. * @param inter
  411. * @param var_list
  412. * @return
  413. */
  414. ResultType setParameter(long int line, char *file, Parameter *call_base, Parameter *function_base, VarList *function_var, LinkValue *function_father, INTER_FUNCTIONSIG_NOT_ST) {
  415. Argument *self_tmp = makeValueArgument(function_father);
  416. Argument *father_tmp = makeValueArgument(function_father->belong);
  417. Argument *call = NULL;
  418. setResultCore(result);
  419. call = getArgument(call_base, false, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  420. self_tmp->next = father_tmp;
  421. father_tmp->next = call;
  422. if (!run_continue(result)) {
  423. freeArgument(call, false);
  424. return result->type;
  425. }
  426. freeResult(result);
  427. setParameterCore(line, file, self_tmp, function_base, function_var, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, function_father));
  428. freeArgument(self_tmp, false);
  429. return result->type;
  430. }
  431. ResultType setParameterCore(long int line, char *file, Argument *call, Parameter *function_base, VarList *function_var,
  432. INTER_FUNCTIONSIG_NOT_ST) {
  433. Parameter *function = NULL;
  434. Parameter *tmp_function = NULL; // 释放使用
  435. enum {
  436. match_status = 1,
  437. default_status = 2,
  438. self_ass = 3,
  439. mul_par = 4,
  440. space_kwargs = 5,
  441. error_to_less = -1,
  442. error_to_more = -2,
  443. error_kw = -3,
  444. finished = 0,
  445. } status = match_status;
  446. function = copyParameter(function_base);
  447. tmp_function = function;
  448. setResultCore(result);
  449. gc_freeze(inter, function_var, NULL, true);
  450. gc_freeze(inter, var_list, NULL, true);
  451. while (true){
  452. if (call == NULL && function == NULL)
  453. status = finished;
  454. else if (call != NULL && function == NULL)
  455. status = error_to_more;
  456. else if ((call == NULL && function->type == value_par))
  457. status = error_to_less;
  458. else if (call != NULL && call->type == value_par && function->type == kwargs_par)
  459. status = error_kw;
  460. else if (call == NULL && function->type == name_par) // 根据前面的条件, 已经决定function不会为NULL
  461. status = default_status;
  462. else if (call == NULL && function->type == kwargs_par)
  463. status = space_kwargs;
  464. else if (function->type == args_par) // 根据前面的条件, 已经决定call不会为NULL
  465. status = mul_par;
  466. else if (call->type == value_arg)
  467. status = match_status;
  468. else if (call->type == name_arg)
  469. status = self_ass;
  470. freeResult(result);
  471. switch (status) {
  472. case match_status: {
  473. argumentToParameter(&call, &function, function_var, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  474. returnResult(result);
  475. break;
  476. }
  477. case default_status: {
  478. NUMBER_TYPE num = 0;
  479. defaultParameter(&function, &num, CALL_INTER_FUNCTIONSIG_NOT_ST(function_var, result, belong));
  480. returnResult(result);
  481. break;
  482. }
  483. case self_ass: {
  484. NUMBER_TYPE set_num = 0;
  485. NUMBER_TYPE get_num = 0;
  486. bool dict_status = false;
  487. VarList *tmp = makeVarList(inter, true);
  488. argumentToVar(&call, &set_num, CALL_INTER_FUNCTIONSIG_NOT_ST(tmp, result, belong));
  489. if (!run_continue(result)) {
  490. freeVarList(tmp);
  491. goto return_;
  492. }
  493. freeResult(result);
  494. parameterFromVar(&function, function_var, &get_num, set_num, &dict_status, CALL_INTER_FUNCTIONSIG_NOT_ST(tmp, result, belong));
  495. freeVarList(tmp);
  496. if (!run_continue(result))
  497. goto return_;
  498. if (!dict_status && set_num > get_num)
  499. goto to_more;
  500. break;
  501. }
  502. case mul_par: {
  503. LinkValue *tmp = makeLinkValue(makeListValue(&call, inter, value_tuple), belong, inter);
  504. assCore(function->data.value, tmp, CALL_INTER_FUNCTIONSIG_NOT_ST(function_var, result, belong));
  505. returnResult(result);
  506. function = function->next;
  507. break;
  508. }
  509. case space_kwargs:{
  510. LinkValue *tmp = makeLinkValue(makeDictValue(NULL, true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)), belong, inter);
  511. returnResult(result);
  512. freeResult(result);
  513. assCore(function->data.value, tmp, CALL_INTER_FUNCTIONSIG_NOT_ST(function_var, result, belong));
  514. returnResult(result);
  515. function = function->next;
  516. break;
  517. }
  518. case error_to_less:
  519. setResultError(result, inter, "ArgumentException", "Too less argument", line, file, belong, true);
  520. goto return_;
  521. case error_to_more:
  522. to_more:
  523. setResultError(result, inter, "ArgumentException", "Too more argument", line, file, belong, true);
  524. goto return_;
  525. case error_kw:
  526. setResultError(result, inter, "ArgumentException", "Value argument for double star", line, file, belong, true);
  527. goto return_;
  528. default:
  529. goto break_;
  530. }
  531. }
  532. break_:
  533. setResult(result, inter, belong);
  534. return_:
  535. gc_freeze(inter, function_var, NULL, false);
  536. gc_freeze(inter, var_list, NULL, false);
  537. freeParameter(tmp_function, true);
  538. return result->type;
  539. }
  540. Inherit *setFather(Argument *call) {
  541. Inherit *father_tmp = NULL;
  542. for (Argument *tmp = call; tmp != NULL && tmp->type == value_arg; tmp = tmp->next)
  543. if (tmp->data.value->value->type == class) {
  544. father_tmp = connectInherit(father_tmp, makeInherit(tmp->data.value));
  545. father_tmp = connectInherit(father_tmp, copyInherit(tmp->data.value->value->object.inherit));
  546. }
  547. return setFatherCore(father_tmp);
  548. }
  549. Inherit *setFatherCore(Inherit *father_tmp) {
  550. Inherit *base_father = NULL;
  551. while (father_tmp != NULL){
  552. Inherit *next = father_tmp->next;
  553. father_tmp->next = NULL;
  554. base_father = connectSafeInherit(base_father, father_tmp);
  555. father_tmp = next;
  556. }
  557. return base_father;
  558. }
  559. bool checkFormal(Parameter *pt) {
  560. enum {
  561. Formal_1,
  562. Formal_2,
  563. } status = Formal_1;
  564. for (PASS; pt != NULL; pt = pt->next){
  565. if (status == Formal_1 && (pt->type == name_par || pt->type == args_par))
  566. status = Formal_2;
  567. else if (status == Formal_2 && (pt->type == value_par || pt->type == args_par) || pt->type == kwargs_par && pt->next != NULL)
  568. return false;
  569. }
  570. return true;
  571. }
  572. int parserArgumentUnion(ArgumentParser ap[], Argument *arg, INTER_FUNCTIONSIG_NOT_ST){
  573. setResultCore(result);
  574. if (ap->type != only_name){
  575. ArgumentParser *bak = NULL;
  576. int status = 1;
  577. arg = parserValueArgument(ap, arg, &status, &bak);
  578. if (status != 1){
  579. setResultError(result, inter, "ArgumentException", "Too less Argument", 0, "sys", belong, true);
  580. return 0;
  581. }
  582. ap = bak;
  583. }
  584. if (ap->must != -1){
  585. ArgumentParser *bak = NULL;
  586. int status;
  587. if (arg != NULL && arg->type != name_arg) {
  588. setResultError(result, inter, "ArgumentException", "Too many Argument", 0, "sys", belong, true);
  589. return -6;
  590. }
  591. status = parserNameArgument(ap, arg, &bak, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  592. if (!run_continue(result))
  593. return -1;
  594. if (status == -3){
  595. if (parserArgumentNameDefault(ap)->must != -1){
  596. setResultError(result, inter, "ArgumentException", "Too less Argument", 0, "sys", belong, true);
  597. return -7;
  598. }
  599. }
  600. else if (status == 0){
  601. setResultError(result, inter, "ArgumentException", "Too many Argument", 0, "sys", belong, true);
  602. return -2;
  603. } else if (status == -4){
  604. setResultError(result, inter, "ArgumentException", "Too less Argument", 0, "sys", belong, true);
  605. return -3;
  606. }
  607. } else{
  608. if (arg != NULL) {
  609. setResultError(result, inter, "ArgumentException", "Too many Argument", 0, "sys", belong, true);
  610. return -4;
  611. }
  612. }
  613. return 1;
  614. }
  615. Argument *parserValueArgument(ArgumentParser *ap, Argument *arg, int *status, ArgumentParser **bak){
  616. *status = 1;
  617. for (PASS; ap->must != -1 && (ap->type == only_value || ap->type == name_value); ap++){
  618. if (arg == NULL || arg->name_type != value_arg) { // 形参进入key=value模式
  619. if ((ap = parserArgumentValueDefault(ap))->must != -1 && ap->type == only_value) // 检查剩余的是否.must=1
  620. *status = 0; // 存在.must=1则返回 0
  621. break; // 正常情况返回 1
  622. }
  623. arg = parserArgumentValueCore(arg, ap);
  624. }
  625. if (bak != NULL)
  626. *bak = ap;
  627. return arg;
  628. }
  629. int parserNameArgument(ArgumentParser ap[], Argument *arg, ArgumentParser **bak, INTER_FUNCTIONSIG_NOT_ST){
  630. VarList *tmp = NULL;
  631. NUMBER_TYPE set_num = 0;
  632. NUMBER_TYPE get_num = 0;
  633. int return_;
  634. setResultCore(result);
  635. gc_freeze(inter, var_list, NULL, true);
  636. for (PASS; arg != NULL && arg->type != name_arg; arg = arg->next)
  637. PASS;
  638. if (arg == NULL) {
  639. return_ = -3; // 参数缺失
  640. goto return_;
  641. }
  642. tmp = makeVarList(inter, true);
  643. argumentToVar(&arg, &set_num, CALL_INTER_FUNCTIONSIG_NOT_ST(tmp, result, belong));
  644. if (!run_continue(result)) {
  645. return_ = -1;
  646. goto return_;
  647. }
  648. setResultBase(result, inter, belong);
  649. for (PASS; ap->must != -1 && (ap->type == only_name || ap->type == name_value); ap++) {
  650. int status = parserArgumentVar(ap, inter, tmp);
  651. if (status == 1)
  652. get_num ++;
  653. else{
  654. return_ = -2; // 参数缺失
  655. goto return_;
  656. }
  657. }
  658. return_ = (get_num < set_num) ? 0 : ((get_num > set_num) ? -4 : 1);
  659. return_:
  660. freeVarList(tmp);
  661. gc_freeze(inter, var_list, NULL, false);
  662. if (bak != NULL)
  663. *bak = ap;
  664. return return_;
  665. }
  666. Argument *parserArgumentValueCore(Argument *arg, ArgumentParser *ap){
  667. int count = 1;
  668. ap->arg = arg;
  669. ap->value = arg->data.value;
  670. arg = arg->next;
  671. if (ap->long_arg)
  672. for (PASS; arg != NULL && arg->type == value_arg; arg = arg->next, count++)
  673. PASS;
  674. ap->c_count = count;
  675. return arg;
  676. }
  677. int parserArgumentVar(ArgumentParser *ap, Inter *inter, VarList *var_list){
  678. LinkValue *value = findStrVar(ap->name, false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  679. ap->value = value;
  680. if (value != NULL)
  681. return 1;
  682. else if (ap->must)
  683. return -1;
  684. return 0;
  685. }
  686. ArgumentParser *parserArgumentValueDefault(ArgumentParser *ap){
  687. for (PASS; ap->type == only_value && ap->must == 0; ap++) {
  688. ap->arg = NULL;
  689. ap->value = NULL;
  690. ap->c_count = 0;
  691. }
  692. return ap;
  693. }
  694. ArgumentParser *parserArgumentNameDefault(ArgumentParser *ap){
  695. for (PASS; ap->must == 0; ap++) {
  696. ap->arg = NULL;
  697. ap->value = NULL;
  698. ap->c_count = 0;
  699. }
  700. return ap;
  701. }