str_obj.c 4.4 KB

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