Mercurial > repos > rhope
comparison runtime/func.h @ 110:336da6ce8174
Merge
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 06 Oct 2010 23:48:32 +0000 |
parents | 43cc42df26cc |
children | e5627038b7e7 60906f8803ef |
comparison
equal
deleted
inserted
replaced
109:b7df624895b2 | 110:336da6ce8174 |
---|---|
31 #endif | 31 #endif |
32 | 32 |
33 | 33 |
34 #define MethodName(name,type) f_ ## name ## AT_ ## type | 34 #define MethodName(name,type) f_ ## name ## AT_ ## type |
35 | 35 |
36 | 36 #ifdef ENABLE_PROFILING |
37 #define Func(name,numparams) \ | 37 |
38 f_ ## name:\ | 38 #define START_PROFILE \ |
39 for(idx = numparams; idx < cdata->num_params; ++idx)\ | 39 gettimeofday(&time, NULL);\ |
40 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ | 40 cdata->accum = cdata->self_accum = 0;\ |
41 sf_ ## name:\ | 41 cdata->self_start = cdata->start = ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec); |
42 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\ | 42 |
43 my_cdata = cdata; | 43 #define PAUSE_SELF \ |
44 | 44 gettimeofday(&time, NULL);\ |
45 | 45 my_cdata->self_accum += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - my_cdata->self_start; |
46 #define FuncNoLocals(name,numparams) \ | 46 |
47 f_ ## name:\ | 47 #define AND_TOTAL \ |
48 for(idx = numparams; idx < cdata->num_params; ++idx)\ | 48 my_cdata->accum += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - my_cdata->start; |
49 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ | 49 |
50 sf_ ## name:\ | 50 #define RESUME_SELF \ |
51 my_cdata = cdata; | 51 gettimeofday(&time, NULL);\ |
52 my_cdata->self_start = ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec); | |
53 | |
54 #define AND_RESUME_TOTAL my_cdata->start = my_cdata->self_start; | |
55 | |
56 #define EndFunc(name) \ | |
57 free_stack(ct, lv_ ## name);\ | |
58 func = cdata->func;\ | |
59 gettimeofday(&time, NULL);\ | |
60 profile_counts[FUNC_ ## name]++;\ | |
61 profile_totals[FUNC_ ## name] += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->start + cdata->accum;\ | |
62 profile_selftotals[FUNC_ ## name] += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->self_start + cdata->self_accum; | |
63 | |
64 #else | |
65 | |
66 #define START_PROFILE | |
67 #define PAUSE_SELF | |
68 #define RESUME_SELF | |
69 #define AND_TOTAL | |
70 #define AND_RESUME_TOTAL | |
52 | 71 |
53 #define EndFunc(name) \ | 72 #define EndFunc(name) \ |
54 free_stack(ct, lv_ ## name);\ | 73 free_stack(ct, lv_ ## name);\ |
55 func = cdata->func; | 74 func = cdata->func; |
56 | 75 |
76 | |
77 #endif | |
78 | |
57 #define EndFuncNoLocals \ | 79 #define EndFuncNoLocals \ |
58 func = cdata->func; | 80 func = cdata->func; |
59 | 81 |
60 #define Method(name) \ | 82 #define Func(name,numparams) \ |
61 f_ ## name:\ | 83 f_ ## name:\ |
84 for(idx = numparams; idx < cdata->num_params; ++idx)\ | |
85 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ | |
62 sf_ ## name:\ | 86 sf_ ## name:\ |
63 switch(get_blueprint(cdata->params[0])->type_id)\ | 87 START_PROFILE\ |
64 { | 88 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\ |
65 | 89 my_cdata = cdata; |
66 #define EndMethod(name) \ | 90 |
67 default:\ | 91 |
68 printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\ | 92 #define FuncNoLocals(name,numparams) \ |
69 cdata = alloc_cdata(ct, cdata, 0);\ | 93 f_ ## name:\ |
70 cdata->func = FUNC_ ## name;\ | 94 for(idx = numparams; idx < cdata->num_params; ++idx)\ |
71 goto _exception;\ | 95 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ |
72 } | 96 sf_ ## name:\ |
73 | 97 my_cdata = cdata; |
74 | 98 |
75 #define MethodDispatch(type_id,name,type_name) \ | |
76 case type_id:\ | |
77 goto m_ ## name ## AT_ ## type_name; | |
78 | |
79 #define MethodImpl(name,type_name,mytype_id,numparams) \ | 99 #define MethodImpl(name,type_name,mytype_id,numparams) \ |
80 f_ ## name ## AT_ ## type_name:\ | 100 f_ ## name ## AT_ ## type_name:\ |
81 sf_ ## name ## AT_ ## type_name:\ | 101 sf_ ## name ## AT_ ## type_name:\ |
82 if (cdata->num_params < 1)\ | 102 if (cdata->num_params < 1)\ |
83 {\ | 103 {\ |
89 {\ | 109 {\ |
90 puts("uh oh, need conversion and that's not implemented yet!");\ | 110 puts("uh oh, need conversion and that's not implemented yet!");\ |
91 exit(1);\ | 111 exit(1);\ |
92 }\ | 112 }\ |
93 m_ ## name ## AT_ ## type_name:\ | 113 m_ ## name ## AT_ ## type_name:\ |
114 START_PROFILE\ | |
94 for(idx = numparams; idx < cdata->num_params; ++idx)\ | 115 for(idx = numparams; idx < cdata->num_params; ++idx)\ |
95 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ | 116 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ |
96 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\ | 117 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\ |
97 my_cdata = cdata; | 118 my_cdata = cdata; |
98 | 119 |
111 }\ | 132 }\ |
112 m_ ## name ## AT_ ## type_name:\ | 133 m_ ## name ## AT_ ## type_name:\ |
113 for(idx = numparams; idx < cdata->num_params; ++idx)\ | 134 for(idx = numparams; idx < cdata->num_params; ++idx)\ |
114 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ | 135 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ |
115 my_cdata = cdata; | 136 my_cdata = cdata; |
137 | |
138 | |
139 #define Method(name) \ | |
140 f_ ## name:\ | |
141 sf_ ## name:\ | |
142 switch(get_blueprint(cdata->params[0])->type_id)\ | |
143 { | |
144 | |
145 #define EndMethod(name) \ | |
146 default:\ | |
147 printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\ | |
148 cdata = alloc_cdata(ct, cdata, 0);\ | |
149 cdata->func = FUNC_ ## name;\ | |
150 goto _exception;\ | |
151 } | |
152 | |
153 | |
154 #define MethodDispatch(type_id,name,type_name) \ | |
155 case type_id:\ | |
156 goto m_ ## name ## AT_ ## type_name; | |
116 | 157 |
117 #define NumParams | 158 #define NumParams |
118 #define CallSpace | 159 #define CallSpace |
119 | 160 |
120 #define Param(num,convtypeid) \ | 161 #define Param(num,convtypeid) \ |
173 ++last_vcparam;\ | 214 ++last_vcparam;\ |
174 }\ | 215 }\ |
175 cdata->func = RES_ ## resumeto ## _ ## myname;\ | 216 cdata->func = RES_ ## resumeto ## _ ## myname;\ |
176 cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\ | 217 cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\ |
177 cdata->vars = lv_ ## myname;\ | 218 cdata->vars = lv_ ## myname;\ |
178 func = ((t_Worker *)tocall)->payload.Index; | 219 func = ((t_Worker *)tocall)->payload.Index;\ |
220 PAUSE_SELF | |
179 | 221 |
180 #define ValCallPostlude(resumeto,myname)\ | 222 #define ValCallPostlude(resumeto,myname)\ |
181 r ## resumeto ## _ ## myname:\ | 223 r ## resumeto ## _ ## myname:\ |
182 my_cdata = cdata->lastframe;\ | 224 my_cdata = cdata->lastframe;\ |
225 RESUME_SELF\ | |
183 lv_ ## myname = cdata->vars; | 226 lv_ ## myname = cdata->vars; |
184 | 227 |
185 | 228 |
186 #define Call(tocall, numparams, resumeto, myname)\ | 229 #define Call(tocall, numparams, resumeto, myname)\ |
187 cdata->func = RES_ ## resumeto ## _ ## myname;\ | 230 cdata->func = RES_ ## resumeto ## _ ## myname;\ |
188 cdata->num_params = numparams;\ | 231 cdata->num_params = numparams;\ |
189 cdata->vars = lv_ ## myname;\ | 232 cdata->vars = lv_ ## myname;\ |
233 if(FUNC_ ## tocall == FUNC_ ## myname) {\ | |
234 PAUSE_SELF\ | |
235 AND_TOTAL\ | |
236 } else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\ | |
237 PAUSE_SELF\ | |
238 }\ | |
190 goto sf_ ## tocall;\ | 239 goto sf_ ## tocall;\ |
191 r ## resumeto ## _ ## myname:\ | 240 r ## resumeto ## _ ## myname:\ |
192 my_cdata = cdata->lastframe;\ | 241 my_cdata = cdata->lastframe;\ |
242 if(FUNC_ ## tocall == FUNC_ ## myname) {\ | |
243 RESUME_SELF\ | |
244 AND_RESUME_TOTAL\ | |
245 } else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\ | |
246 RESUME_SELF\ | |
247 }\ | |
193 lv_ ## myname = cdata->vars; | 248 lv_ ## myname = cdata->vars; |
194 | 249 |
195 | 250 |
196 #define FreeCall\ | 251 #define FreeCall\ |
197 temp_cdata = cdata->lastframe;\ | 252 temp_cdata = cdata->lastframe;\ |