run_code.c 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210
  1. #include <stdio.h>
  2. #include "aFun.h"
  3. size_t getSize(char *id, af_Object *obj) {
  4. return sizeof(int *);
  5. }
  6. void initData(char *id, af_Object *obj, int **data, af_Environment *env) {
  7. *data = calloc(1, sizeof(int));
  8. **data = 100;
  9. }
  10. void freeData(char *id, af_Object *obj, int **data, af_Environment *env) {
  11. printf("freeData(): **data = %d\n", **data);
  12. free(*data);
  13. }
  14. af_VarSpace *getShareVS(char *id, af_Object *obj) {
  15. return *(af_VarSpace **)getObjectData(obj);
  16. }
  17. size_t getSize_Normal(char *id, af_Object *obj) {
  18. return sizeof(af_VarList *);
  19. }
  20. void initData_Normal(char *id, af_Object *obj, af_VarList **data, af_Environment *env) {
  21. *data = pushProtectVarList(NULL, env);
  22. printf("initData_Normal(): VarSpace %p\n", *data);
  23. }
  24. void freeData_Normal(char *id, af_Object *obj, af_VarList **data, af_Environment *env) {
  25. printf("freeData_Normal(): vsl = %p\n", *data);
  26. freeAllVarSpaceList(*data);
  27. }
  28. void literalSet_Data(char *id, af_Object *obj, void *data, char *str, af_Environment *env) {
  29. printf("literalSet_Data(): str = %s\n", str);
  30. }
  31. af_FuncBody *testFunc_Normal(af_CallFuncInfo *cfi, af_Environment *env) { // 测试用函数
  32. printf("testFunc_Normal(): I am testFunc_Normal\n");
  33. af_Object *obj;
  34. {
  35. af_ObjectAPI *api = makeObjectAPI();
  36. DLC_SYMBOL(objectAPIFunc) literal_set = MAKE_SYMBOL(literalSet_Data, objectAPIFunc);
  37. if (addAPI(literal_set, "obj_literalSetting", api) != 1)
  38. return NULL;
  39. obj = makeObject("func", true, api, true, NULL, true, NULL, env);
  40. FREE_SYMBOL(literal_set);
  41. }
  42. pushMessageDown(makeNORMALMessage(obj, env), env);
  43. return NULL;
  44. }
  45. bool getInfo_Normal(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  46. *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
  47. makeCodeFuncBodyToFuncInfo(makeElementCode("test", NUL, 0, "Unknown"), true, NULL, *fi);
  48. DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc_Normal, callFuncBody);
  49. makeCFuncBodyToFuncInfo(func, NULL, *fi);
  50. FREE_SYMBOL(func);
  51. return true;
  52. }
  53. bool getAcl_Normal(char *id, af_Object *obj, af_ArgCodeList **acl, af_Code *code, int **mark, af_Environment *env) {
  54. *acl = makeArgCodeList(makeElementCode("object", NUL, 0, "Unknown"), 0, true, false);
  55. *mark = calloc(1, sizeof(int));
  56. **mark = 100;
  57. return true;
  58. }
  59. bool getVsl_Normal(char *id, af_Object *obj, af_VarList **vsl, void *mark, af_Environment *env) {
  60. *vsl = *(af_VarList **)getObjectData(obj);
  61. return true;
  62. }
  63. af_GcList *getGcList_Normal(char *id, af_Object *obj, void *data) {
  64. af_GcList *gl = pushGcList(glt_vsl, *(af_VarList **)data, NULL);
  65. return gl;
  66. }
  67. bool getAl_Normal(char *id, af_Object *obj, af_ArgList **al, af_ArgCodeList *acl, void *mark, af_Environment *env) {
  68. *al = makeArgListFromArgCodeList("test",acl, env);
  69. return true;
  70. }
  71. void freeMark_Normal(char *id, af_Object *obj, int *mark) {
  72. printf("freeMark_Normal(): mark = %d\n", *mark);
  73. free(mark);
  74. }
  75. af_FuncBody *testFuncMacro(af_CallFuncInfo *cfi, af_Environment *env) { // 测试用函数
  76. printf("testFuncMacro(): I am testFuncMacro\n");
  77. af_Object *obj;
  78. {
  79. af_ObjectAPI *api = makeObjectAPI();
  80. DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl_Normal, objectAPIFunc);
  81. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  82. DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl_Normal, objectAPIFunc);
  83. DLC_SYMBOL(objectAPIFunc) get_info = MAKE_SYMBOL(getInfo_Normal, objectAPIFunc);
  84. DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark_Normal, objectAPIFunc);
  85. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  86. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  87. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  88. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  89. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  90. return NULL;
  91. if (addAPI(initData_2, "obj_initData", api) != 1)
  92. return NULL;
  93. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  94. return NULL;
  95. if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
  96. return NULL;
  97. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  98. return NULL;
  99. if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
  100. return NULL;
  101. if (addAPI(get_info, "obj_funcGetInfo", api) != 1)
  102. return NULL;
  103. if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
  104. return NULL;
  105. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  106. return NULL;
  107. obj = makeObject("func", true, api, true, NULL, true, NULL, env);
  108. FREE_SYMBOL(getSize_2);
  109. FREE_SYMBOL(initData_2);
  110. FREE_SYMBOL(freeData_2);
  111. FREE_SYMBOL(get_alc);
  112. FREE_SYMBOL(get_vsl);
  113. FREE_SYMBOL(get_al);
  114. FREE_SYMBOL(get_info);
  115. FREE_SYMBOL(free_mark);
  116. FREE_SYMBOL(get_gl);
  117. }
  118. pushMessageDown(makeNORMALMessage(obj, env), env);
  119. return NULL;
  120. }
  121. bool getInfo_Macro(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  122. *fi = makeFuncInfo(normal_scope, not_embedded, true, true, true);
  123. makeCodeFuncBodyToFuncInfo(makeElementCode("test", NUL, 0, "Unknown"), true, NULL, *fi);
  124. DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFuncMacro, callFuncBody);
  125. makeCFuncBodyToFuncInfo(func, NULL, *fi);
  126. FREE_SYMBOL(func);
  127. return true;
  128. }
  129. bool getInfo_Tail(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  130. *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
  131. makeCodeFuncBodyToFuncInfo(makeElementCode("data3", NUL, 0, "Unknown"), true, NULL, *fi);
  132. return true;
  133. }
  134. af_FuncBody *testFunc_Obj(af_CallFuncInfo *cfi, af_Environment *env) { // 测试用函数
  135. printf("testFunc_Obj(): I am testFunc_Obj\n");
  136. af_Object *obj;
  137. {
  138. af_ObjectAPI *api = makeObjectAPI();
  139. DLC_SYMBOL(objectAPIFunc) literal_set = MAKE_SYMBOL(literalSet_Data, objectAPIFunc);
  140. if (addAPI(literal_set, "obj_literalSetting", api) != 1)
  141. return NULL;
  142. obj = makeObject("func", true, api, true, NULL, true, NULL, env);
  143. FREE_SYMBOL(literal_set);
  144. }
  145. pushMessageDown(makeNORMALMessage(obj, env), env);
  146. return NULL;
  147. }
  148. bool getInfo_Obj(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  149. *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
  150. DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc_Obj, callFuncBody);
  151. makeCFuncBodyToFuncInfo(func, NULL, *fi);
  152. FREE_SYMBOL(func);
  153. return true;
  154. }
  155. bool isObjTrue(char *id, af_Object *obj) {
  156. return true;
  157. }
  158. size_t getSize3(char *id, af_Object *obj) {
  159. return sizeof(af_VarSpace *);
  160. }
  161. void initData3(char *id, af_Object *obj, af_VarSpace **data, af_Environment *env) {
  162. *data = makeVarSpace(obj, 3, 2, 0, env);
  163. gc_delVarSpaceReference(*data, env);
  164. }
  165. void freeData3(char *id, af_Object *obj, af_VarSpace **data, af_Environment *env) {
  166. printf("freeData(): *data = %p\n", *data);
  167. }
  168. af_GcList *getGcList3(char *id, af_Object *obj, void *data) {
  169. af_GcList *gl = pushGcList(glt_vs, *(af_VarSpace **)data, NULL);
  170. return gl;
  171. }
  172. af_FuncBody *testFunc_Dynamic(af_CallFuncInfo *cfi, af_Environment *env) { // 测试用函数
  173. af_Object *obj;
  174. af_FuncBody *fb;
  175. obj = makeObject("obj", true, makeObjectAPI(), true, NULL, true, NULL, env);
  176. pushMessageDown(makeNORMALMessage(obj, env), env);
  177. printf("testFunc_Dynamic(%p): I am testFunc_Dynamic\n", obj);
  178. DLC_SYMBOL(callFuncBody) func1 = MAKE_SYMBOL(testFunc_Dynamic, callFuncBody);
  179. fb = makeCFuncBody(func1, NULL);
  180. FREE_SYMBOL(func1);
  181. return fb;
  182. }
  183. bool getInfo_Dynamic(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  184. *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
  185. DLC_SYMBOL(callFuncBody) func1 = MAKE_SYMBOL(testFunc_Dynamic, callFuncBody);
  186. makeCFuncBodyToFuncInfo(func1, NULL, *fi);
  187. FREE_SYMBOL(func1);
  188. makeDynamicFuncBodyToFuncInfo(*fi);
  189. return true;
  190. }
  191. af_FuncBody *testFunc_GcDestruct_b(af_CallFuncInfo *cfi, af_Environment *env) { // 测试用函数
  192. af_Object *obj;
  193. obj = makeObject("obj", true, makeObjectAPI(), true, NULL, true, NULL, env);
  194. pushMessageDown(makeNORMALMessage(obj, env), env);
  195. printf("testFunc_GcDestruct_b(%p): I am testFunc_GcDestruct_b\n", obj);
  196. fflush(stdout);
  197. return NULL;
  198. }
  199. af_FuncBody *testFunc_GcDestruct_c(af_CallFuncInfo *cfi, af_Environment *env) { // 测试用函数
  200. af_Object *obj;
  201. obj = makeObject("func", true, makeObjectAPI(), true, NULL, true, NULL, env);
  202. pushMessageDown(makeNORMALMessage(obj, env), env);
  203. printf("testFunc_GcDestruct_c[des](%p): I am testFunc_GcDestruct_c\n", obj);
  204. fflush(stdout);
  205. return NULL;
  206. }
  207. bool getInfo_GcDestruct_2(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  208. *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
  209. DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc_GcDestruct_c, callFuncBody);
  210. makeCFuncBodyToFuncInfo(func, NULL, *fi);
  211. FREE_SYMBOL(func);
  212. return true;
  213. }
  214. af_FuncBody *testFunc_GcDestruct_a(af_CallFuncInfo *cfi, af_Environment *env) { // 测试用函数
  215. af_Object *obj;
  216. af_Object *des;
  217. obj = makeObject("func", true, makeObjectAPI(), true, NULL, true, NULL, env);
  218. {
  219. af_ObjectAPI *api = makeObjectAPI();
  220. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  221. DLC_SYMBOL(objectAPIFunc) get_info7 = MAKE_SYMBOL(getInfo_GcDestruct_2, objectAPIFunc);
  222. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  223. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  224. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  225. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  226. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  227. return NULL;
  228. if (addAPI(initData_2, "obj_initData", api) != 1)
  229. return NULL;
  230. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  231. return NULL;
  232. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  233. return NULL;
  234. if (addAPI(get_info7, "obj_funcGetInfo", api) != 1)
  235. return NULL;
  236. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  237. return NULL;
  238. des = makeObject("func-des", true, api, true, NULL, true, NULL, env);
  239. FREE_SYMBOL(get_vsl);
  240. FREE_SYMBOL(get_info7);
  241. FREE_SYMBOL(get_gl);
  242. FREE_SYMBOL(getSize_2);
  243. FREE_SYMBOL(initData_2);
  244. FREE_SYMBOL(freeData_2);
  245. }
  246. setObjectAttributes(mg_gc_destruct, 3, 3, 3, des, obj, obj, env);
  247. pushMessageDown(makeNORMALMessage(obj, env), env);
  248. printf("testFunc_GcDestruct_a[des](%p, %p): I am testFunc_GcDestruct_a\n", obj, des);
  249. gc_delObjectReference(des, env); // obj不需要 delReference, 因为他存在于NORMAL_Message中
  250. return NULL;
  251. }
  252. bool getInfo_GcDestruct(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  253. *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
  254. DLC_SYMBOL(callFuncBody) func1 = MAKE_SYMBOL(testFunc_GcDestruct_a, callFuncBody);
  255. makeCFuncBodyToFuncInfo(func1, NULL, *fi);
  256. FREE_SYMBOL(func1);
  257. DLC_SYMBOL(callFuncBody) func2 = MAKE_SYMBOL(testFunc_GcDestruct_b, callFuncBody);
  258. makeCFuncBodyToFuncInfo(func2, NULL, *fi);
  259. FREE_SYMBOL(func2);
  260. return true;
  261. }
  262. af_FuncBody *testFunc_Gc(af_CallFuncInfo *cfi, af_Environment *env) { // 测试用函数
  263. af_Object *obj;
  264. af_Object *des;
  265. obj = makeObject("func", true, makeObjectAPI(), true, NULL, true, NULL, env);
  266. {
  267. af_ObjectAPI *api = makeObjectAPI();
  268. /* 无get_acl API 表示析构函数没有参数 */
  269. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  270. DLC_SYMBOL(objectAPIFunc) get_info6 = MAKE_SYMBOL(getInfo_GcDestruct, objectAPIFunc);
  271. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  272. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  273. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  274. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  275. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  276. return NULL;
  277. if (addAPI(initData_2, "obj_initData", api) != 1)
  278. return NULL;
  279. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  280. return NULL;
  281. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  282. return NULL;
  283. if (addAPI(get_info6, "obj_funcGetInfo", api) != 1)
  284. return NULL;
  285. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  286. return NULL;
  287. des = makeObject("func-des", true, api, true, NULL, true, NULL, env);
  288. FREE_SYMBOL(get_vsl);
  289. FREE_SYMBOL(get_info6);
  290. FREE_SYMBOL(get_gl);
  291. FREE_SYMBOL(getSize_2);
  292. FREE_SYMBOL(initData_2);
  293. FREE_SYMBOL(freeData_2);
  294. }
  295. setObjectAttributes(mg_gc_destruct, 3, 3, 3, des, obj, obj, env);
  296. pushMessageDown(makeNORMALMessage(obj, env), env);
  297. printf("testFunc_Gc(%p, %p): I am testFunc_Gc\n", obj, des);
  298. gc_delObjectReference(des, env);
  299. return NULL;
  300. }
  301. bool getInfo_Gc(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  302. *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
  303. DLC_SYMBOL(callFuncBody) func = MAKE_SYMBOL(testFunc_Gc, callFuncBody);
  304. makeCFuncBodyToFuncInfo(func, NULL, *fi);
  305. FREE_SYMBOL(func);
  306. makeCodeFuncBodyToFuncInfo(makeElementCode("test", NUL, 0, "Unknown"), true, NULL, *fi);
  307. return true;
  308. }
  309. bool getInfo_NotVar(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  310. *fi = makeFuncInfo(normal_scope, not_embedded, true, true, true);
  311. makeCodeFuncBodyToFuncInfo(makeElementCode("no-var", NUL, 1, "func9.info.aun"), true, NULL, *fi);
  312. return true;
  313. }
  314. bool getInfo_Import(char *id, af_Object *obj, af_FuncInfo **fi, af_Code *code, void *mark, af_Environment *env) {
  315. *fi = makeFuncInfo(normal_scope, not_embedded, false, true, true);
  316. makeImportFuncBodyToFuncInfo(makeElementCode("global", NUL, 1, "func9.info.aun"), true, NULL, *fi);
  317. return true;
  318. }
  319. bool isInfixTrue(char *id, af_Object *obj) {
  320. return true;
  321. }
  322. struct GDData {
  323. af_Object *func;
  324. bool no_first;
  325. };
  326. af_GuardianList *gd_func(char *type, bool is_guard, struct GDData *data, af_Environment *env) {
  327. printf("gd_func:run-Guardian-func\n");
  328. if (data->no_first)
  329. return NULL;
  330. af_GuardianList *gd = NULL;
  331. data->no_first = true;
  332. gc_addObjectReference(data->func, env); // data->func 本身有一次gc引用, 此次再使用一次gc引用, gd_destruct和freeGuardianList时各释放一次
  333. pushGuardianList(NULL, data->func, &gd, env);
  334. return gd;
  335. }
  336. void gd_destruct(char *type, struct GDData *data, af_Environment *env) {
  337. gc_delObjectReference(data->func, env);
  338. }
  339. int main(int argc, char **argv) {
  340. jmp_buf main_buf;
  341. char *base_path = getExedir(1);
  342. if (base_path == NULL)
  343. goto INIT_ERROR;
  344. if (setjmp(main_buf) == 1)
  345. return EXIT_FAILURE;
  346. aFunInitInfo info = {
  347. .base_dir=base_path,
  348. .level=log_track,
  349. .log_asyn=true,
  350. .buf=&main_buf
  351. };
  352. if (!aFunInit(&info)) {
  353. INIT_ERROR:
  354. free(base_path);
  355. printf_stderr(0, "aFunlang init error\n");
  356. return EXIT_FAILURE;
  357. } else
  358. free(base_path);
  359. af_Environment *env = creatAFunEnvironment(0, NULL);
  360. aFunRunInfo ri = {.signal=true};
  361. defineRunEnv(&ri);
  362. if(!pushLiteralRegex("data.*", "func-normal", true, env)) {
  363. fprintf(stderr, "pushLiteralRegex Error\n");
  364. goto RETURN_1;
  365. }
  366. {
  367. af_ObjectAPI *api = makeObjectAPI();
  368. af_Object *obj;
  369. DLC_SYMBOL(objectAPIFunc) getSize_3 = MAKE_SYMBOL(getSize3, objectAPIFunc);
  370. DLC_SYMBOL(objectAPIFunc) initData_3 = MAKE_SYMBOL(initData3, objectAPIFunc);
  371. DLC_SYMBOL(objectAPIFunc) freeData_3 = MAKE_SYMBOL(freeData3, objectAPIFunc);
  372. DLC_SYMBOL(objectAPIFunc) getShareVS_ = MAKE_SYMBOL(getShareVS, objectAPIFunc);
  373. DLC_SYMBOL(objectAPIFunc) get_gl3 = MAKE_SYMBOL(getGcList3, objectAPIFunc);
  374. if (addAPI(getSize_3, "obj_getDataSize", api) != 1)
  375. goto RETURN_2;
  376. if (addAPI(initData_3, "obj_initData", api) != 1)
  377. goto RETURN_2;
  378. if (addAPI(freeData_3, "obj_destructData", api) != 1)
  379. goto RETURN_2;
  380. if (addAPI(getShareVS_, "obj_getShareVarSpace", api) != 1)
  381. goto RETURN_2;
  382. if (addAPI(get_gl3, "obj_getGcList", api) != 1)
  383. goto RETURN_2;
  384. makeVarToProtectVarSpace("object", 3, 3, 3,
  385. (obj = makeObject("object", true, api, true, NULL, true, NULL, env)),
  386. env);
  387. FREE_SYMBOL(getSize_3);
  388. FREE_SYMBOL(initData_3);
  389. FREE_SYMBOL(freeData_3);
  390. FREE_SYMBOL(getShareVS_);
  391. FREE_SYMBOL(get_gl3);
  392. printf("object(%p)\n", obj);
  393. gc_delObjectReference(obj, env);
  394. }
  395. af_Object *af_func = NULL;
  396. {
  397. af_ObjectAPI *api = makeObjectAPI();
  398. af_Object *obj;
  399. DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl_Normal, objectAPIFunc);
  400. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  401. DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl_Normal, objectAPIFunc);
  402. DLC_SYMBOL(objectAPIFunc) get_info = MAKE_SYMBOL(getInfo_Normal, objectAPIFunc);
  403. DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark_Normal, objectAPIFunc);
  404. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  405. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  406. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  407. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  408. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  409. goto RETURN_2;
  410. if (addAPI(initData_2, "obj_initData", api) != 1)
  411. goto RETURN_2;
  412. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  413. goto RETURN_2;
  414. if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
  415. goto RETURN_2;
  416. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  417. goto RETURN_2;
  418. if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
  419. goto RETURN_2;
  420. if (addAPI(get_info, "obj_funcGetInfo", api) != 1)
  421. goto RETURN_2;
  422. if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
  423. goto RETURN_2;
  424. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  425. goto RETURN_2;
  426. makeVarToProtectVarSpace("func-normal", 3, 3, 3,
  427. (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env);
  428. FREE_SYMBOL(get_alc);
  429. FREE_SYMBOL(get_vsl);
  430. FREE_SYMBOL(get_al);
  431. FREE_SYMBOL(get_info);
  432. FREE_SYMBOL(free_mark);
  433. FREE_SYMBOL(get_gl);
  434. FREE_SYMBOL(getSize_2);
  435. FREE_SYMBOL(initData_2);
  436. FREE_SYMBOL(freeData_2);
  437. af_func = obj;
  438. gc_delObjectReference(obj, env);
  439. printf("func-normal(%p)\n", obj);
  440. }
  441. {
  442. af_ObjectAPI *api = makeObjectAPI();
  443. af_Object *obj;
  444. DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl_Normal, objectAPIFunc);
  445. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  446. DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl_Normal, objectAPIFunc);
  447. DLC_SYMBOL(objectAPIFunc) get_info2 = MAKE_SYMBOL(getInfo_Macro, objectAPIFunc); // 宏函数
  448. DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark_Normal, objectAPIFunc);
  449. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  450. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  451. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  452. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  453. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  454. goto RETURN_2;
  455. if (addAPI(initData_2, "obj_initData", api) != 1)
  456. goto RETURN_2;
  457. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  458. goto RETURN_2;
  459. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  460. goto RETURN_2;
  461. if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
  462. goto RETURN_2;
  463. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  464. goto RETURN_2;
  465. if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
  466. goto RETURN_2;
  467. if (addAPI(get_info2, "obj_funcGetInfo", api) != 1)
  468. goto RETURN_2;
  469. if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
  470. goto RETURN_2;
  471. makeVarToProtectVarSpace("macro", 3, 3, 3,
  472. (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env);
  473. FREE_SYMBOL(get_alc);
  474. FREE_SYMBOL(get_vsl);
  475. FREE_SYMBOL(get_al);
  476. FREE_SYMBOL(get_info2);
  477. FREE_SYMBOL(free_mark);
  478. FREE_SYMBOL(get_gl);
  479. FREE_SYMBOL(getSize_2);
  480. FREE_SYMBOL(initData_2);
  481. FREE_SYMBOL(freeData_2);
  482. printf("macro(%p)\n", obj);
  483. gc_delObjectReference(obj, env);
  484. }
  485. {
  486. af_ObjectAPI *api = makeObjectAPI();
  487. af_Object *obj;
  488. DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl_Normal, objectAPIFunc);
  489. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  490. DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl_Normal, objectAPIFunc);
  491. DLC_SYMBOL(objectAPIFunc) get_info3 = MAKE_SYMBOL(getInfo_Tail, objectAPIFunc);
  492. DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark_Normal, objectAPIFunc);
  493. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  494. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  495. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  496. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  497. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  498. goto RETURN_2;
  499. if (addAPI(initData_2, "obj_initData", api) != 1)
  500. goto RETURN_2;
  501. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  502. goto RETURN_2;
  503. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  504. goto RETURN_2;
  505. if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
  506. goto RETURN_2;
  507. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  508. goto RETURN_2;
  509. if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
  510. goto RETURN_2;
  511. if (addAPI(get_info3, "obj_funcGetInfo", api) != 1)
  512. goto RETURN_2;
  513. if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
  514. goto RETURN_2;
  515. makeVarToProtectVarSpace("func-tail", 3, 3, 3,
  516. (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env);
  517. FREE_SYMBOL(get_alc);
  518. FREE_SYMBOL(get_vsl);
  519. FREE_SYMBOL(get_al);
  520. FREE_SYMBOL(get_info3);
  521. FREE_SYMBOL(free_mark);
  522. FREE_SYMBOL(get_gl);
  523. FREE_SYMBOL(getSize_2);
  524. FREE_SYMBOL(initData_2);
  525. FREE_SYMBOL(freeData_2);
  526. printf("func-tail(%p)\n", obj);
  527. gc_delObjectReference(obj, env);
  528. }
  529. {
  530. af_ObjectAPI *api = makeObjectAPI();
  531. af_Object *obj;
  532. DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl_Normal, objectAPIFunc);
  533. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  534. DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl_Normal, objectAPIFunc);
  535. DLC_SYMBOL(objectAPIFunc) get_info4 = MAKE_SYMBOL(getInfo_Obj, objectAPIFunc);
  536. DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark_Normal, objectAPIFunc);
  537. DLC_SYMBOL(objectAPIFunc) obj_func = MAKE_SYMBOL(isObjTrue, objectAPIFunc);
  538. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  539. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  540. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  541. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  542. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  543. goto RETURN_2;
  544. if (addAPI(initData_2, "obj_initData", api) != 1)
  545. goto RETURN_2;
  546. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  547. goto RETURN_2;
  548. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  549. goto RETURN_2;
  550. if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
  551. goto RETURN_2;
  552. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  553. goto RETURN_2;
  554. if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
  555. goto RETURN_2;
  556. if (addAPI(get_info4, "obj_funcGetInfo", api) != 1)
  557. goto RETURN_2;
  558. if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
  559. goto RETURN_2;
  560. if (addAPI(obj_func, "obj_isObjFunc", api) != 1)
  561. goto RETURN_2;
  562. makeVarToProtectVarSpace("func-obj", 3, 3, 3,
  563. (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env);
  564. FREE_SYMBOL(get_alc);
  565. FREE_SYMBOL(get_vsl);
  566. FREE_SYMBOL(get_al);
  567. FREE_SYMBOL(get_info4);
  568. FREE_SYMBOL(free_mark);
  569. FREE_SYMBOL(obj_func);
  570. FREE_SYMBOL(get_gl);
  571. FREE_SYMBOL(getSize_2);
  572. FREE_SYMBOL(initData_2);
  573. FREE_SYMBOL(freeData_2);
  574. printf("func-obj(%p)\n", obj);
  575. gc_delObjectReference(obj, env);
  576. }
  577. {
  578. af_ObjectAPI *api = makeObjectAPI();
  579. af_Object *obj;
  580. DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl_Normal, objectAPIFunc);
  581. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  582. DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl_Normal, objectAPIFunc);
  583. DLC_SYMBOL(objectAPIFunc) get_info5 = MAKE_SYMBOL(getInfo_Gc, objectAPIFunc);
  584. DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark_Normal, objectAPIFunc);
  585. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  586. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  587. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  588. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  589. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  590. goto RETURN_2;
  591. if (addAPI(initData_2, "obj_initData", api) != 1)
  592. goto RETURN_2;
  593. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  594. goto RETURN_2;
  595. if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
  596. goto RETURN_2;
  597. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  598. goto RETURN_2;
  599. if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
  600. goto RETURN_2;
  601. if (addAPI(get_info5, "obj_funcGetInfo", api) != 1)
  602. goto RETURN_2;
  603. if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
  604. goto RETURN_2;
  605. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  606. goto RETURN_2;
  607. makeVarToProtectVarSpace("func-gc", 3, 3, 3,
  608. (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env);
  609. FREE_SYMBOL(get_alc);
  610. FREE_SYMBOL(get_vsl);
  611. FREE_SYMBOL(get_al);
  612. FREE_SYMBOL(get_info5);
  613. FREE_SYMBOL(free_mark);
  614. FREE_SYMBOL(get_gl);
  615. FREE_SYMBOL(getSize_2);
  616. FREE_SYMBOL(initData_2);
  617. FREE_SYMBOL(freeData_2);
  618. printf("func-gc(%p)\n", obj);
  619. gc_delObjectReference(obj, env);
  620. }
  621. {
  622. af_ObjectAPI *api = makeObjectAPI();
  623. af_Object *obj;
  624. DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl_Normal, objectAPIFunc);
  625. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  626. DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl_Normal, objectAPIFunc);
  627. DLC_SYMBOL(objectAPIFunc) get_info9 = MAKE_SYMBOL(getInfo_Dynamic, objectAPIFunc);
  628. DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark_Normal, objectAPIFunc);
  629. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  630. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  631. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  632. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  633. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  634. goto RETURN_2;
  635. if (addAPI(initData_2, "obj_initData", api) != 1)
  636. goto RETURN_2;
  637. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  638. goto RETURN_2;
  639. if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
  640. goto RETURN_2;
  641. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  642. goto RETURN_2;
  643. if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
  644. goto RETURN_2;
  645. if (addAPI(get_info9, "obj_funcGetInfo", api) != 1)
  646. goto RETURN_2;
  647. if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
  648. goto RETURN_2;
  649. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  650. goto RETURN_2;
  651. makeVarToProtectVarSpace("func-body-dynamic", 3, 3, 3,
  652. (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env);
  653. FREE_SYMBOL(get_alc);
  654. FREE_SYMBOL(get_vsl);
  655. FREE_SYMBOL(get_al);
  656. FREE_SYMBOL(get_info9);
  657. FREE_SYMBOL(free_mark);
  658. FREE_SYMBOL(get_gl);
  659. FREE_SYMBOL(getSize_2);
  660. FREE_SYMBOL(initData_2);
  661. FREE_SYMBOL(freeData_2);
  662. printf("func-body-dynamic(%p)\n", obj);
  663. gc_delObjectReference(obj, env);
  664. }
  665. {
  666. af_ObjectAPI *api = makeObjectAPI();
  667. af_Object *obj;
  668. DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl_Normal, objectAPIFunc);
  669. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  670. DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl_Normal, objectAPIFunc);
  671. DLC_SYMBOL(objectAPIFunc) get_info = MAKE_SYMBOL(getInfo_Normal, objectAPIFunc);
  672. DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark_Normal, objectAPIFunc);
  673. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  674. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  675. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  676. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  677. DLC_SYMBOL(objectAPIFunc) infix_func = MAKE_SYMBOL(isInfixTrue, objectAPIFunc);
  678. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  679. goto RETURN_2;
  680. if (addAPI(initData_2, "obj_initData", api) != 1)
  681. goto RETURN_2;
  682. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  683. goto RETURN_2;
  684. if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
  685. goto RETURN_2;
  686. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  687. goto RETURN_2;
  688. if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
  689. goto RETURN_2;
  690. if (addAPI(get_info, "obj_funcGetInfo", api) != 1)
  691. goto RETURN_2;
  692. if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
  693. goto RETURN_2;
  694. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  695. goto RETURN_2;
  696. if (addAPI(infix_func, "obj_isInfixFunc", api) != 1)
  697. goto RETURN_2;
  698. makeVarToProtectVarSpace("func-brackets", 3, 3, 3,
  699. (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env);
  700. FREE_SYMBOL(get_alc);
  701. FREE_SYMBOL(get_vsl);
  702. FREE_SYMBOL(get_al);
  703. FREE_SYMBOL(get_info);
  704. FREE_SYMBOL(free_mark);
  705. FREE_SYMBOL(get_gl);
  706. FREE_SYMBOL(getSize_2);
  707. FREE_SYMBOL(initData_2);
  708. FREE_SYMBOL(freeData_2);
  709. FREE_SYMBOL(infix_func);
  710. printf("func-brackets(%p)\n", obj);
  711. gc_delObjectReference(obj, env);
  712. }
  713. {
  714. af_ObjectAPI *api = makeObjectAPI();
  715. af_Object *obj;
  716. DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl_Normal, objectAPIFunc);
  717. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  718. DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl_Normal, objectAPIFunc);
  719. DLC_SYMBOL(objectAPIFunc) get_info10 = MAKE_SYMBOL(getInfo_NotVar, objectAPIFunc);
  720. DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark_Normal, objectAPIFunc);
  721. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  722. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  723. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  724. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  725. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  726. goto RETURN_2;
  727. if (addAPI(initData_2, "obj_initData", api) != 1)
  728. goto RETURN_2;
  729. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  730. goto RETURN_2;
  731. if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
  732. goto RETURN_2;
  733. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  734. goto RETURN_2;
  735. if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
  736. goto RETURN_2;
  737. if (addAPI(get_info10, "obj_funcGetInfo", api) != 1)
  738. goto RETURN_2;
  739. if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
  740. goto RETURN_2;
  741. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  742. goto RETURN_2;
  743. makeVarToProtectVarSpace("func-no-var", 3, 3, 3,
  744. (obj = makeObject("func", true, api, true, NULL, true, NULL, env)), env);
  745. FREE_SYMBOL(get_alc);
  746. FREE_SYMBOL(get_vsl);
  747. FREE_SYMBOL(get_al);
  748. FREE_SYMBOL(get_info10);
  749. FREE_SYMBOL(free_mark);
  750. FREE_SYMBOL(get_gl);
  751. FREE_SYMBOL(getSize_2);
  752. FREE_SYMBOL(initData_2);
  753. FREE_SYMBOL(freeData_2);
  754. printf("func-no-var(%p)\n", obj);
  755. gc_delObjectReference(obj, env);
  756. }
  757. {
  758. af_ObjectAPI *api = makeObjectAPI();
  759. af_Object *obj;
  760. DLC_SYMBOL(objectAPIFunc) get_alc = MAKE_SYMBOL(getAcl_Normal, objectAPIFunc);
  761. DLC_SYMBOL(objectAPIFunc) get_vsl = MAKE_SYMBOL(getVsl_Normal, objectAPIFunc);
  762. DLC_SYMBOL(objectAPIFunc) get_al = MAKE_SYMBOL(getAl_Normal, objectAPIFunc);
  763. DLC_SYMBOL(objectAPIFunc) get_info11 = MAKE_SYMBOL(getInfo_Import, objectAPIFunc);
  764. DLC_SYMBOL(objectAPIFunc) free_mark = MAKE_SYMBOL(freeMark_Normal, objectAPIFunc);
  765. DLC_SYMBOL(objectAPIFunc) get_gl = MAKE_SYMBOL(getGcList_Normal, objectAPIFunc);
  766. DLC_SYMBOL(objectAPIFunc) getSize_2 = MAKE_SYMBOL(getSize_Normal, objectAPIFunc);
  767. DLC_SYMBOL(objectAPIFunc) initData_2 = MAKE_SYMBOL(initData_Normal, objectAPIFunc);
  768. DLC_SYMBOL(objectAPIFunc) freeData_2 = MAKE_SYMBOL(freeData_Normal, objectAPIFunc);
  769. if (addAPI(getSize_2, "obj_getDataSize", api) != 1)
  770. goto RETURN_2;
  771. if (addAPI(initData_2, "obj_initData", api) != 1)
  772. goto RETURN_2;
  773. if (addAPI(freeData_2, "obj_destructData", api) != 1)
  774. goto RETURN_2;
  775. if (addAPI(get_alc, "obj_funcGetArgCodeList", api) != 1)
  776. goto RETURN_2;
  777. if (addAPI(get_vsl, "obj_funcGetVarList", api) != 1)
  778. goto RETURN_2;
  779. if (addAPI(get_al, "obj_funcGetArgList", api) != 1)
  780. goto RETURN_2;
  781. if (addAPI(get_info11, "obj_funcGetInfo", api) != 1)
  782. goto RETURN_2;
  783. if (addAPI(free_mark, "obj_funcFreeMask", api) != 1)
  784. goto RETURN_2;
  785. if (addAPI(get_gl, "obj_getGcList", api) != 1)
  786. goto RETURN_2;
  787. makeVarToProtectVarSpace("func-import", 3, 3, 3,
  788. (obj =makeObject("func", true, api, true, NULL, true, NULL, env)), env);
  789. FREE_SYMBOL(get_alc);
  790. FREE_SYMBOL(get_vsl);
  791. FREE_SYMBOL(get_al);
  792. FREE_SYMBOL(get_info11);
  793. FREE_SYMBOL(free_mark);
  794. FREE_SYMBOL(get_gl);
  795. FREE_SYMBOL(getSize_2);
  796. FREE_SYMBOL(initData_2);
  797. FREE_SYMBOL(freeData_2);
  798. printf("func-import(%p)\n", obj);
  799. gc_delObjectReference(obj, env);
  800. }
  801. {
  802. af_Object *obj = getGlobal(env);
  803. printf("global(%p)\n", obj);
  804. gc_delObjectReference(obj, env);
  805. }
  806. { // 正常程序
  807. printf("\nTAG A: [Normal test]\n");
  808. af_Code *bt1 = makeElementCode("object", 0, 1, "Taga.aun");
  809. af_Code *bt2 = makeElementCode("data", 0, 0, NULL);
  810. pushCode(&bt1, bt2);
  811. af_Code *bt3 = makeElementCode("func-normal", 0, 1, NULL);
  812. af_Code *bt5 = makeBlockCode(curly, bt3, 0, 1, NULL, NULL);
  813. pushCode(&bt1, bt5);
  814. af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
  815. pushCode(&bt5, bt6);
  816. runCodeFromMemory(bt1, 0, env);
  817. freeAllCode(bt1);
  818. }
  819. { // 宏函数
  820. printf("\nTAG L: [Macro test]\n");
  821. af_Code *bt1 = makeElementCode("object", 0, 1, "Tagl.aun");
  822. af_Code *bt3 = makeElementCode("macro", 0, 1, NULL);
  823. af_Code *bt5 = makeBlockCode(curly, bt3, 0, 1, NULL, NULL);
  824. pushCode(&bt1, bt5);
  825. af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
  826. pushCode(&bt5, bt6);
  827. runCodeFromMemory(bt1, 0, env);
  828. freeAllCode(bt1);
  829. }
  830. { // 测试顺序执行 '(xxx)
  831. printf("\nTAG E: [ex]\n");
  832. af_Code *bt3 = makeElementCode("data2", 0, 0, NULL);
  833. af_Code *bt4 = makeElementCode("global", 0, 1, NULL);
  834. pushCode(&bt3, bt4);
  835. af_Code *bt5 = makeBlockCode(parentheses, bt3, '\'', 1, "Tage.aun", NULL);
  836. runCodeFromMemory(bt5, 0, env);
  837. freeAllCode(bt5);
  838. }
  839. { // 尾调用优化
  840. printf("\nTAG B: [Tail test]\n");
  841. af_Code *bt1 = makeElementCode("object", 0, 1, NULL);
  842. af_Code *bt2 = makeElementCode("func-normal", 0, 1, NULL);
  843. af_Code *bt3 = makeBlockCode(curly, bt2, 0, 1, NULL, NULL);
  844. pushCode(&bt1, bt3);
  845. af_Code *bt4 = makeBlockCode(parentheses, bt1, '\'', 1, "Tagb.aun", NULL);
  846. runCodeFromMemory(bt4, 0, env);
  847. freeAllCode(bt4);
  848. }
  849. { // 尾调用优化2
  850. printf("\nTAG C: [Tail test on literal]\n");
  851. af_Code *bt1 = makeElementCode("data", 0, 0, "Tagc.aun");
  852. af_Code *bt2 = makeBlockCode(parentheses, bt1, '\'', 1, "Tagc.aun", NULL);
  853. runCodeFromMemory(bt2, 0, env);
  854. freeAllCode(bt2);
  855. }
  856. { // 测试类前缀调用
  857. printf("\nTAG D: [parentheses-call]\n");
  858. af_Code *bt1 = makeElementCode("func-normal", 0, 1, "Tagd.aun");
  859. af_Code *bt2 = makeBlockCode(parentheses, NULL, 0, 1, NULL, NULL);
  860. pushCode(&bt1, bt2);
  861. runCodeFromMemory(bt1, 0, env);
  862. freeAllCode(bt1);
  863. }
  864. { // 测试顺序执行 $[xxx]
  865. printf("\nTAG F: [ex-first]\n");
  866. af_Code *bt3 = makeElementCode("data2", 0, 0, NULL);
  867. af_Code *bt4 = makeElementCode("global", 0, 1, NULL);
  868. pushCode(&bt3, bt4);
  869. af_Code *bt5 = makeBlockCode(brackets, bt3, '$', 1, "Tagf.aun", NULL);
  870. runCodeFromMemory(bt5, 0, env);
  871. freeAllCode(bt5);
  872. }
  873. { // 双层尾调用优化 (函数内调用函数)
  874. printf("\nTAG I: [Double tail test]\n");
  875. af_Code *bt1 = makeElementCode("func-tail", 0, 1, NULL);
  876. af_Code *bt2 = makeBlockCode(curly, bt1, 0, 1, "Tagi.aun", NULL);
  877. af_Code *bt3 = makeBlockCode(parentheses, bt2, '\'', 1, "Tagi.aun", NULL);
  878. runCodeFromMemory(bt3, 0, env);
  879. freeAllCode(bt3);
  880. }
  881. { // 对象函数的调用
  882. printf("\nTAG J: [object]\n");
  883. af_Code *bt1 = makeElementCode("func-obj", 0, 1, "Tagj.aun");
  884. runCodeFromMemory(bt1, 0, env);
  885. freeAllCode(bt1);
  886. }
  887. { // 变量引用调用
  888. printf("\nTAG K: [not object]\n");
  889. af_Code *bt1 = makeElementCode("func-obj", '\'', 1, "Tagk.aun");
  890. runCodeFromMemory(bt1, 0, env);
  891. freeAllCode(bt1);
  892. }
  893. { // 对象函数的调用 (尾调用优化)
  894. printf("\nTAG L: [pbject-tail]\n");
  895. af_Code *bt1 = makeElementCode("func-obj", 0, 1, "Tagl.aun");
  896. af_Code *bt2 = makeBlockCode(parentheses, bt1, '\'', 1, "Tagi.aun", NULL);
  897. runCodeFromMemory(bt2, 0, env);
  898. freeAllCode(bt2);
  899. }
  900. { // gc测试
  901. printf("\nTAG N: [gc-test]\n");
  902. af_Code *bt2 = makeElementCode("func-gc", 0, 1, NULL);
  903. af_Code *bt1 = makeBlockCode(curly, bt2, 0, 1, "Tagn.aun", NULL);
  904. af_Code *bt3 = makeElementCode("global", 0, 1, NULL);
  905. af_Code *bt4 = makeElementCode("global", 0, 1, NULL);
  906. pushCode(&bt1, bt3);
  907. pushCode(&bt3, bt4);
  908. runCodeFromMemory(bt1, 0, env);
  909. freeAllCode(bt1);
  910. }
  911. { // func_body_dynamic 测试
  912. printf("\nTAG O: [func body dynamic]\n");
  913. af_Code *bt2 = makeElementCode("func-body-dynamic", 0, 1, NULL);
  914. af_Code *bt1 = makeBlockCode(curly, bt2, 0, 1, "Tago.aun", NULL);
  915. runCodeFromMemory(bt1, 0, env);
  916. freeAllCode(bt1);
  917. }
  918. { // 中缀调用测试
  919. printf("\nTAG P: [infix-call]\n");
  920. af_Code *bt2 = makeElementCode("func-brackets", 0, 1, NULL);
  921. af_Code *bt1 = makeBlockCode(brackets, bt2, 0, 1, "Tagp.aun", NULL);
  922. runCodeFromMemory(bt1, 0, env);
  923. freeAllCode(bt1);
  924. }
  925. { // func_body_import 测试
  926. printf("\nTAG Q: [import]\n");
  927. af_Code *bt2 = makeElementCode("func-import", 0, 1, NULL);
  928. af_Code *bt1 = makeBlockCode(curly, bt2, 0, 1, "Tagq.aun", NULL);
  929. af_Code *bt3 = makeElementCode("global", 0, 1, NULL);
  930. pushCode(&bt1, bt3);
  931. runCodeFromMemory(bt1, 0, env);
  932. freeAllCode(bt1);
  933. }
  934. { // 导入式运行
  935. printf("\nTAG R: [import-Tagr]\n");
  936. af_Code *bt1 = makeElementCode("object", 0, 1, "Tagr.aun");
  937. af_Code *bt2 = makeElementCode("data", 0, 0, NULL);
  938. pushCode(&bt1, bt2);
  939. af_Code *bt3 = makeElementCode("func-normal", 0, 1, NULL);
  940. af_Code *bt5 = makeBlockCode(curly, bt3, 0, 1, NULL, NULL);
  941. pushCode(&bt2, bt5);
  942. af_Code *bt6 = makeElementCode("global", 0, 1, NULL);
  943. pushCode(&bt5, bt6);
  944. runCodeFromMemory(bt1, 1, env);
  945. freeAllCode(bt1);
  946. }
  947. {
  948. printf("\nTAG S: [string]\n");
  949. int exit_code = runCodeFromString("str\ndata\n{func-normal}\nglobal\n", "Tags-string.aun", 1, env);
  950. printf("exit code = %d\n", exit_code);
  951. }
  952. {
  953. DLC_SYMBOL(GuardianFunc) func = MAKE_SYMBOL(gd_func, GuardianFunc);
  954. DLC_SYMBOL(GuardianDestruct) des = MAKE_SYMBOL(gd_destruct, GuardianDestruct);
  955. struct GDData *data = NULL;
  956. addGuardian("test", false, true, sizeof(struct GDData), func, des, (void **) &data, env);
  957. data->func = af_func;
  958. gc_addObjectReference(af_func, env);
  959. FREE_SYMBOL(func);
  960. FREE_SYMBOL(des);
  961. printf("\nTAG U: [guardian]\n");
  962. af_Code *bt1 = makeElementCode("func-normal", 0, 1, "TagU.aun");
  963. af_Code *bt2 = makeElementCode("global", 0, 1, "TagU.aun");
  964. af_Code *bt3 = makeElementCode("global", 0, 1, "TagU.aun");
  965. pushCode(&bt1, bt2);
  966. pushCode(&bt2, bt3);
  967. runCodeFromMemory(bt1, 0, env);
  968. freeAllCode(bt1);
  969. bool re = popGuardian("test", env);
  970. printf("popGuardian: %d\n\n", re);
  971. }
  972. {
  973. printf("\nTAG V: [Thread]\n");
  974. af_Code *bt1 = makeElementCode("object", 0, 1, "Tagv.aun");
  975. startRunThread(env, NULL, bt1, false, true, true, true, true);
  976. runCodeFromMemory(bt1, 0, env);
  977. freeAllCode(bt1);
  978. }
  979. // 错误用例
  980. { // 中缀调用测试
  981. printf("\nTAG a: ERROR\n");
  982. af_Code *bt2 = makeElementCode("func-normal", 0, 1, NULL);
  983. af_Code *bt1 = makeBlockCode(brackets, bt2, 0, 1, "Taga-error.aun", NULL);
  984. runCodeFromMemory(bt1, 0, env);
  985. freeAllCode(bt1);
  986. }
  987. { // 测试错误 (无函数指定)
  988. printf("\nTAG b: ERROR\n");
  989. af_Code *bt1 = makeBlockCode(curly, NULL, 0, 1, "Tagb-error.aun", NULL);
  990. runCodeFromMemory(bt1, 0, env);
  991. freeAllCode(bt1);
  992. }
  993. { // 测试错误 (object2 Var not found)
  994. printf("\nTAG c: ERROR\n");
  995. af_Code *bt1 = makeElementCode("object2", 0, 1, "Tagc-error.aun");
  996. runCodeFromMemory(bt1, 0, env);
  997. freeAllCode(bt1);
  998. }
  999. { // 中缀保护测试
  1000. printf("\nTAG d: ERROR\n");
  1001. af_Code *bt1 = makeElementCode("global", 0, 1, "Tagd-error.aun");
  1002. af_Code *bt2 = makeElementCode("func-brackets", 0, 2, NULL);
  1003. pushCode(&bt1, bt2);
  1004. runCodeFromMemory(bt1, 0, env);
  1005. freeAllCode(bt1);
  1006. }
  1007. { // 错误回溯测试
  1008. printf("\nTAG e: ERROR\n");
  1009. af_Code *bt2 = makeElementCode("func-no-var", 0, 1, NULL);
  1010. af_Code *bt1 = makeBlockCode(curly, bt2, 0, 1, "Tage-error.aun", NULL);
  1011. af_Code *bt3 = makeElementCode("global", 0, 1, NULL);
  1012. pushCode(&bt1, bt3);
  1013. runCodeFromMemory(bt1, 0, env);
  1014. freeAllCode(bt1);
  1015. }
  1016. printf("\nfreeEnvironment:\n");
  1017. destructAFunEnvironment(env);
  1018. undefRunEnv(&ri);
  1019. printf("Exit at 0.\n");
  1020. #ifndef IN_CTEST
  1021. getc(stdin);
  1022. #endif
  1023. aFunDestruct();
  1024. aFunExit(0);
  1025. RETURN_1:
  1026. undefRunEnv(&ri);
  1027. printf("Exit at 1.\n");
  1028. #ifndef IN_CTEST
  1029. getc(stdin);
  1030. #endif
  1031. aFunDestruct();
  1032. aFunExit(1);
  1033. RETURN_2:
  1034. undefRunEnv(&ri);
  1035. printf("Exit at 2.\n");
  1036. #ifndef IN_CTEST
  1037. getc(stdin);
  1038. #endif
  1039. aFunDestruct();
  1040. aFunExit(2);
  1041. }