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
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
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
77 #define AND_RESUME_TOTAL \
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
78 *(my_cdata->myactivationlevel)++;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
86 if(profile_activationlevel[FUNC_ ## name])\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
87 {\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
88 profile_nestedcounts[FUNC_ ## name]++;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
89 } else {\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
100 profile_activationlevel[FUNC_ ## name]++;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
121 profile_activationlevel[FUNC_ ## name ## AT_ ## type_name]++;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
128
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
129 #else
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
130
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
131 #define START_PROFILE
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
132 #define PAUSE_SELF
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
133 #define RESUME_SELF
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
134 #define AND_TOTAL
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
135 #define AND_RESUME_TOTAL
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
136
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
137 #define EndFunc(name) \
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
138 free_stack(ct, lv_ ## name);\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
139 func = cdata->func;
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
142 f_ ## name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
143 for(idx = numparams; idx < cdata->num_params; ++idx)\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
144 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
145 sf_ ## name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
146 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
147 my_cdata = cdata;
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
150 f_ ## name ## AT_ ## type_name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
151 sf_ ## name ## AT_ ## type_name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
152 if (cdata->num_params < 1)\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
153 {\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
154 cdata = alloc_cdata(ct, cdata, 0);\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
155 cdata->func = FUNC_ ## name ## AT_ ## type_name;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
156 goto _exception;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
157 }\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
158 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
162 }\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
163 m_ ## name ## AT_ ## type_name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
164 for(idx = numparams; idx < cdata->num_params; ++idx)\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
165 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
166 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
167 my_cdata = cdata;
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
168
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
169 #endif
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
170
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
171 #define EndFuncNoLocals \
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
172 func = cdata->func;
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
173
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
176 f_ ## name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
177 for(idx = numparams; idx < cdata->num_params; ++idx)\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
178 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
179 sf_ ## name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
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