2
0

global_obj.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "aFunCore.h"
  2. #include "__object.h"
  3. typedef struct GlobalObjectData GlobalObjectData;
  4. struct GlobalObjectData {
  5. af_VarSpace *share;
  6. };
  7. static char *global_id = "global-object";
  8. static void initGOD(af_Object *obj, GlobalObjectData *data, af_Environment *env) {
  9. data->share = makeVarSpace(obj, 3, 2, 0, env);
  10. gc_delReference(data->share, env);
  11. }
  12. static void freeGOD(GlobalObjectData *god, af_Object *obj, af_Environment *env) {
  13. god->share = NULL;
  14. }
  15. static size_t getSize(char *id, af_Object *obj) {
  16. /* 不需要检查 id */
  17. return sizeof(GlobalObjectData);
  18. }
  19. static void initData(char *id, af_Object *obj, GlobalObjectData *data, af_Environment *env) {
  20. if (EQ_STR(id, global_id))
  21. initGOD(obj, data, env);
  22. }
  23. static void freeData(char *id, af_Object *obj, GlobalObjectData *data, af_Environment *env) {
  24. if (EQ_STR(id, global_id))
  25. freeGOD(data, obj, env);
  26. }
  27. static af_GcList *getGcList(char *id, af_Object *obj, GlobalObjectData *data) {
  28. if (!EQ_STR(id, global_id))
  29. return NULL;
  30. if (data->share != NULL)
  31. return pushGcList(glt_vs, data->share, NULL);
  32. else
  33. return NULL;
  34. }
  35. static af_VarSpace *getShareVS(char *id, af_Object *obj) {
  36. if (!EQ_STR(id, global_id))
  37. return NULL;
  38. return ((GlobalObjectData *)getObjectData(obj))->share;
  39. }
  40. af_Object *makeGlobalObject(af_Environment *env) {
  41. af_ObjectAPI *api = makeObjectAPI();
  42. DLC_SYMBOL(objectAPIFunc) get_size = MAKE_SYMBOL(getSize, objectAPIFunc);
  43. DLC_SYMBOL(objectAPIFunc) init_data = MAKE_SYMBOL(initData, objectAPIFunc);
  44. DLC_SYMBOL(objectAPIFunc) free_data = MAKE_SYMBOL(freeData, objectAPIFunc);
  45. DLC_SYMBOL(objectAPIFunc) get_share_vs = MAKE_SYMBOL(getShareVS, objectAPIFunc);
  46. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList, objectAPIFunc);
  47. if (addAPI(get_size, "obj_getDataSize", api) != 1)
  48. return NULL;
  49. if (addAPI(init_data, "obj_initData", api) != 1)
  50. return NULL;
  51. if (addAPI(free_data, "obj_destructData", api) != 1)
  52. return NULL;
  53. if (addAPI(get_share_vs, "obj_getShareVarSpace", api) != 1)
  54. return NULL;
  55. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  56. return NULL;
  57. FREE_SYMBOL(get_size);
  58. FREE_SYMBOL(init_data);
  59. FREE_SYMBOL(free_data);
  60. FREE_SYMBOL(get_share_vs);
  61. FREE_SYMBOL(get_gl);
  62. return makeObject(global_id, true, api, true, NULL, true, NULL, env);
  63. }