1
0

__run.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include "__run.h"
  2. ResultType getBaseVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
  3. LinkValue *value;
  4. *name = setStrVarName(st->u.base_var.name, false, inter);
  5. *times = 0;
  6. if (st->u.base_var.times == NULL){
  7. *times = 0;
  8. goto not_times;
  9. }
  10. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.base_var.times, var_list, result, father)))
  11. return result->type;
  12. if (!isType(result->value->value, number)){
  13. setResultErrorSt(result, inter, "TypeException", "Don't get a number value", st, father, true);
  14. return result->type;
  15. }
  16. *times = (int)result->value->value->data.num.num;
  17. freeResult(result);
  18. not_times:
  19. value = makeLinkValue(makeStringValue(st->u.base_var.name, inter), father, inter);
  20. setResultOperation(result, value);
  21. return result->type;
  22. }
  23. ResultType getBaseSVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
  24. freeResult(result);
  25. if (st->u.base_svar.times == NULL){
  26. *times = 0;
  27. goto not_times;
  28. }
  29. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.base_svar.times, var_list, result, father)))
  30. return result->type;
  31. if (!isType(result->value->value, number)){
  32. setResultErrorSt(result, inter, "TypeException", "Don't get a number value", st, father, true);
  33. return result->type;
  34. }
  35. *times = (int)result->value->value->data.num.num;
  36. freeResult(result);
  37. not_times:
  38. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.base_svar.name, var_list, result, father)))
  39. return result->type;
  40. *name = getNameFromValue(result->value->value, inter);
  41. result->type = operation_return; // 执行 operationSafeInterStatement 的时候已经初始化 result
  42. return result->type;
  43. }
  44. ResultType getVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
  45. if (st->type == base_var)
  46. getBaseVarInfo(name, times, CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  47. else if (st->type == base_svar)
  48. getBaseSVarInfo(name, times, CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
  49. else{
  50. if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father)))
  51. return result->type;
  52. *name = getNameFromValue(result->value->value, inter);
  53. *times = 0;
  54. }
  55. return result->type;
  56. }
  57. char *setStrVarName(char *old, bool free_old, Inter *inter) {
  58. return memStrcat(inter->data.var_str_prefix, old, false, free_old);
  59. }
  60. char *setNumVarName(NUMBER_TYPE num, struct Inter *inter) {
  61. char name[50];
  62. snprintf(name, 50, "%"NUMBER_FORMAT, num);
  63. return memStrcat(inter->data.var_num_prefix, name, false, false);
  64. }
  65. char *getNameFromValue(Value *value, struct Inter *inter) {
  66. switch (value->type){
  67. case string:
  68. return setStrVarName(value->data.str.str, false, inter);
  69. case number:
  70. return setNumVarName(value->data.num.num, inter);
  71. default:
  72. return memStrcpy(inter->data.var_defualt);
  73. }
  74. }
  75. bool popStatementVarList(Statement *funtion_st, VarList **function_var, VarList *out_var, Inter *inter){
  76. bool yield_run;
  77. if ((yield_run = funtion_st->info.have_info)) {
  78. *function_var = funtion_st->info.var_list;
  79. (*function_var)->next = out_var;
  80. }
  81. else
  82. *function_var = pushVarList(out_var, inter);
  83. return yield_run;
  84. }
  85. void newFunctionYield(Statement *funtion_st, Statement *node, VarList *new_var, Inter *inter){
  86. new_var->next = NULL;
  87. gc_freeze(inter, new_var, NULL, true);
  88. funtion_st->info.var_list = new_var;
  89. funtion_st->info.node = node->type == yield_code ? node->next : node;
  90. funtion_st->info.have_info = true;
  91. }
  92. void updateFunctionYield(Statement *function_st, Statement *node){
  93. function_st->info.node = node->type == yield_code ? node->next : node;
  94. function_st->info.have_info = true;
  95. }
  96. ResultType setFunctionArgument(Argument **arg, LinkValue *function_value, long line, char *file, INTER_FUNCTIONSIG_NOT_ST){
  97. Argument *tmp = NULL;
  98. enum FunctionPtType pt_type = function_value->value->data.function.function_data.pt_type;
  99. setResultCore(result);
  100. if (function_value->father == NULL){
  101. setResultError(result, inter, "ArgumentException", "Don't get self", line, file, father, true);
  102. return error_return;
  103. }
  104. switch (pt_type) {
  105. case static_:
  106. tmp = makeValueArgument(function_value);
  107. tmp->next = *arg;
  108. *arg = tmp;
  109. break;
  110. case class_static_:
  111. tmp = makeValueArgument(function_value);
  112. tmp->next = makeValueArgument(function_value->father);
  113. tmp->next->next = *arg;
  114. *arg = tmp;
  115. break;
  116. case object_static_:
  117. tmp = makeValueArgument(function_value);
  118. if (function_value->father->value->type == class)
  119. tmp->next = *arg;
  120. else {
  121. tmp->next = makeValueArgument(function_value->father);
  122. tmp->next->next = *arg;
  123. }
  124. *arg = tmp;
  125. break;
  126. case class_free_:
  127. tmp = makeValueArgument(function_value->father);
  128. tmp->next = *arg;
  129. *arg = tmp;
  130. break;
  131. case object_free_:
  132. if (function_value->father->value->type != class) {
  133. tmp = makeValueArgument(function_value->father);
  134. tmp->next = *arg;
  135. *arg = tmp;
  136. }
  137. break;
  138. default:
  139. break;
  140. }
  141. setResultBase(result, inter, father);
  142. return result->type;
  143. }
  144. void freeFunctionArgument(Argument *arg, Argument *base) {
  145. for (Argument *tmp = arg; tmp != NULL; tmp = tmp->next) {
  146. if (tmp->next == base) {
  147. tmp->next = NULL;
  148. freeArgument(arg, true);
  149. break;
  150. }
  151. }
  152. }
  153. LinkValue *findStrVar(char *name, bool free_old, INTER_FUNCTIONSIG_CORE){
  154. LinkValue *tmp = NULL;
  155. char *name_ = setStrVarName(name, free_old, inter);
  156. tmp = findFromVarList(name_, 0, false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  157. memFree(name_);
  158. return tmp;
  159. }
  160. void addStrVar(char *name, bool free_old, LinkValue *value, LinkValue *father, INTER_FUNCTIONSIG_CORE){
  161. char *var_name = setStrVarName(name, free_old, inter);
  162. LinkValue *name_ = makeLinkValue(makeStringValue(var_name, inter), father, inter);
  163. addFromVarList(var_name, name_, 0, value, CALL_INTER_FUNCTIONSIG_CORE(var_list));
  164. memFree(var_name);
  165. }
  166. LinkValue *findAttributes(char *name, bool free_old, LinkValue *value, Inter *inter) {
  167. LinkValue *attr = findStrVar(name, free_old, CALL_INTER_FUNCTIONSIG_CORE(value->value->object.var));
  168. if (attr != NULL && attr->father->value != value->value && checkAttribution(value->value, attr->father->value))
  169. attr->father = value;
  170. return attr;
  171. }