str_obj.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "__base.hpp"
  2. static const std::string string_func_id = "string-maker";
  3. typedef struct ObjectStrFunc ObjectStrFunc;
  4. struct ObjectStrFunc {
  5. af_ObjectAPI *api;
  6. af_VarSpace *share_vs;
  7. af_VarList *func_var_list;
  8. };
  9. static size_t strGetSize(const std::string &id, af_Object *obj) {
  10. return sizeof(ObjectString);
  11. }
  12. static void strInit(const std::string &id, af_Object *obj, ObjectString *data, af_Environment *env) {
  13. if (id == string_id)
  14. data->str = nullptr;
  15. }
  16. static void strDestruct(const std::string &id, af_Object *obj, ObjectString *data, af_Environment *env) {
  17. if (id == string_id) {
  18. free(data->str);
  19. }
  20. }
  21. static void strLiteral(const std::string &id, af_Object *obj, ObjectString *data, char *str, af_Environment *env) {
  22. if (id != string_id || data->str != nullptr)
  23. return;
  24. writeTrackLog(aFunCoreLogger, "strLiteral str = %s, %d", str, strlen(str));
  25. data->str = NEW_STR(STR_LEN(str) - 2); // 取出两个引号
  26. memcpy(data->str, str + 1, (STR_LEN(str) - 2) * sizeof(char));
  27. }
  28. static size_t strFuncGetSize(const std::string &id, af_Object *obj) {
  29. return sizeof(ObjectStrFunc);
  30. }
  31. static void strFuncInit(const std::string &id, af_Object *obj, ObjectStrFunc *data, af_Environment *env) {
  32. static const APIFuncList api_list[] = {
  33. {.name="obj_getDataSize", .func=(void *)strGetSize, .dlc=nullptr},
  34. {.name="obj_initData", .func=(void *)strInit, .dlc=nullptr},
  35. {.name="obj_destructData", .func=(void *)strDestruct, .dlc=nullptr},
  36. {.name="obj_literalSetting", .func=(void *)strLiteral, .dlc=nullptr},
  37. {.name=nullptr}
  38. };
  39. if (id != string_func_id)
  40. return;
  41. data->func_var_list = copyVarSpaceList(getRunVarSpaceList(env));
  42. data->share_vs = makeVarSpace(obj, 3, 2, 0, env);
  43. data->api = makeAPIFromList(api_list);
  44. gc_delVarSpaceReference(data->share_vs, env);
  45. }
  46. static bool strFuncArgCodeList(const std::string &id, af_Object *obj, af_ArgCodeList **acl, af_Code *code, void **mark, af_Environment *env) {
  47. *acl = nullptr;
  48. return true;
  49. }
  50. static bool strFuncArgList(const std::string &id, af_Object *obj, af_ArgList **al, af_ArgCodeList *acl, void *mark, af_Environment *env) {
  51. *al = nullptr;
  52. return true;
  53. }
  54. static bool strFuncVarList(const std::string &id, af_Object *obj, af_VarList **vsl, void *mark, af_Environment *env) {
  55. auto sf = (ObjectStrFunc *)getObjectData(obj);
  56. *vsl = sf->func_var_list;
  57. return true;
  58. }
  59. static af_FuncBody *strFuncBody(af_CallFuncInfo *cfi, af_Environment *env) {
  60. af_Object *obj = cfi->func;
  61. auto *osf = (ObjectStrFunc *)getObjectData(obj);
  62. af_Object *str = makeObject((char *) string_id, false, osf->api, false, nullptr, true, makeInherit(obj), env);
  63. pushMessageDown(makeNORMALMessage(str, env), env);
  64. return nullptr;
  65. }
  66. static bool strFuncGetInfo(const std::string &id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  67. *fi = makeFuncInfo(normal_scope, not_embedded, false, false, false);
  68. DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(strFuncBody, callFuncBody);
  69. makeCFuncBodyToFuncInfo(func, nullptr, *fi);
  70. FREE_SYMBOL(func);
  71. return true;
  72. }
  73. static af_GcList *strFuncGetGc(const std::string &id, af_Object *obj, ObjectStrFunc *data) {
  74. af_GcList *gl = pushGcList(glt_vsl, data->func_var_list, nullptr);
  75. gl = pushGcList(glt_vs, data->share_vs, gl);
  76. return gl;
  77. }
  78. static void strFuncDestruct(const std::string &id, af_Object *obj, ObjectStrFunc *data, af_Environment *env) {
  79. if (id == string_func_id) {
  80. freeObjectAPI(data->api);
  81. freeAllVarSpaceList(data->func_var_list);
  82. }
  83. }
  84. void makeStrFunc(af_Object *visitor, af_VarSpace *vs, af_Environment *env) {
  85. static APIFuncList api_list[] = {
  86. {.name="obj_getDataSize", .func=(void *)strFuncGetSize, .dlc=nullptr},
  87. {.name="obj_initData", .func=(void *)strFuncInit, .dlc=nullptr},
  88. {.name="obj_destructData", .func=(void *)strFuncDestruct, .dlc=nullptr},
  89. {.name="obj_funcGetArgCodeList", .func=(void *)strFuncArgCodeList, .dlc=nullptr},
  90. {.name="obj_funcGetVarList", .func=(void *)strFuncVarList, .dlc=nullptr},
  91. {.name="obj_funcGetArgList", .func=(void *)strFuncArgList, .dlc=nullptr},
  92. {.name="obj_funcGetInfo", .func=(void *)strFuncGetInfo, .dlc=nullptr},
  93. {.name="obj_getGcList", .func=(void *)strFuncGetGc, .dlc=nullptr},
  94. {.name=nullptr}
  95. };
  96. static ObjectDefineList obj_def[] = {
  97. {.id=string_func_id, .free_api=true, .api_list=api_list, .allow_inherit=true,
  98. .var_name="str", .p_self=3, .p_posterity=3, .p_external=3},
  99. {.id=""}
  100. };
  101. makeObjectFromList(obj_def, visitor, vs, env);
  102. }