Mercurial > repos > rhope
annotate runtime/func.h @ 85:6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 30 Jul 2010 23:49:19 +0000 |
parents | 0083b2f7b3c7 |
children | f51c4c17457c |
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 *); |
85
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
17 typedef void (*special_func) (object *); |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
18 |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
19 #ifdef MULTI_SWITCH |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
20 #define DispatchEntry(name) case FUNC_##name: goto f_##name; |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
21 #define ResumeEntry(num,name) case RES_##num##_##name: goto r##num##_##name; |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
22 #define DispatchVar |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
23 #define DISPATCH switch(func) { DispatchEntries } |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
24 #define EndEntry case END: goto DO_END; |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
25 #else |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
26 #define DispatchEntry(name) &&f_##name, |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
27 #define ResumeEntry(num,name) &&r##num##_##name, |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
28 #define DispatchVar void * funcs[] = { DispatchEntries }; |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
29 #define DISPATCH goto *funcs[func]; |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
30 #define EndEntry &&DO_END |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
31 #endif |
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
32 |
8
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
33 |
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
|
34 #define MethodName(name,type) f_ ## name ## AT_ ## type |
7
d61550e2c001
Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
36 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
37 #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
|
38 f_ ## name:\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
39 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
|
40 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
|
41 sf_ ## name:\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
42 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
|
43 my_cdata = cdata; |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
44 |
11
3021dac0d8f5
Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
45 |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
46 #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
|
47 f_ ## name:\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
48 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
|
49 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
|
50 sf_ ## name:\ |
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
51 my_cdata = cdata; |
11
3021dac0d8f5
Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
52 |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
53 #define EndFunc(name) \ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
54 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
|
55 func = cdata->func; |
56
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 EndFuncNoLocals \ |
59
4f1ae6eb71d8
Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents:
58
diff
changeset
|
58 func = cdata->func; |
11
3021dac0d8f5
Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
59 |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
60 #define Method(name) \ |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
61 f_ ## name:\ |
59
4f1ae6eb71d8
Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents:
58
diff
changeset
|
62 sf_ ## name:\ |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
63 switch(get_blueprint(cdata->params[0])->type_id)\ |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
64 { |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
65 |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
66 #define EndMethod(name) \ |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
67 default:\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
68 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
|
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;\ |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
71 goto _exception;\ |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
72 } |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
73 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
74 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
75 #define MethodDispatch(type_id,name,type_name) \ |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
76 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
|
77 goto m_ ## name ## AT_ ## type_name; |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
78 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
79 #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
|
80 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
|
81 sf_ ## name ## AT_ ## type_name:\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
82 if (cdata->num_params < 1)\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
83 {\ |
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
84 cdata = alloc_cdata(ct, cdata, 0);\ |
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
85 cdata->func = FUNC_ ## name ## AT_ ## type_name;\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
86 goto _exception;\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
87 }\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
88 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
|
89 {\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
90 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
|
91 exit(1);\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
92 }\ |
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
|
93 m_ ## name ## AT_ ## type_name:\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
94 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
|
95 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
|
96 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
|
97 my_cdata = cdata; |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
98 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
99 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
100 #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
|
101 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
|
102 sf_ ## name ## AT_ ## type_name:\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
103 if (cdata->num_params < 1)\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
104 cdata = alloc_cdata(ct, cdata, 0);\ |
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
105 cdata->func = FUNC_ ## name ## AT_ ## type_name;\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
106 goto _exception;\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
107 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
|
108 {\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
109 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
|
110 exit(1);\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
111 }\ |
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
|
112 m_ ## name ## AT_ ## type_name:\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
113 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
|
114 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
|
115 my_cdata = cdata; |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
116 |
11
3021dac0d8f5
Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
117 #define NumParams |
3021dac0d8f5
Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
118 #define CallSpace |
3021dac0d8f5
Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
119 |
12
31f8182f3433
Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents:
11
diff
changeset
|
120 #define Param(num,convtypeid) \ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
121 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
|
122 {\ |
75
0083b2f7b3c7
Partially working implementation of List. Modified build scripts to allow use of other compilers. Fixed some bugs involving method implementations on different types returning different numbers of outputs. Added Fold to the 'builtins' in the comipler.
Mike Pavone <pavone@retrodev.com>
parents:
74
diff
changeset
|
123 printf("uh oh, need conversion from type %d to type %d for param %d and that's not implemented yet!", get_blueprint(cdata->params[num])->type_id, convtypeid, num);\ |
0083b2f7b3c7
Partially working implementation of List. Modified build scripts to allow use of other compilers. Fixed some bugs involving method implementations on different types returning different numbers of outputs. Added Fold to the 'builtins' in the comipler.
Mike Pavone <pavone@retrodev.com>
parents:
74
diff
changeset
|
124 goto _exception;\ |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
125 } |
8
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
126 |
12
31f8182f3433
Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents:
11
diff
changeset
|
127 #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
|
128 #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
|
129 #define NumRet(num) cdata->num_params = num; |
7
d61550e2c001
Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 #define Exception |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
131 #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
|
132 #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
|
133 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
134 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
135 #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
|
136 |
74
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
137 #define SetParam(num,value) cdata->params[num] = value; |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
138 |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
139 #define VCPrepCall(func,numparams) \ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
140 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
|
141 vcparam_offset = 0; |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
142 |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
143 #define VCSetParam(func,num,value) \ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
144 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
|
145 {\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
146 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
|
147 ++vcparam_offset;\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
148 }\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
149 cdata->params[num+vcparam_offset] = value;\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
150 last_vcparam = num+vcparam_offset; |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
151 |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
152 #define ValCall(tocall,numparams,resumeto,myname)\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
153 last_vcparam++;\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
154 while(last_vcparam < ((t_Worker *)tocall)->payload.Size)\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
155 {\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
156 if (((object **)(((t_Worker *)tocall)+1))[last_vcparam]) \ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
157 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
|
158 ++last_vcparam;\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
159 }\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
160 cdata->func = RES_ ## resumeto ## _ ## myname;\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
161 cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
162 cdata->vars = lv_ ## myname;\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
163 func = ((t_Worker *)tocall)->payload.Index; |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
164 |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
165 #define ValCallPostlude(resumeto,myname)\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
166 r ## resumeto ## _ ## myname:\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
167 my_cdata = cdata->lastframe;\ |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
168 lv_ ## myname = cdata->vars; |
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
169 |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
170 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
171 #define Call(tocall, numparams, resumeto, myname)\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
172 cdata->func = RES_ ## resumeto ## _ ## myname;\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
173 cdata->num_params = numparams;\ |
71
c40c3d399133
Add Int32@String and Get Char. Fix stack bug
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
174 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
|
175 goto sf_ ## tocall;\ |
4f1ae6eb71d8
Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents:
58
diff
changeset
|
176 r ## resumeto ## _ ## myname:\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
177 my_cdata = cdata->lastframe;\ |
71
c40c3d399133
Add Int32@String and Get Char. Fix stack bug
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
178 lv_ ## myname = cdata->vars; |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
179 |
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
|
180 |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
181 #define FreeCall\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
182 temp_cdata = cdata->lastframe;\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
183 free_stack(ct, cdata);\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
184 cdata = temp_cdata; |
7
d61550e2c001
Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
185 |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
186 #define FreeCallMethod(myname,mytype)\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
187 temp_cdata = cdata->lastframe;\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
188 free_stack(ct, cdata);\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
189 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
|
190 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
|
191 |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
192 #define TPrepCall(callspace) \ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
193 func = cdata->lastframe->func;\ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
194 temp_cdata = cdata->lastframe->lastframe;\ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
195 free_stack(ct, cdata->lastframe);\ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
196 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
|
197 cdata->func = func; |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
198 |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
199 #define TCall(tocall, numparams)\ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
200 cdata->num_params = numparams;\ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
201 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
|
202 |
31f8182f3433
Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents:
11
diff
changeset
|
203 |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
204 #endif //_FUNC_H_ |