quit.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "__base.h"
  2. #define func_id "quit-func"
  3. typedef struct QuitFunc QuitFunc;
  4. struct QuitFunc {
  5. af_VarSpaceListNode *func_var_list;
  6. };
  7. static size_t funcGetSize(char *id, af_Object *obj) {
  8. return sizeof(QuitFunc);
  9. }
  10. static void funcInit(char *id, af_Object *obj, QuitFunc *data, af_Environment *env) {
  11. if (!EQ_STR(id, func_id))
  12. return;
  13. data->func_var_list = copyVarSpaceList(getRunVarSpaceList(env));
  14. }
  15. static bool funcArgCodeList(char *id, af_Object *obj, af_ArgCodeList **acl, af_Code *code, void **mark, af_Environment *env) {
  16. *acl = NULL;
  17. return true;
  18. }
  19. static bool funcArgList(char *id, af_Object *obj, af_ArgList **al, af_ArgCodeList *acl, void *mark, af_Environment *env) {
  20. *al = NULL;
  21. return true;
  22. }
  23. static bool funcVarList(char *id, af_Object *obj, af_VarSpaceListNode **vsl, void *mark, af_Environment *env) {
  24. QuitFunc *sf = getObjectData(obj);
  25. *vsl = sf->func_var_list;
  26. return true;
  27. }
  28. static af_FuncBody *funcBody(CallFuncInfo *cfi, af_Environment *env) {
  29. env->core->exit_code_->num = 0;
  30. env->core->status = core_exit;
  31. pushMessageDown(makeNORMALMessage(getGlobal(env)), env);
  32. return NULL;
  33. }
  34. static bool funcGetInfo(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  35. *fi = makeFuncInfo(normal_scope, not_embedded, false, false, false);
  36. DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(funcBody, callFuncBody);
  37. makeCFuncBodyToFuncInfo(func, NULL, *fi);
  38. FREE_SYMBOL(func);
  39. return true;
  40. }
  41. static void funcDestruct(char *id, af_Object *obj, QuitFunc *data, af_Environment *env) {
  42. if (EQ_STR(id, func_id))
  43. freeAllVarSpaceList(data->func_var_list);
  44. }
  45. void makeQuitFunc(af_Object *visitor, af_VarSpace *vs, af_Environment *env) {
  46. static APIFuncList api_list[] = {
  47. {.name="obj_getDataSize", .func=funcGetSize, .dlc=NULL},
  48. {.name="obj_initData", .func=funcInit, .dlc=NULL},
  49. {.name="obj_destructData", .func=funcDestruct, .dlc=NULL},
  50. {.name="obj_funcGetArgCodeList", .func=funcArgCodeList, .dlc=NULL},
  51. {.name="obj_funcGetVarList", .func=funcVarList, .dlc=NULL},
  52. {.name="obj_funcGetArgList", .func=funcArgList, .dlc=NULL},
  53. {.name="obj_funcGetInfo", .func=funcGetInfo, .dlc=NULL},
  54. {.name=NULL}
  55. };
  56. static ObjectDefineList obj_def[] = {
  57. {.id=func_id, .free_api=true, .api_list=api_list, .allow_inherit=false,
  58. .var_name="quit", .p_self=3, .p_posterity=3, .p_external=3},
  59. {.id=NULL}
  60. };
  61. makeObjectFromList(obj_def, visitor, vs, env);
  62. }