dbghelp: While loading MSC debug info, don't handle public symbol at once, but delay...
[wine] / dlls / jscript / engine.c
1 /*
2  * Copyright 2008 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include "jscript.h"
20 #include "engine.h"
21
22 #include "wine/debug.h"
23
24 WINE_DEFAULT_DEBUG_CHANNEL(jscript);
25
26 static inline HRESULT stat_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
27 {
28     return stat->eval(ctx, stat, rt, ret);
29 }
30
31 HRESULT create_exec_ctx(exec_ctx_t **ret)
32 {
33     exec_ctx_t *ctx;
34
35     ctx = heap_alloc_zero(sizeof(exec_ctx_t));
36     if(!ctx)
37         return E_OUTOFMEMORY;
38
39     *ret = ctx;
40     return S_OK;
41 }
42
43 void exec_release(exec_ctx_t *ctx)
44 {
45     if(--ctx->ref)
46         return;
47
48     heap_free(ctx);
49 }
50
51 HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *source, jsexcept_t *ei, VARIANT *retv)
52 {
53     script_ctx_t *script = parser->script;
54     parser_ctx_t *prev_parser;
55     VARIANT val, tmp;
56     statement_t *stat;
57     exec_ctx_t *prev_ctx;
58     return_type_t rt;
59     HRESULT hres = S_OK;
60
61     prev_ctx = script->exec_ctx;
62     script->exec_ctx = ctx;
63
64     prev_parser = ctx->parser;
65     ctx->parser = parser;
66
67     V_VT(&val) = VT_EMPTY;
68     memset(&rt, 0, sizeof(rt));
69     rt.type = RT_NORMAL;
70
71     for(stat = source->statement; stat; stat = stat->next) {
72         hres = stat_eval(ctx, stat, &rt, &tmp);
73         if(FAILED(hres))
74             break;
75
76         VariantClear(&val);
77         val = tmp;
78         if(rt.type != RT_NORMAL)
79             break;
80     }
81
82     script->exec_ctx = prev_ctx;
83     ctx->parser = prev_parser;
84
85     if(rt.type != RT_NORMAL && rt.type != RT_RETURN) {
86         FIXME("wrong rt %d\n", rt.type);
87         hres = E_FAIL;
88     }
89
90     *ei = rt.ei;
91     if(FAILED(hres)) {
92         VariantClear(&val);
93         return hres;
94     }
95
96     if(retv)
97         *retv = val;
98     else
99         VariantClear(&val);
100     return S_OK;
101 }
102
103 HRESULT block_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
104 {
105     FIXME("\n");
106     return E_NOTIMPL;
107 }
108
109 HRESULT var_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
110 {
111     FIXME("\n");
112     return E_NOTIMPL;
113 }
114
115 HRESULT empty_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
116 {
117     TRACE("\n");
118
119     V_VT(ret) = VT_EMPTY;
120     return S_OK;
121 }
122
123 HRESULT expression_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
124 {
125     FIXME("\n");
126     return E_NOTIMPL;
127 }
128
129 HRESULT if_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
130 {
131     FIXME("\n");
132     return E_NOTIMPL;
133 }
134
135 HRESULT dowhile_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
136 {
137     FIXME("\n");
138     return E_NOTIMPL;
139 }
140
141 HRESULT while_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
142 {
143     FIXME("\n");
144     return E_NOTIMPL;
145 }
146
147 HRESULT for_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
148 {
149     FIXME("\n");
150     return E_NOTIMPL;
151 }
152
153 HRESULT forin_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
154 {
155     FIXME("\n");
156     return E_NOTIMPL;
157 }
158
159 HRESULT continue_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
160 {
161     FIXME("\n");
162     return E_NOTIMPL;
163 }
164
165 HRESULT break_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
166 {
167     FIXME("\n");
168     return E_NOTIMPL;
169 }
170
171 HRESULT return_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
172 {
173     FIXME("\n");
174     return E_NOTIMPL;
175 }
176
177 HRESULT with_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
178 {
179     FIXME("\n");
180     return E_NOTIMPL;
181 }
182
183 HRESULT labelled_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
184 {
185     FIXME("\n");
186     return E_NOTIMPL;
187 }
188
189 HRESULT switch_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
190 {
191     FIXME("\n");
192     return E_NOTIMPL;
193 }
194
195 HRESULT throw_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
196 {
197     FIXME("\n");
198     return E_NOTIMPL;
199 }
200
201 HRESULT try_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
202 {
203     FIXME("\n");
204     return E_NOTIMPL;
205 }
206
207 HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
208 {
209     FIXME("\n");
210     return E_NOTIMPL;
211 }
212
213 HRESULT conditional_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
214 {
215     FIXME("\n");
216     return E_NOTIMPL;
217 }
218
219 HRESULT array_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
220 {
221     FIXME("\n");
222     return E_NOTIMPL;
223 }
224
225 HRESULT member_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
226 {
227     FIXME("\n");
228     return E_NOTIMPL;
229 }
230
231 HRESULT member_new_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
232 {
233     FIXME("\n");
234     return E_NOTIMPL;
235 }
236
237 HRESULT call_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
238 {
239     FIXME("\n");
240     return E_NOTIMPL;
241 }
242
243 HRESULT this_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
244 {
245     FIXME("\n");
246     return E_NOTIMPL;
247 }
248
249 HRESULT identifier_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
250 {
251     FIXME("\n");
252     return E_NOTIMPL;
253 }
254
255 HRESULT literal_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
256 {
257     FIXME("\n");
258     return E_NOTIMPL;
259 }
260
261 HRESULT array_literal_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
262 {
263     FIXME("\n");
264     return E_NOTIMPL;
265 }
266
267 HRESULT property_value_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
268 {
269     FIXME("\n");
270     return E_NOTIMPL;
271 }
272
273 HRESULT comma_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
274 {
275     FIXME("\n");
276     return E_NOTIMPL;
277 }
278
279 HRESULT logical_or_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
280 {
281     FIXME("\n");
282     return E_NOTIMPL;
283 }
284
285 HRESULT logical_and_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
286 {
287     FIXME("\n");
288     return E_NOTIMPL;
289 }
290
291 HRESULT binary_or_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
292 {
293     FIXME("\n");
294     return E_NOTIMPL;
295 }
296
297 HRESULT binary_xor_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
298 {
299     FIXME("\n");
300     return E_NOTIMPL;
301 }
302
303 HRESULT binary_and_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
304 {
305     FIXME("\n");
306     return E_NOTIMPL;
307 }
308
309 HRESULT instanceof_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
310 {
311     FIXME("\n");
312     return E_NOTIMPL;
313 }
314
315 HRESULT in_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
316 {
317     FIXME("\n");
318     return E_NOTIMPL;
319 }
320
321 HRESULT add_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
322 {
323     FIXME("\n");
324     return E_NOTIMPL;
325 }
326
327 HRESULT sub_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
328 {
329     FIXME("\n");
330     return E_NOTIMPL;
331 }
332
333 HRESULT mul_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
334 {
335     FIXME("\n");
336     return E_NOTIMPL;
337 }
338
339 HRESULT div_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
340 {
341     FIXME("\n");
342     return E_NOTIMPL;
343 }
344
345 HRESULT mod_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
346 {
347     FIXME("\n");
348     return E_NOTIMPL;
349 }
350
351 HRESULT delete_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
352 {
353     FIXME("\n");
354     return E_NOTIMPL;
355 }
356
357 HRESULT void_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
358 {
359     FIXME("\n");
360     return E_NOTIMPL;
361 }
362
363 HRESULT typeof_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
364 {
365     FIXME("\n");
366     return E_NOTIMPL;
367 }
368
369 HRESULT minus_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
370 {
371     FIXME("\n");
372     return E_NOTIMPL;
373 }
374
375 HRESULT plus_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
376 {
377     FIXME("\n");
378     return E_NOTIMPL;
379 }
380
381 HRESULT post_increment_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
382 {
383     FIXME("\n");
384     return E_NOTIMPL;
385 }
386
387 HRESULT post_decrement_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
388 {
389     FIXME("\n");
390     return E_NOTIMPL;
391 }
392
393 HRESULT pre_increment_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
394 {
395     FIXME("\n");
396     return E_NOTIMPL;
397 }
398
399 HRESULT pre_decrement_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
400 {
401     FIXME("\n");
402     return E_NOTIMPL;
403 }
404
405 HRESULT new_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
406 {
407     FIXME("\n");
408     return E_NOTIMPL;
409 }
410
411 HRESULT equal_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
412 {
413     FIXME("\n");
414     return E_NOTIMPL;
415 }
416
417 HRESULT equal2_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
418 {
419     FIXME("\n");
420     return E_NOTIMPL;
421 }
422
423 HRESULT not_equal_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
424 {
425
426     FIXME("\n");
427     return E_NOTIMPL;
428 }
429
430 HRESULT not_equal2_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
431 {
432     FIXME("\n");
433     return E_NOTIMPL;
434 }
435
436 HRESULT less_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
437 {
438     FIXME("\n");
439     return E_NOTIMPL;
440 }
441
442 HRESULT lesseq_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
443 {
444     FIXME("\n");
445     return E_NOTIMPL;
446 }
447
448 HRESULT greater_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
449 {
450     FIXME("\n");
451     return E_NOTIMPL;
452 }
453
454 HRESULT greatereq_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
455 {
456     FIXME("\n");
457     return E_NOTIMPL;
458 }
459
460 HRESULT binary_negation_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
461 {
462     FIXME("\n");
463     return E_NOTIMPL;
464 }
465
466 HRESULT logical_negation_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
467 {
468     FIXME("\n");
469     return E_NOTIMPL;
470 }
471
472 HRESULT left_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
473 {
474     FIXME("\n");
475     return E_NOTIMPL;
476 }
477
478 HRESULT right_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
479 {
480     FIXME("\n");
481     return E_NOTIMPL;
482 }
483
484 HRESULT right2_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
485 {
486     FIXME("\n");
487     return E_NOTIMPL;
488 }
489
490 HRESULT assign_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
491 {
492     FIXME("\n");
493     return E_NOTIMPL;
494 }
495
496 HRESULT assign_lshift_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
497 {
498     FIXME("\n");
499     return E_NOTIMPL;
500 }
501
502 HRESULT assign_rshift_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
503 {
504     FIXME("\n");
505     return E_NOTIMPL;
506 }
507
508 HRESULT assign_rrshift_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
509 {
510     FIXME("\n");
511     return E_NOTIMPL;
512 }
513
514 HRESULT assign_add_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
515 {
516     FIXME("\n");
517     return E_NOTIMPL;
518 }
519
520 HRESULT assign_sub_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
521 {
522     FIXME("\n");
523     return E_NOTIMPL;
524 }
525
526 HRESULT assign_mul_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
527 {
528     FIXME("\n");
529     return E_NOTIMPL;
530 }
531
532 HRESULT assign_div_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
533 {
534     FIXME("\n");
535     return E_NOTIMPL;
536 }
537
538 HRESULT assign_mod_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
539 {
540     FIXME("\n");
541     return E_NOTIMPL;
542 }
543
544 HRESULT assign_and_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
545 {
546     FIXME("\n");
547     return E_NOTIMPL;
548 }
549
550 HRESULT assign_or_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
551 {
552     FIXME("\n");
553     return E_NOTIMPL;
554 }
555
556 HRESULT assign_xor_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
557 {
558     FIXME("\n");
559     return E_NOTIMPL;
560 }