comparison runtime/func.h @ 66:d4b44ae2e34a

New variant of C backend works now
author Mike Pavone <pavone@retrodev.com>
date Sun, 06 Jun 2010 20:29:10 -0400
parents 1db811fa4744
children c40c3d399133
comparison
equal deleted inserted replaced
65:1db811fa4744 66:d4b44ae2e34a
20 20
21 21
22 #define Func(name,numparams) \ 22 #define Func(name,numparams) \
23 f_ ## name:\ 23 f_ ## name:\
24 for(idx = numparams; idx < cdata->num_params; ++idx)\ 24 for(idx = numparams; idx < cdata->num_params; ++idx)\
25 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ 25 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
26 sf_ ## name:\ 26 sf_ ## name:\
27 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name)); 27 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
28 my_cdata = cdata;
28 29
29 30
30 #define FuncNoLocals(name,numparams) \ 31 #define FuncNoLocals(name,numparams) \
31 f_ ## name:\ 32 f_ ## name:\
32 for(idx = numparams; idx < cdata->num_params; ++idx)\ 33 for(idx = numparams; idx < cdata->num_params; ++idx)\
33 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ 34 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
34 sf_ ## name: 35 sf_ ## name:\
36 my_cdata = cdata;
35 37
36 #define EndFunc(name) \ 38 #define EndFunc(name) \
37 free_stack(ct, lv_ ## name);\ 39 free_stack(ct, lv_ ## name);\
38 func = cdata->func; 40 func = cdata->func;
39 41
44 f_ ## name:\ 46 f_ ## name:\
45 sf_ ## name:\ 47 sf_ ## name:\
46 switch(get_blueprint(cdata->params[0])->type_id)\ 48 switch(get_blueprint(cdata->params[0])->type_id)\
47 { 49 {
48 50
49 #define EndMethod \ 51 #define EndMethod(name) \
50 default:\ 52 default:\
53 printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\
54 cdata = alloc_cdata(ct, cdata, 0);\
55 cdata->func = FUNC_ ## name;\
51 goto _exception;\ 56 goto _exception;\
52 } 57 }
53 58
54 59
55 #define MethodDispatch(type_id,name,type_name) \ 60 #define MethodDispatch(type_id,name,type_name) \
58 63
59 #define MethodImpl(name,type_name,mytype_id,numparams) \ 64 #define MethodImpl(name,type_name,mytype_id,numparams) \
60 f_ ## name ## AT_ ## type_name:\ 65 f_ ## name ## AT_ ## type_name:\
61 sf_ ## name ## AT_ ## type_name:\ 66 sf_ ## name ## AT_ ## type_name:\
62 if (cdata->num_params < 1)\ 67 if (cdata->num_params < 1)\
68 {\
69 cdata = alloc_cdata(ct, cdata, 0);\
70 cdata->func = FUNC_ ## name ## AT_ ## type_name;\
71 goto _exception;\
72 }\
73 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
74 {\
75 puts("uh oh, need conversion and that's not implemented yet!");\
76 exit(1);\
77 }\
78 m_ ## name ## AT_ ## type_name:\
79 for(idx = numparams; idx < cdata->num_params; ++idx)\
80 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
81 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\
82 my_cdata = cdata;
83
84
85 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \
86 f_ ## name ## AT_ ## type_name:\
87 sf_ ## name ## AT_ ## type_name:\
88 if (cdata->num_params < 1)\
89 cdata = alloc_cdata(ct, cdata, 0);\
90 cdata->func = FUNC_ ## name ## AT_ ## type_name;\
63 goto _exception;\ 91 goto _exception;\
64 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ 92 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
65 {\ 93 {\
66 puts("uh oh, need conversion and that's not implemented yet!");\ 94 puts("uh oh, need conversion and that's not implemented yet!");\
67 exit(1);\ 95 exit(1);\
68 }\ 96 }\
69 m_ ## name ## AT_ ## type_name:\ 97 m_ ## name ## AT_ ## type_name:\
70 for(idx = numparams; idx < cdata->num_params; ++idx)\ 98 for(idx = numparams; idx < cdata->num_params; ++idx)\
71 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ 99 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
72 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name)); 100 my_cdata = cdata;
73
74
75 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \
76 f_ ## name ## AT_ ## type_name:\
77 sf_ ## name ## AT_ ## type_name:\
78 if (cdata->num_params < 1)\
79 goto _exception;\
80 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
81 {\
82 puts("uh oh, need conversion and that's not implemented yet!");\
83 exit(1);\
84 }\
85 m_ ## name ## AT_ ## type_name:\
86 for(idx = numparams; idx < cdata->num_params; ++idx)\
87 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;
88 101
89 #define NumParams 102 #define NumParams
90 #define CallSpace 103 #define CallSpace
91 104
92 #define Param(num,convtypeid) \ 105 #define Param(num,convtypeid) \
93 if(get_blueprint(cdata->params[0-num])->type_id != convtypeid)\ 106 if(get_blueprint(cdata->params[num])->type_id != convtypeid)\
94 {\ 107 {\
95 puts("uh oh, need conversion and that's not implemented yet!");\ 108 puts("uh oh, need conversion and that's not implemented yet!");\
96 exit(1);\ 109 exit(1);\
97 } 110 }
98 111
99 #define CopiedParam(num,convtypeid) Param(num,convtypeid) cdata->params[num] = copy_object(cdata->params[num]); 112 #define CopiedParam(num,convtypeid) Param(num,convtypeid) cdata->params[num] = copy_object(cdata->params[num]);
100 #define Ret(num,val) cdata->params[0-num] = (object *)(val); 113 #define Ret(num,val) cdata->params[num] = (object *)(val);
114 #define NumRet(num) cdata->num_params = num;
101 #define Exception 115 #define Exception
102 #define FuncDef(name) lt_ ## name * lv_ ## name; 116 #define FuncDef(name) lt_ ## name * lv_ ## name;
103 #define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name; 117 #define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name;
104 118
105 119
106 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace); 120 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace);
107 121
108 #define SetParam(num,value) cdata->params[0-num] = value; 122 #define SetParam(num,value) cdata->params[num] = value;
109 123
110 #define Call(tocall, numparams, resumeto, myname)\ 124 #define Call(tocall, numparams, resumeto, myname)\
111 cdata->func = FUNC_ ## myname ## _ ## resumeto;\ 125 cdata->func = RES_ ## resumeto ## _ ## myname;\
112 cdata->num_params = numparams;\ 126 cdata->num_params = numparams;\
113 goto sf_ ## tocall;\ 127 goto sf_ ## tocall;\
114 r ## resumeto ## _ ## myname:\ 128 r ## resumeto ## _ ## myname:\
115 lv_ ## myname = (lt_ ## myname *)(cdata->lastframe+1); 129 my_cdata = cdata->lastframe;\
130 lv_ ## myname = (lt_ ## myname *)(my_cdata->params+my_cdata->callspace);
131
116 132
117 #define FreeCall\ 133 #define FreeCall\
118 temp_cdata = cdata->lastframe;\ 134 temp_cdata = cdata->lastframe;\
119 free_stack(ct, cdata);\ 135 free_stack(ct, cdata);\
120 cdata = temp_cdata; 136 cdata = temp_cdata;