comparison runtime/func.h @ 12:31f8182f3433

Finished fib test and did some small work on the c backend
author Mike Pavone <pavone@retrodev.com>
date Mon, 25 May 2009 23:34:36 -0400
parents 3021dac0d8f5
children 3498713c3dc9
comparison
equal deleted inserted replaced
11:3021dac0d8f5 12:31f8182f3433
11 11
12 12
13 typedef returntype (*rhope_func)(struct calldata *); 13 typedef returntype (*rhope_func)(struct calldata *);
14 typedef void (*special_func) (struct object *); 14 typedef void (*special_func) (struct object *);
15 15
16 #define MethodName(name,type) _f_ ## name ## _AT_ ## type 16 #define MethodName(name,type) f_ ## name ## _AT_ ## type
17 17
18 #define Func(name,numparams,callspace,localtype) \ 18 #define Func(name,numparams,callspace,localtype) \
19 returntype _f_ ## name (calldata * cdata)\ 19 returntype f_ ## name (calldata * cdata)\
20 {\ 20 {\
21 localtype *locals;\ 21 localtype *locals;\
22 calldata *call;\ 22 calldata *call;\
23 returntype ret;\ 23 returntype ret;\
24 int idx;\ 24 int idx;\
25 if(cdata->resume)\ 25 if(cdata->resume)\
26 {\ 26 {\
27 call = cdata->call;\
27 locals = cdata->locals;\ 28 locals = cdata->locals;\
28 call = (calldata *)(((char *)cdata->locals) + sizeof(localtype));\
29 }\ 29 }\
30 switch(cdata->resume)\ 30 switch(cdata->resume)\
31 {\ 31 {\
32 case 0:\ 32 case 0:\
33 for(idx = numparams; idx < cdata->num_params; ++idx)\ 33 for(idx = numparams; idx < cdata->num_params; ++idx)\
34 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ 34 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
35 cdata->num_params = numparams;\ 35 cdata->num_params = numparams;\
36 cdata->locals = call = alloc_cdata(cdata->ct, callspace); 36 cdata->call = call = alloc_cdata(cdata->ct, callspace);\
37 cdata->locals = locals = alloc_stack(cdata->ct, sizeof(localtype));
37 38
38 #define FuncNoLocals(name,numparams,callspace) \ 39 #define FuncNoLocals(name,numparams,callspace) \
39 returntype _f_ ## name (calldata * cdata)\ 40 returntype f_ ## name (calldata * cdata)\
40 {\ 41 {\
41 calldata *call;\ 42 calldata *call;\
42 returntype ret;\ 43 returntype ret;\
43 int idx;\ 44 int idx;\
44 if(cdata->resume)\ 45 if(cdata->resume)\
50 release_ref(cdata->params[idx]);\ 51 release_ref(cdata->params[idx]);\
51 cdata->num_params = numparams;\ 52 cdata->num_params = numparams;\
52 cdata->locals = call = alloc_cdata(cdata->ct, callspace); 53 cdata->locals = call = alloc_cdata(cdata->ct, callspace);
53 54
54 #define EndFunc \ 55 #define EndFunc \
56 free_stack(cdata->ct, call);\
55 return NORMAL_RETURN;\ 57 return NORMAL_RETURN;\
56 }\ 58 }\
57 } 59 }
58 60
59 #define Method(name,type,numparams,callspace,localtype) \ 61 #define Method(name,type,numparams,callspace,localtype) \
63 calldata *call;\ 65 calldata *call;\
64 returntype ret;\ 66 returntype ret;\
65 int idx;\ 67 int idx;\
66 if(cdata->resume)\ 68 if(cdata->resume)\
67 {\ 69 {\
70 call = cdata->call;\
68 locals = cdata->locals;\ 71 locals = cdata->locals;\
69 call = (calldata *)(((char *)cdata->locals) + sizeof(localtype));\
70 }\ 72 }\
71 switch(cdata->resume)\ 73 switch(cdata->resume)\
72 {\ 74 {\
73 case 0:\ 75 case 0:\
74 for(idx = numparams; idx < cdata->num_params; ++idx)\ 76 for(idx = numparams; idx < cdata->num_params; ++idx)\
75 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ 77 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
76 cdata->num_params = numparams;\ 78 cdata->num_params = numparams;\
77 cdata->locals = call = alloc_cdata(cdata->ct, callspace); 79 cdata->call = call = alloc_cdata(cdata->ct, callspace);\
80 cdata->locals = locals = alloc_stack(cdata->ct, sizeof(localtype));
78 81
79 #define MethodNoLocals(name,type,numparams,callspace) \ 82 #define MethodNoLocals(name,type,numparams,callspace) \
80 returntype MethodName(name,type) (calldata * cdata)\ 83 returntype MethodName(name,type) (calldata * cdata)\
81 {\ 84 {\
82 calldata *call;\ 85 calldata *call;\
93 cdata->locals = call = alloc_cdata(cdata->ct, callspace); 96 cdata->locals = call = alloc_cdata(cdata->ct, callspace);
94 97
95 #define NumParams 98 #define NumParams
96 #define CallSpace 99 #define CallSpace
97 100
98 #define ParamBase(num,var,type,convtypeid) \ 101 #define Param(num,convtypeid) \
99 call->params[0] = cdata->params[num];\ 102 call->params[0] = cdata->params[num];\
100 call->resume = 0;\ 103 call->resume = 0;\
101 ret = coerce_value(convtypeid, call);\ 104 ret = coerce_value(convtypeid, call);\
102 while(ret == TAIL_RETURN)\ 105 while(ret == TAIL_RETURN)\
103 ret = call->tail_func(call);\ 106 ret = call->tail_func(call);\
104 if(ret == EXCEPTION_RETURN)\ 107 if(ret == EXCEPTION_RETURN)\
105 {\ 108 {\
106 for(idx = 0; idx < cdata->num_params; ++idx)\ 109 for(idx = 0; idx < cdata->num_params; ++idx)\
107 if(idx != num)\ 110 if(idx != num && cdata->params[idx])\
108 release_ref(cdata->params[idx]);\ 111 release_ref(cdata->params[idx]);\
109 cdata->params[0] = call->params[0];\ 112 cdata->params[0] = call->params[0];\
113 free_stack(cdata->ct, call);\
110 return ret;\ 114 return ret;\
111 }\ 115 }\
112 cdata->params[num] = call->params[0]; 116 cdata->params[num] = call->params[0];
113 117
114 #define Param(num,var,type,convtypeid) ParamBase(num,var,type,convtypeid) var = (_t_##type *)(cdata->params[num]); 118 #define CopiedParam(num,convtypeid) Param(num,convtypeid) cdata->params[num] = copy_object(cdata->params[num]);
115 #define CopiedParam(num,var,type,convtypeid) ParamBase(num,var,type,convtypeid) cdata->params[num] = copy_object(cdata->params[num]); var = (_t_##type *)(cdata->params[num]);
116 #define Ret(num,val) cdata->params[num] = (object *)(val); 119 #define Ret(num,val) cdata->params[num] = (object *)(val);
117 #define Return return NORMAL_RETURN; 120 #define Return return NORMAL_RETURN;
118 #define Exception 121 #define Exception
119 #define FuncDef(name) returntype _f_ ## name (calldata * cdata); 122 #define FuncDef(name) returntype f_ ## name (calldata * cdata);
120 #define MethodDef(name,type) returntype MethodName(name,type) (calldata * cdata); 123 #define MethodDef(name,type) returntype MethodName(name,type) (calldata * cdata);
121 124
122 #define Call(func, numparams)\ 125 #define Call(func, numparams)\
123 call->num_params = numparams;\ 126 call->num_params = numparams;\
124 call->resume = 0;\ 127 call->resume = 0;\
125 ret = _f_ ## func (call);\ 128 ret = f_ ## func (call);\
126 while(ret == TAIL_RETURN)\ 129 while(ret == TAIL_RETURN)\
127 ret = call->tail_func(call);\ 130 ret = call->tail_func(call);\
128 if(ret == EXCEPTION_RETURN)\ 131 if(ret == EXCEPTION_RETURN)\
129 {\ 132 {\
130 for(idx = 0; idx < cdata->num_params; ++idx)\ 133 for(idx = 0; idx < cdata->num_params; ++idx)\
131 release_ref(cdata->params[idx]);\ 134 if(cdata->params[idx])\
135 release_ref(cdata->params[idx]);\
132 cdata->params[0] = call->params[0];\ 136 cdata->params[0] = call->params[0];\
137 free_stack(cdata->ct, call);\
133 return ret;\ 138 return ret;\
134 } 139 }
135 140
136 #define MCall(methodid, numparams)\ 141 #define MCall(methodid, numparams)\
137 call->num_params = numparams;\ 142 call->num_params = numparams;\
140 while(ret == TAIL_RETURN)\ 145 while(ret == TAIL_RETURN)\
141 ret = call->tail_func(call);\ 146 ret = call->tail_func(call);\
142 if(ret == EXCEPTION_RETURN)\ 147 if(ret == EXCEPTION_RETURN)\
143 {\ 148 {\
144 for(idx = 0; idx < cdata->num_params; ++idx)\ 149 for(idx = 0; idx < cdata->num_params; ++idx)\
145 release_ref(cdata->params[idx]);\ 150 if(cdata->params[idx])\
151 release_ref(cdata->params[idx]);\
146 cdata->params[0] = call->params[0];\ 152 cdata->params[0] = call->params[0];\
153 free_stack(cdata->ct, call);\
147 return ret;\ 154 return ret;\
148 } 155 }
149 156
157 #define TMCall(methodid, numparams)\
158 free_stack(cdata->ct, call);\
159 cdata->num_params = numparams;\
160 cdata->resume = 0;\
161 ret = call_method(methodid, cdata);\
162 return ret;
163
164 #define TCall(func, numparams)\
165 free_stack(cdata->ct, call);\
166 cdata->num_params = numparams;\
167 cdata->resume = 0;\
168 cdata->tail_func = f_ ## func;\
169 return TAIL_RETURN;
170
171
150 #endif //_FUNC_H_ 172 #endif //_FUNC_H_