Mercurial > repos > rhope
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_ |