parameter.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. #include "__virtualmath.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, INTER_FUNCTIONSIG_CORE){
  158. Argument *at = NULL;
  159. for (int i=0;i<list_value->value->data.list.size;i++)
  160. at = connectValueArgument(list_value->value->data.list.list[i], at);
  161. return at;
  162. }
  163. Argument *dictToArgument(LinkValue *dict_value, INTER_FUNCTIONSIG_CORE){
  164. Argument *at = NULL;
  165. Var *tmp = NULL;
  166. for (int i = 0; i < MAX_SIZE; i++)
  167. for (tmp = dict_value->value->data.dict.dict->hashtable[i]; tmp != NULL; tmp = tmp->next)
  168. at = connectCharNameArgument(tmp->value, tmp->name_, tmp->name, at);
  169. return at;
  170. }
  171. /**
  172. * 设置形式参数的默认值
  173. * 仅支持name_value
  174. * @param function_ad
  175. * @param inter
  176. * @param var_list
  177. * @param num
  178. * @return
  179. */
  180. ResultType defaultParameter(Parameter **function_ad, NUMBER_TYPE *num, INTER_FUNCTIONSIG_NOT_ST) {
  181. Parameter *function = *function_ad;
  182. setResultCore(result);
  183. for (*num = 0; function != NULL && function->type == name_par; (*num)++, function = function->next){
  184. LinkValue *value = NULL;
  185. if(operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(function->data.value, var_list, result, father)))
  186. goto return_;
  187. value = result->value;
  188. freeResult(result);
  189. assCore(function->data.name, value, CALL_INTER_FUNCTIONSIG_NOT_ST (var_list, result, father));
  190. if (!run_continue(result))
  191. goto return_;
  192. }
  193. setResult(result, inter, father);
  194. return_:
  195. *function_ad = function;
  196. return result->type;
  197. }
  198. /**
  199. * 设置实际参数的默认值, 仅支持name_base_value
  200. * @param call_ad
  201. * @param inter
  202. * @param var_list
  203. * @param num
  204. * @return
  205. */
  206. ResultType argumentToVar(Argument **call_ad, NUMBER_TYPE *num, INTER_FUNCTIONSIG_NOT_ST) {
  207. Argument *call = *call_ad;
  208. setResultCore(result);
  209. for (*num = 0; call != NULL && call->type == name_arg; (*num)++, call = call->next){
  210. if (call->name_type == name_char){
  211. addFromVarList(call->data.name_, call->data.name_value, 0, call->data.value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  212. continue;
  213. }
  214. freeResult(result);
  215. assCore(call->data.name, call->data.value, CALL_INTER_FUNCTIONSIG_NOT_ST (var_list, result, father));
  216. if (!run_continue(result))
  217. goto return_;
  218. }
  219. setResult(result, inter, father);
  220. return_:
  221. *call_ad = call;
  222. return result->type;
  223. }
  224. /**
  225. * 形式参数从变量空间中获取值
  226. * @param function_ad
  227. * @param function_var
  228. * @param inter
  229. * @param var_list
  230. * @param num
  231. * @return
  232. */
  233. ResultType parameterFromVar(Parameter **function_ad, VarList *function_var, NUMBER_TYPE *num, NUMBER_TYPE max, bool *status,
  234. INTER_FUNCTIONSIG_NOT_ST) {
  235. Parameter *function = *function_ad;
  236. bool get = true;
  237. setResultCore(result);
  238. for (*num = 0, *status = false; function != NULL; function = function->next){
  239. int int_times;
  240. char *str_name = NULL;
  241. Statement *name = function->type == name_par ? function->data.name : function->data.value;
  242. LinkValue *value = NULL;
  243. get = true;
  244. if (function->type == kwargs_par){
  245. value = makeLinkValue(makeDictValue(NULL, false, father, NULL, inter, var_list), father, inter);
  246. value->value->data.dict.dict = var_list->hashtable;
  247. value->value->data.dict.size = max - *num;
  248. *status = true;
  249. goto not_return;
  250. }
  251. freeResult(result);
  252. getVarInfo(&str_name, &int_times, CALL_INTER_FUNCTIONSIG(name, var_list, result, father));
  253. if (!run_continue(result)) {
  254. memFree(str_name);
  255. *function_ad = function;
  256. return result->type;
  257. }
  258. freeResult(result);
  259. value = findFromVarList(str_name, var_list, int_times, true);
  260. memFree(str_name);
  261. if(value == NULL) {
  262. get = false;
  263. if (function->type == name_par && !operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(function->data.value, var_list, result, father))) {
  264. value = result->value;
  265. goto not_return;
  266. }
  267. setResultError(result, inter, "ArgumentException", "Too less Argument", name, father, true);
  268. goto reutnr_;
  269. }
  270. else if ((name->aut == public_aut || name->aut == auto_aut) && (value->aut != public_aut && value->aut != auto_aut)) {
  271. setResultError(result, inter, "PermissionsException", "Wrong Permissions: access Argument as public", name,
  272. father, true);
  273. goto reutnr_;
  274. }
  275. else if ((name->aut == protect_aut) && (value->aut == private_aut)) {
  276. setResultError(result, inter, "PermissionsException", "Wrong Permissions: access variables as protect",
  277. name, father, true);
  278. goto reutnr_;
  279. }
  280. value = copyLinkValue(value, inter);
  281. not_return:
  282. freeResult(result);
  283. assCore(name, value, CALL_INTER_FUNCTIONSIG_NOT_ST (function_var, result, father));
  284. if (!run_continue(result)) {
  285. *function_ad = function;
  286. return result->type;
  287. }
  288. else
  289. freeResult(result);
  290. if (get)
  291. (*num)++;
  292. }
  293. setResult(result, inter, father);
  294. reutnr_:
  295. *function_ad = function;
  296. return result->type;
  297. }
  298. /**
  299. * 对位赋值
  300. * @param call_ad
  301. * @param function_ad
  302. * @param function_var
  303. * @param inter
  304. * @param var_list
  305. * @return
  306. */
  307. ResultType argumentToParameter(Argument **call_ad, Parameter **function_ad, VarList *function_var, INTER_FUNCTIONSIG_NOT_ST){
  308. Argument *call = *call_ad;
  309. Parameter *function = *function_ad;
  310. setResultCore(result);
  311. for (PASS; call != NULL && function != NULL && (call->type == value_arg) && function->type != args_par; call = call->next, function = function->next){
  312. Statement *name = function->type == value_par ? function->data.value : function->data.name;
  313. assCore(name, call->data.value, CALL_INTER_FUNCTIONSIG_NOT_ST (function_var, result, father));
  314. if (!run_continue(result))
  315. goto return_;
  316. freeResult(result);
  317. }
  318. setResult(result, inter, father);
  319. return_:
  320. *call_ad = call;
  321. *function_ad = function;
  322. return result->type;
  323. }
  324. /**
  325. * 把所有实际参数的值计算出来
  326. * @param call_ad
  327. * @param inter
  328. * @param var_list
  329. * @return
  330. */
  331. ResultType iterParameter(Parameter *call, Argument **base_ad, bool is_dict, INTER_FUNCTIONSIG_NOT_ST){
  332. Argument *base = *base_ad;
  333. setResultCore(result);
  334. for (PASS; call != NULL; call = call->next){
  335. if(operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(call->data.value, var_list, result, father)))
  336. goto return_;
  337. if (call->type == value_par)
  338. base = connectValueArgument(result->value, base);
  339. else if (call->type == name_par){
  340. if (is_dict){
  341. LinkValue *value = result->value;
  342. setResultCore(result);
  343. if(operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(call->data.name, var_list, result, father))) {
  344. gc_freeTmpLink(&value->gc_status);
  345. goto return_;
  346. }
  347. char *name_str = getNameFromValue(result->value->value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  348. base = connectCharNameArgument(value, result->value, name_str, base);
  349. memFree(name_str);
  350. gc_freeTmpLink(&value->gc_status);
  351. }
  352. else
  353. base = connectStatementNameArgument(result->value, call->data.name, base);
  354. }
  355. else if (call->type == args_par){
  356. Argument *tmp_at = listToArgument(result->value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  357. base = connectArgument(tmp_at, base);
  358. }
  359. else if (call->type == kwargs_par){
  360. Argument *tmp_at = dictToArgument(result->value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  361. base = connectArgument(tmp_at, base);
  362. }
  363. freeResult(result);
  364. }
  365. setResult(result, inter, father);
  366. return_:
  367. *base_ad = base;
  368. return result->type;
  369. }
  370. Argument * getArgument(Parameter *call, bool is_dict, INTER_FUNCTIONSIG_NOT_ST) {
  371. Argument *new_arg = NULL;
  372. freeResult(result);
  373. iterParameter(call, &new_arg, is_dict, CALL_INTER_FUNCTIONSIG_NOT_ST (var_list, result, father));
  374. return new_arg;
  375. }
  376. /**
  377. * 参数表:
  378. |实参 \ 形参| name | value | arg | kwarg | null |
  379. ----------------------------------------
  380. |name | p_3 | p_3 | p_4 | p_3! | error |
  381. |value | p_1 | p_1 | p_4 | error | error |
  382. |null | p_2 | error | p_4 | p_5 | okay |
  383. ----------------------------------------
  384. * 注解: @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
  385. * @param call
  386. * @param function
  387. * @param function_var
  388. * @param inter
  389. * @param var_list
  390. * @return
  391. */
  392. ResultType setParameter(Parameter *call_base, Parameter *function_base, VarList *function_var, LinkValue *function_father, INTER_FUNCTIONSIG_NOT_ST) {
  393. Argument *call = NULL;
  394. setResultCore(result);
  395. call = getArgument(call_base, false, CALL_INTER_FUNCTIONSIG_NOT_ST (var_list, result, father));
  396. if (!run_continue(result)) {
  397. freeArgument(call, false);
  398. return result->type;
  399. }
  400. freeResult(result);
  401. setParameterCore(call, function_base, function_var, CALL_INTER_FUNCTIONSIG_NOT_ST (var_list, result, function_father));
  402. freeArgument(call, false);
  403. return result->type;
  404. }
  405. ResultType setParameterCore(Argument *call, Parameter *function_base, VarList *function_var,
  406. INTER_FUNCTIONSIG_NOT_ST) {
  407. Parameter *function = NULL;
  408. Parameter *tmp_function = NULL; // 释放使用
  409. enum {
  410. match_status = 1,
  411. default_status = 2,
  412. self_ass = 3,
  413. mul_par = 4,
  414. space_kwargs = 5,
  415. error = -1,
  416. finished = 0,
  417. } status = match_status;
  418. function = copyParameter(function_base);
  419. tmp_function = function;
  420. setResultCore(result);
  421. while (true){
  422. if (call == NULL && function == NULL)
  423. status = finished;
  424. else if ((call != NULL && (function == NULL || call->type == value_par && function->type == kwargs_par)) ||
  425. (call == NULL && function != NULL && function->type == value_par))
  426. status = error;
  427. else if (call == NULL && function->type == name_par) // 根据前面的条件, 已经决定function不会为NULL
  428. status = default_status;
  429. else if (call == NULL && function->type == kwargs_par)
  430. status = space_kwargs;
  431. else if (function->type == args_par) // 根据前面的条件, 已经决定call不会为NULL
  432. status = mul_par;
  433. else if (call->type == value_arg)
  434. status = match_status;
  435. else if (call->type == name_arg)
  436. status = self_ass;
  437. freeResult(result);
  438. switch (status) {
  439. case match_status: {
  440. argumentToParameter(&call, &function, function_var, CALL_INTER_FUNCTIONSIG_NOT_ST (var_list, result, father));
  441. returnResult(result);
  442. break;
  443. }
  444. case default_status: {
  445. NUMBER_TYPE num = 0;
  446. defaultParameter(&function, &num, CALL_INTER_FUNCTIONSIG_NOT_ST (function_var, result, father));
  447. returnResult(result);
  448. break;
  449. }
  450. case self_ass: {
  451. NUMBER_TYPE set_num = 0;
  452. NUMBER_TYPE get_num = 0;
  453. bool dict_status = false;
  454. VarList *tmp = pushVarList(var_list, inter);
  455. argumentToVar(&call, &set_num, CALL_INTER_FUNCTIONSIG_NOT_ST (tmp, result, father));
  456. returnResult(result);
  457. if (!run_continue(result)) {
  458. popVarList(tmp);
  459. goto return_;
  460. }
  461. freeResult(result);
  462. parameterFromVar(&function, function_var, &get_num, set_num, &dict_status, CALL_INTER_FUNCTIONSIG_NOT_ST (tmp, result, father));
  463. if (!run_continue(result)) {
  464. popVarList(tmp);
  465. goto return_;
  466. }
  467. popVarList(tmp);
  468. if (!dict_status && set_num > get_num) {
  469. freeResult(result);
  470. goto error_;
  471. }
  472. break;
  473. }
  474. case mul_par: {
  475. LinkValue *tmp = makeLinkValue(makeListValue(&call, inter, value_tuple), father, inter);
  476. if (!run_continue(result))
  477. goto return_;
  478. else
  479. freeResult(result);
  480. assCore(function->data.value, tmp, CALL_INTER_FUNCTIONSIG_NOT_ST (function_var, result, father));
  481. returnResult(result);
  482. function = function->next;
  483. break;
  484. }
  485. case space_kwargs:{
  486. LinkValue *tmp = makeLinkValue(makeDictValue(NULL, true, father, result, inter, var_list), father, inter);
  487. assCore(function->data.value, tmp, CALL_INTER_FUNCTIONSIG_NOT_ST (function_var, result, father));
  488. returnResult(result);
  489. function = function->next;
  490. break;
  491. }
  492. case error:
  493. error_: // Statement 处理
  494. writeLog(inter->data.debug, ERROR, "setParameter error\n", NULL);
  495. setResultError(result, inter, "ArgumentException", "Set Argument error", 0, father, true);
  496. goto return_;
  497. default:
  498. goto break_;
  499. }
  500. }
  501. break_:
  502. setResult(result, inter, father);
  503. return_:
  504. freeParameter(tmp_function, true);
  505. return result->type;
  506. }
  507. FatherValue *setFather(Argument *call, INTER_FUNCTIONSIG_NOT_ST) {
  508. setResultCore(result);
  509. FatherValue *father_tmp = NULL;
  510. for (Argument *tmp = call; tmp != NULL && tmp->type == value_arg; tmp = tmp->next)
  511. if (tmp->data.value->value->type == class) {
  512. father_tmp = connectFatherValue(father_tmp, makeFatherValue(tmp->data.value));
  513. father_tmp = connectFatherValue(father_tmp, copyFatherValue(tmp->data.value->value->object.father));
  514. }
  515. return setFatherCore(father_tmp);
  516. }
  517. FatherValue *setFatherCore(FatherValue *father_tmp) {
  518. FatherValue *base_father = NULL;
  519. while (father_tmp != NULL){
  520. FatherValue *next = father_tmp->next;
  521. father_tmp->next = NULL;
  522. base_father = connectSafeFatherValue(base_father, father_tmp);
  523. father_tmp = next;
  524. }
  525. return base_father;
  526. }