Mercurial > repos > rhope
annotate runtime/func.h @ 186:ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 07 Oct 2011 00:10:02 -0700 |
parents | d2b941f82d74 |
children |
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 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
4 #define MethodName(name,type) f_ ## name ## AT_ ## type |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
5 #define NumParams |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
6 #define NumOutputs |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
7 #define CallSpace |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
8 |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
9 typedef struct object object; |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
10 typedef void (*special_func) (object *); |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
11 |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
12 |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
13 #ifdef RAW_FUNC |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
14 #include "func_raw.h" |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
15 #else |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
16 |
8
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
17 typedef enum { |
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
18 NORMAL_RETURN=0, |
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
19 EXCEPTION_RETURN, |
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
20 TAIL_RETURN, |
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
21 NO_CONVERSION, |
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
22 STACK_UNWIND |
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
23 } returntype; |
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
24 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
25 typedef struct calldata calldata; |
8
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
26 |
53
70af7fa155d0
Cleaned up some C warnings and added a simple compile script
Mike Pavone <pavone@retrodev.com>
parents:
48
diff
changeset
|
27 typedef returntype (*rhope_func)(calldata *); |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
28 |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
29 #define lv(func,var) lv_ ## func->var |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
30 #define lvar(type, name) type name; |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
31 #define my_params(num) my_cdata->params[num] |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
32 #define child_params(num) cdata->params[num] |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
33 #define my_outputs(num) my_cdata->params[num] |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
34 |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
35 #define result(num) cdata->params[num] |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
36 #define numresults cdata->num_params |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
37 |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
38 #define LocalsType(def,func) typedef struct { def } lt_ ## func; |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
39 |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
40 #define ResEnum(num,name) RES_ ## num ## _ ## name, |
100
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
41 |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
42 #ifdef MULTI_SWITCH |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
43 #define DispatchEntry(name) case FUNC_##name: goto f_##name; |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
44 #define ResumeEntry(num,name) case RES_##num##_##name: goto r##num##_##name; |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
45 #define DispatchVar |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
46 #define DISPATCH switch(func) { DispatchEntries } |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
47 #define EndEntry case END: goto DO_END; |
140
c14698c512f1
Untested addition of Pause/Resume
Mike Pavone <pavone@retrodev.com>
parents:
128
diff
changeset
|
48 #define EndThreadEntry case END_THREAD: goto DO_END_THREAD; |
100
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
49 #else |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
50 #define DispatchEntry(name) &&f_##name, |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
51 #define ResumeEntry(num,name) &&r##num##_##name, |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
52 #define DispatchVar void * funcs[] = { DispatchEntries }; |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
53 #define DISPATCH goto *funcs[func]; |
141
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
54 #define EndEntry &&DO_END, |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
55 #define EndThreadEntry &&DO_END_THREAD |
100
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
56 #endif |
85
6d10b5b9ebc3
Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents:
75
diff
changeset
|
57 |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
58 #ifdef ENABLE_PROFILING |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
59 |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
60 #define START_PROFILE \ |
151
b75ec364cecc
Fix conflict between name of proviling variable and time function in C stdlib
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
61 gettimeofday(&proftime, NULL);\ |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
62 cdata->accum = cdata->self_accum = 0;\ |
151
b75ec364cecc
Fix conflict between name of proviling variable and time function in C stdlib
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
63 cdata->self_start = cdata->start = ((uint64_t)proftime.tv_sec) * 1000000ULL + ((uint64_t)proftime.tv_usec); |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
64 |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
65 #define PAUSE_SELF \ |
151
b75ec364cecc
Fix conflict between name of proviling variable and time function in C stdlib
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
66 gettimeofday(&proftime, NULL);\ |
b75ec364cecc
Fix conflict between name of proviling variable and time function in C stdlib
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
67 my_cdata->self_accum += ((uint64_t)proftime.tv_sec) * 1000000ULL + ((uint64_t)proftime.tv_usec) - my_cdata->self_start; |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
68 |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
69 #define AND_TOTAL \ |
116 | 70 *(my_cdata->myactivationlevel)--;\ |
151
b75ec364cecc
Fix conflict between name of proviling variable and time function in C stdlib
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
71 my_cdata->accum += ((uint64_t)proftime.tv_sec) * 1000000ULL + ((uint64_t)proftime.tv_usec) - my_cdata->start; |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
72 |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
73 #define RESUME_SELF \ |
151
b75ec364cecc
Fix conflict between name of proviling variable and time function in C stdlib
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
74 gettimeofday(&proftime, NULL);\ |
b75ec364cecc
Fix conflict between name of proviling variable and time function in C stdlib
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
75 my_cdata->self_start = ((uint64_t)proftime.tv_sec) * 1000000ULL + ((uint64_t)proftime.tv_usec); |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
76 |
116 | 77 #define AND_RESUME_TOTAL \ |
78 *(my_cdata->myactivationlevel)++;\ | |
79 my_cdata->start = my_cdata->self_start; | |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
80 |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
81 #define EndFunc(name) \ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
82 free_stack(ct, lv_ ## name);\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
83 func = cdata->func;\ |
116 | 84 profile_activationlevel[FUNC_ ## name]--;\ |
151
b75ec364cecc
Fix conflict between name of proviling variable and time function in C stdlib
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
85 gettimeofday(&proftime, NULL);\ |
116 | 86 if(profile_activationlevel[FUNC_ ## name])\ |
87 {\ | |
88 profile_nestedcounts[FUNC_ ## name]++;\ | |
89 } else {\ | |
90 profile_counts[FUNC_ ## name]++;\ | |
151
b75ec364cecc
Fix conflict between name of proviling variable and time function in C stdlib
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
91 profile_totals[FUNC_ ## name] += ((uint64_t)proftime.tv_sec) * 1000000ULL + ((uint64_t)proftime.tv_usec) - cdata->start + cdata->accum;\ |
116 | 92 }\ |
151
b75ec364cecc
Fix conflict between name of proviling variable and time function in C stdlib
Mike Pavone <pavone@retrodev.com>
parents:
142
diff
changeset
|
93 profile_selftotals[FUNC_ ## name] += ((uint64_t)proftime.tv_sec) * 1000000ULL + ((uint64_t)proftime.tv_usec) - cdata->self_start + cdata->self_accum; |
116 | 94 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
95 #define Func(name,numparams,numret) \ |
59
4f1ae6eb71d8
Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents:
58
diff
changeset
|
96 f_ ## name:\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
97 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
|
98 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
|
99 sf_ ## name:\ |
116 | 100 profile_activationlevel[FUNC_ ## name]++;\ |
101 cdata->myactivationlevel = &profile_activationlevel[FUNC_ ## name];\ | |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
102 START_PROFILE\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
103 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
|
104 my_cdata = cdata; |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
105 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
106 #define MethodImpl(name,type_name,mytype_id,numparams,numret) \ |
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
|
107 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
|
108 sf_ ## name ## AT_ ## type_name:\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
109 if (cdata->num_params < 1)\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
110 {\ |
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
111 cdata = alloc_cdata(ct, cdata, 0);\ |
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
112 cdata->func = FUNC_ ## name ## AT_ ## type_name;\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
113 goto _exception;\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
114 }\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
115 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
|
116 {\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
117 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
|
118 exit(1);\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
119 }\ |
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
|
120 m_ ## name ## AT_ ## type_name:\ |
116 | 121 profile_activationlevel[FUNC_ ## name ## AT_ ## type_name]++;\ |
122 cdata->myactivationlevel = &profile_activationlevel[FUNC_ ## name ## AT_ ## type_name];\ | |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
123 START_PROFILE\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
124 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
|
125 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
|
126 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
|
127 my_cdata = cdata; |
116 | 128 |
129 #else | |
130 | |
131 #define START_PROFILE | |
132 #define PAUSE_SELF | |
133 #define RESUME_SELF | |
134 #define AND_TOTAL | |
135 #define AND_RESUME_TOTAL | |
136 | |
137 #define EndFunc(name) \ | |
138 free_stack(ct, lv_ ## name);\ | |
139 func = cdata->func; | |
140 | |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
141 #define Func(name,numparams,numret) \ |
116 | 142 f_ ## name:\ |
143 for(idx = numparams; idx < cdata->num_params; ++idx)\ | |
144 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ | |
145 sf_ ## name:\ | |
146 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\ | |
147 my_cdata = cdata; | |
148 | |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
149 #define MethodImpl(name,type_name,mytype_id,numparams,numret) \ |
116 | 150 f_ ## name ## AT_ ## type_name:\ |
151 sf_ ## name ## AT_ ## type_name:\ | |
152 if (cdata->num_params < 1)\ | |
153 {\ | |
154 cdata = alloc_cdata(ct, cdata, 0);\ | |
155 cdata->func = FUNC_ ## name ## AT_ ## type_name;\ | |
156 goto _exception;\ | |
157 }\ | |
158 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ | |
159 {\ | |
168
d2b941f82d74
Fix type of list constants in inference pass and return type of some Array related workers
Mike Pavone <pavone@retrodev.com>
parents:
159
diff
changeset
|
160 printf("uh oh, need conversion from type %d to %s(%d) for %s and that's not implemented yet!\n", get_blueprint(cdata->params[0])->type_id, #type_name, mytype_id, #name);\ |
d2b941f82d74
Fix type of list constants in inference pass and return type of some Array related workers
Mike Pavone <pavone@retrodev.com>
parents:
159
diff
changeset
|
161 goto _exception;\ |
116 | 162 }\ |
163 m_ ## name ## AT_ ## type_name:\ | |
164 for(idx = numparams; idx < cdata->num_params; ++idx)\ | |
165 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ | |
166 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\ | |
167 my_cdata = cdata; | |
168 | |
169 #endif | |
170 | |
171 #define EndFuncNoLocals \ | |
172 func = cdata->func; | |
173 | |
174 | |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
175 #define FuncNoLocals(name,numparams,numret) \ |
116 | 176 f_ ## name:\ |
177 for(idx = numparams; idx < cdata->num_params; ++idx)\ | |
178 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ | |
179 sf_ ## name:\ | |
180 my_cdata = cdata; | |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
181 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
182 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
183 #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
|
184 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
|
185 sf_ ## name ## AT_ ## type_name:\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
186 if (cdata->num_params < 1)\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
187 cdata = alloc_cdata(ct, cdata, 0);\ |
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
188 cdata->func = FUNC_ ## name ## AT_ ## type_name;\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
189 goto _exception;\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
190 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
|
191 {\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
192 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
|
193 exit(1);\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
194 }\ |
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
|
195 m_ ## name ## AT_ ## type_name:\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
196 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
|
197 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
|
198 my_cdata = cdata; |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
199 |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
200 |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
201 #define Method(name) \ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
202 f_ ## name:\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
203 sf_ ## name:\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
204 switch(get_blueprint(cdata->params[0])->type_id)\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
205 { |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
206 |
128
5eedee9063dc
Print type name in error message for a missing method
Mike Pavone <pavone@retrodev.com>
parents:
116
diff
changeset
|
207 #define EndMethod(mname) \ |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
208 default:\ |
128
5eedee9063dc
Print type name in error message for a missing method
Mike Pavone <pavone@retrodev.com>
parents:
116
diff
changeset
|
209 printf("Type ");\ |
5eedee9063dc
Print type name in error message for a missing method
Mike Pavone <pavone@retrodev.com>
parents:
116
diff
changeset
|
210 fwrite( ((t_Array *)((t_String *)get_blueprint(cdata->params[0])->name)->payload.Buffer)+1, 1, ((t_Array *)((t_String *)get_blueprint(cdata->params[0])->name)->payload.Buffer)->payload.Length, stdout);\ |
5eedee9063dc
Print type name in error message for a missing method
Mike Pavone <pavone@retrodev.com>
parents:
116
diff
changeset
|
211 printf("(%d) does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #mname);\ |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
212 cdata = alloc_cdata(ct, cdata, 0);\ |
128
5eedee9063dc
Print type name in error message for a missing method
Mike Pavone <pavone@retrodev.com>
parents:
116
diff
changeset
|
213 cdata->func = FUNC_ ## mname;\ |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
214 goto _exception;\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
215 } |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
216 |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
217 |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
218 #define MethodDispatch(type_id,name,type_name) \ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
219 case type_id:\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
220 goto m_ ## name ## AT_ ## type_name; |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
221 |
12
31f8182f3433
Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents:
11
diff
changeset
|
222 #define Param(num,convtypeid) \ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
223 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
|
224 {\ |
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
|
225 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
|
226 goto _exception;\ |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
227 } |
8
8d74ef7fa357
Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
228 |
12
31f8182f3433
Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents:
11
diff
changeset
|
229 #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
|
230 #define Ret(num,val) cdata->params[num] = (object *)(val); |
101
f4fc0a98088a
Fixed some bugs that were preventing compiled compiler from working correctly. Need to address memory usage
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
231 #define NumRet(num) cdata->num_params = num;\ |
f4fc0a98088a
Fixed some bugs that were preventing compiled compiler from working correctly. Need to address memory usage
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
232 if (num == 1 && !cdata->params[0])\ |
f4fc0a98088a
Fixed some bugs that were preventing compiled compiler from working correctly. Need to address memory usage
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
233 {\ |
f4fc0a98088a
Fixed some bugs that were preventing compiled compiler from working correctly. Need to address memory usage
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
234 puts("Worker with only one output failed to produce data for that output!");\ |
f4fc0a98088a
Fixed some bugs that were preventing compiled compiler from working correctly. Need to address memory usage
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
235 goto _exception;\ |
f4fc0a98088a
Fixed some bugs that were preventing compiled compiler from working correctly. Need to address memory usage
Mike Pavone <pavone@retrodev.com>
parents:
100
diff
changeset
|
236 } |
7
d61550e2c001
Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
237 #define Exception |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
238 #define FuncDef(name) lt_ ## name * lv_ ## name; |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
239 #define MethodDef(name) lt_ ## name * lv_ ## name; |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
240 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
241 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
242 #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
|
243 |
100
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
244 #define SetParam(num,value) cdata->params[num] = value; |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
245 |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
246 |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
247 #define VCRePrepCall(func,numparams,lastnumparams) \ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
248 if(numparams + ((t_Worker *)func)->payload.Count > lastnumparams)\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
249 {\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
250 temp_cdata = cdata->lastframe;\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
251 free_stack(ct, cdata);\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
252 cdata = alloc_cdata(ct, temp_cdata, numparams + ((t_Worker *)func)->payload.Count);\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
253 }\ |
159
d1e206ff75f9
Fix some bugs involving calling a worker object
Mike Pavone <pavone@retrodev.com>
parents:
151
diff
changeset
|
254 vcparam_offset = 0;\ |
d1e206ff75f9
Fix some bugs involving calling a worker object
Mike Pavone <pavone@retrodev.com>
parents:
151
diff
changeset
|
255 last_vcparam = -1; |
100
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
256 |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
257 #define VCPrepCall(func,numparams) \ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
258 cdata = alloc_cdata(ct, cdata, numparams + ((t_Worker *)func)->payload.Count);\ |
159
d1e206ff75f9
Fix some bugs involving calling a worker object
Mike Pavone <pavone@retrodev.com>
parents:
151
diff
changeset
|
259 vcparam_offset = 0;\ |
d1e206ff75f9
Fix some bugs involving calling a worker object
Mike Pavone <pavone@retrodev.com>
parents:
151
diff
changeset
|
260 last_vcparam = -1; |
100
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
261 |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
262 #define VCSetParam(func,num,value) \ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
263 while((num+vcparam_offset) < ((t_Worker *)func)->payload.Size && ((object **)(((t_Worker *)func)+1))[num+vcparam_offset])\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
264 {\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
265 cdata->params[num+vcparam_offset] = add_ref(((object **)(((t_Worker *)func)+1))[num+vcparam_offset]);\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
266 ++vcparam_offset;\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
267 }\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
268 cdata->params[num+vcparam_offset] = value;\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
269 last_vcparam = num+vcparam_offset; |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
270 |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
271 #define ValCall(tocall,numparams,resumeto,myname)\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
272 last_vcparam++;\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
273 while(last_vcparam < ((t_Worker *)tocall)->payload.Size)\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
274 {\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
275 if (((object **)(((t_Worker *)tocall)+1))[last_vcparam]) \ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
276 cdata->params[last_vcparam] = add_ref(((object **)(((t_Worker *)tocall)+1))[last_vcparam]);\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
277 ++last_vcparam;\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
278 }\ |
74
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
279 cdata->func = RES_ ## resumeto ## _ ## myname;\ |
100
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
280 cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
281 cdata->vars = lv_ ## myname;\ |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
282 func = ((t_Worker *)tocall)->payload.Index;\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
283 PAUSE_SELF |
100
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
284 |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
285 #define ValCallPostlude(resumeto,myname)\ |
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
286 r ## resumeto ## _ ## myname:\ |
74
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
287 my_cdata = cdata->lastframe;\ |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
288 RESUME_SELF\ |
100
f51c4c17457c
Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents:
85
diff
changeset
|
289 lv_ ## myname = cdata->vars; |
141
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
290 |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
291 #define ValCallNoLocals(tocall,numparams,resumeto,myname)\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
292 last_vcparam++;\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
293 while(last_vcparam < ((t_Worker *)tocall)->payload.Size)\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
294 {\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
295 if (((object **)(((t_Worker *)tocall)+1))[last_vcparam]) \ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
296 cdata->params[last_vcparam] = add_ref(((object **)(((t_Worker *)tocall)+1))[last_vcparam]);\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
297 ++last_vcparam;\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
298 }\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
299 cdata->func = RES_ ## resumeto ## _ ## myname;\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
300 cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
301 func = ((t_Worker *)tocall)->payload.Index;\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
302 PAUSE_SELF |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
303 |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
304 #define ValCallNoLocalsPostlude(resumeto,myname)\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
305 r ## resumeto ## _ ## myname:\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
306 my_cdata = cdata->lastframe;\ |
f2cb85c53ced
Fix Pause/Resume and rewrite Call Async in Rhope rather than C
Mike Pavone <pavone@retrodev.com>
parents:
140
diff
changeset
|
307 RESUME_SELF |
74
a844c623c7df
Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents:
71
diff
changeset
|
308 |
142
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
309 #define CallNoLocals(tocall, numparams, resumeto, myname)\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
310 cdata->func = RES_ ## resumeto ## _ ## myname;\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
311 cdata->num_params = numparams;\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
312 if(FUNC_ ## tocall == FUNC_ ## myname) {\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
313 PAUSE_SELF\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
314 AND_TOTAL\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
315 } else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
316 PAUSE_SELF\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
317 }\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
318 goto sf_ ## tocall;\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
319 r ## resumeto ## _ ## myname:\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
320 my_cdata = cdata->lastframe;\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
321 if(FUNC_ ## tocall == FUNC_ ## myname) {\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
322 RESUME_SELF\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
323 AND_RESUME_TOTAL\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
324 } else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
325 RESUME_SELF\ |
7bbdc034e347
Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
Mike Pavone <pavone@retrodev.com>
parents:
141
diff
changeset
|
326 } |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
327 |
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
328 #define Call(tocall, numparams, resumeto, myname)\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
329 cdata->func = RES_ ## resumeto ## _ ## myname;\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
330 cdata->num_params = numparams;\ |
71
c40c3d399133
Add Int32@String and Get Char. Fix stack bug
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
331 cdata->vars = lv_ ## myname;\ |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
332 if(FUNC_ ## tocall == FUNC_ ## myname) {\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
333 PAUSE_SELF\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
334 AND_TOTAL\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
335 } else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
336 PAUSE_SELF\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
337 }\ |
59
4f1ae6eb71d8
Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents:
58
diff
changeset
|
338 goto sf_ ## tocall;\ |
4f1ae6eb71d8
Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents:
58
diff
changeset
|
339 r ## resumeto ## _ ## myname:\ |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
340 my_cdata = cdata->lastframe;\ |
105
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
341 if(FUNC_ ## tocall == FUNC_ ## myname) {\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
342 RESUME_SELF\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
343 AND_RESUME_TOTAL\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
344 } else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
345 RESUME_SELF\ |
43cc42df26cc
Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents:
101
diff
changeset
|
346 }\ |
71
c40c3d399133
Add Int32@String and Get Char. Fix stack bug
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
347 lv_ ## myname = cdata->vars; |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
348 |
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
|
349 |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
350 #define FreeCall\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
351 temp_cdata = cdata->lastframe;\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
352 free_stack(ct, cdata);\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
353 cdata = temp_cdata; |
7
d61550e2c001
Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
354 |
56
d2f9b0a9403d
Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
355 #define FreeCallMethod(myname,mytype)\ |
57
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
356 temp_cdata = cdata->lastframe;\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
357 free_stack(ct, cdata);\ |
2174878a6e4b
Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents:
56
diff
changeset
|
358 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
|
359 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
|
360 |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
361 #define TPrepCall(callspace) \ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
362 func = cdata->lastframe->func;\ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
363 temp_cdata = cdata->lastframe->lastframe;\ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
364 free_stack(ct, cdata->lastframe);\ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
365 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
|
366 cdata->func = func; |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
367 |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
368 #define TCall(tocall, numparams)\ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
369 cdata->num_params = numparams;\ |
fa24ef3b026f
Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
370 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
|
371 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
372 #endif //RAW_FUNC |
66
d4b44ae2e34a
New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents:
65
diff
changeset
|
373 #endif //_FUNC_H_ |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
168
diff
changeset
|
374 |