annotate runtime/func.h @ 105:43cc42df26cc

Various compiler improvements
author Mike Pavone <pavone@retrodev.com>
date Tue, 24 Aug 2010 23:22:17 -0400
parents f4fc0a98088a
children e5627038b7e7 60906f8803ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #ifndef _FUNC_H_
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #define _FUNC_H_
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
4 typedef struct object object;
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
5 typedef struct calldata calldata;
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
6
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
7 typedef enum {
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
8 NORMAL_RETURN=0,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
9 EXCEPTION_RETURN,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
10 TAIL_RETURN,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
11 NO_CONVERSION,
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
12 STACK_UNWIND
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
13 } returntype;
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
14
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
15
53
70af7fa155d0 Cleaned up some C warnings and added a simple compile script
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
16 typedef returntype (*rhope_func)(calldata *);
100
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
17 typedef void (*special_func) (object *);
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
18
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
19 #ifdef MULTI_SWITCH
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
20 #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
21 #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
22 #define DispatchVar
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
23 #define DISPATCH switch(func) { DispatchEntries }
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
24 #define EndEntry case END: goto DO_END;
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
25 #else
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
26 #define DispatchEntry(name) &&f_##name,
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
27 #define ResumeEntry(num,name) &&r##num##_##name,
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
28 #define DispatchVar void * funcs[] = { DispatchEntries };
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
29 #define DISPATCH goto *funcs[func];
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
30 #define EndEntry &&DO_END
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
31 #endif
85
6d10b5b9ebc3 Make dispatch type selectable between replicated switch and computed goto
Mike Pavone <pavone@retrodev.com>
parents: 75
diff changeset
32
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
33
48
a24eb366195c Fixed some bugs introduced in previous commit and moved definition of integer methods out of runtime and into the compiler
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
34 #define MethodName(name,type) f_ ## name ## AT_ ## type
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
35
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
36 #ifdef ENABLE_PROFILING
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
37
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
38 #define START_PROFILE \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
39 gettimeofday(&time, NULL);\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
40 cdata->accum = cdata->self_accum = 0;\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
41 cdata->self_start = cdata->start = ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec);
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
42
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
43 #define PAUSE_SELF \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
44 gettimeofday(&time, NULL);\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
45 my_cdata->self_accum += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - my_cdata->self_start;
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
46
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
47 #define AND_TOTAL \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
48 my_cdata->accum += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - my_cdata->start;
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
49
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
50 #define RESUME_SELF \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
51 gettimeofday(&time, NULL);\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
52 my_cdata->self_start = ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec);
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
53
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
54 #define AND_RESUME_TOTAL my_cdata->start = my_cdata->self_start;
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
55
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
56 #define EndFunc(name) \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
57 free_stack(ct, lv_ ## name);\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
58 func = cdata->func;\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
59 gettimeofday(&time, NULL);\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
60 profile_counts[FUNC_ ## name]++;\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
61 profile_totals[FUNC_ ## name] += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->start + cdata->accum;\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
62 profile_selftotals[FUNC_ ## name] += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->self_start + cdata->self_accum;
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
63
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
64 #else
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
65
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
66 #define START_PROFILE
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
67 #define PAUSE_SELF
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
68 #define RESUME_SELF
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
69 #define AND_TOTAL
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
70 #define AND_RESUME_TOTAL
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
71
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
72 #define EndFunc(name) \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
73 free_stack(ct, lv_ ## name);\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
74 func = cdata->func;
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
75
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
76
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
77 #endif
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
78
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
79 #define EndFuncNoLocals \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
80 func = cdata->func;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
81
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
82 #define Func(name,numparams) \
59
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
83 f_ ## name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
84 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
85 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
86 sf_ ## name:\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
87 START_PROFILE\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
88 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
89 my_cdata = cdata;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
90
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
91
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
92 #define FuncNoLocals(name,numparams) \
59
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
93 f_ ## name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
94 for(idx = numparams; idx < cdata->num_params; ++idx)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
95 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
96 sf_ ## name:\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
97 my_cdata = cdata;
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
98
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
99 #define MethodImpl(name,type_name,mytype_id,numparams) \
65
1db811fa4744 Handle native Rhope functions and plain C functions separately as part of move to new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
100 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
101 sf_ ## name ## AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
102 if (cdata->num_params < 1)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
103 {\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
104 cdata = alloc_cdata(ct, cdata, 0);\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
105 cdata->func = FUNC_ ## name ## AT_ ## type_name;\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
106 goto _exception;\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
107 }\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
108 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
109 {\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
110 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
111 exit(1);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
112 }\
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
113 m_ ## name ## AT_ ## type_name:\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
114 START_PROFILE\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
115 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
116 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
117 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
118 my_cdata = cdata;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
119
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
120
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
121 #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
122 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
123 sf_ ## name ## AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
124 if (cdata->num_params < 1)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
125 cdata = alloc_cdata(ct, cdata, 0);\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
126 cdata->func = FUNC_ ## name ## AT_ ## type_name;\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
127 goto _exception;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
128 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
129 {\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
130 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
131 exit(1);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
132 }\
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
133 m_ ## name ## AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
134 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
135 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
136 my_cdata = cdata;
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
137
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
138
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
139 #define Method(name) \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
140 f_ ## name:\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
141 sf_ ## name:\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
142 switch(get_blueprint(cdata->params[0])->type_id)\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
143 {
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
144
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
145 #define EndMethod(name) \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
146 default:\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
147 printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
148 cdata = alloc_cdata(ct, cdata, 0);\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
149 cdata->func = FUNC_ ## name;\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
150 goto _exception;\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
151 }
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
152
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
153
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
154 #define MethodDispatch(type_id,name,type_name) \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
155 case type_id:\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
156 goto m_ ## name ## AT_ ## type_name;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
157
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
158 #define NumParams
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
159 #define CallSpace
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
160
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
161 #define Param(num,convtypeid) \
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
162 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
163 {\
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
164 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
165 goto _exception;\
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
166 }
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
167
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
168 #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
169 #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
170 #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
171 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
172 {\
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
173 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
174 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
175 }
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
176 #define Exception
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
177 #define FuncDef(name) lt_ ## name * lv_ ## name;
65
1db811fa4744 Handle native Rhope functions and plain C functions separately as part of move to new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 63
diff changeset
178 #define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
179
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
180
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
181 #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
182
100
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
183 #define SetParam(num,value) cdata->params[num] = value;
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
184
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
185
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
186 #define VCRePrepCall(func,numparams,lastnumparams) \
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
187 if(numparams + ((t_Worker *)func)->payload.Count > lastnumparams)\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
188 {\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
189 temp_cdata = cdata->lastframe;\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
190 free_stack(ct, cdata);\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
191 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
192 }\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
193 vcparam_offset = 0;
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
194
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
195 #define VCPrepCall(func,numparams) \
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
196 cdata = alloc_cdata(ct, cdata, numparams + ((t_Worker *)func)->payload.Count);\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
197 vcparam_offset = 0;
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
198
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
199 #define VCSetParam(func,num,value) \
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
200 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
201 {\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
202 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
203 ++vcparam_offset;\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
204 }\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
205 cdata->params[num+vcparam_offset] = value;\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
206 last_vcparam = num+vcparam_offset;
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
207
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
208 #define ValCall(tocall,numparams,resumeto,myname)\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
209 last_vcparam++;\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
210 while(last_vcparam < ((t_Worker *)tocall)->payload.Size)\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
211 {\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
212 if (((object **)(((t_Worker *)tocall)+1))[last_vcparam]) \
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
213 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
214 ++last_vcparam;\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
215 }\
74
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
216 cdata->func = RES_ ## resumeto ## _ ## myname;\
100
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
217 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
218 cdata->vars = lv_ ## myname;\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
219 func = ((t_Worker *)tocall)->payload.Index;\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
220 PAUSE_SELF
100
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
221
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
222 #define ValCallPostlude(resumeto,myname)\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
223 r ## resumeto ## _ ## myname:\
74
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
224 my_cdata = cdata->lastframe;\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
225 RESUME_SELF\
100
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
226 lv_ ## myname = cdata->vars;
74
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
227
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
228
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
229 #define Call(tocall, numparams, resumeto, myname)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
230 cdata->func = RES_ ## resumeto ## _ ## myname;\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
231 cdata->num_params = numparams;\
71
c40c3d399133 Add Int32@String and Get Char. Fix stack bug
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
232 cdata->vars = lv_ ## myname;\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
233 if(FUNC_ ## tocall == FUNC_ ## myname) {\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
234 PAUSE_SELF\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
235 AND_TOTAL\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
236 } 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
237 PAUSE_SELF\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
238 }\
59
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
239 goto sf_ ## tocall;\
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
240 r ## resumeto ## _ ## myname:\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
241 my_cdata = cdata->lastframe;\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
242 if(FUNC_ ## tocall == FUNC_ ## myname) {\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
243 RESUME_SELF\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
244 AND_RESUME_TOTAL\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
245 } 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
246 RESUME_SELF\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
247 }\
71
c40c3d399133 Add Int32@String and Get Char. Fix stack bug
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
248 lv_ ## myname = cdata->vars;
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
249
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
250
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
251 #define FreeCall\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
252 temp_cdata = cdata->lastframe;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
253 free_stack(ct, cdata);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
254 cdata = temp_cdata;
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
255
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
256 #define FreeCallMethod(myname,mytype)\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
257 temp_cdata = cdata->lastframe;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
258 free_stack(ct, cdata);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
259 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
260 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
261
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
262 #define TPrepCall(callspace) \
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
263 func = cdata->lastframe->func;\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
264 temp_cdata = cdata->lastframe->lastframe;\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
265 free_stack(ct, cdata->lastframe);\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
266 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
267 cdata->func = func;
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
268
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
269 #define TCall(tocall, numparams)\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
270 cdata->num_params = numparams;\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
271 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
272
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
273
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
274 #endif //_FUNC_H_