__ofunc.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include "__ofunc.h"
  2. LinkValue *registeredFunctionCore(OfficialFunction of, wchar_t *name, FUNC_NT) {
  3. LinkValue *value = NULL;
  4. makeCFunctionValue(of, LINEFILE, CNEXT_NT);
  5. GET_RESULT(value, result);
  6. addStrVar(name, false, true, value, LINEFILE, false, CNEXT_NT);
  7. gc_freeTmpLink(&value->gc_status);
  8. return value;
  9. }
  10. bool iterNameFunc(NameFunc *list, FUNC_NT){
  11. setResultCore(result);
  12. for (PASS; list->of != NULL; list++) {
  13. LinkValue *value = registeredFunctionCore(list->of, list->name, CNEXT_NT);
  14. if (!CHECK_RESULT(result))
  15. return false;
  16. value->value->data.function.function_data.pt_type = list->type;
  17. freeResult(result);
  18. }
  19. return true;
  20. }
  21. bool iterClassFunc(NameFunc *list, FUNC_NT){
  22. VarList *object_var = belong->value->object.var;
  23. VarList *object_backup = object_var->next;
  24. enum FunctionPtType bak = inter->data.default_pt_type;
  25. bool return_ = true;
  26. setResultCore(result);
  27. object_var->next = var_list;
  28. inter->data.default_pt_type = object_free_;
  29. gc_freeze(inter, object_backup, true);
  30. for (PASS; list->of != NULL; list++) {
  31. LinkValue *value = registeredFunctionCore(list->of, list->name, CFUNC_NT(object_var, result, belong));
  32. if (!CHECK_RESULT(result)) {
  33. return_ = false;
  34. break;
  35. }
  36. value->value->data.function.function_data.pt_type = list->type;
  37. freeResult(result);
  38. }
  39. gc_freeze(inter, object_backup, false);
  40. object_var->next = object_backup;
  41. inter->data.default_pt_type = bak;
  42. return return_;
  43. }
  44. void iterBaseNameFunc(NameFunc *list, LinkValue *belong, FUNC_CORE){
  45. Result result;
  46. setResultCore(&result);
  47. if (!iterNameFunc(list, CFUNC_NT(var_list, &result, belong)))
  48. printError(&result, inter, true);
  49. freeResult(&result);
  50. }
  51. void iterBaseClassFunc(NameFunc *list, LinkValue *belong, FUNC_CORE){
  52. Result result;
  53. setResultCore(&result);
  54. if (!iterClassFunc(list, CFUNC_NT(var_list, &result, belong)))
  55. printError(&result, inter, true);
  56. freeResult(&result);
  57. }
  58. LinkValue *makeBaseChildClass(LinkValue *inherit, Inter *inter) {
  59. Inherit *father_value;
  60. Value *new;
  61. LinkValue *re;
  62. {
  63. Argument *arg = makeValueArgument(inherit);
  64. gc_addTmpLink(&inherit->gc_status);
  65. father_value = setFather(arg);
  66. freeArgument(arg, true);
  67. gc_freeTmpLink(&inherit->gc_status);
  68. }
  69. new = makeClassValue(inter->var_list, inter, father_value);
  70. re = makeLinkValue(new, inter->base_belong, inter);
  71. gc_freeTmpLink(&new->gc_status);
  72. return re;
  73. }
  74. bool checkIndex(vint *index, const vint *size, FUNC_NT){
  75. setResultCore(result);
  76. if (*index < 0)
  77. *index = *size + *index;
  78. if (*index >= *size){
  79. setResultError(E_IndexException, L"index too max", LINEFILE, true, CNEXT_NT);
  80. return false;
  81. } else if (*index < 0){
  82. setResultError(E_IndexException, L"index is less than 0", LINEFILE, true, CNEXT_NT);
  83. return false;
  84. }
  85. return true; // true - 保持result为setResultCore的结果
  86. }
  87. bool checkSlice(vint *first, vint *second, const vint *stride, vint size, FUNC_NT){
  88. setResultCore(result);
  89. *first = *first < 0 ? *first + size : *first;
  90. *second = *second < 0 ? *second + size : *second;
  91. if (*second > size || *first >= size){
  92. setResultError(E_IndexException, L"index too max", LINEFILE, true, CNEXT_NT);
  93. return false;
  94. } else if (*first < 0 || *second <= 0){
  95. setResultError(E_IndexException, L"index is less than 0", LINEFILE, true, CNEXT_NT);
  96. return false;
  97. }
  98. if (*stride == 0 || *first > *second && stride > 0 || *first < *second && stride < 0){
  99. setResultError(E_StrideException, L"stride is 0 or Unfinished iteration", LINEFILE, true, CNEXT_NT);
  100. return false;
  101. }
  102. return true;
  103. }
  104. void addBaseClassVar(wchar_t *name, LinkValue *obj, LinkValue *belong, Inter *inter) {
  105. Result result;
  106. setResultCore(&result);
  107. addStrVar(name, false, true, obj, LINEFILE, false, CFUNC_NT(inter->var_list, &result, belong));
  108. if (!RUN_TYPE(result.type))
  109. printError(&result, inter, true);
  110. freeResult(&result);
  111. }
  112. void newObjectSettingPresetting(LinkValue *func, LinkValue *name, Inter *inter) {
  113. Result result;
  114. setResultCore(&result);
  115. newObjectSetting(name, LINEFILE, func, &result, inter, NULL);
  116. if (RUN_TYPE(result.type))
  117. printError(&result, inter, true);
  118. freeResult(&result);
  119. }