123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- #include "aFunlang.hpp"
- #include "__cycle_obj.hpp"
- size_t getSizec_Cycle(const std::string &id, af_Object *obj) {
- return sizeof(af_VarList *);
- }
- void initDatac_Cycle(const std::string &id, af_Object *obj, af_VarList **data, af_Environment *env) {
- *data = pushProtectVarList(nullptr, env);
- }
- void freeDatac_Cycle(const std::string &id, af_Object *obj, af_VarList **data, af_Environment *env) {
- freeAllVarSpaceList(*data);
- }
- typedef struct CycleMark CycleMark;
- struct CycleMark {
- af_FuncInfo *fi;
- af_FuncBody *body;
- };
- af_FuncBody *func_Cycle(af_CallFuncInfo *cfi, af_Environment *env) { // 测试用函数
- auto mark = (CycleMark *)cfi->mark;
- cfi->body_next = mark->body;
- pushMessageDown(makeNORMALMessage(getGlobal(env), env), env);
- return nullptr;
- }
- bool getInfoc_Cycle(const std::string &id, af_Object *obj, af_FuncInfo **fi, af_Code *code, CycleMark *mark, af_Environment *env) {
- mark->fi = makeFuncInfo(normal_scope, not_embedded, false, false, false);
- *fi = mark->fi;
- DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(func_Cycle, callFuncBody);
- mark->body = makeCFuncBodyToFuncInfo(func, nullptr, mark->fi); // 压入两个相同的 body
- FREE_SYMBOL(func);
- return true;
- }
- bool getAclc_Cycle(const std::string &id, af_Object *obj, af_ArgCodeList **acl, af_Code *code, CycleMark **mark, af_Environment *env) {
- *acl = nullptr;
- *mark = calloc(1, CycleMark);
- return true;
- }
- bool getVslc_Cycle(const std::string &id, af_Object *obj, af_VarList **vsl, CycleMark *mark, af_Environment *env) {
- *vsl = *(af_VarList **)getObjectData(obj);
- return true;
- }
- af_GcList *getGcListc_Cycle(const std::string &id, af_Object *obj, void *data) {
- af_GcList *gl = pushGcList(glt_vsl, *(af_VarList **)data, nullptr);
- return gl;
- }
- bool getAlc_Cycle(const std::string &id, af_Object *obj, af_ArgList **al, af_ArgCodeList *acl, CycleMark *mark, af_Environment *env) {
- *al = nullptr;
- return true;
- }
- void freeMarkc_Cycle(const std::string &id, af_Object *obj, CycleMark *mark) {
- free(mark);
- }
- af_Object *makeCycleObject(af_Environment *env) {
- af_ObjectAPI *api = makeObjectAPI();
- DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAclc_Cycle, objectAPIFunc);
- DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVslc_Cycle, objectAPIFunc);
- DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAlc_Cycle, objectAPIFunc);
- DLC_SYMBOL(objectAPIFunc) get_info = MAKE_SYMBOL(getInfoc_Cycle, objectAPIFunc);
- DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMarkc_Cycle, objectAPIFunc);
- DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcListc_Cycle, objectAPIFunc);
- DLC_SYMBOL(objectAPIFunc) get_size = MAKE_SYMBOL(getSizec_Cycle, objectAPIFunc);
- DLC_SYMBOL(objectAPIFunc) init_data = MAKE_SYMBOL(initDatac_Cycle, objectAPIFunc);
- DLC_SYMBOL(objectAPIFunc) free_data = MAKE_SYMBOL(freeDatac_Cycle, objectAPIFunc);
- if (addAPI(get_size, "obj_getDataSize", api) != 1)
- return nullptr;
- if (addAPI(init_data, "obj_initData", api) != 1)
- return nullptr;
- if (addAPI(free_data, "obj_destructData", api) != 1)
- return nullptr;
- if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
- return nullptr;
- if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
- return nullptr;
- if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
- return nullptr;
- if (addAPI(get_info, "obj_funcGetInfo", api) != 1)
- return nullptr;
- if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
- return nullptr;
- if (addAPI(get_gl, "obj_getGcList", api) != 1)
- return nullptr;
- FREE_SYMBOL(get_alc);
- FREE_SYMBOL(get_vsl);
- FREE_SYMBOL(get_al);
- FREE_SYMBOL(get_info);
- FREE_SYMBOL(free_mark);
- FREE_SYMBOL(get_gl);
- FREE_SYMBOL(get_size);
- FREE_SYMBOL(init_data);
- FREE_SYMBOL(free_data);
- return makeObject("func", true, api, true, nullptr, true, nullptr, env);
- }
|