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
|
|
53 #define START_COMP_STORAGE 40
|
|
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
|
|
98 int vis_random(datum ** inputlist, queue_entry * worker_entry);
|
|
99 int vis_print(datum ** inputlist, queue_entry * worker_entry);
|
|
100 int vis_build(datum ** inputlist, queue_entry * worker_entry);
|
|
101 int vis_end(datum ** inputlist, queue_entry * worker_entry);
|
|
102 int vis_append(datum ** inputlist, queue_entry * worker_entry);
|
|
103 int vis_getinput(datum ** inputlist, queue_entry * worker_entry);
|
|
104 int vis_stringtoint(datum ** inputlist, queue_entry * worker_entry);
|
|
105 int vis_string_get_dstring(datum ** inputlist, queue_entry * worker_entry);
|
|
106 int vis_whole_add(datum ** inputlist, queue_entry * worker_entry);
|
|
107 int vis_whole_fromhex(datum ** inputlist, queue_entry * worker_entry);
|
|
108 int vis_whole_subtract(datum ** inputlist, queue_entry * worker_entry);
|
|
109 int vis_whole_mult(datum ** inputlist, queue_entry * worker_entry);
|
|
110 int vis_whole_div(datum ** inputlist, queue_entry * worker_entry);
|
|
111 int vis_whole_or(datum ** inputlist, queue_entry * worker_entry);
|
|
112 int vis_whole_and(datum ** inputlist, queue_entry * worker_entry);
|
|
113 int vis_whole_lsh(datum ** inputlist, queue_entry * worker_entry);
|
|
114 int vis_whole_rsh(datum ** inputlist, queue_entry * worker_entry);
|
|
115 int vis_inttostring(datum ** inputlist, queue_entry * worker_entry);
|
|
116 int vis_stringequal(datum ** inputlist, queue_entry * worker_entry);
|
|
117 int vis_string_split(datum ** inputlist, queue_entry * worker_entry);
|
|
118 int vis_string_get_raw(datum ** inputlist, queue_entry * worker_entry);
|
|
119 int vis_string_put_raw(datum ** inputlist, queue_entry * worker_entry);
|
|
120 int vis_string_slice(datum ** inputlist, queue_entry * worker_entry);
|
|
121 int vis_string_reverse(datum ** inputlist, queue_entry * worker_entry);
|
|
122 int vis_string_length(datum ** inputlist, queue_entry * worker_entry);
|
|
123 int vis_string_put_byte(datum ** inputlist, queue_entry * worker_entry);
|
|
124 int vis_wholeequal(datum ** inputlist, queue_entry * worker_entry);
|
|
125 int vis_if(datum ** inputlist, queue_entry * worker_entry);
|
|
126 int vis_yesnotostring(datum ** inputlist, queue_entry * worker_entry);
|
|
127 int vis_greaterint(datum ** inputlist, queue_entry * worker_entry);
|
|
128 int vis_lesserint(datum ** inputlist, queue_entry * worker_entry);
|
|
129 int vis_greaterstring(datum ** inputlist, queue_entry * worker_entry);
|
|
130 int vis_lesserstring(datum ** inputlist, queue_entry * worker_entry);
|
|
131 int vis_stringtoreal(datum ** inputlist, queue_entry * worker_entry);
|
|
132 int vis_real_add(datum ** inputlist, queue_entry * worker_entry);
|
|
133 int vis_real_subtract(datum ** inputlist, queue_entry * worker_entry);
|
|
134 int vis_realequal(datum ** inputlist, queue_entry * worker_entry);
|
|
135 int vis_greaterreal(datum ** inputlist, queue_entry * worker_entry);
|
|
136 int vis_lesserreal(datum ** inputlist, queue_entry * worker_entry);
|
|
137 int vis_realtostring(datum ** inputlist, queue_entry * worker_entry);
|
|
138 //Index, Append, Swap, Insert, Remove, Set, Length, New
|
|
139 int vis_list_index(datum ** inputlist, queue_entry * worker_entry);
|
|
140 int vis_list_append(datum ** inputlist, queue_entry * worker_entry);
|
|
141 int vis_list_swap(datum ** inputlist, queue_entry * worker_entry);
|
|
142 int vis_list_insert(datum ** inputlist, queue_entry * worker_entry);
|
|
143 int vis_list_remove(datum ** inputlist, queue_entry * worker_entry);
|
|
144 int vis_list_set(datum ** inputlist, queue_entry * worker_entry);
|
|
145 int vis_list_length(datum ** inputlist, queue_entry * worker_entry);
|
|
146 int vis_list_new(datum ** inputlist, queue_entry * worker_entry);
|
|
147 int vis_list_first(datum ** inputlist, queue_entry * worker_entry);
|
|
148 int vis_list_next(datum ** inputlist, queue_entry * worker_entry);
|
|
149 int vis_dict_index(datum ** inputlist, queue_entry * worker_entry);
|
|
150 int vis_dict_swap(datum ** inputlist, queue_entry * worker_entry);
|
|
151 int vis_dict_remove(datum ** inputlist, queue_entry * worker_entry);
|
|
152 int vis_dict_set(datum ** inputlist, queue_entry * worker_entry);
|
|
153 int vis_dict_length(datum ** inputlist, queue_entry * worker_entry);
|
|
154 int vis_dict_new(datum ** inputlist, queue_entry * worker_entry);
|
|
155 int vis_dict_first(datum ** inputlist, queue_entry * worker_entry);
|
|
156 int vis_dict_next(datum ** inputlist, queue_entry * worker_entry);
|
|
157 int vis_file_from_string(datum ** inputlist, queue_entry * worker_entry);
|
|
158 int vis_file_get_fstring(datum ** inputlist, queue_entry * worker_entry);
|
|
159 int vis_file_get_dstring(datum ** inputlist, queue_entry * worker_entry);
|
|
160 int vis_file_get_byte(datum ** inputlist, queue_entry * worker_entry);
|
|
161 int vis_file_get_word(datum ** inputlist, queue_entry * worker_entry);
|
|
162 int vis_file_get_long(datum ** inputlist, queue_entry * worker_entry);
|
|
163 int vis_file_put_string(datum ** inputlist, queue_entry * worker_entry);
|
|
164 int vis_file_length(datum ** inputlist, queue_entry * worker_entry);
|
|
165 int vis_worker_from_string(datum ** inputlist, queue_entry * worker_entry);
|
|
166 int vis_worker_do(datum ** inputlist, queue_entry * worker_entry);
|
|
167 int vis_worker_setinput(datum ** inputlist, queue_entry * worker_entry);
|
|
168 int vis_window_new(datum ** inputlist, queue_entry * worker_entry);
|
|
169 int vis_window_add_widget(datum ** inputlist, queue_entry * worker_entry);
|
|
170 int vis_window_show(datum ** inputlist, queue_entry * worker_entry);
|
|
171 int vis_window_wait_close(datum ** inputlist, queue_entry * worker_entry);
|
|
172 int vis_window_get_value(datum ** inputlist, queue_entry * worker_entry);
|
|
173 int vis_window_set_value(datum ** inputlist, queue_entry * worker_entry);
|
|
174 int vis_window_shown_addwidget(datum ** inputlist, queue_entry * worker_entry);
|
|
175 int vis_worker_add_worker_call(datum ** inputlist, queue_entry * worker_entry);
|
|
176 int vis_worker_add_wire(datum ** inputlist, queue_entry * worker_entry);
|
|
177 int vis_worker_add_constant(datum ** inputlist, queue_entry * worker_entry);
|
|
178 int vis_worker_add_input(datum ** inputlist, queue_entry * worker_entry);
|
|
179 int vis_worker_add_output(datum ** inputlist, queue_entry * worker_entry);
|
|
180 int vis_worker_add_globalget(datum ** inputlist, queue_entry * worker_entry);
|
|
181 int vis_worker_add_globalset(datum ** inputlist, queue_entry * worker_entry);
|
|
182 int vis_worker_clear(datum ** inputlist, queue_entry * worker_entry);
|
|
183 int vis_worker_uses(datum ** inputlist, queue_entry * worker_entry);
|
|
184 int vis_worker_new(datum ** inputlist, queue_entry * worker_entry);
|
|
185 int vis_worker_setio_counts(datum ** inputlist, queue_entry * worker_entry);
|
|
186 int vis_program_run(datum ** inputlist, queue_entry * worker_entry);
|
|
187 int vis_program_add_builtins(datum ** inputlist, queue_entry * worker_entry);
|
|
188 int vis_program_new_worker(datum ** inputlist, queue_entry * worker_entry);
|
|
189 int vis_program_new(datum ** inputlist, queue_entry * worker_entry);
|
|
190 int vis_program_find_worker(datum ** inputlist, queue_entry * worker_entry);
|
|
191 int vis_program_add_worker(datum ** inputlist, queue_entry * worker_entry);
|
|
192 int vis_button_new(datum ** inputlist, queue_entry * worker_entry);
|
|
193 int vis_button_set_handler(datum ** inputlist, queue_entry * worker_entry);
|
|
194 int vis_inputbox_new(datum ** inputlist, queue_entry * worker_entry);
|
|
195 int vis_inputbox_settype(datum ** inputlist, queue_entry * worker_entry);
|
|
196 int net_client_new(datum ** params, queue_entry * worker_entry);
|
|
197 int net_client_put_string(datum ** params, queue_entry * worker_entry);
|
|
198 int net_client_get_fstring(datum ** params, queue_entry * worker_entry);
|
|
199 int net_client_get_dstring(datum ** params, queue_entry * worker_entry);
|
|
200 int net_client_put_raw(datum ** params, queue_entry * worker_entry);
|
|
201 int net_client_get_raw(datum ** params, queue_entry * worker_entry);
|
|
202 int vis_net_listenport(datum ** params, queue_entry * worker_entry);
|
|
203 int vis_wait_forever(datum ** params, queue_entry * worker_entry);
|
|
204 int vis_screen_custom_defaultpaint(datum ** params, queue_entry * entry);
|
|
205 int vis_screen_custom_drawline(datum ** params, queue_entry * entry);
|
|
206 int vis_screen_custom_drawstring(datum ** params, queue_entry * entry);
|
|
207 int vis_screen_custom_setdrawcolor(datum ** params, queue_entry * entry);
|
|
208 int vis_screen_custom_moveby(datum ** params, queue_entry * entry);
|
|
209 int vis_screen_custom_sethandler(datum ** params, queue_entry * entry);
|
|
210 int vis_screen_custom_removehandler(datum ** params, queue_entry * entry);
|
|
211 int vis_screen_custom_givefocus(datum ** params, queue_entry * entry);
|
|
212 int vis_screen_custom_addwidget(datum ** params, queue_entry * entry);
|
|
213 int vis_screen_custom_getwindow(datum ** params, queue_entry * entry);
|
|
214 int vis_customwidget_new(datum ** inputlist, queue_entry * worker_entry);
|
|
215 int vis_checkbox_new(datum ** params, queue_entry * entry);
|
|
216 int vis_dropdown_new(datum ** params, queue_entry * entry);
|
|
217 int vis_dropdown_settext(datum ** params, queue_entry * entry);
|
|
218 int vis_dropdown_select(datum ** params, queue_entry * entry);
|
|
219 int vis_buffer_new(datum ** params, queue_entry * entry);
|
|
220 int vis_buffer_lock(datum ** params, queue_entry * entry);
|
|
221 int vis_buffer_unlock(datum ** params, queue_entry * entry);
|
|
222 int vis_buffer_putbyte(datum ** params, queue_entry * entry);
|
|
223 int vis_buffer_writebyte(datum ** params, queue_entry * entry);
|
|
224 int vis_buffer_putshort(datum ** params, queue_entry * entry);
|
|
225 int vis_buffer_writeshort(datum ** params, queue_entry * entry);
|
|
226 int vis_buffer_putlong(datum ** params, queue_entry * entry);
|
|
227 int vis_buffer_writelong(datum ** params, queue_entry * entry);
|
|
228 int vis_buffer_reset(datum ** params, queue_entry * entry);
|
|
229 int vis_buffer_fromaddress(datum ** params, queue_entry * entry);
|
|
230 int init_global_store(datum ** params, queue_entry * worker_entry);
|
|
231 int vis_type_of(datum ** params, queue_entry * worker_entry);
|
|
232 int vis_real_div(datum ** inputlist, queue_entry * worker_entry);
|
|
233 int vis_clear_handler(datum ** params, queue_entry * entry);
|
|
234 int vis_register_handler(datum ** params, queue_entry * entry);
|
|
235 int vis_held_keys(datum ** params, queue_entry * worker_entry);
|
|
236 int vis_touch_position(datum ** params, queue_entry * worker_entry);
|
|
237 int vis_blueprint_new(datum ** params, queue_entry * entry);
|
|
238 int vis_blueprint_addfield(datum ** params, queue_entry * entry);
|
|
239 int vis_blueprint_name(datum ** params, queue_entry * entry);
|
|
240 int vis_blueprint_getfields(datum ** params, queue_entry * entry);
|
|
241 int vis_get_blueprint(datum ** params, queue_entry * entry);
|
|
242 int vis_get_field(datum ** params, queue_entry * entry);
|
|
243 int vis_set_field(datum ** params, queue_entry * entry);
|
|
244 int vis_program_newblueprint(datum ** params, queue_entry * entry);
|
|
245 int vis_worker_add_objectset(datum ** inputlist, queue_entry * worker_entry);
|
|
246 int vis_worker_add_objectget(datum ** inputlist, queue_entry * worker_entry);
|
|
247
|
|
248 datum * make_string(const char * string, int len, program * prog);
|
|
249 void close_sync_primitives();
|
|
250 void vis_window_closed(datum * window_datum);
|
|
251 void cleanup_check(queue_entry aworker);
|
|
252 void cleanup_custom_worker(worker_instance * instance, int worker_num);
|
|
253 void process_outputs(datum ** params, int aworker, worker_instance * instance);
|
|
254 void worker_complete(queue_entry aworker);
|
|
255 void test_virtual();
|
|
256 datum * create_dict(program * prog);
|
|
257 datum * create_list(program * prog);
|
|
258 int worker_populate_inputs(datum * inputWorker, datum * ioList, datum ** inputlist);
|
|
259 void run_queued_irqs();
|
|
260 void prep_program(program * prog);
|
|
261 void add_program_ref(program * prog);
|
|
262 void release_program_ref(program * prog);
|
|
263
|
|
264 extern int irq_queue_count;
|
|
265
|
|
266 #ifdef ENABLE_PROFILING
|
|
267 #define NUM_PROFS 33
|
|
268
|
|
269 extern __int64 vis_profile_start_times[NUM_PROFS];
|
|
270 extern __int64 vis_profile_running_total[NUM_PROFS];
|
|
271 extern int vis_profile_counts[NUM_PROFS];
|
|
272 unsigned __int64 __cdecl rdtsc(void);
|
|
273
|
|
274 #define VIS_PROFILE_START(index) vis_profile_start_times[index] = rdtsc()
|
|
275 #define VIS_PROFILE_END(index) vis_profile_running_total[index] += (rdtsc()-vis_profile_start_times[index]); ++vis_profile_counts[index]
|
|
276
|
|
277 #define PROF_ADDREF 29
|
|
278 #define PROF_RELEASE 30
|
|
279 #define PROF_NEW_DATUM 31
|
|
280 #define PROF_DATUM_ALLOC 32
|
|
281
|
|
282 #else
|
|
283 #define VIS_PROFILE_START(index)
|
|
284 #define VIS_PROFILE_END(index)
|
|
285 #endif
|
|
286
|
|
287
|
|
288 #ifdef CPLUSPLUS
|
|
289 }
|
|
290 #endif
|
|
291
|
|
292
|
|
293 #endif //_INTERP_H_
|
|
294
|
|
295
|
|
296
|
|
297
|
|
298
|
|
299
|
|
300
|
|
301
|
|
302
|
|
303
|
|
304
|
|
305
|
|
306
|
|
307
|
|
308
|
|
309
|