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