Mercurial > repos > rhope
annotate interp.h @ 48:a24eb366195c
Fixed some bugs introduced in previous commit and moved definition of integer methods out of runtime and into the compiler
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 02 Mar 2010 00:18:49 -0500 |
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 |