cycle_obj.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "aFunlang.hpp"
  2. #include "__cycle_obj.hpp"
  3. size_t getSizec_Cycle(const std::string &id, af_Object *obj) {
  4. return sizeof(af_VarList *);
  5. }
  6. void initDatac_Cycle(const std::string &id, af_Object *obj, af_VarList **data, af_Environment *env) {
  7. *data = pushProtectVarList(nullptr, env);
  8. }
  9. void freeDatac_Cycle(const std::string &id, af_Object *obj, af_VarList **data, af_Environment *env) {
  10. freeAllVarSpaceList(*data);
  11. }
  12. typedef struct CycleMark CycleMark;
  13. struct CycleMark {
  14. af_FuncInfo *fi;
  15. af_FuncBody *body;
  16. };
  17. af_FuncBody *func_Cycle(af_CallFuncInfo *cfi, af_Environment *env) { // 测试用函数
  18. auto mark = (CycleMark *)cfi->mark;
  19. cfi->body_next = mark->body;
  20. pushMessageDown(makeNORMALMessage(getGlobal(env), env), env);
  21. return nullptr;
  22. }
  23. bool getInfoc_Cycle(const std::string &id, af_Object *obj, af_FuncInfo **fi, af_Code *code, CycleMark *mark, af_Environment *env) {
  24. mark->fi = makeFuncInfo(normal_scope, not_embedded, false, false, false);
  25. *fi = mark->fi;
  26. DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(func_Cycle, callFuncBody);
  27. mark->body = makeCFuncBodyToFuncInfo(func, nullptr, mark->fi); // 压入两个相同的 body
  28. FREE_SYMBOL(func);
  29. return true;
  30. }
  31. bool getAclc_Cycle(const std::string &id, af_Object *obj, af_ArgCodeList **acl, af_Code *code, CycleMark **mark, af_Environment *env) {
  32. *acl = nullptr;
  33. *mark = calloc(1, CycleMark);
  34. return true;
  35. }
  36. bool getVslc_Cycle(const std::string &id, af_Object *obj, af_VarList **vsl, CycleMark *mark, af_Environment *env) {
  37. *vsl = *(af_VarList **)getObjectData(obj);
  38. return true;
  39. }
  40. af_GcList *getGcListc_Cycle(const std::string &id, af_Object *obj, void *data) {
  41. af_GcList *gl = pushGcList(glt_vsl, *(af_VarList **)data, nullptr);
  42. return gl;
  43. }
  44. bool getAlc_Cycle(const std::string &id, af_Object *obj, af_ArgList **al, af_ArgCodeList *acl, CycleMark *mark, af_Environment *env) {
  45. *al = nullptr;
  46. return true;
  47. }
  48. void freeMarkc_Cycle(const std::string &id, af_Object *obj, CycleMark *mark) {
  49. free(mark);
  50. }
  51. af_Object *makeCycleObject(af_Environment *env) {
  52. af_ObjectAPI *api = makeObjectAPI();
  53. DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAclc_Cycle, objectAPIFunc);
  54. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVslc_Cycle, objectAPIFunc);
  55. DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAlc_Cycle, objectAPIFunc);
  56. DLC_SYMBOL(objectAPIFunc) get_info = MAKE_SYMBOL(getInfoc_Cycle, objectAPIFunc);
  57. DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMarkc_Cycle, objectAPIFunc);
  58. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcListc_Cycle, objectAPIFunc);
  59. DLC_SYMBOL(objectAPIFunc) get_size = MAKE_SYMBOL(getSizec_Cycle, objectAPIFunc);
  60. DLC_SYMBOL(objectAPIFunc) init_data = MAKE_SYMBOL(initDatac_Cycle, objectAPIFunc);
  61. DLC_SYMBOL(objectAPIFunc) free_data = MAKE_SYMBOL(freeDatac_Cycle, objectAPIFunc);
  62. if (addAPI(get_size, "obj_getDataSize", api) != 1)
  63. return nullptr;
  64. if (addAPI(init_data, "obj_initData", api) != 1)
  65. return nullptr;
  66. if (addAPI(free_data, "obj_destructData", api) != 1)
  67. return nullptr;
  68. if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
  69. return nullptr;
  70. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  71. return nullptr;
  72. if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
  73. return nullptr;
  74. if (addAPI(get_info, "obj_funcGetInfo", api) != 1)
  75. return nullptr;
  76. if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
  77. return nullptr;
  78. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  79. return nullptr;
  80. FREE_SYMBOL(get_alc);
  81. FREE_SYMBOL(get_vsl);
  82. FREE_SYMBOL(get_al);
  83. FREE_SYMBOL(get_info);
  84. FREE_SYMBOL(free_mark);
  85. FREE_SYMBOL(get_gl);
  86. FREE_SYMBOL(get_size);
  87. FREE_SYMBOL(init_data);
  88. FREE_SYMBOL(free_data);
  89. return makeObject("func", true, api, true, nullptr, true, nullptr, env);
  90. }