annotate runtime/func.h @ 139:a68e6828d896

Global stores and transactions are working. Definately leaks memory on retries. Probably a fair number of bugs to work out. However, a basic test program works.
author Mike Pavone <pavone@retrodev.com>
date Fri, 19 Nov 2010 04:04:14 -0500
parents 5eedee9063dc
children c14698c512f1
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 \
116
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
48 *(my_cdata->myactivationlevel)--;\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
49 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
50
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
51 #define RESUME_SELF \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
52 gettimeofday(&time, NULL);\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
53 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
54
116
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
55 #define AND_RESUME_TOTAL \
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
56 *(my_cdata->myactivationlevel)++;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
57 my_cdata->start = my_cdata->self_start;
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
58
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
59 #define EndFunc(name) \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
60 free_stack(ct, lv_ ## name);\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
61 func = cdata->func;\
116
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
62 profile_activationlevel[FUNC_ ## name]--;\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
63 gettimeofday(&time, NULL);\
116
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
64 if(profile_activationlevel[FUNC_ ## name])\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
65 {\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
66 profile_nestedcounts[FUNC_ ## name]++;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
67 } else {\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
68 profile_counts[FUNC_ ## name]++;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
69 profile_totals[FUNC_ ## name] += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->start + cdata->accum;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
70 }\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
71 profile_selftotals[FUNC_ ## name] += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->self_start + cdata->self_accum;
116
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
72
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
73 #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
74 f_ ## name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
75 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
76 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
77 sf_ ## name:\
116
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
78 profile_activationlevel[FUNC_ ## name]++;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
79 cdata->myactivationlevel = &profile_activationlevel[FUNC_ ## name];\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
80 START_PROFILE\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
81 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
82 my_cdata = cdata;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
83
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
84 #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
85 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
86 sf_ ## name ## AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
87 if (cdata->num_params < 1)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
88 {\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
89 cdata = alloc_cdata(ct, cdata, 0);\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
90 cdata->func = FUNC_ ## name ## AT_ ## type_name;\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
91 goto _exception;\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
92 }\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
93 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
94 {\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
95 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
96 exit(1);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
97 }\
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
98 m_ ## name ## AT_ ## type_name:\
116
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
99 profile_activationlevel[FUNC_ ## name ## AT_ ## type_name]++;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
100 cdata->myactivationlevel = &profile_activationlevel[FUNC_ ## name ## AT_ ## type_name];\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
101 START_PROFILE\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
102 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
103 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
104 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
105 my_cdata = cdata;
116
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
106
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
107 #else
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
108
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
109 #define START_PROFILE
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
110 #define PAUSE_SELF
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
111 #define RESUME_SELF
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
112 #define AND_TOTAL
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
113 #define AND_RESUME_TOTAL
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
114
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
115 #define EndFunc(name) \
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
116 free_stack(ct, lv_ ## name);\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
117 func = cdata->func;
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
118
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
119 #define Func(name,numparams) \
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
120 f_ ## name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
121 for(idx = numparams; idx < cdata->num_params; ++idx)\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
122 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
123 sf_ ## name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
124 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
125 my_cdata = cdata;
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
126
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
127 #define MethodImpl(name,type_name,mytype_id,numparams) \
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
128 f_ ## name ## AT_ ## type_name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
129 sf_ ## name ## AT_ ## type_name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
130 if (cdata->num_params < 1)\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
131 {\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
132 cdata = alloc_cdata(ct, cdata, 0);\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
133 cdata->func = FUNC_ ## name ## AT_ ## type_name;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
134 goto _exception;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
135 }\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
136 if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
137 {\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
138 puts("uh oh, need conversion and that's not implemented yet!");\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
139 exit(1);\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
140 }\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
141 m_ ## name ## AT_ ## type_name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
142 for(idx = numparams; idx < cdata->num_params; ++idx)\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
143 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
144 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
145 my_cdata = cdata;
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
146
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
147 #endif
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
148
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
149 #define EndFuncNoLocals \
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
150 func = cdata->func;
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
151
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
152
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
153 #define FuncNoLocals(name,numparams) \
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
154 f_ ## name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
155 for(idx = numparams; idx < cdata->num_params; ++idx)\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
156 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
157 sf_ ## name:\
60906f8803ef Improved profiling
Mike Pavone <pavone@retrodev.com>
parents: 105
diff changeset
158 my_cdata = cdata;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
159
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
160
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
161 #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
162 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
163 sf_ ## name ## AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
164 if (cdata->num_params < 1)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
165 cdata = alloc_cdata(ct, cdata, 0);\
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
166 cdata->func = FUNC_ ## name ## AT_ ## type_name;\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
167 goto _exception;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
168 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
169 {\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
170 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
171 exit(1);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
172 }\
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
173 m_ ## name ## AT_ ## type_name:\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
174 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
175 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
176 my_cdata = cdata;
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
177
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
178
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
179 #define Method(name) \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
180 f_ ## name:\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
181 sf_ ## name:\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
182 switch(get_blueprint(cdata->params[0])->type_id)\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
183 {
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
184
128
5eedee9063dc Print type name in error message for a missing method
Mike Pavone <pavone@retrodev.com>
parents: 116
diff changeset
185 #define EndMethod(mname) \
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
186 default:\
128
5eedee9063dc Print type name in error message for a missing method
Mike Pavone <pavone@retrodev.com>
parents: 116
diff changeset
187 printf("Type ");\
5eedee9063dc Print type name in error message for a missing method
Mike Pavone <pavone@retrodev.com>
parents: 116
diff changeset
188 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
189 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
190 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
191 cdata->func = FUNC_ ## mname;\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
192 goto _exception;\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
193 }
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
194
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
195
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
196 #define MethodDispatch(type_id,name,type_name) \
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
197 case type_id:\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
198 goto m_ ## name ## AT_ ## type_name;
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
199
11
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
200 #define NumParams
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
201 #define CallSpace
3021dac0d8f5 Stack unwind is so close I can almost taste it
Mike Pavone <pavone@retrodev.com>
parents: 9
diff changeset
202
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
203 #define Param(num,convtypeid) \
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
204 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
205 {\
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
206 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
207 goto _exception;\
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
208 }
8
8d74ef7fa357 Improved helper macros and added separate Rhope stack in runtime
Mike Pavone <pavone@retrodev.com>
parents: 7
diff changeset
209
12
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
210 #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
211 #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
212 #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
213 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
214 {\
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
215 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
216 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
217 }
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
218 #define Exception
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
219 #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
220 #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
221
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
222
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
223 #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
224
100
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
225 #define SetParam(num,value) cdata->params[num] = value;
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
226
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
227
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
228 #define VCRePrepCall(func,numparams,lastnumparams) \
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
229 if(numparams + ((t_Worker *)func)->payload.Count > lastnumparams)\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
230 {\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
231 temp_cdata = cdata->lastframe;\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
232 free_stack(ct, cdata);\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
233 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
234 }\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
235 vcparam_offset = 0;
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
236
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
237 #define VCPrepCall(func,numparams) \
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
238 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
239 vcparam_offset = 0;
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
240
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
241 #define VCSetParam(func,num,value) \
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
242 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
243 {\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
244 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
245 ++vcparam_offset;\
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 cdata->params[num+vcparam_offset] = value;\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
248 last_vcparam = num+vcparam_offset;
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 #define ValCall(tocall,numparams,resumeto,myname)\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
251 last_vcparam++;\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
252 while(last_vcparam < ((t_Worker *)tocall)->payload.Size)\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
253 {\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
254 if (((object **)(((t_Worker *)tocall)+1))[last_vcparam]) \
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
255 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
256 ++last_vcparam;\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
257 }\
74
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
258 cdata->func = RES_ ## resumeto ## _ ## myname;\
100
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
259 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
260 cdata->vars = lv_ ## myname;\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
261 func = ((t_Worker *)tocall)->payload.Index;\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
262 PAUSE_SELF
100
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
263
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
264 #define ValCallPostlude(resumeto,myname)\
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
265 r ## resumeto ## _ ## myname:\
74
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
266 my_cdata = cdata->lastframe;\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
267 RESUME_SELF\
100
f51c4c17457c Broken port of parser to compiler
Mike Pavone <pavone@retrodev.com>
parents: 85
diff changeset
268 lv_ ## myname = cdata->vars;
74
a844c623c7df Add support for Worker type
Mike Pavone <pavone@retrodev.com>
parents: 71
diff changeset
269
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
270
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
271 #define Call(tocall, numparams, resumeto, myname)\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
272 cdata->func = RES_ ## resumeto ## _ ## myname;\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
273 cdata->num_params = numparams;\
71
c40c3d399133 Add Int32@String and Get Char. Fix stack bug
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
274 cdata->vars = lv_ ## myname;\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
275 if(FUNC_ ## tocall == FUNC_ ## myname) {\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
276 PAUSE_SELF\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
277 AND_TOTAL\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
278 } 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
279 PAUSE_SELF\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
280 }\
59
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
281 goto sf_ ## tocall;\
4f1ae6eb71d8 Use replicated switch statement for returns and late-bound calls
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
282 r ## resumeto ## _ ## myname:\
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
283 my_cdata = cdata->lastframe;\
105
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
284 if(FUNC_ ## tocall == FUNC_ ## myname) {\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
285 RESUME_SELF\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
286 AND_RESUME_TOTAL\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
287 } 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
288 RESUME_SELF\
43cc42df26cc Various compiler improvements
Mike Pavone <pavone@retrodev.com>
parents: 101
diff changeset
289 }\
71
c40c3d399133 Add Int32@String and Get Char. Fix stack bug
Mike Pavone <pavone@retrodev.com>
parents: 66
diff changeset
290 lv_ ## myname = cdata->vars;
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
291
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
292
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
293 #define FreeCall\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
294 temp_cdata = cdata->lastframe;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
295 free_stack(ct, cdata);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
296 cdata = temp_cdata;
7
d61550e2c001 Added current work on new runtime
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
297
56
d2f9b0a9403d Initial experiment with goto and switch
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
298 #define FreeCallMethod(myname,mytype)\
57
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
299 temp_cdata = cdata->lastframe;\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
300 free_stack(ct, cdata);\
2174878a6e4b Avoid unnecessary nested switch
Mike Pavone <pavone@retrodev.com>
parents: 56
diff changeset
301 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
302 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
303
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
304 #define TPrepCall(callspace) \
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
305 func = cdata->lastframe->func;\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
306 temp_cdata = cdata->lastframe->lastframe;\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
307 free_stack(ct, cdata->lastframe);\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
308 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
309 cdata->func = func;
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
310
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
311 #define TCall(tocall, numparams)\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
312 cdata->num_params = numparams;\
fa24ef3b026f Added macro for tail calls with new C strategy
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
313 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
314
31f8182f3433 Finished fib test and did some small work on the c backend
Mike Pavone <pavone@retrodev.com>
parents: 11
diff changeset
315
66
d4b44ae2e34a New variant of C backend works now
Mike Pavone <pavone@retrodev.com>
parents: 65
diff changeset
316 #endif //_FUNC_H_