ofunc.c 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "__run.h"
  2. static Registered base_func_list[] = {registeredVObject,
  3. registeredInt,
  4. registeredDou,
  5. registeredStr,
  6. registeredBool,
  7. registeredEllipisis,
  8. registeredFunction,
  9. registeredDict,
  10. registeredList,
  11. registeredListIter,
  12. registeredDictIter,
  13. registeredExcIter,
  14. registeredFile,
  15. registeredLib,
  16. registeredPointer,
  17. registeredStruct,
  18. registeredSysFunction,
  19. registeredIOFunction,
  20. NULL};
  21. void registeredBaseFunction(LinkValue *belong, Inter *inter){
  22. for (Registered *list = base_func_list; *list != NULL; list++)
  23. (*list)(CR_FUNC(belong, inter->var_list));
  24. }
  25. static void registeredStdFile(FILE *std, char *path, char *mode, wchar_t *name, LinkValue *belong, Inter *inter) {
  26. Result result;
  27. setResultCore(&result);
  28. makeFileValue(std, mode, true, path, LINEFILE, CFUNC_NT(inter->var_list, &result, belong));
  29. if (RUN_TYPE(result.type)) {
  30. LinkValue *new = result.value;
  31. result.value = NULL;
  32. freeResult(&result);
  33. addStrVar(name, false, false, new, LINEFILE, false, CFUNC_NT(inter->var_list, &result, belong));
  34. gc_freeTmpLink(&new->gc_status);
  35. if (!RUN_TYPE(result.type))
  36. goto error;
  37. freeResult(&result);
  38. } else {
  39. error: printError(&result, inter, true);
  40. }
  41. }
  42. static void registeredBaseVar(LinkValue *belong, Inter *inter){
  43. registeredStdFile(stdin, "stdin", "r", L"stdin", belong, inter);
  44. registeredStdFile(stdout, "stdout", "w", L"stdout", belong, inter);
  45. registeredStdFile(stderr, "stderr", "w", L"stderr", belong, inter);
  46. }
  47. void registeredFunctionName(LinkValue *belong, Inter *inter) {
  48. makeBaseObject(inter, belong); // 在makeBaseObject之前base_belong还是NULL, object要关联于belong参数给定的值(用于import的时候)
  49. makeBaseVObject(inter);
  50. makeBaseInt(inter);
  51. makeBaseDou(inter);
  52. makeBaseBool(inter);
  53. makeBaseEllipisis(inter);
  54. makeBaseFunction(inter);
  55. makeBaseDict(inter);
  56. makeBaseList(inter);
  57. makeBaseListIter(inter);
  58. makeBaseDictIter(inter);
  59. makeExcIter(inter);
  60. makeBaseFile(inter);
  61. makeBaseLib(inter);
  62. makeBasePointer(inter);
  63. makeBaseStruct(inter);
  64. makeBaseStr(inter);
  65. functionPresetting(inter->data.base_obj[B_FUNCTION], inter); // 预设定function的__new__方法
  66. registeredObject(inter->base_belong, CFUNC_CORE(inter->var_list));
  67. registeredBaseFunction(inter->base_belong, inter);
  68. registeredBaseVar(inter->base_belong, inter);
  69. }