Mercurial > repos > rhope
annotate interp.h @ 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.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 06 Jul 2010 07:52:59 -0400 |
parents | 429b5f441381 |
children |
rev | line source |
---|---|
0 | 1 #ifndef _INTERP_H_ |
2 #define _INTERP_H_ | |
3 | |
4 #ifdef WIN32 | |
5 #include <windows.h> | |
6 #endif | |
7 | |
8 #ifndef BOOL | |
9 #define BOOL short | |
10 #define TRUE 1 | |
11 #define FALSE 0 | |
12 #endif | |
13 | |
14 #ifndef DWORD | |
15 #define DWORD unsigned long | |
16 #endif | |
17 | |
18 #ifndef WINAPI | |
19 #define WINAPI | |
20 #endif | |
21 | |
22 #ifndef LPVOID | |
23 #define LPVOID void * | |
24 #endif | |
25 #ifndef NULL | |
26 #define NULL 0 | |
27 #endif | |
28 #include "vis_threading.h" | |
29 #include "structs.h" | |
30 #include "debugmacros.h" | |
31 | |
32 #define CONSTANT 0 | |
33 #define ROOM 1 | |
34 #define WORKER 2 | |
35 #define INPUT 3 | |
36 #define OUTPUT 4 | |
37 #define SET_COMP 5 | |
38 #define GET_COMP 6 | |
39 #define SET_GLOBAL 7 | |
40 #define GET_GLOBAL 8 | |
41 #define TAIL_CALL 9 | |
42 #define TAIL_RECURSE 10 | |
43 | |
44 #define RECTANGLE 1 | |
45 #define TRAPEZOID 2 | |
46 | |
47 | |
48 #define WORKER_TYPE 0 | |
49 #define MAGIC_TYPE 1 | |
50 #define USER_FLAG 0x8000 | |
51 #define TYPE_MASK 0xFF | |
52 | |
30
914ad38f9b59
Compiler now works for some simple programs
Mike Pavone <pavone@retrodev.com>
parents:
29
diff
changeset
|
53 #define START_COMP_STORAGE 128 |
0 | 54 #define START_DEF_STORAGE 100 |
55 | |
56 #ifdef CPLUSPLUS | |
57 extern "C" { | |
58 #endif | |
59 | |
60 //extern company companylist[]; | |
61 //extern int num_companies; | |
62 extern BOOL execute_active; | |
63 extern int program_count; | |
64 VIS_EXTERN_CRITICAL_SECTION(program_count_lock) | |
65 | |
66 void main_callback(worker_instance * junkinst, int junk, worker_instance * main_instance, void * data); | |
67 | |
68 void optimize(worker_def * def); | |
69 void run_optimized(worker_instance * instance, datum ** params); | |
70 datum * get_constant(char * value, int len, program * prog); | |
71 int execute_def(worker_def * process_def, queue_entry worker_entry, datum ** params, instance_callback callback); | |
72 int execute_def_data(worker_def * process_def, queue_entry worker_entry, datum ** params, instance_callback callback, void * data); | |
73 BOOL execute_def_wait(worker_def * def, datum ** params); | |
74 int process_worker(queue_entry aworker); | |
75 void initworkers(program * prog); | |
76 void initpredefworkers(program * prog); | |
77 DWORD WINAPI worker_thread(LPVOID param); | |
78 void interp_start(int num_threads, BOOL use_this_thread, int argc, char ** argv, program * initial_prog); | |
79 void interp_stop(); | |
80 void add_if_ready(int workerNum, worker_instance * instance); | |
81 void make_lookup_arrays(program * prog); | |
82 void def_make_lookup(worker_def * def); | |
83 queue_entry get_queue(); | |
84 void add_queue(int data, worker_instance * instance); | |
85 void add_multiple(int * data, int num, worker_instance * instance); | |
86 void init_sync_primitives(); | |
87 void init_global_storage(); | |
88 void pack_list_sub_callback(worker_instance * caller_instance, int caller_workernum, worker_instance * done_instance, void * data); | |
89 worker_def * find_method(int type, char * name, int num_inputs, program * prog); | |
90 worker_def * find_method_noinputcheck(int type, char * name, program * prog); | |
91 worker_def * find_converter_method(int totype, int fromtype, program * prog); | |
92 | |
93 //doesn't belong here, but because of include order issues I can't put it in datum.h | |
94 datum * new_datum_comp(company * comp, unsigned char union_type, int generic_len); | |
95 | |
96 void vis_window_init(); //defined in window.cpp | |
97 | |
31
fab5bb137cf9
Added Unix Time worker to interpreter
Mike Pavone <pavone@retrodev.com>
parents:
29
diff
changeset
|
98 int unix_time(datum ** inputlist, queue_entry * worker_entry); |
0 | 99 int vis_random(datum ** inputlist, queue_entry * worker_entry); |
100 int vis_print(datum ** inputlist, queue_entry * worker_entry); | |
101 int vis_build(datum ** inputlist, queue_entry * worker_entry); | |
102 int vis_end(datum ** inputlist, queue_entry * worker_entry); | |
103 int vis_append(datum ** inputlist, queue_entry * worker_entry); | |
104 int vis_getinput(datum ** inputlist, queue_entry * worker_entry); | |
105 int vis_stringtoint(datum ** inputlist, queue_entry * worker_entry); | |
106 int vis_string_get_dstring(datum ** inputlist, queue_entry * worker_entry); | |
107 int vis_whole_add(datum ** inputlist, queue_entry * worker_entry); | |
108 int vis_whole_fromhex(datum ** inputlist, queue_entry * worker_entry); | |
109 int vis_whole_subtract(datum ** inputlist, queue_entry * worker_entry); | |
110 int vis_whole_mult(datum ** inputlist, queue_entry * worker_entry); | |
111 int vis_whole_div(datum ** inputlist, queue_entry * worker_entry); | |
112 int vis_whole_or(datum ** inputlist, queue_entry * worker_entry); | |
113 int vis_whole_and(datum ** inputlist, queue_entry * worker_entry); | |
114 int vis_whole_lsh(datum ** inputlist, queue_entry * worker_entry); | |
115 int vis_whole_rsh(datum ** inputlist, queue_entry * worker_entry); | |
46 | 116 int vis_whole_modulus(datum ** inputlist, queue_entry * worker_entry); |
0 | 117 int vis_inttostring(datum ** inputlist, queue_entry * worker_entry); |
118 int vis_stringequal(datum ** inputlist, queue_entry * worker_entry); | |
119 int vis_string_split(datum ** inputlist, queue_entry * worker_entry); | |
120 int vis_string_get_raw(datum ** inputlist, queue_entry * worker_entry); | |
121 int vis_string_put_raw(datum ** inputlist, queue_entry * worker_entry); | |
122 int vis_string_slice(datum ** inputlist, queue_entry * worker_entry); | |
123 int vis_string_reverse(datum ** inputlist, queue_entry * worker_entry); | |
124 int vis_string_length(datum ** inputlist, queue_entry * worker_entry); | |
125 int vis_string_put_byte(datum ** inputlist, queue_entry * worker_entry); | |
126 int vis_wholeequal(datum ** inputlist, queue_entry * worker_entry); | |
127 int vis_if(datum ** inputlist, queue_entry * worker_entry); | |
128 int vis_yesnotostring(datum ** inputlist, queue_entry * worker_entry); | |
129 int vis_greaterint(datum ** inputlist, queue_entry * worker_entry); | |
130 int vis_lesserint(datum ** inputlist, queue_entry * worker_entry); | |
131 int vis_greaterstring(datum ** inputlist, queue_entry * worker_entry); | |
132 int vis_lesserstring(datum ** inputlist, queue_entry * worker_entry); | |
133 int vis_stringtoreal(datum ** inputlist, queue_entry * worker_entry); | |
134 int vis_real_add(datum ** inputlist, queue_entry * worker_entry); | |
135 int vis_real_subtract(datum ** inputlist, queue_entry * worker_entry); | |
136 int vis_realequal(datum ** inputlist, queue_entry * worker_entry); | |
137 int vis_greaterreal(datum ** inputlist, queue_entry * worker_entry); | |
138 int vis_lesserreal(datum ** inputlist, queue_entry * worker_entry); | |
139 int vis_realtostring(datum ** inputlist, queue_entry * worker_entry); | |
46 | 140 int vis_whole_fromreal(datum ** inputlist, queue_entry * worker_entry); |
141 int vis_real_fromwhole(datum ** inputlist, queue_entry * worker_entry); | |
0 | 142 //Index, Append, Swap, Insert, Remove, Set, Length, New |
143 int vis_list_index(datum ** inputlist, queue_entry * worker_entry); | |
144 int vis_list_append(datum ** inputlist, queue_entry * worker_entry); | |
145 int vis_list_swap(datum ** inputlist, queue_entry * worker_entry); | |
146 int vis_list_insert(datum ** inputlist, queue_entry * worker_entry); | |
147 int vis_list_remove(datum ** inputlist, queue_entry * worker_entry); | |
148 int vis_list_set(datum ** inputlist, queue_entry * worker_entry); | |
149 int vis_list_length(datum ** inputlist, queue_entry * worker_entry); | |
150 int vis_list_new(datum ** inputlist, queue_entry * worker_entry); | |
151 int vis_list_first(datum ** inputlist, queue_entry * worker_entry); | |
152 int vis_list_next(datum ** inputlist, queue_entry * worker_entry); | |
153 int vis_dict_index(datum ** inputlist, queue_entry * worker_entry); | |
154 int vis_dict_swap(datum ** inputlist, queue_entry * worker_entry); | |
155 int vis_dict_remove(datum ** inputlist, queue_entry * worker_entry); | |
156 int vis_dict_set(datum ** inputlist, queue_entry * worker_entry); | |
157 int vis_dict_length(datum ** inputlist, queue_entry * worker_entry); | |
158 int vis_dict_new(datum ** inputlist, queue_entry * worker_entry); | |
159 int vis_dict_first(datum ** inputlist, queue_entry * worker_entry); | |
160 int vis_dict_next(datum ** inputlist, queue_entry * worker_entry); | |
161 int vis_file_from_string(datum ** inputlist, queue_entry * worker_entry); | |
162 int vis_file_get_fstring(datum ** inputlist, queue_entry * worker_entry); | |
163 int vis_file_get_dstring(datum ** inputlist, queue_entry * worker_entry); | |
164 int vis_file_get_byte(datum ** inputlist, queue_entry * worker_entry); | |
165 int vis_file_get_word(datum ** inputlist, queue_entry * worker_entry); | |
166 int vis_file_get_long(datum ** inputlist, queue_entry * worker_entry); | |
26 | 167 int vis_file_get_double(datum ** inputlist, queue_entry * worker_entry); |
0 | 168 int vis_file_put_string(datum ** inputlist, queue_entry * worker_entry); |
169 int vis_file_length(datum ** inputlist, queue_entry * worker_entry); | |
170 int vis_worker_from_string(datum ** inputlist, queue_entry * worker_entry); | |
171 int vis_worker_do(datum ** inputlist, queue_entry * worker_entry); | |
172 int vis_worker_setinput(datum ** inputlist, queue_entry * worker_entry); | |
173 int vis_window_new(datum ** inputlist, queue_entry * worker_entry); | |
174 int vis_window_add_widget(datum ** inputlist, queue_entry * worker_entry); | |
175 int vis_window_show(datum ** inputlist, queue_entry * worker_entry); | |
176 int vis_window_wait_close(datum ** inputlist, queue_entry * worker_entry); | |
177 int vis_window_get_value(datum ** inputlist, queue_entry * worker_entry); | |
178 int vis_window_set_value(datum ** inputlist, queue_entry * worker_entry); | |
179 int vis_window_shown_addwidget(datum ** inputlist, queue_entry * worker_entry); | |
180 int vis_worker_add_worker_call(datum ** inputlist, queue_entry * worker_entry); | |
181 int vis_worker_add_wire(datum ** inputlist, queue_entry * worker_entry); | |
182 int vis_worker_add_constant(datum ** inputlist, queue_entry * worker_entry); | |
183 int vis_worker_add_input(datum ** inputlist, queue_entry * worker_entry); | |
184 int vis_worker_add_output(datum ** inputlist, queue_entry * worker_entry); | |
185 int vis_worker_add_globalget(datum ** inputlist, queue_entry * worker_entry); | |
186 int vis_worker_add_globalset(datum ** inputlist, queue_entry * worker_entry); | |
187 int vis_worker_clear(datum ** inputlist, queue_entry * worker_entry); | |
188 int vis_worker_uses(datum ** inputlist, queue_entry * worker_entry); | |
189 int vis_worker_new(datum ** inputlist, queue_entry * worker_entry); | |
190 int vis_worker_setio_counts(datum ** inputlist, queue_entry * worker_entry); | |
191 int vis_program_run(datum ** inputlist, queue_entry * worker_entry); | |
192 int vis_program_add_builtins(datum ** inputlist, queue_entry * worker_entry); | |
193 int vis_program_new_worker(datum ** inputlist, queue_entry * worker_entry); | |
194 int vis_program_new(datum ** inputlist, queue_entry * worker_entry); | |
195 int vis_program_find_worker(datum ** inputlist, queue_entry * worker_entry); | |
196 int vis_program_add_worker(datum ** inputlist, queue_entry * worker_entry); | |
197 int vis_button_new(datum ** inputlist, queue_entry * worker_entry); | |
198 int vis_button_set_handler(datum ** inputlist, queue_entry * worker_entry); | |
199 int vis_inputbox_new(datum ** inputlist, queue_entry * worker_entry); | |
200 int vis_inputbox_settype(datum ** inputlist, queue_entry * worker_entry); | |
201 int net_client_new(datum ** params, queue_entry * worker_entry); | |
202 int net_client_put_string(datum ** params, queue_entry * worker_entry); | |
203 int net_client_get_fstring(datum ** params, queue_entry * worker_entry); | |
204 int net_client_get_dstring(datum ** params, queue_entry * worker_entry); | |
205 int net_client_put_raw(datum ** params, queue_entry * worker_entry); | |
206 int net_client_get_raw(datum ** params, queue_entry * worker_entry); | |
207 int vis_net_listenport(datum ** params, queue_entry * worker_entry); | |
208 int vis_wait_forever(datum ** params, queue_entry * worker_entry); | |
209 int vis_screen_custom_defaultpaint(datum ** params, queue_entry * entry); | |
210 int vis_screen_custom_drawline(datum ** params, queue_entry * entry); | |
211 int vis_screen_custom_drawstring(datum ** params, queue_entry * entry); | |
212 int vis_screen_custom_setdrawcolor(datum ** params, queue_entry * entry); | |
213 int vis_screen_custom_moveby(datum ** params, queue_entry * entry); | |
214 int vis_screen_custom_sethandler(datum ** params, queue_entry * entry); | |
215 int vis_screen_custom_removehandler(datum ** params, queue_entry * entry); | |
216 int vis_screen_custom_givefocus(datum ** params, queue_entry * entry); | |
217 int vis_screen_custom_addwidget(datum ** params, queue_entry * entry); | |
218 int vis_screen_custom_getwindow(datum ** params, queue_entry * entry); | |
219 int vis_customwidget_new(datum ** inputlist, queue_entry * worker_entry); | |
220 int vis_checkbox_new(datum ** params, queue_entry * entry); | |
221 int vis_dropdown_new(datum ** params, queue_entry * entry); | |
222 int vis_dropdown_settext(datum ** params, queue_entry * entry); | |
223 int vis_dropdown_select(datum ** params, queue_entry * entry); | |
224 int vis_buffer_new(datum ** params, queue_entry * entry); | |
225 int vis_buffer_lock(datum ** params, queue_entry * entry); | |
226 int vis_buffer_unlock(datum ** params, queue_entry * entry); | |
227 int vis_buffer_putbyte(datum ** params, queue_entry * entry); | |
228 int vis_buffer_writebyte(datum ** params, queue_entry * entry); | |
229 int vis_buffer_putshort(datum ** params, queue_entry * entry); | |
230 int vis_buffer_writeshort(datum ** params, queue_entry * entry); | |
231 int vis_buffer_putlong(datum ** params, queue_entry * entry); | |
232 int vis_buffer_writelong(datum ** params, queue_entry * entry); | |
233 int vis_buffer_reset(datum ** params, queue_entry * entry); | |
234 int vis_buffer_fromaddress(datum ** params, queue_entry * entry); | |
235 int init_global_store(datum ** params, queue_entry * worker_entry); | |
236 int vis_type_of(datum ** params, queue_entry * worker_entry); | |
237 int vis_real_div(datum ** inputlist, queue_entry * worker_entry); | |
29
3cc5e4a42344
Missed registration for *@Real Number in previous commit
Mike Pavone <pavone@retrodev.com>
parents:
28
diff
changeset
|
238 int vis_real_mult(datum ** inputlist, queue_entry * worker_entry); |
28
d8b4d38fceb6
Merged in the worker registration code for the math functions added for ICFP 08
Mike Pavone <pavone@retrodev.com>
parents:
26
diff
changeset
|
239 int vis_real_cos(datum ** inputlist, queue_entry * worker_entry); |
d8b4d38fceb6
Merged in the worker registration code for the math functions added for ICFP 08
Mike Pavone <pavone@retrodev.com>
parents:
26
diff
changeset
|
240 int vis_real_sin(datum ** inputlist, queue_entry * worker_entry); |
d8b4d38fceb6
Merged in the worker registration code for the math functions added for ICFP 08
Mike Pavone <pavone@retrodev.com>
parents:
26
diff
changeset
|
241 int vis_real_tan(datum ** inputlist, queue_entry * worker_entry); |
d8b4d38fceb6
Merged in the worker registration code for the math functions added for ICFP 08
Mike Pavone <pavone@retrodev.com>
parents:
26
diff
changeset
|
242 int vis_real_arccos(datum ** inputlist, queue_entry * worker_entry); |
d8b4d38fceb6
Merged in the worker registration code for the math functions added for ICFP 08
Mike Pavone <pavone@retrodev.com>
parents:
26
diff
changeset
|
243 int vis_real_arcsin(datum ** inputlist, queue_entry * worker_entry); |
d8b4d38fceb6
Merged in the worker registration code for the math functions added for ICFP 08
Mike Pavone <pavone@retrodev.com>
parents:
26
diff
changeset
|
244 int vis_real_arctan(datum ** inputlist, queue_entry * worker_entry); |
d8b4d38fceb6
Merged in the worker registration code for the math functions added for ICFP 08
Mike Pavone <pavone@retrodev.com>
parents:
26
diff
changeset
|
245 int vis_real_exp(datum ** inputlist, queue_entry * workere_entry); |
d8b4d38fceb6
Merged in the worker registration code for the math functions added for ICFP 08
Mike Pavone <pavone@retrodev.com>
parents:
26
diff
changeset
|
246 int vis_real_sqrt(datum ** inputlist, queue_entry * worker_entry); |
0 | 247 int vis_clear_handler(datum ** params, queue_entry * entry); |
248 int vis_register_handler(datum ** params, queue_entry * entry); | |
249 int vis_held_keys(datum ** params, queue_entry * worker_entry); | |
250 int vis_touch_position(datum ** params, queue_entry * worker_entry); | |
251 int vis_blueprint_new(datum ** params, queue_entry * entry); | |
252 int vis_blueprint_addfield(datum ** params, queue_entry * entry); | |
253 int vis_blueprint_name(datum ** params, queue_entry * entry); | |
254 int vis_blueprint_getfields(datum ** params, queue_entry * entry); | |
255 int vis_get_blueprint(datum ** params, queue_entry * entry); | |
256 int vis_get_field(datum ** params, queue_entry * entry); | |
257 int vis_set_field(datum ** params, queue_entry * entry); | |
258 int vis_program_newblueprint(datum ** params, queue_entry * entry); | |
259 int vis_worker_add_objectset(datum ** inputlist, queue_entry * worker_entry); | |
260 int vis_worker_add_objectget(datum ** inputlist, queue_entry * worker_entry); | |
261 | |
262 datum * make_string(const char * string, int len, program * prog); | |
263 void close_sync_primitives(); | |
264 void vis_window_closed(datum * window_datum); | |
265 void cleanup_check(queue_entry aworker); | |
266 void cleanup_custom_worker(worker_instance * instance, int worker_num); | |
267 void process_outputs(datum ** params, int aworker, worker_instance * instance); | |
268 void worker_complete(queue_entry aworker); | |
269 void test_virtual(); | |
270 datum * create_dict(program * prog); | |
271 datum * create_list(program * prog); | |
272 int worker_populate_inputs(datum * inputWorker, datum * ioList, datum ** inputlist); | |
273 void run_queued_irqs(); | |
274 void prep_program(program * prog); | |
275 void add_program_ref(program * prog); | |
276 void release_program_ref(program * prog); | |
277 | |
278 extern int irq_queue_count; | |
279 | |
280 #ifdef ENABLE_PROFILING | |
281 #define NUM_PROFS 33 | |
282 | |
283 extern __int64 vis_profile_start_times[NUM_PROFS]; | |
284 extern __int64 vis_profile_running_total[NUM_PROFS]; | |
285 extern int vis_profile_counts[NUM_PROFS]; | |
286 unsigned __int64 __cdecl rdtsc(void); | |
287 | |
288 #define VIS_PROFILE_START(index) vis_profile_start_times[index] = rdtsc() | |
289 #define VIS_PROFILE_END(index) vis_profile_running_total[index] += (rdtsc()-vis_profile_start_times[index]); ++vis_profile_counts[index] | |
290 | |
291 #define PROF_ADDREF 29 | |
292 #define PROF_RELEASE 30 | |
293 #define PROF_NEW_DATUM 31 | |
294 #define PROF_DATUM_ALLOC 32 | |
295 | |
296 #else | |
297 #define VIS_PROFILE_START(index) | |
298 #define VIS_PROFILE_END(index) | |
299 #endif | |
300 | |
301 | |
302 #ifdef CPLUSPLUS | |
303 } | |
304 #endif | |
305 | |
306 | |
307 #endif //_INTERP_H_ | |
308 | |
309 | |
310 | |
311 | |
312 | |
313 | |
314 | |
315 | |
316 | |
317 | |
318 | |
319 | |
320 | |
321 | |
322 | |
323 |