comparison runtime/func.h @ 57:2174878a6e4b

Avoid unnecessary nested switch
author Mike Pavone <pavone@retrodev.com>
date Thu, 08 Oct 2009 02:12:25 -0400
parents d2f9b0a9403d
children 4c22fe798779
comparison
equal deleted inserted replaced
56:d2f9b0a9403d 57:2174878a6e4b
17 17
18 18
19 #define Func(name,numparams) \ 19 #define Func(name,numparams) \
20 case FUNC_ ## name:\ 20 case FUNC_ ## name:\
21 f_ ## name:\ 21 f_ ## name:\
22 switch(resume)\ 22 for(idx = numparams; idx < cdata->num_params; ++idx)\
23 {\ 23 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\
24 case 0:\ 24 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));
25 for(idx = numparams; idx < cdata->num_params; ++idx)\
26 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\
27 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));
28 25
29 26
30 #define FuncNoLocals(name,numparams) \ 27 #define FuncNoLocals(name,numparams) \
31 case FUNC_ ## name:\ 28 case FUNC_ ## name:\
32 f_ ## name:\ 29 f_ ## name:\
33 switch(resume)\ 30 for(idx = numparams; idx < cdata->num_params; ++idx)\
34 {\ 31 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\
35 case 0:\
36 for(idx = numparams; idx < cdata->num_params; ++idx)\
37 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\
38 32
39 #define EndFunc(name) \ 33 #define EndFunc(name) \
40 free_stack(ct, lv_ ## name);\ 34 free_stack(ct, lv_ ## name);\
41 func = cdata->func;\ 35 func = cdata->func;\
42 resume = cdata->resume;\ 36 goto _dispatch;\
43 goto _dispatch;\
44 }
45 37
46 #define EndFuncNoLocals \ 38 #define EndFuncNoLocals \
47 func = cdata->func;\ 39 func = cdata->func;\
48 resume = cdata->resume;\ 40 resume = cdata->resume;\
49 goto _dispatch;\ 41 goto _dispatch;\
50 }
51 42
52 #define Method(name) \ 43 #define Method(name) \
53 case FUNC_ ## name:\ 44 case FUNC_ ## name:\
54 f_ ## name:\ 45 f_ ## name:\
55 if (cdata->num_params < 1)\ 46 if (cdata->num_params < 1)\
68 goto m_ ## name ## _AT_ ## type_name; 59 goto m_ ## name ## _AT_ ## type_name;
69 60
70 #define MethodImpl(name,type_name,mytype_id,numparams) \ 61 #define MethodImpl(name,type_name,mytype_id,numparams) \
71 case FUNC_ ## name ## _AT_ ## type_name:\ 62 case FUNC_ ## name ## _AT_ ## type_name:\
72 f_ ## name ## _AT_ ## type_name:\ 63 f_ ## name ## _AT_ ## type_name:\
73 switch(resume)\ 64 if (cdata->num_params < 1)\
65 goto _exception;\
66 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
74 {\ 67 {\
75 case 0:\ 68 puts("uh oh, need conversion and that's not implemented yet!");\
76 if (cdata->num_params < 1)\ 69 exit(1);\
77 goto _exception;\ 70 }\
78 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
79 {\
80 puts("uh oh, need conversion and that's not implemented yet!");\
81 exit(1);\
82 }\
83 m_ ## name ## _AT_ ## type_name:\ 71 m_ ## name ## _AT_ ## type_name:\
84 for(idx = numparams; idx < cdata->num_params; ++idx)\ 72 for(idx = numparams; idx < cdata->num_params; ++idx)\
85 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ 73 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\
86 lv_ ## name ## _AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## _AT_ ## type_name)); 74 lv_ ## name ## _AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## _AT_ ## type_name));
87 75
88 76
89 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \ 77 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \
90 case FUNC_ ## name ## _AT_ ## type_name:\ 78 case FUNC_ ## name ## _AT_ ## type_name:\
91 f_ ## name ## _AT_ ## type_name:\ 79 f_ ## name ## _AT_ ## type_name:\
92 switch(resume)\ 80 if (cdata->num_params < 1)\
81 goto _exception;\
82 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
93 {\ 83 {\
94 case 0:\ 84 puts("uh oh, need conversion and that's not implemented yet!");\
95 if (cdata->num_params < 1)\ 85 exit(1);\
96 goto _exception;\ 86 }\
97 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
98 {\
99 puts("uh oh, need conversion and that's not implemented yet!");\
100 exit(1);\
101 }\
102 m_ ## name ## _AT_ ## type_name:\ 87 m_ ## name ## _AT_ ## type_name:\
103 for(idx = numparams; idx < cdata->num_params; ++idx)\ 88 for(idx = numparams; idx < cdata->num_params; ++idx)\
104 release_ref(cdata->params[0-idx]); cdata->num_params = numparams; 89 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;
105 90
106 #define NumParams 91 #define NumParams
107 #define CallSpace 92 #define CallSpace
108 93
109 #define Param(num,convtypeid) \ 94 #define Param(num,convtypeid) \
123 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace); 108 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace);
124 109
125 #define SetParam(num,value) cdata->params[0-num] = value; 110 #define SetParam(num,value) cdata->params[0-num] = value;
126 111
127 #define Call(tocall, numparams, resumeto, myname)\ 112 #define Call(tocall, numparams, resumeto, myname)\
128 cdata->func = FUNC_ ## myname;\ 113 cdata->func = FUNC_ ## myname ## _ ## resumeto;\
129 cdata->resume = resumeto;\ 114 cdata->num_params = numparams;\
130 cdata->num_params = numparams;\ 115 goto f_ ## tocall;\
131 resume = 0;\ 116 case FUNC_ ## myname ## _ ## resumeto:\
132 goto f_ ## tocall;\ 117 lv_ ## myname = (lt_ ## myname *)(cdata->lastframe+1);
133 case resumeto:\
134 lv_ ## myname = (lt_ ## myname *)(cdata->lastframe+1);
135 118
136 #define FreeCall\ 119 #define FreeCall\
137 temp_cdata = cdata->lastframe;\ 120 temp_cdata = cdata->lastframe;\
138 free_stack(ct, cdata);\ 121 free_stack(ct, cdata);\
139 cdata = temp_cdata; 122 cdata = temp_cdata;
140 123
141 #define FreeCallMethod(myname,mytype)\ 124 #define FreeCallMethod(myname,mytype)\
142 temp_cdata = cdata->lastframe;\ 125 temp_cdata = cdata->lastframe;\
143 free_stack(ct, cdata);\ 126 free_stack(ct, cdata);\
144 cdata = temp_cdata;\ 127 cdata = temp_cdata;\
145 lv_ ## myname ## _AT_ ## type_name = (lt_ ## myname ## _AT_ ## type_name *)(cdata+1); 128 lv_ ## myname ## _AT_ ## type_name = (lt_ ## myname ## _AT_ ## type_name *)(cdata+1);
146 129
147 #define TCall(func, numparams)\ 130 #define TCall(func, numparams)\
148 free_stack(cdata->ct, call);\ 131 free_stack(cdata->ct, call);\
149 cdata->num_params = numparams;\ 132 cdata->num_params = numparams;\
150 cdata->resume = 0;\ 133 cdata->resume = 0;\