Mercurial > repos > rhope
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;\ |