comparison runtime/func.h @ 11:3021dac0d8f5

Stack unwind is so close I can almost taste it
author Mike Pavone <pavone@retrodev.com>
date Tue, 19 May 2009 23:29:55 -0400
parents 52d9948def24
children 31f8182f3433
comparison
equal deleted inserted replaced
10:0f2c4ee070fe 11:3021dac0d8f5
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,locals) returntype _f_ ## name (calldata * cdata) { locals; calldata *call; returntype ret; int idx; for(idx = numparams; idx < cdata->num_params; ++idx) release_ref(cdata->params[idx]); cdata->num_params = numparams; 18 #define Func(name,numparams,callspace,localtype) \
19 #define FuncNoLocals(name,numparams) returntype _f_ ## name (calldata * cdata) {calldata *call; returntype ret; int idx; for(idx = numparams; idx < cdata->num_params; ++idx) release_ref(cdata->params[idx]); cdata->num_params = numparams; 19 returntype _f_ ## name (calldata * cdata)\
20 #define EndFunc return NORMAL_RETURN; } 20 {\
21 #define Method(name,type,numparams,locals) returntype MethodName(name,type) (calldata * cdata) { locals; calldata *call; returntype ret; int idx; for(idx = numparams; idx < cdata->num_params; ++idx) release_ref(cdata->params[idx]); cdata->num_params = numparams; 21 localtype *locals;\
22 #define MethodNoLocals(name,type,numparams) returntype MethodName(name,type) (calldata * cdata) { calldata *call; returntype ret; int idx; for(idx = numparams; idx < cdata->num_params; ++idx) release_ref(cdata->params[idx]); cdata->num_params = numparams; 22 calldata *call;\
23 returntype ret;\
24 int idx;\
25 if(cdata->resume)\
26 {\
27 locals = cdata->locals;\
28 call = (calldata *)(((char *)cdata->locals) + sizeof(localtype));\
29 }\
30 switch(cdata->resume)\
31 {\
32 case 0:\
33 for(idx = numparams; idx < cdata->num_params; ++idx)\
34 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
35 cdata->num_params = numparams;\
36 cdata->locals = call = alloc_cdata(cdata->ct, callspace);
37
38 #define FuncNoLocals(name,numparams,callspace) \
39 returntype _f_ ## name (calldata * cdata)\
40 {\
41 calldata *call;\
42 returntype ret;\
43 int idx;\
44 if(cdata->resume)\
45 call = cdata->locals;\
46 switch(cdata->resume)\
47 {\
48 case 0:\
49 for(idx = numparams; idx < cdata->num_params; ++idx)\
50 release_ref(cdata->params[idx]);\
51 cdata->num_params = numparams;\
52 cdata->locals = call = alloc_cdata(cdata->ct, callspace);
53
54 #define EndFunc \
55 return NORMAL_RETURN;\
56 }\
57 }
58
59 #define Method(name,type,numparams,callspace,localtype) \
60 returntype MethodName(name,type) (calldata * cdata)\
61 {\
62 localtype *locals;\
63 calldata *call;\
64 returntype ret;\
65 int idx;\
66 if(cdata->resume)\
67 {\
68 locals = cdata->locals;\
69 call = (calldata *)(((char *)cdata->locals) + sizeof(localtype));\
70 }\
71 switch(cdata->resume)\
72 {\
73 case 0:\
74 for(idx = numparams; idx < cdata->num_params; ++idx)\
75 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
76 cdata->num_params = numparams;\
77 cdata->locals = call = alloc_cdata(cdata->ct, callspace);
78
79 #define MethodNoLocals(name,type,numparams,callspace) \
80 returntype MethodName(name,type) (calldata * cdata)\
81 {\
82 calldata *call;\
83 returntype ret;\
84 int idx;\
85 if(cdata->resume)\
86 call = cdata->locals;\
87 switch(cdata->resume)\
88 {\
89 case 0:\
90 for(idx = numparams; idx < cdata->num_params; ++idx)\
91 release_ref(cdata->params[idx]);\
92 cdata->num_params = numparams;\
93 cdata->locals = call = alloc_cdata(cdata->ct, callspace);
94
95 #define NumParams
96 #define CallSpace
97
23 #define ParamBase(num,var,type,convtypeid) \ 98 #define ParamBase(num,var,type,convtypeid) \
24 call->params[0] = cdata->params[num];\ 99 call->params[0] = cdata->params[num];\
25 ret = coerce_value(convtypeid, call);\ 100 call->resume = 0;\
26 while(ret == TAIL_RETURN)\ 101 ret = coerce_value(convtypeid, call);\
27 ret = call->tail_func(call);\ 102 while(ret == TAIL_RETURN)\
28 if(ret == EXCEPTION_RETURN)\ 103 ret = call->tail_func(call);\
29 {\ 104 if(ret == EXCEPTION_RETURN)\
30 for(idx = 0; idx < cdata->num_params; ++idx)\ 105 {\
31 if(idx != num)\ 106 for(idx = 0; idx < cdata->num_params; ++idx)\
32 release_ref(cdata->params[idx]);\ 107 if(idx != num)\
33 cdata->params[0] = call->params[0];\ 108 release_ref(cdata->params[idx]);\
34 return ret;\ 109 cdata->params[0] = call->params[0];\
35 }\ 110 return ret;\
36 cdata->params[num] = call->params[0]; 111 }\
112 cdata->params[num] = call->params[0];
37 113
38 #define Param(num,var,type,convtypeid) ParamBase(num,var,type,convtypeid) var = (_t_##type *)(cdata->params[num]); 114 #define Param(num,var,type,convtypeid) ParamBase(num,var,type,convtypeid) var = (_t_##type *)(cdata->params[num]);
39 #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]); 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]);
40 #define Ret(num,val) cdata->params[num] = (object *)(val); 116 #define Ret(num,val) cdata->params[num] = (object *)(val);
41 #define Return return NORMAL_RETURN; 117 #define Return return NORMAL_RETURN;
42 #define Exception 118 #define Exception
43 #define FuncDef(name) returntype _f_ ## name (calldata * cdata); 119 #define FuncDef(name) returntype _f_ ## name (calldata * cdata);
44 #define MethodDef(name,type) returntype MethodName(name,type) (calldata * cdata); 120 #define MethodDef(name,type) returntype MethodName(name,type) (calldata * cdata);
45 121
122 #define Call(func, numparams)\
123 call->num_params = numparams;\
124 call->resume = 0;\
125 ret = _f_ ## func (call);\
126 while(ret == TAIL_RETURN)\
127 ret = call->tail_func(call);\
128 if(ret == EXCEPTION_RETURN)\
129 {\
130 for(idx = 0; idx < cdata->num_params; ++idx)\
131 release_ref(cdata->params[idx]);\
132 cdata->params[0] = call->params[0];\
133 return ret;\
134 }
135
136 #define MCall(methodid, numparams)\
137 call->num_params = numparams;\
138 call->resume = 0;\
139 ret = call_method(methodid, call);\
140 while(ret == TAIL_RETURN)\
141 ret = call->tail_func(call);\
142 if(ret == EXCEPTION_RETURN)\
143 {\
144 for(idx = 0; idx < cdata->num_params; ++idx)\
145 release_ref(cdata->params[idx]);\
146 cdata->params[0] = call->params[0];\
147 return ret;\
148 }
46 149
47 #endif //_FUNC_H_ 150 #endif //_FUNC_H_