annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #ifndef _FUNC_H_
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #define _FUNC_H_
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
4 typedef enum {
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
5 NORMAL_RETURN=0,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
6 EXCEPTION_RETURN,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
7 TAIL_RETURN,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
8 NO_CONVERSION,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
9 STACK_UNWIND
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
10 } returntype;
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
11
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
12
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
13 typedef returntype (*rhope_func)(struct calldata *);
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
14 typedef void (*special_func) (struct object *);
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
15
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
16 #define MethodName(name,type) f_ ## name ## _AT_ ## type
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
17
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
18
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
19 #define Func(name,numparams) \
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
20 case FUNC_ ## name:\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
21 f_ ## name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
22 for(idx = numparams; idx < cdata->num_params; ++idx)\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
23 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
24 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
25
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
26
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
27 #define FuncNoLocals(name,numparams) \
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
28 case FUNC_ ## name:\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
29 f_ ## name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
30 for(idx = numparams; idx < cdata->num_params; ++idx)\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
31 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
32
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
33 #define EndFunc(name) \
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
34 free_stack(ct, lv_ ## name);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
35 func = cdata->func;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
36 goto _dispatch;\
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
37
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
38 #define EndFuncNoLocals \
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
39 func = cdata->func;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
40 resume = cdata->resume;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
41 goto _dispatch;\
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
42
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
43 #define Method(name) \
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
44 case FUNC_ ## name:\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
45 f_ ## name:\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
46 if (cdata->num_params < 1)\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
47 goto _exception;\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
48 switch(get_blueprint(cdata->params[0])->type_id)\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
49 {
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
50
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
51 #define EndMethod \
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
52 default:\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
53 goto _exception;\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
54 }
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
55
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
57 #define MethodDispatch(type_id,name,type_name) \
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
58 case type_id:\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
59 goto m_ ## name ## _AT_ ## type_name;
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
60
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
61 #define MethodImpl(name,type_name,mytype_id,numparams) \
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
62 case FUNC_ ## name ## _AT_ ## type_name:\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
63 f_ ## name ## _AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
64 if (cdata->num_params < 1)\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
65 goto _exception;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
66 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
67 {\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
68 puts("uh oh, need conversion and that's not implemented yet!");\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
69 exit(1);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
70 }\
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
71 m_ ## name ## _AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
72 for(idx = numparams; idx < cdata->num_params; ++idx)\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
73 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
74 lv_ ## name ## _AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## _AT_ ## type_name));
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
75
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
76
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
77 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
78 case FUNC_ ## name ## _AT_ ## type_name:\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
79 f_ ## name ## _AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
80 if (cdata->num_params < 1)\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
81 goto _exception;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
82 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
83 {\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
84 puts("uh oh, need conversion and that's not implemented yet!");\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
85 exit(1);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
86 }\
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
87 m_ ## name ## _AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
88 for(idx = numparams; idx < cdata->num_params; ++idx)\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
89 release_ref(cdata->params[0-idx]); cdata->num_params = numparams;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
90
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
91 #define NumParams
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
92 #define CallSpace
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
93
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
94 #define Param(num,convtypeid) \
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
95 if(get_blueprint(cdata->params[0-num])->type_id != convtypeid)\
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
96 {\
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
97 puts("uh oh, need conversion and that's not implemented yet!");\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
98 exit(1);\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
99 }
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
100
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
101 #define CopiedParam(num,convtypeid) Param(num,convtypeid) cdata->params[num] = copy_object(cdata->params[num]);
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
102 #define Ret(num,val) cdata->params[0-num] = (object *)(val);
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
103 #define Exception
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
104 #define FuncDef(name) lt_ ## name * lv_ ## name;
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
105 #define MethodDef(name) lt_ ## name ## _AT_ ## type_name * lv_ ## name ## _AT_ ## type_name;
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
106
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
107
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
108 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace);
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
109
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
110 #define SetParam(num,value) cdata->params[0-num] = value;
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
111
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
112 #define Call(tocall, numparams, resumeto, myname)\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
113 cdata->func = FUNC_ ## myname ## _ ## resumeto;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
114 cdata->num_params = numparams;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
115 goto f_ ## tocall;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
116 case FUNC_ ## myname ## _ ## resumeto:\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
117 lv_ ## myname = (lt_ ## myname *)(cdata->lastframe+1);
35
3498713c3dc9 C backend portion of supporting user defined types is done, but untested. Parser/NWorker still need a fair bit of work
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
118
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
119 #define FreeCall\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
120 temp_cdata = cdata->lastframe;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
121 free_stack(ct, cdata);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
122 cdata = temp_cdata;
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
123
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
124 #define FreeCallMethod(myname,mytype)\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
125 temp_cdata = cdata->lastframe;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
126 free_stack(ct, cdata);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
127 cdata = temp_cdata;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
128 lv_ ## myname ## _AT_ ## type_name = (lt_ ## myname ## _AT_ ## type_name *)(cdata+1);
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
129
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
130 #define TCall(func, numparams)\
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
131 free_stack(cdata->ct, call);\
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
132 cdata->num_params = numparams;\
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
133 cdata->resume = 0;\
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
134 cdata->tail_func = f_ ## func;\
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
135 return TAIL_RETURN;
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
136
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
137
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
138 #endif //_FUNC_H_