jscript: Added IActiveScript::ParseScriptText implementation.
[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     FIXME("\n");
118     return E_NOTIMPL;
119 }
120
121 HRESULT expression_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
122 {
123     FIXME("\n");
124     return E_NOTIMPL;
125 }
126
127 HRESULT if_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
128 {
129     FIXME("\n");
130     return E_NOTIMPL;
131 }
132
133 HRESULT dowhile_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
134 {
135     FIXME("\n");
136     return E_NOTIMPL;
137 }
138
139 HRESULT while_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
140 {
141     FIXME("\n");
142     return E_NOTIMPL;
143 }
144
145 HRESULT for_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
146 {
147     FIXME("\n");
148     return E_NOTIMPL;
149 }
150
151 HRESULT forin_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
152 {
153     FIXME("\n");
154     return E_NOTIMPL;
155 }
156
157 HRESULT continue_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
158 {
159     FIXME("\n");
160     return E_NOTIMPL;
161 }
162
163 HRESULT break_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
164 {
165     FIXME("\n");
166     return E_NOTIMPL;
167 }
168
169 HRESULT return_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
170 {
171     FIXME("\n");
172     return E_NOTIMPL;
173 }
174
175 HRESULT with_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
176 {
177     FIXME("\n");
178     return E_NOTIMPL;
179 }
180
181 HRESULT labelled_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
182 {
183     FIXME("\n");
184     return E_NOTIMPL;
185 }
186
187 HRESULT switch_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
188 {
189     FIXME("\n");
190     return E_NOTIMPL;
191 }
192
193 HRESULT throw_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
194 {
195     FIXME("\n");
196     return E_NOTIMPL;
197 }
198
199 HRESULT try_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
200 {
201     FIXME("\n");
202     return E_NOTIMPL;
203 }
204
205 HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
206 {
207     FIXME("\n");
208     return E_NOTIMPL;
209 }
210
211 HRESULT conditional_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
212 {
213     FIXME("\n");
214     return E_NOTIMPL;
215 }
216
217 HRESULT array_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
218 {
219     FIXME("\n");
220     return E_NOTIMPL;
221 }
222
223 HRESULT member_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
224 {
225     FIXME("\n");
226     return E_NOTIMPL;
227 }
228
229 HRESULT member_new_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
230 {
231     FIXME("\n");
232     return E_NOTIMPL;
233 }
234
235 HRESULT call_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
236 {
237     FIXME("\n");
238     return E_NOTIMPL;
239 }
240
241 HRESULT this_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
242 {
243     FIXME("\n");
244     return E_NOTIMPL;
245 }
246
247 HRESULT identifier_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
248 {
249     FIXME("\n");
250     return E_NOTIMPL;
251 }
252
253 HRESULT literal_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
254 {
255     FIXME("\n");
256     return E_NOTIMPL;
257 }
258
259 HRESULT array_literal_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
260 {
261     FIXME("\n");
262     return E_NOTIMPL;
263 }
264
265 HRESULT property_value_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
266 {
267     FIXME("\n");
268     return E_NOTIMPL;
269 }
270
271 HRESULT comma_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
272 {
273     FIXME("\n");
274     return E_NOTIMPL;
275 }
276
277 HRESULT logical_or_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
278 {
279     FIXME("\n");
280     return E_NOTIMPL;
281 }
282
283 HRESULT logical_and_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
284 {
285     FIXME("\n");
286     return E_NOTIMPL;
287 }
288
289 HRESULT binary_or_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
290 {
291     FIXME("\n");
292     return E_NOTIMPL;
293 }
294
295 HRESULT binary_xor_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
296 {
297     FIXME("\n");
298     return E_NOTIMPL;
299 }
300
301 HRESULT binary_and_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
302 {
303     FIXME("\n");
304     return E_NOTIMPL;
305 }
306
307 HRESULT instanceof_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
308 {
309     FIXME("\n");
310     return E_NOTIMPL;
311 }
312
313 HRESULT in_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
314 {
315     FIXME("\n");
316     return E_NOTIMPL;
317 }
318
319 HRESULT add_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
320 {
321     FIXME("\n");
322     return E_NOTIMPL;
323 }
324
325 HRESULT sub_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
326 {
327     FIXME("\n");
328     return E_NOTIMPL;
329 }
330
331 HRESULT mul_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
332 {
333     FIXME("\n");
334     return E_NOTIMPL;
335 }
336
337 HRESULT div_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
338 {
339     FIXME("\n");
340     return E_NOTIMPL;
341 }
342
343 HRESULT mod_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
344 {
345     FIXME("\n");
346     return E_NOTIMPL;
347 }
348
349 HRESULT delete_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
350 {
351     FIXME("\n");
352     return E_NOTIMPL;
353 }
354
355 HRESULT void_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
356 {
357     FIXME("\n");
358     return E_NOTIMPL;
359 }
360
361 HRESULT typeof_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
362 {
363     FIXME("\n");
364     return E_NOTIMPL;
365 }
366
367 HRESULT minus_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
368 {
369     FIXME("\n");
370     return E_NOTIMPL;
371 }
372
373 HRESULT plus_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
374 {
375     FIXME("\n");
376     return E_NOTIMPL;
377 }
378
379 HRESULT post_increment_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
380 {
381     FIXME("\n");
382     return E_NOTIMPL;
383 }
384
385 HRESULT post_decrement_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
386 {
387     FIXME("\n");
388     return E_NOTIMPL;
389 }
390
391 HRESULT pre_increment_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
392 {
393     FIXME("\n");
394     return E_NOTIMPL;
395 }
396
397 HRESULT pre_decrement_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
398 {
399     FIXME("\n");
400     return E_NOTIMPL;
401 }
402
403 HRESULT new_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
404 {
405     FIXME("\n");
406     return E_NOTIMPL;
407 }
408
409 HRESULT equal_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
410 {
411     FIXME("\n");
412     return E_NOTIMPL;
413 }
414
415 HRESULT equal2_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
416 {
417     FIXME("\n");
418     return E_NOTIMPL;
419 }
420
421 HRESULT not_equal_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
422 {
423
424     FIXME("\n");
425     return E_NOTIMPL;
426 }
427
428 HRESULT not_equal2_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
429 {
430     FIXME("\n");
431     return E_NOTIMPL;
432 }
433
434 HRESULT less_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
435 {
436     FIXME("\n");
437     return E_NOTIMPL;
438 }
439
440 HRESULT lesseq_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
441 {
442     FIXME("\n");
443     return E_NOTIMPL;
444 }
445
446 HRESULT greater_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
447 {
448     FIXME("\n");
449     return E_NOTIMPL;
450 }
451
452 HRESULT greatereq_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
453 {
454     FIXME("\n");
455     return E_NOTIMPL;
456 }
457
458 HRESULT binary_negation_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
459 {
460     FIXME("\n");
461     return E_NOTIMPL;
462 }
463
464 HRESULT logical_negation_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
465 {
466     FIXME("\n");
467     return E_NOTIMPL;
468 }
469
470 HRESULT left_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
471 {
472     FIXME("\n");
473     return E_NOTIMPL;
474 }
475
476 HRESULT right_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
477 {
478     FIXME("\n");
479     return E_NOTIMPL;
480 }
481
482 HRESULT right2_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
483 {
484     FIXME("\n");
485     return E_NOTIMPL;
486 }
487
488 HRESULT assign_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
489 {
490     FIXME("\n");
491     return E_NOTIMPL;
492 }
493
494 HRESULT assign_lshift_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
495 {
496     FIXME("\n");
497     return E_NOTIMPL;
498 }
499
500 HRESULT assign_rshift_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
501 {
502     FIXME("\n");
503     return E_NOTIMPL;
504 }
505
506 HRESULT assign_rrshift_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
507 {
508     FIXME("\n");
509     return E_NOTIMPL;
510 }
511
512 HRESULT assign_add_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
513 {
514     FIXME("\n");
515     return E_NOTIMPL;
516 }
517
518 HRESULT assign_sub_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
519 {
520     FIXME("\n");
521     return E_NOTIMPL;
522 }
523
524 HRESULT assign_mul_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
525 {
526     FIXME("\n");
527     return E_NOTIMPL;
528 }
529
530 HRESULT assign_div_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
531 {
532     FIXME("\n");
533     return E_NOTIMPL;
534 }
535
536 HRESULT assign_mod_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
537 {
538     FIXME("\n");
539     return E_NOTIMPL;
540 }
541
542 HRESULT assign_and_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
543 {
544     FIXME("\n");
545     return E_NOTIMPL;
546 }
547
548 HRESULT assign_or_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
549 {
550     FIXME("\n");
551     return E_NOTIMPL;
552 }
553
554 HRESULT assign_xor_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
555 {
556     FIXME("\n");
557     return E_NOTIMPL;
558 }