main.c 42 KB

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