annotate runtime/func.h @ 74:a844c623c7df

Add support for Worker type
author Mike Pavone <pavone@retrodev.com>
date Thu, 01 Jul 2010 21:32:08 -0400
parents c40c3d399133
children 0083b2f7b3c7
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
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
4 typedef struct object object;
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
5 typedef struct calldata calldata;
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
6
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
7 typedef enum {
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
8 NORMAL_RETURN=0,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
9 EXCEPTION_RETURN,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
10 TAIL_RETURN,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
11 NO_CONVERSION,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
12 STACK_UNWIND
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
13 } returntype;
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
14
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
15
53
70af7fa155d0 Cleaned up some C warnings and added a simple compile script
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
16 typedef returntype (*rhope_func)(calldata *);
70af7fa155d0 Cleaned up some C warnings and added a simple compile script
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
17 typedef void (*special_func) (object *);
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
18
48
a24eb366195c Fixed some bugs introduced in previous commit and moved definition of integer methods out of runtime and into the compiler
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
19 #define MethodName(name,type) f_ ## name ## AT_ ## type
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
21
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
22 #define Func(name,numparams) \
59
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
23 f_ ## name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
24 for(idx = numparams; idx < cdata->num_params; ++idx)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
25 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
59
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
26 sf_ ## name:\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
27 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
28 my_cdata = cdata;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
29
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
30
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
31 #define FuncNoLocals(name,numparams) \
59
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
32 f_ ## name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
33 for(idx = numparams; idx < cdata->num_params; ++idx)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
34 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
35 sf_ ## name:\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
36 my_cdata = cdata;
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
37
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
38 #define EndFunc(name) \
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
39 free_stack(ct, lv_ ## name);\
59
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
40 func = cdata->func;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
41
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
42 #define EndFuncNoLocals \
59
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
43 func = cdata->func;
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
44
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
45 #define Method(name) \
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
46 f_ ## name:\
59
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
47 sf_ ## name:\
56
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
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
51 #define EndMethod(name) \
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
52 default:\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
53 printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
54 cdata = alloc_cdata(ct, cdata, 0);\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
55 cdata->func = FUNC_ ## name;\
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
56 goto _exception;\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
57 }
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
58
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
59
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
60 #define MethodDispatch(type_id,name,type_name) \
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
61 case type_id:\
65
1db811fa4744 Handle native Rhope functions and plain C functions separately as part of move to new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
62 goto m_ ## name ## AT_ ## type_name;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
63
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
64 #define MethodImpl(name,type_name,mytype_id,numparams) \
65
1db811fa4744 Handle native Rhope functions and plain C functions separately as part of move to new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
65 f_ ## name ## AT_ ## type_name:\
1db811fa4744 Handle native Rhope functions and plain C functions separately as part of move to new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
66 sf_ ## name ## AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
67 if (cdata->num_params < 1)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
68 {\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
69 cdata = alloc_cdata(ct, cdata, 0);\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
70 cdata->func = FUNC_ ## name ## AT_ ## type_name;\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
71 goto _exception;\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
72 }\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
73 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
74 {\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
75 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
76 exit(1);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
77 }\
65
1db811fa4744 Handle native Rhope functions and plain C functions separately as part of move to new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
78 m_ ## name ## AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
79 for(idx = numparams; idx < cdata->num_params; ++idx)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
80 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
81 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
82 my_cdata = cdata;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
83
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
84
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
85 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \
65
1db811fa4744 Handle native Rhope functions and plain C functions separately as part of move to new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
86 f_ ## name ## AT_ ## type_name:\
1db811fa4744 Handle native Rhope functions and plain C functions separately as part of move to new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
87 sf_ ## name ## AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
88 if (cdata->num_params < 1)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
89 cdata = alloc_cdata(ct, cdata, 0);\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
90 cdata->func = FUNC_ ## name ## AT_ ## type_name;\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
91 goto _exception;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
92 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
93 {\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
94 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
95 exit(1);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
96 }\
65
1db811fa4744 Handle native Rhope functions and plain C functions separately as part of move to new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
97 m_ ## name ## AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
98 for(idx = numparams; idx < cdata->num_params; ++idx)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
99 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
100 my_cdata = cdata;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
101
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
102 #define NumParams
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
103 #define CallSpace
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
104
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
105 #define Param(num,convtypeid) \
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
106 if(get_blueprint(cdata->params[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
107 {\
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
108 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
109 exit(1);\
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
110 }
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
111
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
112 #define CopiedParam(num,convtypeid) Param(num,convtypeid) cdata->params[num] = copy_object(cdata->params[num]);
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
113 #define Ret(num,val) cdata->params[num] = (object *)(val);
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
114 #define NumRet(num) cdata->num_params = num;
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
115 #define Exception
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
116 #define FuncDef(name) lt_ ## name * lv_ ## name;
65
1db811fa4744 Handle native Rhope functions and plain C functions separately as part of move to new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
117 #define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
118
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
119
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
120 #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
121
74
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
122 #define SetParam(num,value) cdata->params[num] = value;
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
123
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
124 #define VCPrepCall(func,numparams) \
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
125 cdata = alloc_cdata(ct, cdata, numparams + ((t_Worker *)func)->payload.Count);\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
126 vcparam_offset = 0;
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
127
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
128 #define VCSetParam(func,num,value) \
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
129 while((num+vcparam_offset) < ((t_Worker *)func)->payload.Size && ((object **)(((t_Worker *)func)+1))[num+vcparam_offset])\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
130 {\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
131 cdata->params[num+vcparam_offset] = add_ref(((object **)(((t_Worker *)func)+1))[num+vcparam_offset]);\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
132 ++vcparam_offset;\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
133 }\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
134 cdata->params[num+vcparam_offset] = value;\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
135 last_vcparam = num+vcparam_offset;
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
136
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
137 #define ValCall(tocall,numparams,resumeto,myname)\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
138 last_vcparam++;\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
139 while(last_vcparam < ((t_Worker *)tocall)->payload.Size)\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
140 {\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
141 if (((object **)(((t_Worker *)tocall)+1))[last_vcparam]) \
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
142 cdata->params[last_vcparam] = add_ref(((object **)(((t_Worker *)tocall)+1))[last_vcparam]);\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
143 ++last_vcparam;\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
144 }\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
145 cdata->func = RES_ ## resumeto ## _ ## myname;\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
146 cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
147 cdata->vars = lv_ ## myname;\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
148 func = ((t_Worker *)tocall)->payload.Index;
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
149
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
150 #define ValCallPostlude(resumeto,myname)\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
151 r ## resumeto ## _ ## myname:\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
152 my_cdata = cdata->lastframe;\
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
153 lv_ ## myname = cdata->vars;
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
154
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
155
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
156 #define Call(tocall, numparams, resumeto, myname)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
157 cdata->func = RES_ ## resumeto ## _ ## myname;\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
158 cdata->num_params = numparams;\
71
c40c3d399133 Add Int32@String and Get Char. Fix stack bug
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
159 cdata->vars = lv_ ## myname;\
59
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
160 goto sf_ ## tocall;\
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
161 r ## resumeto ## _ ## myname:\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
162 my_cdata = cdata->lastframe;\
71
c40c3d399133 Add Int32@String and Get Char. Fix stack bug
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
163 lv_ ## myname = cdata->vars;
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
164
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
165
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
166 #define FreeCall\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
167 temp_cdata = cdata->lastframe;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
168 free_stack(ct, cdata);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
169 cdata = temp_cdata;
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
170
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
171 #define FreeCallMethod(myname,mytype)\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
172 temp_cdata = cdata->lastframe;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
173 free_stack(ct, cdata);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
174 cdata = temp_cdata;\
65
1db811fa4744 Handle native Rhope functions and plain C functions separately as part of move to new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
175 lv_ ## myname ## AT_ ## type_name = (lt_ ## myname ## AT_ ## type_name *)(cdata+1);
61
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
176
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
177 #define TPrepCall(callspace) \
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
178 func = cdata->lastframe->func;\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
179 temp_cdata = cdata->lastframe->lastframe;\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
180 free_stack(ct, cdata->lastframe);\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
181 cdata = alloc_cdata(ct, temp_cdata, callspace);\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
182 cdata->func = func;
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
183
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
184 #define TCall(tocall, numparams)\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
185 cdata->num_params = numparams;\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
186 goto sf_ ## tocall;
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
187
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
188
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
189 #endif //_FUNC_H_