run_code.c 49 KB

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