jscript: Added '>>>=' expression 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 #define EXPR_NOVAL   0x0001
27 #define EXPR_NEWREF  0x0002
28 #define EXPR_STRREF  0x0004
29
30 static inline HRESULT stat_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
31 {
32     return stat->eval(ctx, stat, rt, ret);
33 }
34
35 static inline HRESULT expr_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
36 {
37     return _expr->eval(ctx, _expr, flags, ei, ret);
38 }
39
40 static void exprval_release(exprval_t *val)
41 {
42     switch(val->type) {
43     case EXPRVAL_VARIANT:
44         if(V_VT(&val->u.var) != VT_EMPTY)
45             VariantClear(&val->u.var);
46         return;
47     case EXPRVAL_IDREF:
48         if(val->u.idref.disp)
49             IDispatch_Release(val->u.idref.disp);
50         return;
51     case EXPRVAL_NAMEREF:
52         if(val->u.nameref.disp)
53             IDispatch_Release(val->u.nameref.disp);
54         SysFreeString(val->u.nameref.name);
55     }
56 }
57
58 /* ECMA-262 3rd Edition    8.7.1 */
59 static HRESULT exprval_value(script_ctx_t *ctx, exprval_t *val, jsexcept_t *ei, VARIANT *ret)
60 {
61     V_VT(ret) = VT_EMPTY;
62
63     switch(val->type) {
64     case EXPRVAL_VARIANT:
65         return VariantCopy(ret, &val->u.var);
66     case EXPRVAL_IDREF:
67         if(!val->u.idref.disp) {
68             FIXME("throw ReferenceError\n");
69             return E_FAIL;
70         }
71
72         return disp_propget(val->u.idref.disp, val->u.idref.id, ctx->lcid, ret, ei, NULL/*FIXME*/);
73     default:
74         ERR("type %d\n", val->type);
75         return E_FAIL;
76     }
77 }
78
79 static HRESULT exprval_to_value(script_ctx_t *ctx, exprval_t *val, jsexcept_t *ei, VARIANT *ret)
80 {
81     if(val->type == EXPRVAL_VARIANT) {
82         *ret = val->u.var;
83         V_VT(&val->u.var) = VT_EMPTY;
84         return S_OK;
85     }
86
87     return exprval_value(ctx, val, ei, ret);
88 }
89
90 static HRESULT exprval_to_boolean(script_ctx_t *ctx, exprval_t *exprval, jsexcept_t *ei, VARIANT_BOOL *b)
91 {
92     if(exprval->type != EXPRVAL_VARIANT) {
93         VARIANT val;
94         HRESULT hres;
95
96         hres = exprval_to_value(ctx, exprval, ei, &val);
97         if(FAILED(hres))
98             return hres;
99
100         hres = to_boolean(&val, b);
101         VariantClear(&val);
102         return hres;
103     }
104
105     return to_boolean(&exprval->u.var, b);
106 }
107
108 static void exprval_init(exprval_t *val)
109 {
110     val->type = EXPRVAL_VARIANT;
111     V_VT(&val->u.var) = VT_EMPTY;
112 }
113
114 static void exprval_set_idref(exprval_t *val, IDispatch *disp, DISPID id)
115 {
116     val->type = EXPRVAL_IDREF;
117     val->u.idref.disp = disp;
118     val->u.idref.id = id;
119
120     if(disp)
121         IDispatch_AddRef(disp);
122 }
123
124 HRESULT scope_push(scope_chain_t *scope, DispatchEx *obj, scope_chain_t **ret)
125 {
126     scope_chain_t *new_scope;
127
128     new_scope = heap_alloc(sizeof(scope_chain_t));
129     if(!new_scope)
130         return E_OUTOFMEMORY;
131
132     new_scope->ref = 1;
133
134     IDispatchEx_AddRef(_IDispatchEx_(obj));
135     new_scope->obj = obj;
136
137     if(scope) {
138         scope_addref(scope);
139         new_scope->next = scope;
140     }else {
141         new_scope->next = NULL;
142     }
143
144     *ret = new_scope;
145     return S_OK;
146 }
147
148 static void scope_pop(scope_chain_t **scope)
149 {
150     scope_chain_t *tmp;
151
152     tmp = *scope;
153     *scope = tmp->next;
154     scope_release(tmp);
155 }
156
157 void scope_release(scope_chain_t *scope)
158 {
159     if(--scope->ref)
160         return;
161
162     if(scope->next)
163         scope_release(scope->next);
164
165     IDispatchEx_Release(_IDispatchEx_(scope->obj));
166     heap_free(scope);
167 }
168
169 HRESULT create_exec_ctx(IDispatch *this_obj, DispatchEx *var_disp, scope_chain_t *scope, exec_ctx_t **ret)
170 {
171     exec_ctx_t *ctx;
172
173     ctx = heap_alloc_zero(sizeof(exec_ctx_t));
174     if(!ctx)
175         return E_OUTOFMEMORY;
176
177     IDispatch_AddRef(this_obj);
178     ctx->this_obj = this_obj;
179
180     IDispatchEx_AddRef(_IDispatchEx_(var_disp));
181     ctx->var_disp = var_disp;
182
183     if(scope) {
184         scope_addref(scope);
185         ctx->scope_chain = scope;
186     }
187
188     *ret = ctx;
189     return S_OK;
190 }
191
192 void exec_release(exec_ctx_t *ctx)
193 {
194     if(--ctx->ref)
195         return;
196
197     if(ctx->scope_chain)
198         scope_release(ctx->scope_chain);
199     if(ctx->var_disp)
200         IDispatchEx_Release(_IDispatchEx_(ctx->var_disp));
201     if(ctx->this_obj)
202         IDispatch_Release(ctx->this_obj);
203     heap_free(ctx);
204 }
205
206 static HRESULT dispex_get_id(IDispatchEx *dispex, BSTR name, DWORD flags, DISPID *id)
207 {
208     *id = 0;
209
210     return IDispatchEx_GetDispID(dispex, name, flags|fdexNameCaseSensitive, id);
211 }
212
213 static HRESULT disp_get_id(IDispatch *disp, BSTR name, DWORD flags, DISPID *id)
214 {
215     IDispatchEx *dispex;
216     HRESULT hres;
217
218     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
219     if(FAILED(hres)) {
220         TRACE("unsing IDispatch\n");
221
222         *id = 0;
223         return IDispatch_GetIDsOfNames(disp, &IID_NULL, &name, 1, 0, id);
224     }
225
226     hres = dispex_get_id(dispex, name, flags, id);
227     IDispatchEx_Release(dispex);
228     return hres;
229 }
230
231 /* ECMA-262 3rd Edition    8.7.2 */
232 static HRESULT put_value(script_ctx_t *ctx, exprval_t *ref, VARIANT *v, jsexcept_t *ei)
233 {
234     if(ref->type != EXPRVAL_IDREF) {
235         FIXME("throw ReferemceError\n");
236         return E_FAIL;
237     }
238
239     return disp_propput(ref->u.idref.disp, ref->u.idref.id, ctx->lcid, v, ei, NULL/*FIXME*/);
240 }
241
242 static HRESULT disp_cmp(IDispatch *disp1, IDispatch *disp2, BOOL *ret)
243 {
244     IObjectIdentity *identity;
245     IUnknown *unk1, *unk2;
246     HRESULT hres;
247
248     if(disp1 == disp2) {
249         *ret = TRUE;
250         return S_OK;
251     }
252
253     hres = IDispatch_QueryInterface(disp1, &IID_IUnknown, (void**)&unk1);
254     if(FAILED(hres))
255         return hres;
256
257     hres = IDispatch_QueryInterface(disp2, &IID_IUnknown, (void**)&unk2);
258     if(FAILED(hres)) {
259         IUnknown_Release(unk1);
260         return hres;
261     }
262
263     if(unk1 == unk2) {
264         *ret = TRUE;
265     }else {
266         hres = IUnknown_QueryInterface(unk1, &IID_IObjectIdentity, (void**)&identity);
267         if(SUCCEEDED(hres)) {
268             hres = IObjectIdentity_IsEqualObject(identity, unk2);
269             IObjectIdentity_Release(identity);
270             *ret = hres == S_OK;
271         }else {
272             *ret = FALSE;
273         }
274     }
275
276     IUnknown_Release(unk1);
277     IUnknown_Release(unk2);
278     return S_OK;
279 }
280
281 static inline BOOL is_num_vt(enum VARENUM vt)
282 {
283     return vt == VT_I4 || vt == VT_R8;
284 }
285
286 static inline DOUBLE num_val(const VARIANT *v)
287 {
288     return V_VT(v) == VT_I4 ? V_I4(v) : V_R8(v);
289 }
290
291 /* ECMA-262 3rd Edition    11.9.6 */
292 HRESULT equal2_values(VARIANT *lval, VARIANT *rval, BOOL *ret)
293 {
294     TRACE("\n");
295
296     if(V_VT(lval) != V_VT(rval)) {
297         if(is_num_vt(V_VT(lval)) && is_num_vt(V_VT(rval))) {
298             *ret = num_val(lval) == num_val(rval);
299             return S_OK;
300         }
301
302         *ret = FALSE;
303         return S_OK;
304     }
305
306     switch(V_VT(lval)) {
307     case VT_EMPTY:
308     case VT_NULL:
309         *ret = VARIANT_TRUE;
310         break;
311     case VT_I4:
312         *ret = V_I4(lval) == V_I4(rval);
313         break;
314     case VT_R8:
315         *ret = V_R8(lval) == V_R8(rval);
316         break;
317     case VT_BSTR:
318         *ret = !strcmpW(V_BSTR(lval), V_BSTR(rval));
319         break;
320     case VT_DISPATCH:
321         return disp_cmp(V_DISPATCH(lval), V_DISPATCH(rval), ret);
322     case VT_BOOL:
323         *ret = !V_BOOL(lval) == !V_BOOL(rval);
324         break;
325     default:
326         FIXME("unimplemented vt %d\n", V_VT(lval));
327         return E_NOTIMPL;
328     }
329
330     return S_OK;
331 }
332
333 static HRESULT literal_to_var(literal_t *literal, VARIANT *v)
334 {
335     V_VT(v) = literal->vt;
336
337     switch(V_VT(v)) {
338     case VT_EMPTY:
339     case VT_NULL:
340         break;
341     case VT_I4:
342         V_I4(v) = literal->u.lval;
343         break;
344     case VT_R8:
345         V_R8(v) = literal->u.dval;
346         break;
347     case VT_BSTR:
348         V_BSTR(v) = SysAllocString(literal->u.wstr);
349         break;
350     case VT_BOOL:
351         V_BOOL(v) = literal->u.bval;
352         break;
353     case VT_DISPATCH:
354         IDispatch_AddRef(literal->u.disp);
355         V_DISPATCH(v) = literal->u.disp;
356         break;
357     default:
358         ERR("wrong type %d\n", V_VT(v));
359         return E_NOTIMPL;
360     }
361
362     return S_OK;
363 }
364
365 HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *source, jsexcept_t *ei, VARIANT *retv)
366 {
367     script_ctx_t *script = parser->script;
368     function_declaration_t *func;
369     parser_ctx_t *prev_parser;
370     VARIANT val, tmp;
371     statement_t *stat;
372     exec_ctx_t *prev_ctx;
373     return_type_t rt;
374     HRESULT hres = S_OK;
375
376     for(func = source->functions; func; func = func->next) {
377         DispatchEx *func_obj;
378         VARIANT var;
379
380         hres = create_source_function(parser, func->parameter_list, func->source_elements, ctx->scope_chain, &func_obj);
381         if(FAILED(hres))
382             return hres;
383
384         V_VT(&var) = VT_DISPATCH;
385         V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(func_obj);
386         hres = jsdisp_propput_name(ctx->var_disp, func->identifier, script->lcid, &var, ei, NULL);
387         IDispatchEx_Release(_IDispatchEx_(func_obj));
388         if(FAILED(hres))
389             return hres;
390     }
391
392     prev_ctx = script->exec_ctx;
393     script->exec_ctx = ctx;
394
395     prev_parser = ctx->parser;
396     ctx->parser = parser;
397
398     V_VT(&val) = VT_EMPTY;
399     memset(&rt, 0, sizeof(rt));
400     rt.type = RT_NORMAL;
401
402     for(stat = source->statement; stat; stat = stat->next) {
403         hres = stat_eval(ctx, stat, &rt, &tmp);
404         if(FAILED(hres))
405             break;
406
407         VariantClear(&val);
408         val = tmp;
409         if(rt.type != RT_NORMAL)
410             break;
411     }
412
413     script->exec_ctx = prev_ctx;
414     ctx->parser = prev_parser;
415
416     if(rt.type != RT_NORMAL && rt.type != RT_RETURN) {
417         FIXME("wrong rt %d\n", rt.type);
418         hres = E_FAIL;
419     }
420
421     *ei = rt.ei;
422     if(FAILED(hres)) {
423         VariantClear(&val);
424         return hres;
425     }
426
427     if(retv)
428         *retv = val;
429     else
430         VariantClear(&val);
431     return S_OK;
432 }
433
434 /* ECMA-262 3rd Edition    10.1.4 */
435 static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, exprval_t *ret)
436 {
437     scope_chain_t *scope;
438     named_item_t *item;
439     DISPID id = 0;
440     HRESULT hres;
441
442     TRACE("%s\n", debugstr_w(identifier));
443
444     for(scope = ctx->scope_chain; scope; scope = scope->next) {
445         hres = dispex_get_id(_IDispatchEx_(scope->obj), identifier, 0, &id);
446         if(SUCCEEDED(hres))
447             break;
448     }
449
450     if(scope) {
451         exprval_set_idref(ret, (IDispatch*)_IDispatchEx_(scope->obj), id);
452         return S_OK;
453     }
454
455     hres = dispex_get_id(_IDispatchEx_(ctx->parser->script->global), identifier, 0, &id);
456     if(SUCCEEDED(hres)) {
457         exprval_set_idref(ret, (IDispatch*)_IDispatchEx_(ctx->parser->script->global), id);
458         return S_OK;
459     }
460
461     for(item = ctx->parser->script->named_items; item; item = item->next) {
462         hres = disp_get_id(item->disp, identifier, 0, &id);
463         if(SUCCEEDED(hres))
464             break;
465     }
466
467     if(item) {
468         exprval_set_idref(ret, (IDispatch*)item->disp, id);
469         return S_OK;
470     }
471
472     hres = dispex_get_id(_IDispatchEx_(ctx->parser->script->script_disp), identifier, 0, &id);
473     if(SUCCEEDED(hres)) {
474         exprval_set_idref(ret, (IDispatch*)_IDispatchEx_(ctx->parser->script->script_disp), id);
475         return S_OK;
476     }
477
478     if(flags & EXPR_NEWREF) {
479         hres = dispex_get_id(_IDispatchEx_(ctx->var_disp), identifier, fdexNameEnsure, &id);
480         if(FAILED(hres))
481             return hres;
482
483         exprval_set_idref(ret, (IDispatch*)_IDispatchEx_(ctx->var_disp), id);
484         return S_OK;
485     }
486
487     WARN("Could not find identifier %s\n", debugstr_w(identifier));
488     return E_FAIL;
489 }
490
491 /* ECMA-262 3rd Edition    12.1 */
492 HRESULT block_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
493 {
494     block_statement_t *stat = (block_statement_t*)_stat;
495     VARIANT val, tmp;
496     statement_t *iter;
497     HRESULT hres = S_OK;
498
499     TRACE("\n");
500
501     V_VT(&val) = VT_EMPTY;
502     for(iter = stat->stat_list; iter; iter = iter->next) {
503         hres = stat_eval(ctx, iter, rt, &tmp);
504         if(FAILED(hres))
505             break;
506
507         VariantClear(&val);
508         val = tmp;
509         if(rt->type != RT_NORMAL)
510             break;
511     }
512
513     if(FAILED(hres)) {
514         VariantClear(&val);
515         return hres;
516     }
517
518     *ret = val;
519     return S_OK;
520 }
521
522 /* ECMA-262 3rd Edition    12.2 */
523 static HRESULT variable_list_eval(exec_ctx_t *ctx, variable_declaration_t *var_list, jsexcept_t *ei)
524 {
525     variable_declaration_t *iter;
526     HRESULT hres = E_FAIL;
527
528     for(iter = var_list; iter; iter = iter->next) {
529         VARIANT val;
530
531         if(iter->expr) {
532             exprval_t exprval;
533
534             hres = expr_eval(ctx, iter->expr, 0, ei, &exprval);
535             if(FAILED(hres))
536                 break;
537
538             hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
539             exprval_release(&exprval);
540             if(FAILED(hres))
541                 break;
542         }else {
543             V_VT(&val) = VT_EMPTY;
544         }
545
546         hres = jsdisp_propput_name(ctx->var_disp, iter->identifier, ctx->parser->script->lcid, &val, ei, NULL/*FIXME*/);
547         VariantClear(&val);
548         if(FAILED(hres))
549             break;
550     }
551
552     return hres;
553 }
554
555 /* ECMA-262 3rd Edition    12.2 */
556 HRESULT var_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
557 {
558     var_statement_t *stat = (var_statement_t*)_stat;
559     HRESULT hres;
560
561     TRACE("\n");
562
563     hres = variable_list_eval(ctx, stat->variable_list, &rt->ei);
564     if(FAILED(hres))
565         return hres;
566
567     V_VT(ret) = VT_EMPTY;
568     return S_OK;
569 }
570
571 /* ECMA-262 3rd Edition    12.3 */
572 HRESULT empty_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
573 {
574     TRACE("\n");
575
576     V_VT(ret) = VT_EMPTY;
577     return S_OK;
578 }
579
580 /* ECMA-262 3rd Edition    12.4 */
581 HRESULT expression_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
582 {
583     expression_statement_t *stat = (expression_statement_t*)_stat;
584     exprval_t exprval;
585     VARIANT val;
586     HRESULT hres;
587
588     TRACE("\n");
589
590     hres = expr_eval(ctx, stat->expr, EXPR_NOVAL, &rt->ei, &exprval);
591     if(FAILED(hres))
592         return hres;
593
594     hres = exprval_to_value(ctx->parser->script, &exprval, &rt->ei, &val);
595     exprval_release(&exprval);
596     if(FAILED(hres))
597         return hres;
598
599     *ret = val;
600     TRACE("= %s\n", debugstr_variant(ret));
601     return S_OK;
602 }
603
604 /* ECMA-262 3rd Edition    12.5 */
605 HRESULT if_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
606 {
607     if_statement_t *stat = (if_statement_t*)_stat;
608     exprval_t exprval;
609     VARIANT_BOOL b;
610     HRESULT hres;
611
612     TRACE("\n");
613
614     hres = expr_eval(ctx, stat->expr, 0, &rt->ei, &exprval);
615     if(FAILED(hres))
616         return hres;
617
618     hres = exprval_to_boolean(ctx->parser->script, &exprval, &rt->ei, &b);
619     exprval_release(&exprval);
620     if(FAILED(hres))
621         return hres;
622
623     if(b)
624         hres = stat_eval(ctx, stat->if_stat, rt, ret);
625     else if(stat->else_stat)
626         hres = stat_eval(ctx, stat->else_stat, rt, ret);
627     else
628         V_VT(ret) = VT_EMPTY;
629
630     return hres;
631 }
632
633 /* ECMA-262 3rd Edition    12.6.2 */
634 HRESULT while_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
635 {
636     while_statement_t *stat = (while_statement_t*)_stat;
637     exprval_t exprval;
638     VARIANT val, tmp;
639     VARIANT_BOOL b;
640     BOOL test_expr;
641     HRESULT hres;
642
643     TRACE("\n");
644
645     V_VT(&val) = VT_EMPTY;
646     test_expr = !stat->do_while;
647
648     while(1) {
649         if(test_expr) {
650             hres = expr_eval(ctx, stat->expr, 0, &rt->ei, &exprval);
651             if(FAILED(hres))
652                 break;
653
654             hres = exprval_to_boolean(ctx->parser->script, &exprval, &rt->ei, &b);
655             exprval_release(&exprval);
656             if(FAILED(hres) || !b)
657                 break;
658         }else {
659             test_expr = TRUE;
660         }
661
662         hres = stat_eval(ctx, stat->statement, rt, &tmp);
663         if(FAILED(hres))
664             break;
665
666         VariantClear(&val);
667         val = tmp;
668
669         if(rt->type == RT_CONTINUE)
670             rt->type = RT_NORMAL;
671         if(rt->type != RT_NORMAL)
672             break;
673     }
674
675     if(FAILED(hres)) {
676         VariantClear(&val);
677         return hres;
678     }
679
680     if(rt->type == RT_BREAK)
681         rt->type = RT_NORMAL;
682
683     *ret = val;
684     return S_OK;
685 }
686
687 /* ECMA-262 3rd Edition    12.6.3 */
688 HRESULT for_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
689 {
690     for_statement_t *stat = (for_statement_t*)_stat;
691     VARIANT val, tmp, retv;
692     exprval_t exprval;
693     VARIANT_BOOL b;
694     HRESULT hres;
695
696     TRACE("\n");
697
698     if(stat->variable_list) {
699         hres = variable_list_eval(ctx, stat->variable_list, &rt->ei);
700         if(FAILED(hres))
701             return hres;
702     }else if(stat->begin_expr) {
703         hres = expr_eval(ctx, stat->begin_expr, EXPR_NEWREF, &rt->ei, &exprval);
704         if(FAILED(hres))
705             return hres;
706
707         hres = exprval_to_value(ctx->parser->script, &exprval, &rt->ei, &val);
708         exprval_release(&exprval);
709         if(FAILED(hres))
710             return hres;
711
712         VariantClear(&val);
713     }
714
715     V_VT(&retv) = VT_EMPTY;
716
717     while(1) {
718         if(stat->expr) {
719             hres = expr_eval(ctx, stat->expr, 0, &rt->ei, &exprval);
720             if(FAILED(hres))
721                 break;
722
723             hres = exprval_to_boolean(ctx->parser->script, &exprval, &rt->ei, &b);
724             exprval_release(&exprval);
725             if(FAILED(hres) || !b)
726                 break;
727         }
728
729         hres = stat_eval(ctx, stat->statement, rt, &tmp);
730         if(FAILED(hres))
731             break;
732
733         VariantClear(&retv);
734         retv = tmp;
735
736         if(rt->type == RT_CONTINUE)
737             rt->type = RT_NORMAL;
738         else if(rt->type != RT_NORMAL)
739             break;
740
741         if(stat->end_expr) {
742             hres = expr_eval(ctx, stat->end_expr, 0, &rt->ei, &exprval);
743             if(FAILED(hres))
744                 break;
745
746             hres = exprval_to_value(ctx->parser->script, &exprval, &rt->ei, &val);
747             exprval_release(&exprval);
748             if(FAILED(hres))
749                 break;
750
751             VariantClear(&val);
752         }
753     }
754
755     if(FAILED(hres)) {
756         VariantClear(&retv);
757         return hres;
758     }
759
760     if(rt->type == RT_BREAK)
761         rt->type = RT_NORMAL;
762
763     *ret = retv;
764     return S_OK;
765 }
766
767 /* ECMA-262 3rd Edition    12.6.4 */
768 HRESULT forin_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
769 {
770     forin_statement_t *stat = (forin_statement_t*)_stat;
771     VARIANT val, name, retv, tmp;
772     DISPID id = DISPID_STARTENUM;
773     BSTR str, identifier = NULL;
774     IDispatchEx *in_obj;
775     exprval_t exprval;
776     HRESULT hres;
777
778     TRACE("\n");
779
780     if(stat->variable) {
781         hres = variable_list_eval(ctx, stat->variable, &rt->ei);
782         if(FAILED(hres))
783             return hres;
784     }
785
786     hres = expr_eval(ctx, stat->in_expr, EXPR_NEWREF, &rt->ei, &exprval);
787     if(FAILED(hres))
788         return hres;
789
790     hres = exprval_to_value(ctx->parser->script, &exprval, &rt->ei, &val);
791     exprval_release(&exprval);
792     if(FAILED(hres))
793         return hres;
794
795     if(V_VT(&val) != VT_DISPATCH) {
796         FIXME("in vt %d\n", V_VT(&val));
797         VariantClear(&val);
798         return E_NOTIMPL;
799     }
800
801     hres = IDispatch_QueryInterface(V_DISPATCH(&val), &IID_IDispatchEx, (void**)&in_obj);
802     IDispatch_Release(V_DISPATCH(&val));
803     if(FAILED(hres)) {
804         FIXME("Object doesn't support IDispatchEx\n");
805         return E_NOTIMPL;
806     }
807
808     V_VT(&retv) = VT_EMPTY;
809
810     if(stat->variable)
811         identifier = SysAllocString(stat->variable->identifier);
812
813     while(1) {
814         hres = IDispatchEx_GetNextDispID(in_obj, fdexEnumDefault, id, &id);
815         if(FAILED(hres) || hres == S_FALSE)
816             break;
817
818         hres = IDispatchEx_GetMemberName(in_obj, id, &str);
819         if(FAILED(hres))
820             break;
821
822         TRACE("iter %s\n", debugstr_w(str));
823
824         if(stat->variable)
825             hres = identifier_eval(ctx, identifier, 0, &exprval);
826         else
827             hres = expr_eval(ctx, stat->expr, EXPR_NEWREF, &rt->ei, &exprval);
828         if(SUCCEEDED(hres)) {
829             V_VT(&name) = VT_BSTR;
830             V_BSTR(&name) = str;
831             hres = put_value(ctx->parser->script, &exprval, &name, &rt->ei);
832             exprval_release(&exprval);
833         }
834         SysFreeString(str);
835         if(FAILED(hres))
836             break;
837
838         hres = stat_eval(ctx, stat->statement, rt, &tmp);
839         if(FAILED(hres))
840             break;
841
842         VariantClear(&retv);
843         retv = tmp;
844
845         if(rt->type == RT_CONTINUE)
846             rt->type = RT_NORMAL;
847         else if(rt->type != RT_NORMAL)
848             break;
849     }
850
851     SysFreeString(identifier);
852     IDispatchEx_Release(in_obj);
853     if(FAILED(hres)) {
854         VariantClear(&retv);
855         return hres;
856     }
857
858     if(rt->type == RT_BREAK)
859         rt->type = RT_NORMAL;
860
861     *ret = retv;
862     return S_OK;
863 }
864
865 /* ECMA-262 3rd Edition    12.7 */
866 HRESULT continue_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
867 {
868     branch_statement_t *stat = (branch_statement_t*)_stat;
869
870     TRACE("\n");
871
872     if(stat->identifier) {
873         FIXME("indentifier not implemented\n");
874         return E_NOTIMPL;
875     }
876
877     rt->type = RT_CONTINUE;
878     V_VT(ret) = VT_EMPTY;
879     return S_OK;
880 }
881
882 /* ECMA-262 3rd Edition    12.8 */
883 HRESULT break_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
884 {
885     branch_statement_t *stat = (branch_statement_t*)_stat;
886
887     TRACE("\n");
888
889     if(stat->identifier) {
890         FIXME("indentifier not implemented\n");
891         return E_NOTIMPL;
892     }
893
894     rt->type = RT_BREAK;
895     V_VT(ret) = VT_EMPTY;
896     return S_OK;
897 }
898
899 /* ECMA-262 3rd Edition    12.9 */
900 HRESULT return_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
901 {
902     expression_statement_t *stat = (expression_statement_t*)_stat;
903     HRESULT hres;
904
905     TRACE("\n");
906
907     if(stat->expr) {
908         exprval_t exprval;
909
910         hres = expr_eval(ctx, stat->expr, 0, &rt->ei, &exprval);
911         if(FAILED(hres))
912             return hres;
913
914         hres = exprval_to_value(ctx->parser->script, &exprval, &rt->ei, ret);
915         exprval_release(&exprval);
916         if(FAILED(hres))
917             return hres;
918     }else {
919         V_VT(ret) = VT_EMPTY;
920     }
921
922     TRACE("= %s\n", debugstr_variant(ret));
923     rt->type = RT_RETURN;
924     return S_OK;
925 }
926
927 /* ECMA-262 3rd Edition    12.10 */
928 HRESULT with_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
929 {
930     with_statement_t *stat = (with_statement_t*)_stat;
931     exprval_t exprval;
932     IDispatch *disp;
933     DispatchEx *obj;
934     VARIANT val;
935     HRESULT hres;
936
937     TRACE("\n");
938
939     hres = expr_eval(ctx, stat->expr, 0, &rt->ei, &exprval);
940     if(FAILED(hres))
941         return hres;
942
943     hres = exprval_to_value(ctx->parser->script, &exprval, &rt->ei, &val);
944     exprval_release(&exprval);
945     if(FAILED(hres))
946         return hres;
947
948     hres = to_object(ctx, &val, &disp);
949     VariantClear(&val);
950     if(FAILED(hres))
951         return hres;
952
953     obj = iface_to_jsdisp((IUnknown*)disp);
954     IDispatch_Release(disp);
955     if(!obj) {
956         FIXME("disp id not jsdisp\n");
957         return E_NOTIMPL;
958     }
959
960     hres = scope_push(ctx->scope_chain, obj, &ctx->scope_chain);
961     jsdisp_release(obj);
962     if(FAILED(hres));
963
964     hres = stat_eval(ctx, stat->statement, rt, ret);
965
966     scope_pop(&ctx->scope_chain);
967     return hres;
968 }
969
970 /* ECMA-262 3rd Edition    12.12 */
971 HRESULT labelled_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret)
972 {
973     FIXME("\n");
974     return E_NOTIMPL;
975 }
976
977 /* ECMA-262 3rd Edition    12.13 */
978 HRESULT switch_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
979 {
980     switch_statement_t *stat = (switch_statement_t*)_stat;
981     case_clausule_t *iter, *default_clausule = NULL;
982     statement_t *stat_iter;
983     VARIANT val, cval;
984     exprval_t exprval;
985     BOOL b;
986     HRESULT hres;
987
988     TRACE("\n");
989
990     hres = expr_eval(ctx, stat->expr, 0, &rt->ei, &exprval);
991     if(FAILED(hres))
992         return hres;
993
994     hres = exprval_to_value(ctx->parser->script, &exprval, &rt->ei, &val);
995     exprval_release(&exprval);
996     if(FAILED(hres))
997         return hres;
998
999     for(iter = stat->case_list; iter; iter = iter->next) {
1000         if(!iter->expr) {
1001             default_clausule = iter;
1002             continue;
1003         }
1004
1005         hres = expr_eval(ctx, iter->expr, 0, &rt->ei, &exprval);
1006         if(FAILED(hres))
1007             break;
1008
1009         hres = exprval_to_value(ctx->parser->script, &exprval, &rt->ei, &cval);
1010         exprval_release(&exprval);
1011         if(FAILED(hres))
1012             break;
1013
1014         hres = equal2_values(&val, &cval, &b);
1015         VariantClear(&cval);
1016         if(FAILED(hres) || b)
1017             break;
1018     }
1019
1020     VariantClear(&val);
1021     if(FAILED(hres))
1022         return hres;
1023
1024     if(!iter)
1025         iter = default_clausule;
1026
1027     V_VT(&val) = VT_EMPTY;
1028     if(iter) {
1029         VARIANT tmp;
1030
1031         for(stat_iter = iter->stat; stat_iter; stat_iter = stat_iter->next) {
1032             hres = stat_eval(ctx, stat_iter, rt, &tmp);
1033             if(FAILED(hres))
1034                 break;
1035
1036             VariantClear(&val);
1037             val = tmp;
1038
1039             if(rt->type != RT_NORMAL)
1040                 break;
1041         }
1042     }
1043
1044     if(FAILED(hres)) {
1045         VariantClear(&val);
1046         return hres;
1047     }
1048
1049     if(rt->type == RT_BREAK)
1050         rt->type = RT_NORMAL;
1051
1052     *ret = val;
1053     return S_OK;
1054 }
1055
1056 /* ECMA-262 3rd Edition    12.13 */
1057 HRESULT throw_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
1058 {
1059     expression_statement_t *stat = (expression_statement_t*)_stat;
1060     exprval_t exprval;
1061     VARIANT val;
1062     HRESULT hres;
1063
1064     TRACE("\n");
1065
1066     hres = expr_eval(ctx, stat->expr, 0, &rt->ei, &exprval);
1067     if(FAILED(hres))
1068         return hres;
1069
1070     hres = exprval_to_value(ctx->parser->script, &exprval, &rt->ei, &val);
1071     exprval_release(&exprval);
1072     if(FAILED(hres))
1073         return hres;
1074
1075     rt->ei.var = val;
1076     return DISP_E_EXCEPTION;
1077 }
1078
1079 /* ECMA-262 3rd Edition    12.14 */
1080 static HRESULT catch_eval(exec_ctx_t *ctx, catch_block_t *block, return_type_t *rt, VARIANT *ret)
1081 {
1082     DispatchEx *var_disp;
1083     VARIANT ex, val;
1084     HRESULT hres;
1085
1086     ex = rt->ei.var;
1087     memset(&rt->ei, 0, sizeof(jsexcept_t));
1088
1089     hres = create_dispex(ctx->parser->script, NULL, NULL, &var_disp);
1090     if(SUCCEEDED(hres)) {
1091         hres = jsdisp_propput_name(var_disp, block->identifier, ctx->parser->script->lcid,
1092                 &ex, &rt->ei, NULL/*FIXME*/);
1093         if(SUCCEEDED(hres)) {
1094             hres = scope_push(ctx->scope_chain, var_disp, &ctx->scope_chain);
1095             if(SUCCEEDED(hres)) {
1096                 hres = stat_eval(ctx, block->statement, rt, &val);
1097                 scope_pop(&ctx->scope_chain);
1098             }
1099         }
1100
1101         jsdisp_release(var_disp);
1102     }
1103
1104     VariantClear(&ex);
1105     if(FAILED(hres))
1106         return hres;
1107
1108     *ret = val;
1109     return S_OK;
1110 }
1111
1112 /* ECMA-262 3rd Edition    12.14 */
1113 HRESULT try_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret)
1114 {
1115     try_statement_t *stat = (try_statement_t*)_stat;
1116     VARIANT val;
1117     HRESULT hres;
1118
1119     TRACE("\n");
1120
1121     hres = stat_eval(ctx, stat->try_statement, rt, &val);
1122     if(FAILED(hres)) {
1123         TRACE("EXCEPTION\n");
1124         if(!stat->catch_block)
1125             return hres;
1126
1127         hres = catch_eval(ctx, stat->catch_block, rt, &val);
1128         if(FAILED(hres))
1129             return hres;
1130     }
1131
1132     if(stat->finally_statement) {
1133         VariantClear(&val);
1134         hres = stat_eval(ctx, stat->finally_statement, rt, &val);
1135         if(FAILED(hres))
1136             return hres;
1137     }
1138
1139     *ret = val;
1140     return S_OK;
1141 }
1142
1143 static HRESULT return_bool(exprval_t *ret, DWORD b)
1144 {
1145     ret->type = EXPRVAL_VARIANT;
1146     V_VT(&ret->u.var) = VT_BOOL;
1147     V_BOOL(&ret->u.var) = b ? VARIANT_TRUE : VARIANT_FALSE;
1148
1149     return S_OK;
1150 }
1151
1152 static HRESULT get_binary_expr_values(exec_ctx_t *ctx, binary_expression_t *expr, jsexcept_t *ei, VARIANT *lval, VARIANT *rval)
1153 {
1154     exprval_t exprval;
1155     HRESULT hres;
1156
1157     hres = expr_eval(ctx, expr->expression1, 0, ei, &exprval);
1158     if(FAILED(hres))
1159         return hres;
1160
1161     hres = exprval_to_value(ctx->parser->script, &exprval, ei, lval);
1162     exprval_release(&exprval);
1163     if(FAILED(hres))
1164         return hres;
1165
1166     hres = expr_eval(ctx, expr->expression2, 0, ei, &exprval);
1167     if(SUCCEEDED(hres)) {
1168         hres = exprval_to_value(ctx->parser->script, &exprval, ei, rval);
1169         exprval_release(&exprval);
1170     }
1171
1172     if(FAILED(hres)) {
1173         VariantClear(lval);
1174         return hres;
1175     }
1176
1177     return S_OK;
1178 }
1179
1180 typedef HRESULT (*oper_t)(exec_ctx_t*,VARIANT*,VARIANT*,jsexcept_t*,VARIANT*);
1181
1182 static HRESULT binary_expr_eval(exec_ctx_t *ctx, binary_expression_t *expr, oper_t oper, jsexcept_t *ei,
1183         exprval_t *ret)
1184 {
1185     VARIANT lval, rval, retv;
1186     HRESULT hres;
1187
1188     hres = get_binary_expr_values(ctx, expr, ei, &lval, &rval);
1189     if(FAILED(hres))
1190         return hres;
1191
1192     hres = oper(ctx, &lval, &rval, ei, &retv);
1193     VariantClear(&lval);
1194     VariantClear(&rval);
1195     if(FAILED(hres))
1196         return hres;
1197
1198     ret->type = EXPRVAL_VARIANT;
1199     ret->u.var = retv;
1200     return S_OK;
1201 }
1202
1203 /* ECMA-262 3rd Edition    11.13.2 */
1204 static HRESULT assign_oper_eval(exec_ctx_t *ctx, expression_t *lexpr, expression_t *rexpr, oper_t oper,
1205                                 jsexcept_t *ei, exprval_t *ret)
1206 {
1207     VARIANT retv, lval, rval;
1208     exprval_t exprval, exprvalr;
1209     HRESULT hres;
1210
1211     hres = expr_eval(ctx, lexpr, EXPR_NEWREF, ei, &exprval);
1212     if(FAILED(hres))
1213         return hres;
1214
1215     hres = exprval_value(ctx->parser->script, &exprval, ei, &lval);
1216     if(SUCCEEDED(hres)) {
1217         hres = expr_eval(ctx, rexpr, 0, ei, &exprvalr);
1218         if(SUCCEEDED(hres)) {
1219             hres = exprval_value(ctx->parser->script, &exprvalr, ei, &rval);
1220             exprval_release(&exprvalr);
1221         }
1222         if(SUCCEEDED(hres)) {
1223             hres = oper(ctx, &lval, &rval, ei, &retv);
1224             VariantClear(&rval);
1225         }
1226         VariantClear(&lval);
1227     }
1228
1229     if(SUCCEEDED(hres)) {
1230         hres = put_value(ctx->parser->script, &exprval, &retv, ei);
1231         if(FAILED(hres))
1232             VariantClear(&retv);
1233     }
1234     exprval_release(&exprval);
1235
1236     if(FAILED(hres))
1237         return hres;
1238
1239     ret->type = EXPRVAL_VARIANT;
1240     ret->u.var = retv;
1241     return S_OK;
1242 }
1243
1244 /* ECMA-262 3rd Edition    13 */
1245 HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1246 {
1247     function_expression_t *expr = (function_expression_t*)_expr;
1248     DispatchEx *dispex;
1249     VARIANT var;
1250     HRESULT hres;
1251
1252     TRACE("\n");
1253
1254     hres = create_source_function(ctx->parser, expr->parameter_list, expr->source_elements, ctx->scope_chain, &dispex);
1255     if(FAILED(hres))
1256         return hres;
1257
1258     V_VT(&var) = VT_DISPATCH;
1259     V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(dispex);
1260
1261     if(expr->identifier) {
1262         hres = jsdisp_propput_name(ctx->var_disp, expr->identifier, ctx->parser->script->lcid, &var, ei, NULL/*FIXME*/);
1263         if(FAILED(hres)) {
1264             jsdisp_release(dispex);
1265             return hres;
1266         }
1267     }
1268
1269     ret->type = EXPRVAL_VARIANT;
1270     ret->u.var = var;
1271     return S_OK;
1272 }
1273
1274 /* ECMA-262 3rd Edition    11.12 */
1275 HRESULT conditional_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1276 {
1277     conditional_expression_t *expr = (conditional_expression_t*)_expr;
1278     exprval_t exprval;
1279     VARIANT_BOOL b;
1280     HRESULT hres;
1281
1282     TRACE("\n");
1283
1284     hres = expr_eval(ctx, expr->expression, 0, ei, &exprval);
1285     if(FAILED(hres))
1286         return hres;
1287
1288     hres = exprval_to_boolean(ctx->parser->script, &exprval, ei, &b);
1289     exprval_release(&exprval);
1290     if(FAILED(hres))
1291         return hres;
1292
1293     return expr_eval(ctx, b ? expr->true_expression : expr->false_expression, flags, ei, ret);
1294 }
1295
1296 /* ECMA-262 3rd Edition    11.2.1 */
1297 HRESULT array_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1298 {
1299     array_expression_t *expr = (array_expression_t*)_expr;
1300     exprval_t exprval;
1301     VARIANT member, val;
1302     DISPID id;
1303     BSTR str;
1304     IDispatch *obj = NULL;
1305     HRESULT hres;
1306
1307     TRACE("\n");
1308
1309     hres = expr_eval(ctx, expr->member_expr, EXPR_NEWREF, ei, &exprval);
1310     if(FAILED(hres))
1311         return hres;
1312
1313     hres = exprval_to_value(ctx->parser->script, &exprval, ei, &member);
1314     exprval_release(&exprval);
1315     if(FAILED(hres))
1316         return hres;
1317
1318     hres = expr_eval(ctx, expr->expression, EXPR_NEWREF, ei, &exprval);
1319     if(SUCCEEDED(hres)) {
1320         hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
1321         exprval_release(&exprval);
1322     }
1323
1324     if(SUCCEEDED(hres))
1325         hres = to_object(ctx, &member, &obj);
1326     VariantClear(&member);
1327     if(SUCCEEDED(hres)) {
1328         hres = to_string(ctx->parser->script, &val, ei, &str);
1329         if(SUCCEEDED(hres)) {
1330             if(flags & EXPR_STRREF) {
1331                 ret->type = EXPRVAL_NAMEREF;
1332                 ret->u.nameref.disp = obj;
1333                 ret->u.nameref.name = str;
1334                 return S_OK;
1335             }
1336
1337             hres = disp_get_id(obj, str, flags & EXPR_NEWREF ? fdexNameEnsure : 0, &id);
1338         }
1339
1340         if(SUCCEEDED(hres)) {
1341             exprval_set_idref(ret, obj, id);
1342         }else if(!(flags & EXPR_NEWREF) && hres == DISP_E_UNKNOWNNAME) {
1343             exprval_init(ret);
1344             hres = S_OK;
1345         }
1346
1347         IDispatch_Release(obj);
1348     }
1349
1350     return hres;
1351 }
1352
1353 /* ECMA-262 3rd Edition    11.2.1 */
1354 HRESULT member_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1355 {
1356     member_expression_t *expr = (member_expression_t*)_expr;
1357     IDispatch *obj = NULL;
1358     exprval_t exprval;
1359     VARIANT member;
1360     DISPID id;
1361     BSTR str;
1362     HRESULT hres;
1363
1364     TRACE("\n");
1365
1366     hres = expr_eval(ctx, expr->expression, 0, ei, &exprval);
1367     if(FAILED(hres))
1368         return hres;
1369
1370     hres = exprval_to_value(ctx->parser->script, &exprval, ei, &member);
1371     exprval_release(&exprval);
1372     if(FAILED(hres))
1373         return hres;
1374
1375     hres = to_object(ctx, &member, &obj);
1376     VariantClear(&member);
1377     if(FAILED(hres))
1378         return hres;
1379
1380     str = SysAllocString(expr->identifier);
1381     if(flags & EXPR_STRREF) {
1382         ret->type = EXPRVAL_NAMEREF;
1383         ret->u.nameref.disp = obj;
1384         ret->u.nameref.name = str;
1385         return S_OK;
1386     }
1387
1388     hres = disp_get_id(obj, str, flags & EXPR_NEWREF ? fdexNameEnsure : 0, &id);
1389     SysFreeString(str);
1390     if(SUCCEEDED(hres)) {
1391         exprval_set_idref(ret, obj, id);
1392     }else if(!(flags & EXPR_NEWREF) && hres == DISP_E_UNKNOWNNAME) {
1393         exprval_init(ret);
1394         hres = S_OK;
1395     }
1396
1397     IDispatch_Release(obj);
1398     return hres;
1399 }
1400
1401 static void free_dp(DISPPARAMS *dp)
1402 {
1403     DWORD i;
1404
1405     for(i=0; i < dp->cArgs; i++)
1406         VariantClear(dp->rgvarg+i);
1407     heap_free(dp->rgvarg);
1408 }
1409
1410 static HRESULT args_to_param(exec_ctx_t *ctx, argument_t *args, jsexcept_t *ei, DISPPARAMS *dp)
1411 {
1412     VARIANTARG *vargs;
1413     exprval_t exprval;
1414     argument_t *iter;
1415     DWORD cnt = 0, i;
1416     HRESULT hres = S_OK;
1417
1418     memset(dp, 0, sizeof(*dp));
1419     if(!args)
1420         return S_OK;
1421
1422     for(iter = args; iter; iter = iter->next)
1423         cnt++;
1424
1425     vargs = heap_alloc_zero(cnt * sizeof(*vargs));
1426     if(!vargs)
1427         return E_OUTOFMEMORY;
1428
1429     for(i = cnt, iter = args; iter; iter = iter->next) {
1430         hres = expr_eval(ctx, iter->expr, 0, ei, &exprval);
1431         if(FAILED(hres))
1432             break;
1433
1434         hres = exprval_to_value(ctx->parser->script, &exprval, ei, vargs + (--i));
1435         exprval_release(&exprval);
1436         if(FAILED(hres))
1437             break;
1438     }
1439
1440     if(FAILED(hres)) {
1441         free_dp(dp);
1442         return hres;
1443     }
1444
1445     dp->rgvarg = vargs;
1446     dp->cArgs = cnt;
1447     return S_OK;
1448 }
1449
1450 /* ECMA-262 3rd Edition    11.2.2 */
1451 HRESULT new_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1452 {
1453     call_expression_t *expr = (call_expression_t*)_expr;
1454     exprval_t exprval;
1455     VARIANT constr, var;
1456     DISPPARAMS dp;
1457     HRESULT hres;
1458
1459     TRACE("\n");
1460
1461     hres = expr_eval(ctx, expr->expression, 0, ei, &exprval);
1462     if(FAILED(hres))
1463         return hres;
1464
1465     hres = args_to_param(ctx, expr->argument_list, ei, &dp);
1466     if(SUCCEEDED(hres))
1467         hres = exprval_to_value(ctx->parser->script, &exprval, ei, &constr);
1468     exprval_release(&exprval);
1469     if(FAILED(hres))
1470         return hres;
1471
1472     if(V_VT(&constr) != VT_DISPATCH) {
1473         FIXME("throw TypeError\n");
1474         VariantClear(&constr);
1475         return E_FAIL;
1476     }
1477
1478     hres = disp_call(V_DISPATCH(&constr), DISPID_VALUE, ctx->parser->script->lcid,
1479                      DISPATCH_CONSTRUCT, &dp, &var, ei, NULL/*FIXME*/);
1480     IDispatch_Release(V_DISPATCH(&constr));
1481     if(FAILED(hres))
1482         return hres;
1483
1484     ret->type = EXPRVAL_VARIANT;
1485     ret->u.var = var;
1486     return S_OK;
1487 }
1488
1489 HRESULT call_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1490 {
1491     call_expression_t *expr = (call_expression_t*)_expr;
1492     VARIANT func, var;
1493     exprval_t exprval;
1494     DISPPARAMS dp;
1495     HRESULT hres;
1496
1497     TRACE("\n");
1498
1499     hres = expr_eval(ctx, expr->expression, 0, ei, &exprval);
1500     if(FAILED(hres))
1501         return hres;
1502
1503     hres = args_to_param(ctx, expr->argument_list, ei, &dp);
1504     if(SUCCEEDED(hres)) {
1505         switch(exprval.type) {
1506         case EXPRVAL_IDREF:
1507             hres = disp_call(exprval.u.idref.disp, exprval.u.idref.id, ctx->parser->script->lcid, DISPATCH_METHOD,
1508                     &dp, flags & EXPR_NOVAL ? NULL : &var, ei, NULL/*FIXME*/);
1509             if(flags & EXPR_NOVAL)
1510                 V_VT(&var) = VT_EMPTY;
1511             break;
1512         default:
1513             FIXME("unimplemented type %d\n", V_VT(&func));
1514             hres = E_NOTIMPL;
1515         }
1516
1517         free_dp(&dp);
1518     }
1519
1520     exprval_release(&exprval);
1521     if(FAILED(hres))
1522         return hres;
1523
1524     TRACE("= %s\n", debugstr_variant(&var));
1525     ret->type = EXPRVAL_VARIANT;
1526     ret->u.var = var;
1527     return S_OK;
1528 }
1529
1530 HRESULT this_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1531 {
1532     TRACE("\n");
1533
1534     ret->type = EXPRVAL_VARIANT;
1535     V_VT(&ret->u.var) = VT_DISPATCH;
1536     V_DISPATCH(&ret->u.var) = ctx->this_obj;
1537     IDispatch_AddRef(ctx->this_obj);
1538     return S_OK;
1539 }
1540
1541 /* ECMA-262 3rd Edition    10.1.4 */
1542 HRESULT identifier_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1543 {
1544     identifier_expression_t *expr = (identifier_expression_t*)_expr;
1545     BSTR identifier;
1546     HRESULT hres;
1547
1548     TRACE("\n");
1549
1550     identifier = SysAllocString(expr->identifier);
1551     if(!identifier)
1552         return E_OUTOFMEMORY;
1553
1554     hres = identifier_eval(ctx, identifier, flags, ret);
1555
1556     SysFreeString(identifier);
1557     return hres;
1558 }
1559
1560 /* ECMA-262 3rd Edition    7.8 */
1561 HRESULT literal_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1562 {
1563     literal_expression_t *expr = (literal_expression_t*)_expr;
1564     VARIANT var;
1565     HRESULT hres;
1566
1567     TRACE("\n");
1568
1569     hres = literal_to_var(expr->literal, &var);
1570     if(FAILED(hres))
1571         return hres;
1572
1573     ret->type = EXPRVAL_VARIANT;
1574     ret->u.var = var;
1575     return S_OK;
1576 }
1577
1578 /* ECMA-262 3rd Edition    11.1.4 */
1579 HRESULT array_literal_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1580 {
1581     array_literal_expression_t *expr = (array_literal_expression_t*)_expr;
1582     DWORD length = 0, i = 0;
1583     array_element_t *elem;
1584     DispatchEx *array;
1585     exprval_t exprval;
1586     VARIANT val;
1587     HRESULT hres;
1588
1589     TRACE("\n");
1590
1591     for(elem = expr->element_list; elem; elem = elem->next)
1592         length += elem->elision+1;
1593     length += expr->length;
1594
1595     hres = create_array(ctx->parser->script, length, &array);
1596     if(FAILED(hres))
1597         return hres;
1598
1599     for(elem = expr->element_list; elem; elem = elem->next) {
1600         i += elem->elision;
1601
1602         hres = expr_eval(ctx, elem->expr, 0, ei, &exprval);
1603         if(FAILED(hres))
1604             break;
1605
1606         hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
1607         exprval_release(&exprval);
1608         if(FAILED(hres))
1609             break;
1610
1611         hres = jsdisp_propput_idx(array, i, ctx->parser->script->lcid, &val, ei, NULL/*FIXME*/);
1612         VariantClear(&val);
1613         if(FAILED(hres))
1614             break;
1615
1616         i++;
1617     }
1618
1619     if(FAILED(hres)) {
1620         jsdisp_release(array);
1621         return hres;
1622     }
1623
1624     ret->type = EXPRVAL_VARIANT;
1625     V_VT(&ret->u.var) = VT_DISPATCH;
1626     V_DISPATCH(&ret->u.var) = (IDispatch*)_IDispatchEx_(array);
1627     return S_OK;
1628 }
1629
1630 /* ECMA-262 3rd Edition    11.1.5 */
1631 HRESULT property_value_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1632 {
1633     property_value_expression_t *expr = (property_value_expression_t*)_expr;
1634     VARIANT val, tmp;
1635     DispatchEx *obj;
1636     prop_val_t *iter;
1637     exprval_t exprval;
1638     BSTR name;
1639     HRESULT hres;
1640
1641     TRACE("\n");
1642
1643     hres = create_object(ctx->parser->script, NULL, &obj);
1644     if(FAILED(hres))
1645         return hres;
1646
1647     for(iter = expr->property_list; iter; iter = iter->next) {
1648         hres = literal_to_var(iter->name, &tmp);
1649         if(FAILED(hres))
1650             break;
1651
1652         hres = to_string(ctx->parser->script, &tmp, ei, &name);
1653         VariantClear(&tmp);
1654         if(FAILED(hres))
1655             break;
1656
1657         hres = expr_eval(ctx, iter->value, 0, ei, &exprval);
1658         if(SUCCEEDED(hres)) {
1659             hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
1660             exprval_release(&exprval);
1661             if(SUCCEEDED(hres)) {
1662                 hres = jsdisp_propput_name(obj, name, ctx->parser->script->lcid, &val, ei, NULL/*FIXME*/);
1663                 VariantClear(&val);
1664             }
1665         }
1666
1667         SysFreeString(name);
1668         if(FAILED(hres))
1669             break;
1670     }
1671
1672     if(FAILED(hres)) {
1673         jsdisp_release(obj);
1674         return hres;
1675     }
1676
1677     ret->type = EXPRVAL_VARIANT;
1678     V_VT(&ret->u.var) = VT_DISPATCH;
1679     V_DISPATCH(&ret->u.var) = (IDispatch*)_IDispatchEx_(obj);
1680     return S_OK;
1681 }
1682
1683 /* ECMA-262 3rd Edition    11.14 */
1684 HRESULT comma_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1685 {
1686     binary_expression_t *expr = (binary_expression_t*)_expr;
1687     VARIANT lval, rval;
1688     HRESULT hres;
1689
1690     TRACE("\n");
1691
1692     hres = get_binary_expr_values(ctx, expr, ei, &lval, &rval);
1693     if(FAILED(hres))
1694         return hres;
1695
1696     VariantClear(&lval);
1697
1698     ret->type = EXPRVAL_VARIANT;
1699     ret->u.var = rval;
1700     return S_OK;
1701 }
1702
1703 /* ECMA-262 3rd Edition    11.11 */
1704 HRESULT logical_or_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1705 {
1706     binary_expression_t *expr = (binary_expression_t*)_expr;
1707     exprval_t exprval;
1708     VARIANT_BOOL b;
1709     VARIANT val;
1710     HRESULT hres;
1711
1712     TRACE("\n");
1713
1714     hres = expr_eval(ctx, expr->expression1, 0, ei, &exprval);
1715     if(FAILED(hres))
1716         return hres;
1717
1718     hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
1719     exprval_release(&exprval);
1720     if(FAILED(hres))
1721         return hres;
1722
1723     hres = to_boolean(&val, &b);
1724     if(SUCCEEDED(hres) && b) {
1725         ret->type = EXPRVAL_VARIANT;
1726         ret->u.var = val;
1727         return S_OK;
1728     }
1729
1730     VariantClear(&val);
1731     if(FAILED(hres))
1732         return hres;
1733
1734     hres = expr_eval(ctx, expr->expression2, 0, ei, &exprval);
1735     if(FAILED(hres))
1736         return hres;
1737
1738     hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
1739     exprval_release(&exprval);
1740     if(FAILED(hres))
1741         return hres;
1742
1743     ret->type = EXPRVAL_VARIANT;
1744     ret->u.var = val;
1745     return S_OK;
1746 }
1747
1748 /* ECMA-262 3rd Edition    11.11 */
1749 HRESULT logical_and_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1750 {
1751     binary_expression_t *expr = (binary_expression_t*)_expr;
1752     exprval_t exprval;
1753     VARIANT_BOOL b;
1754     VARIANT val;
1755     HRESULT hres;
1756
1757     TRACE("\n");
1758
1759     hres = expr_eval(ctx, expr->expression1, 0, ei, &exprval);
1760     if(FAILED(hres))
1761         return hres;
1762
1763     hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
1764     exprval_release(&exprval);
1765     if(FAILED(hres))
1766         return hres;
1767
1768     hres = to_boolean(&val, &b);
1769     if(SUCCEEDED(hres) && !b) {
1770         ret->type = EXPRVAL_VARIANT;
1771         ret->u.var = val;
1772         return S_OK;
1773     }
1774
1775     VariantClear(&val);
1776     if(FAILED(hres))
1777         return hres;
1778
1779     hres = expr_eval(ctx, expr->expression2, 0, ei, &exprval);
1780     if(FAILED(hres))
1781         return hres;
1782
1783     hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
1784     exprval_release(&exprval);
1785     if(FAILED(hres))
1786         return hres;
1787
1788     ret->type = EXPRVAL_VARIANT;
1789     ret->u.var = val;
1790     return S_OK;
1791 }
1792
1793 /* ECMA-262 3rd Edition    11.10 */
1794 static HRESULT bitor_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, VARIANT *retv)
1795 {
1796     INT li, ri;
1797     HRESULT hres;
1798
1799     hres = to_int32(ctx->parser->script, lval, ei, &li);
1800     if(FAILED(hres))
1801         return hres;
1802
1803     hres = to_int32(ctx->parser->script, rval, ei, &ri);
1804     if(FAILED(hres))
1805         return hres;
1806
1807     V_VT(retv) = VT_I4;
1808     V_I4(retv) = li|ri;
1809     return S_OK;
1810 }
1811
1812 /* ECMA-262 3rd Edition    11.10 */
1813 HRESULT binary_or_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1814 {
1815     binary_expression_t *expr = (binary_expression_t*)_expr;
1816
1817     TRACE("\n");
1818
1819     return binary_expr_eval(ctx, expr, bitor_eval, ei, ret);
1820 }
1821
1822 /* ECMA-262 3rd Edition    11.10 */
1823 static HRESULT xor_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, VARIANT *retv)
1824 {
1825     INT li, ri;
1826     HRESULT hres;
1827
1828     hres = to_int32(ctx->parser->script, lval, ei, &li);
1829     if(FAILED(hres))
1830         return hres;
1831
1832     hres = to_int32(ctx->parser->script, rval, ei, &ri);
1833     if(FAILED(hres))
1834         return hres;
1835
1836     V_VT(retv) = VT_I4;
1837     V_I4(retv) = li^ri;
1838     return S_OK;
1839 }
1840
1841 /* ECMA-262 3rd Edition    11.10 */
1842 HRESULT binary_xor_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1843 {
1844     binary_expression_t *expr = (binary_expression_t*)_expr;
1845
1846     TRACE("\n");
1847
1848     return binary_expr_eval(ctx, expr, xor_eval, ei, ret);
1849 }
1850
1851 /* ECMA-262 3rd Edition    11.10 */
1852 static HRESULT bitand_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, VARIANT *retv)
1853 {
1854     INT li, ri;
1855     HRESULT hres;
1856
1857     hres = to_int32(ctx->parser->script, lval, ei, &li);
1858     if(FAILED(hres))
1859         return hres;
1860
1861     hres = to_int32(ctx->parser->script, rval, ei, &ri);
1862     if(FAILED(hres))
1863         return hres;
1864
1865     V_VT(retv) = VT_I4;
1866     V_I4(retv) = li&ri;
1867     return S_OK;
1868 }
1869
1870 /* ECMA-262 3rd Edition    11.10 */
1871 HRESULT binary_and_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1872 {
1873     binary_expression_t *expr = (binary_expression_t*)_expr;
1874
1875     TRACE("\n");
1876
1877     return binary_expr_eval(ctx, expr, bitand_eval, ei, ret);
1878 }
1879
1880 HRESULT instanceof_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1881 {
1882     FIXME("\n");
1883     return E_NOTIMPL;
1884 }
1885
1886 HRESULT in_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1887 {
1888     FIXME("\n");
1889     return E_NOTIMPL;
1890 }
1891
1892 /* ECMA-262 3rd Edition    11.6.1 */
1893 static HRESULT add_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, VARIANT *retv)
1894 {
1895     VARIANT r, l;
1896     HRESULT hres;
1897
1898     hres = to_primitive(ctx->parser->script, lval, ei, &l);
1899     if(FAILED(hres))
1900         return hres;
1901
1902     hres = to_primitive(ctx->parser->script, rval, ei, &r);
1903     if(FAILED(hres)) {
1904         VariantClear(&l);
1905         return hres;
1906     }
1907
1908     if(V_VT(&l) == VT_BSTR || V_VT(&r) == VT_BSTR) {
1909         BSTR lstr = NULL, rstr = NULL;
1910
1911         if(V_VT(&l) == VT_BSTR)
1912             lstr = V_BSTR(&l);
1913         else
1914             hres = to_string(ctx->parser->script, &l, ei, &lstr);
1915
1916         if(SUCCEEDED(hres)) {
1917             if(V_VT(&r) == VT_BSTR)
1918                 rstr = V_BSTR(&r);
1919             else
1920                 hres = to_string(ctx->parser->script, &r, ei, &rstr);
1921         }
1922
1923         if(SUCCEEDED(hres)) {
1924             int len1, len2;
1925
1926             len1 = SysStringLen(lstr);
1927             len2 = SysStringLen(rstr);
1928
1929             V_VT(retv) = VT_BSTR;
1930             V_BSTR(retv) = SysAllocStringLen(NULL, len1+len2);
1931             memcpy(V_BSTR(retv), lstr, len1*sizeof(WCHAR));
1932             memcpy(V_BSTR(retv)+len1, rstr, (len2+1)*sizeof(WCHAR));
1933         }
1934
1935         if(lstr && V_VT(&l) != VT_BSTR)
1936             SysFreeString(lstr);
1937         if(rstr && V_VT(&r) != VT_BSTR)
1938             SysFreeString(rstr);
1939     }else {
1940         VARIANT nl, nr;
1941
1942         hres = to_number(ctx->parser->script, &l, ei, &nl);
1943         if(SUCCEEDED(hres)) {
1944             hres = to_number(ctx->parser->script, &r, ei, &nr);
1945             if(SUCCEEDED(hres))
1946                 num_set_val(retv, num_val(&nl) + num_val(&nr));
1947         }
1948     }
1949
1950     VariantClear(&r);
1951     VariantClear(&l);
1952     return hres;
1953 }
1954
1955 /* ECMA-262 3rd Edition    11.6.1 */
1956 HRESULT add_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1957 {
1958     binary_expression_t *expr = (binary_expression_t*)_expr;
1959
1960     TRACE("\n");
1961
1962     return binary_expr_eval(ctx, expr, add_eval, ei, ret);
1963 }
1964
1965 /* ECMA-262 3rd Edition    11.6.2 */
1966 static HRESULT sub_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, VARIANT *retv)
1967 {
1968     VARIANT lnum, rnum;
1969     HRESULT hres;
1970
1971     hres = to_number(ctx->parser->script, lval, ei, &lnum);
1972     if(FAILED(hres))
1973         return hres;
1974
1975     hres = to_number(ctx->parser->script, rval, ei, &rnum);
1976     if(FAILED(hres))
1977         return hres;
1978
1979     num_set_val(retv, num_val(&lnum) - num_val(&rnum));
1980     return S_OK;
1981 }
1982
1983 /* ECMA-262 3rd Edition    11.6.2 */
1984 HRESULT sub_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
1985 {
1986     binary_expression_t *expr = (binary_expression_t*)_expr;
1987
1988     TRACE("\n");
1989
1990     return binary_expr_eval(ctx, expr, sub_eval, ei, ret);
1991 }
1992
1993 /* ECMA-262 3rd Edition    11.5.1 */
1994 static HRESULT mul_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, VARIANT *retv)
1995 {
1996     VARIANT lnum, rnum;
1997     HRESULT hres;
1998
1999     hres = to_number(ctx->parser->script, lval, ei, &lnum);
2000     if(FAILED(hres))
2001         return hres;
2002
2003     hres = to_number(ctx->parser->script, rval, ei, &rnum);
2004     if(FAILED(hres))
2005         return hres;
2006
2007     num_set_val(retv, num_val(&lnum) * num_val(&rnum));
2008     return S_OK;
2009 }
2010
2011 /* ECMA-262 3rd Edition    11.5.1 */
2012 HRESULT mul_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2013 {
2014     binary_expression_t *expr = (binary_expression_t*)_expr;
2015
2016     TRACE("\n");
2017
2018     return binary_expr_eval(ctx, expr, mul_eval, ei, ret);
2019 }
2020
2021 /* ECMA-262 3rd Edition    11.5.2 */
2022 static HRESULT div_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, VARIANT *retv)
2023 {
2024     VARIANT lnum, rnum;
2025     HRESULT hres;
2026
2027     hres = to_number(ctx->parser->script, lval, ei, &lnum);
2028     if(FAILED(hres))
2029         return hres;
2030
2031     hres = to_number(ctx->parser->script, rval, ei, &rnum);
2032     if(FAILED(hres))
2033         return hres;
2034
2035     num_set_val(retv, num_val(&lnum) / num_val(&rnum));
2036     return S_OK;
2037 }
2038
2039 /* ECMA-262 3rd Edition    11.5.2 */
2040 HRESULT div_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2041 {
2042     binary_expression_t *expr = (binary_expression_t*)_expr;
2043
2044     TRACE("\n");
2045
2046     return binary_expr_eval(ctx, expr, div_eval, ei, ret);
2047 }
2048
2049 HRESULT mod_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2050 {
2051     FIXME("\n");
2052     return E_NOTIMPL;
2053 }
2054
2055 /* ECMA-262 3rd Edition    11.4.2 */
2056 HRESULT delete_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2057 {
2058     unary_expression_t *expr = (unary_expression_t*)_expr;
2059     VARIANT_BOOL b = VARIANT_FALSE;
2060     exprval_t exprval;
2061     HRESULT hres;
2062
2063     TRACE("\n");
2064
2065     hres = expr_eval(ctx, expr->expression, EXPR_STRREF, ei, &exprval);
2066     if(FAILED(hres))
2067         return hres;
2068
2069     switch(exprval.type) {
2070     case EXPRVAL_NAMEREF: {
2071         IDispatchEx *dispex;
2072
2073         hres = IDispatch_QueryInterface(exprval.u.nameref.disp, &IID_IDispatchEx, (void**)&dispex);
2074         if(SUCCEEDED(hres)) {
2075             hres = IDispatchEx_DeleteMemberByName(dispex, exprval.u.nameref.name, fdexNameCaseSensitive);
2076             b = VARIANT_TRUE;
2077             IDispatchEx_Release(dispex);
2078         }
2079         break;
2080     }
2081     default:
2082         FIXME("unsupported type %d\n", exprval.type);
2083         hres = E_NOTIMPL;
2084     }
2085
2086     exprval_release(&exprval);
2087     if(FAILED(hres))
2088         return hres;
2089
2090     return return_bool(ret, b);
2091 }
2092
2093 /* ECMA-262 3rd Edition    11.4.2 */
2094 HRESULT void_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2095 {
2096     unary_expression_t *expr = (unary_expression_t*)_expr;
2097     exprval_t exprval;
2098     VARIANT tmp;
2099     HRESULT hres;
2100
2101     TRACE("\n");
2102
2103     hres = expr_eval(ctx, expr->expression, 0, ei, &exprval);
2104     if(FAILED(hres))
2105         return hres;
2106
2107     hres = exprval_to_value(ctx->parser->script, &exprval, ei, &tmp);
2108     exprval_release(&exprval);
2109     if(FAILED(hres))
2110         return hres;
2111
2112     VariantClear(&tmp);
2113
2114     ret->type = EXPRVAL_VARIANT;
2115     V_VT(&ret->u.var) = VT_EMPTY;
2116     return S_OK;
2117 }
2118
2119 /* ECMA-262 3rd Edition    11.4.3 */
2120 HRESULT typeof_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2121 {
2122     unary_expression_t *expr = (unary_expression_t*)_expr;
2123     const WCHAR *str;
2124     exprval_t exprval;
2125     VARIANT val;
2126     HRESULT hres;
2127
2128     static const WCHAR booleanW[] = {'b','o','o','l','e','a','n',0};
2129     static const WCHAR functionW[] = {'f','u','n','c','t','i','o','n',0};
2130     static const WCHAR numberW[] = {'n','u','m','b','e','r',0};
2131     static const WCHAR objectW[] = {'o','b','j','e','c','t',0};
2132     static const WCHAR stringW[] = {'s','t','r','i','n','g',0};
2133     static const WCHAR undefinedW[] = {'u','n','d','e','f','i','n','e','d',0};
2134
2135     TRACE("\n");
2136
2137     hres = expr_eval(ctx, expr->expression, 0, ei, &exprval);
2138     if(FAILED(hres))
2139         return hres;
2140
2141     hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
2142     exprval_release(&exprval);
2143     if(FAILED(hres))
2144         return hres;
2145
2146     switch(V_VT(&val)) {
2147     case VT_EMPTY:
2148         str = undefinedW;
2149         break;
2150     case VT_NULL:
2151         str = objectW;
2152         break;
2153     case VT_BOOL:
2154         str = booleanW;
2155         break;
2156     case VT_I4:
2157     case VT_R8:
2158         str = numberW;
2159         break;
2160     case VT_BSTR:
2161         str = stringW;
2162         break;
2163     case VT_DISPATCH: {
2164         DispatchEx *dispex;
2165
2166         dispex = iface_to_jsdisp((IUnknown*)V_DISPATCH(&val));
2167         if(dispex) {
2168             str = dispex->builtin_info->class == JSCLASS_FUNCTION ? functionW : objectW;
2169             IDispatchEx_Release(_IDispatchEx_(dispex));
2170         }else {
2171             str = objectW;
2172         }
2173         break;
2174     }
2175     default:
2176         FIXME("unhandled vt %d\n", V_VT(&val));
2177         hres = E_NOTIMPL;
2178     }
2179
2180     VariantClear(&val);
2181     if(FAILED(hres))
2182         return hres;
2183
2184     ret->type = EXPRVAL_VARIANT;
2185     V_VT(&ret->u.var) = VT_BSTR;
2186     V_BSTR(&ret->u.var) = SysAllocString(str);
2187     return S_OK;
2188 }
2189
2190 /* ECMA-262 3rd Edition    11.4.7 */
2191 HRESULT minus_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2192 {
2193     unary_expression_t *expr = (unary_expression_t*)_expr;
2194     exprval_t exprval;
2195     VARIANT val, num;
2196     HRESULT hres;
2197
2198     TRACE("\n");
2199
2200     hres = expr_eval(ctx, expr->expression, 0, ei, &exprval);
2201     if(FAILED(hres))
2202         return hres;
2203
2204     hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
2205     exprval_release(&exprval);
2206     if(FAILED(hres))
2207         return hres;
2208
2209     hres = to_number(ctx->parser->script, &val, ei, &num);
2210     VariantClear(&val);
2211     if(FAILED(hres))
2212         return hres;
2213
2214     ret->type = EXPRVAL_VARIANT;
2215     num_set_val(&ret->u.var, -num_val(&num));
2216     return S_OK;
2217 }
2218
2219 /* ECMA-262 3rd Edition    11.4.6 */
2220 HRESULT plus_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2221 {
2222     unary_expression_t *expr = (unary_expression_t*)_expr;
2223     exprval_t exprval;
2224     VARIANT val, num;
2225     HRESULT hres;
2226
2227     TRACE("\n");
2228
2229     hres = expr_eval(ctx, expr->expression, EXPR_NEWREF, ei, &exprval);
2230     if(FAILED(hres))
2231         return hres;
2232
2233     hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
2234     exprval_release(&exprval);
2235     if(FAILED(hres))
2236         return hres;
2237
2238     hres = to_number(ctx->parser->script, &val, ei, &num);
2239     if(FAILED(hres))
2240         return hres;
2241
2242     ret->type = EXPRVAL_VARIANT;
2243     ret->u.var = num;
2244     return S_OK;
2245 }
2246
2247 /* ECMA-262 3rd Edition    11.3.1 */
2248 HRESULT post_increment_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2249 {
2250     unary_expression_t *expr = (unary_expression_t*)_expr;
2251     VARIANT val, num;
2252     exprval_t exprval;
2253     HRESULT hres;
2254
2255     TRACE("\n");
2256
2257     hres = expr_eval(ctx, expr->expression, EXPR_NEWREF, ei, &exprval);
2258     if(FAILED(hres))
2259         return hres;
2260
2261     hres = exprval_value(ctx->parser->script, &exprval, ei, &val);
2262     if(SUCCEEDED(hres)) {
2263         hres = to_number(ctx->parser->script, &val, ei, &num);
2264         VariantClear(&val);
2265     }
2266
2267     if(SUCCEEDED(hres)) {
2268         VARIANT inc;
2269         num_set_val(&inc, num_val(&num)+1.0);
2270         hres = put_value(ctx->parser->script, &exprval, &inc, ei);
2271     }
2272
2273     exprval_release(&exprval);
2274     if(FAILED(hres))
2275         return hres;
2276
2277     ret->type = EXPRVAL_VARIANT;
2278     ret->u.var = num;
2279     return S_OK;
2280 }
2281
2282 /* ECMA-262 3rd Edition    11.3.2 */
2283 HRESULT post_decrement_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2284 {
2285     unary_expression_t *expr = (unary_expression_t*)_expr;
2286     VARIANT val, num;
2287     exprval_t exprval;
2288     HRESULT hres;
2289
2290     TRACE("\n");
2291
2292     hres = expr_eval(ctx, expr->expression, EXPR_NEWREF, ei, &exprval);
2293     if(FAILED(hres))
2294         return hres;
2295
2296     hres = exprval_value(ctx->parser->script, &exprval, ei, &val);
2297     if(SUCCEEDED(hres)) {
2298         hres = to_number(ctx->parser->script, &val, ei, &num);
2299         VariantClear(&val);
2300     }
2301
2302     if(SUCCEEDED(hres)) {
2303         VARIANT dec;
2304         num_set_val(&dec, num_val(&num)-1.0);
2305         hres = put_value(ctx->parser->script, &exprval, &dec, ei);
2306     }
2307
2308     exprval_release(&exprval);
2309     if(FAILED(hres))
2310         return hres;
2311
2312     ret->type = EXPRVAL_VARIANT;
2313     ret->u.var = num;
2314     return S_OK;
2315 }
2316
2317 /* ECMA-262 3rd Edition    11.4.4 */
2318 HRESULT pre_increment_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2319 {
2320     unary_expression_t *expr = (unary_expression_t*)_expr;
2321     VARIANT val, num;
2322     exprval_t exprval;
2323     HRESULT hres;
2324
2325     TRACE("\n");
2326
2327     hres = expr_eval(ctx, expr->expression, EXPR_NEWREF, ei, &exprval);
2328     if(FAILED(hres))
2329         return hres;
2330
2331     hres = exprval_value(ctx->parser->script, &exprval, ei, &val);
2332     if(SUCCEEDED(hres)) {
2333         hres = to_number(ctx->parser->script, &val, ei, &num);
2334         VariantClear(&val);
2335     }
2336
2337     if(SUCCEEDED(hres)) {
2338         num_set_val(&val, num_val(&num)+1.0);
2339         hres = put_value(ctx->parser->script, &exprval, &val, ei);
2340     }
2341
2342     exprval_release(&exprval);
2343     if(FAILED(hres))
2344         return hres;
2345
2346     ret->type = EXPRVAL_VARIANT;
2347     ret->u.var = val;
2348     return S_OK;
2349 }
2350
2351 /* ECMA-262 3rd Edition    11.4.5 */
2352 HRESULT pre_decrement_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2353 {
2354     unary_expression_t *expr = (unary_expression_t*)_expr;
2355     VARIANT val, num;
2356     exprval_t exprval;
2357     HRESULT hres;
2358
2359     TRACE("\n");
2360
2361     hres = expr_eval(ctx, expr->expression, EXPR_NEWREF, ei, &exprval);
2362     if(FAILED(hres))
2363         return hres;
2364
2365     hres = exprval_value(ctx->parser->script, &exprval, ei, &val);
2366     if(SUCCEEDED(hres)) {
2367         hres = to_number(ctx->parser->script, &val, ei, &num);
2368         VariantClear(&val);
2369     }
2370
2371     if(SUCCEEDED(hres)) {
2372         num_set_val(&val, num_val(&num)-1.0);
2373         hres = put_value(ctx->parser->script, &exprval, &val, ei);
2374     }
2375
2376     exprval_release(&exprval);
2377     if(FAILED(hres))
2378         return hres;
2379
2380     ret->type = EXPRVAL_VARIANT;
2381     ret->u.var = val;
2382     return S_OK;
2383 }
2384
2385 /* ECMA-262 3rd Edition    11.9.3 */
2386 static HRESULT equal_values(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, BOOL *ret)
2387 {
2388     if(V_VT(lval) == V_VT(rval) || (is_num_vt(V_VT(lval)) && is_num_vt(V_VT(rval))))
2389        return equal2_values(lval, rval, ret);
2390
2391     /* FIXME: NULL disps should be handled in more general way */
2392     if(V_VT(lval) == VT_DISPATCH && !V_DISPATCH(lval)) {
2393         VARIANT v;
2394         V_VT(&v) = VT_NULL;
2395         return equal_values(ctx, &v, rval, ei, ret);
2396     }
2397
2398     if(V_VT(rval) == VT_DISPATCH && !V_DISPATCH(rval)) {
2399         VARIANT v;
2400         V_VT(&v) = VT_NULL;
2401         return equal_values(ctx, lval, &v, ei, ret);
2402     }
2403
2404     if((V_VT(lval) == VT_NULL && V_VT(rval) == VT_EMPTY) ||
2405        (V_VT(lval) == VT_EMPTY && V_VT(rval) == VT_NULL)) {
2406         *ret = TRUE;
2407         return S_OK;
2408     }
2409
2410     if(V_VT(lval) == VT_BSTR && is_num_vt(V_VT(rval))) {
2411         VARIANT v;
2412         HRESULT hres;
2413
2414         hres = to_number(ctx->parser->script, lval, ei, &v);
2415         if(FAILED(hres))
2416             return hres;
2417
2418         return equal_values(ctx, &v, rval, ei, ret);
2419     }
2420
2421     if(V_VT(rval) == VT_BSTR && is_num_vt(V_VT(lval))) {
2422         VARIANT v;
2423         HRESULT hres;
2424
2425         hres = to_number(ctx->parser->script, rval, ei, &v);
2426         if(FAILED(hres))
2427             return hres;
2428
2429         return equal_values(ctx, lval, &v, ei, ret);
2430     }
2431
2432     if(V_VT(rval) == VT_BOOL) {
2433         VARIANT v;
2434
2435         V_VT(&v) = VT_I4;
2436         V_I4(&v) = V_BOOL(rval) ? 1 : 0;
2437         return equal_values(ctx, lval, &v, ei, ret);
2438     }
2439
2440     if(V_VT(lval) == VT_BOOL) {
2441         VARIANT v;
2442
2443         V_VT(&v) = VT_I4;
2444         V_I4(&v) = V_BOOL(lval) ? 1 : 0;
2445         return equal_values(ctx, &v, rval, ei, ret);
2446     }
2447
2448
2449     if(V_VT(rval) == VT_DISPATCH && (V_VT(lval) == VT_BSTR || is_num_vt(V_VT(lval)))) {
2450         VARIANT v;
2451         HRESULT hres;
2452
2453         hres = to_primitive(ctx->parser->script, rval, ei, &v);
2454         if(FAILED(hres))
2455             return hres;
2456
2457         hres = equal_values(ctx, lval, &v, ei, ret);
2458
2459         VariantClear(&v);
2460         return hres;
2461     }
2462
2463
2464     if(V_VT(lval) == VT_DISPATCH && (V_VT(rval) == VT_BSTR || is_num_vt(V_VT(rval)))) {
2465         VARIANT v;
2466         HRESULT hres;
2467
2468         hres = to_primitive(ctx->parser->script, lval, ei, &v);
2469         if(FAILED(hres))
2470             return hres;
2471
2472         hres = equal_values(ctx, &v, rval, ei, ret);
2473
2474         VariantClear(&v);
2475         return hres;
2476     }
2477
2478
2479     *ret = FALSE;
2480     return S_OK;
2481 }
2482
2483 /* ECMA-262 3rd Edition    11.9.1 */
2484 HRESULT equal_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2485 {
2486     binary_expression_t *expr = (binary_expression_t*)_expr;
2487     VARIANT rval, lval;
2488     BOOL b;
2489     HRESULT hres;
2490
2491     TRACE("\n");
2492
2493     hres = get_binary_expr_values(ctx, expr, ei, &rval, &lval);
2494     if(FAILED(hres))
2495         return hres;
2496
2497     hres = equal_values(ctx, &rval, &lval, ei, &b);
2498     if(FAILED(hres))
2499         return hres;
2500
2501     return return_bool(ret, b);
2502 }
2503
2504 /* ECMA-262 3rd Edition    11.9.4 */
2505 HRESULT equal2_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2506 {
2507     binary_expression_t *expr = (binary_expression_t*)_expr;
2508     VARIANT rval, lval;
2509     BOOL b;
2510     HRESULT hres;
2511
2512     TRACE("\n");
2513
2514     hres = get_binary_expr_values(ctx, expr, ei, &rval, &lval);
2515     if(FAILED(hres))
2516         return hres;
2517
2518     hres = equal2_values(&rval, &lval, &b);
2519     if(FAILED(hres))
2520         return hres;
2521
2522     return return_bool(ret, b);
2523 }
2524
2525 /* ECMA-262 3rd Edition    11.9.2 */
2526 HRESULT not_equal_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2527 {
2528     binary_expression_t *expr = (binary_expression_t*)_expr;
2529     VARIANT rval, lval;
2530     BOOL b;
2531     HRESULT hres;
2532
2533     TRACE("\n");
2534
2535     hres = get_binary_expr_values(ctx, expr, ei, &lval, &rval);
2536     if(FAILED(hres))
2537         return hres;
2538
2539     hres = equal_values(ctx, &lval, &rval, ei, &b);
2540     if(FAILED(hres))
2541         return hres;
2542
2543     return return_bool(ret, !b);
2544 }
2545
2546 /* ECMA-262 3rd Edition    11.9.5 */
2547 HRESULT not_equal2_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2548 {
2549     binary_expression_t *expr = (binary_expression_t*)_expr;
2550     VARIANT rval, lval;
2551     BOOL b;
2552     HRESULT hres;
2553
2554     TRACE("\n");
2555
2556     hres = get_binary_expr_values(ctx, expr, ei, &rval, &lval);
2557     if(FAILED(hres))
2558         return hres;
2559
2560     hres = equal2_values(&rval, &lval, &b);
2561     if(FAILED(hres))
2562         return hres;
2563
2564     return return_bool(ret, !b);
2565 }
2566
2567 /* ECMA-262 3rd Edition    11.8.5 */
2568 static HRESULT less_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, BOOL *ret)
2569 {
2570     VARIANT l, r, ln, rn;
2571     HRESULT hres;
2572
2573     hres = to_primitive(ctx->parser->script, lval, ei, &l);
2574     if(FAILED(hres))
2575         return hres;
2576
2577     hres = to_primitive(ctx->parser->script, rval, ei, &r);
2578     if(FAILED(hres)) {
2579         VariantClear(&l);
2580         return hres;
2581     }
2582
2583     if(V_VT(&l) == VT_BSTR && V_VT(&r) == VT_BSTR) {
2584         *ret = strcmpW(V_BSTR(&l), V_BSTR(&r)) < 0;
2585         SysFreeString(V_BSTR(&l));
2586         SysFreeString(V_BSTR(&r));
2587         return S_OK;
2588     }
2589
2590     hres = to_number(ctx->parser->script, &l, ei, &ln);
2591     VariantClear(&l);
2592     if(SUCCEEDED(hres))
2593         hres = to_number(ctx->parser->script, &r, ei, &rn);
2594     VariantClear(&r);
2595     if(FAILED(hres))
2596         return hres;
2597
2598     if(V_VT(&ln) == VT_I4 && V_VT(&rn) == VT_I4)
2599         *ret = V_I4(&ln) < V_I4(&rn);
2600     else
2601         *ret = num_val(&ln) < num_val(&rn);
2602
2603     return S_OK;
2604 }
2605
2606 /* ECMA-262 3rd Edition    11.8.1 */
2607 HRESULT less_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2608 {
2609     binary_expression_t *expr = (binary_expression_t*)_expr;
2610     VARIANT rval, lval;
2611     BOOL b;
2612     HRESULT hres;
2613
2614     TRACE("\n");
2615
2616     hres = get_binary_expr_values(ctx, expr, ei, &lval, &rval);
2617     if(FAILED(hres))
2618         return hres;
2619
2620     hres = less_eval(ctx, &lval, &rval, ei, &b);
2621     VariantClear(&lval);
2622     VariantClear(&rval);
2623     if(FAILED(hres))
2624         return hres;
2625
2626     return return_bool(ret, b);
2627 }
2628
2629 /* ECMA-262 3rd Edition    11.8.3 */
2630 HRESULT lesseq_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2631 {
2632     binary_expression_t *expr = (binary_expression_t*)_expr;
2633     VARIANT rval, lval;
2634     BOOL b;
2635     HRESULT hres;
2636
2637     TRACE("\n");
2638
2639     hres = get_binary_expr_values(ctx, expr, ei, &lval, &rval);
2640     if(FAILED(hres))
2641         return hres;
2642
2643     hres = less_eval(ctx, &rval, &lval, ei, &b);
2644     VariantClear(&lval);
2645     VariantClear(&rval);
2646     if(FAILED(hres))
2647         return hres;
2648
2649     return return_bool(ret, !b);
2650 }
2651
2652 /* ECMA-262 3rd Edition    11.8.2 */
2653 HRESULT greater_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2654 {
2655     binary_expression_t *expr = (binary_expression_t*)_expr;
2656     VARIANT rval, lval;
2657     BOOL b;
2658     HRESULT hres;
2659
2660     TRACE("\n");
2661
2662     hres = get_binary_expr_values(ctx, expr, ei, &lval, &rval);
2663     if(FAILED(hres))
2664         return hres;
2665
2666     hres = less_eval(ctx, &rval, &lval, ei, &b);
2667     VariantClear(&lval);
2668     VariantClear(&rval);
2669     if(FAILED(hres))
2670         return hres;
2671
2672     return return_bool(ret, b);
2673 }
2674
2675 /* ECMA-262 3rd Edition    11.8.4 */
2676 HRESULT greatereq_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2677 {
2678     binary_expression_t *expr = (binary_expression_t*)_expr;
2679     VARIANT rval, lval;
2680     BOOL b;
2681     HRESULT hres;
2682
2683     TRACE("\n");
2684
2685     hres = get_binary_expr_values(ctx, expr, ei, &lval, &rval);
2686     if(FAILED(hres))
2687         return hres;
2688
2689     hres = less_eval(ctx, &lval, &rval, ei, &b);
2690     VariantClear(&lval);
2691     VariantClear(&rval);
2692     if(FAILED(hres))
2693         return hres;
2694
2695     return return_bool(ret, !b);
2696 }
2697
2698 /* ECMA-262 3rd Edition    11.4.8 */
2699 HRESULT binary_negation_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2700 {
2701     unary_expression_t *expr = (unary_expression_t*)_expr;
2702     exprval_t exprval;
2703     VARIANT val;
2704     INT i;
2705     HRESULT hres;
2706
2707     TRACE("\n");
2708
2709     hres = expr_eval(ctx, expr->expression, EXPR_NEWREF, ei, &exprval);
2710     if(FAILED(hres))
2711         return hres;
2712
2713     hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
2714     exprval_release(&exprval);
2715     if(FAILED(hres))
2716         return hres;
2717
2718     hres = to_int32(ctx->parser->script, &val, ei, &i);
2719     if(FAILED(hres))
2720         return hres;
2721
2722     ret->type = EXPRVAL_VARIANT;
2723     V_VT(&ret->u.var) = VT_I4;
2724     V_I4(&ret->u.var) = ~i;
2725     return S_OK;
2726 }
2727
2728 /* ECMA-262 3rd Edition    11.4.9 */
2729 HRESULT logical_negation_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2730 {
2731     unary_expression_t *expr = (unary_expression_t*)_expr;
2732     exprval_t exprval;
2733     VARIANT_BOOL b;
2734     HRESULT hres;
2735
2736     TRACE("\n");
2737
2738     hres = expr_eval(ctx, expr->expression, EXPR_NEWREF, ei, &exprval);
2739     if(FAILED(hres))
2740         return hres;
2741
2742     hres = exprval_to_boolean(ctx->parser->script, &exprval, ei, &b);
2743     exprval_release(&exprval);
2744     if(FAILED(hres))
2745         return hres;
2746
2747     return return_bool(ret, !b);
2748 }
2749
2750 /* ECMA-262 3rd Edition    11.7.1 */
2751 static HRESULT lshift_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, VARIANT *retv)
2752 {
2753     DWORD ri;
2754     INT li;
2755     HRESULT hres;
2756
2757     hres = to_int32(ctx->parser->script, lval, ei, &li);
2758     if(FAILED(hres))
2759         return hres;
2760
2761     hres = to_uint32(ctx->parser->script, rval, ei, &ri);
2762     if(FAILED(hres))
2763         return hres;
2764
2765     V_VT(retv) = VT_I4;
2766     V_I4(retv) = li << (ri&0x1f);
2767     return S_OK;
2768 }
2769
2770 /* ECMA-262 3rd Edition    11.7.1 */
2771 HRESULT left_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2772 {
2773     binary_expression_t *expr = (binary_expression_t*)_expr;
2774
2775     TRACE("\n");
2776
2777     return binary_expr_eval(ctx, expr, lshift_eval, ei, ret);
2778 }
2779
2780 /* ECMA-262 3rd Edition    11.7.2 */
2781 static HRESULT rshift_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, VARIANT *retv)
2782 {
2783     DWORD ri;
2784     INT li;
2785     HRESULT hres;
2786
2787     hres = to_int32(ctx->parser->script, lval, ei, &li);
2788     if(FAILED(hres))
2789         return hres;
2790
2791     hres = to_uint32(ctx->parser->script, rval, ei, &ri);
2792     if(FAILED(hres))
2793         return hres;
2794
2795     V_VT(retv) = VT_I4;
2796     V_I4(retv) = li >> (ri&0x1f);
2797     return S_OK;
2798 }
2799
2800 /* ECMA-262 3rd Edition    11.7.2 */
2801 HRESULT right_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2802 {
2803     binary_expression_t *expr = (binary_expression_t*)_expr;
2804
2805     TRACE("\n");
2806
2807     return binary_expr_eval(ctx, expr, rshift_eval, ei, ret);
2808 }
2809
2810 /* ECMA-262 3rd Edition    11.7.3 */
2811 static HRESULT rshift2_eval(exec_ctx_t *ctx, VARIANT *lval, VARIANT *rval, jsexcept_t *ei, VARIANT *retv)
2812 {
2813     DWORD li, ri;
2814     HRESULT hres;
2815
2816     hres = to_uint32(ctx->parser->script, lval, ei, &li);
2817     if(FAILED(hres))
2818         return hres;
2819
2820     hres = to_uint32(ctx->parser->script, rval, ei, &ri);
2821     if(FAILED(hres))
2822         return hres;
2823
2824     V_VT(retv) = VT_I4;
2825     V_I4(retv) = li >> (ri&0x1f);
2826     return S_OK;
2827 }
2828
2829 /* ECMA-262 3rd Edition    11.7.3 */
2830 HRESULT right2_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2831 {
2832     binary_expression_t *expr = (binary_expression_t*)_expr;
2833
2834     TRACE("\n");
2835
2836     return binary_expr_eval(ctx, expr, rshift2_eval, ei, ret);
2837 }
2838
2839 /* ECMA-262 3rd Edition    11.13.1 */
2840 HRESULT assign_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2841 {
2842     binary_expression_t *expr = (binary_expression_t*)_expr;
2843     exprval_t exprval, exprvalr;
2844     VARIANT rval;
2845     HRESULT hres;
2846
2847     TRACE("\n");
2848
2849     hres = expr_eval(ctx, expr->expression1, EXPR_NEWREF, ei, &exprval);
2850     if(FAILED(hres))
2851         return hres;
2852
2853     hres = expr_eval(ctx, expr->expression2, 0, ei, &exprvalr);
2854     if(SUCCEEDED(hres)) {
2855         hres = exprval_to_value(ctx->parser->script, &exprvalr, ei, &rval);
2856         exprval_release(&exprvalr);
2857     }
2858
2859     if(SUCCEEDED(hres))
2860         hres = put_value(ctx->parser->script, &exprval, &rval, ei);
2861
2862     exprval_release(&exprval);
2863     if(FAILED(hres)) {
2864         VariantClear(&rval);
2865         return hres;
2866     }
2867
2868     ret->type = EXPRVAL_VARIANT;
2869     ret->u.var = rval;
2870     return S_OK;
2871 }
2872
2873 /* ECMA-262 3rd Edition    11.13.2 */
2874 HRESULT assign_lshift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2875 {
2876     binary_expression_t *expr = (binary_expression_t*)_expr;
2877
2878     TRACE("\n");
2879
2880     return assign_oper_eval(ctx, expr->expression1, expr->expression2, lshift_eval, ei, ret);
2881 }
2882
2883 /* ECMA-262 3rd Edition    11.13.2 */
2884 HRESULT assign_rshift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2885 {
2886     binary_expression_t *expr = (binary_expression_t*)_expr;
2887
2888     TRACE("\n");
2889
2890     return assign_oper_eval(ctx, expr->expression1, expr->expression2, rshift_eval, ei, ret);
2891 }
2892
2893 /* ECMA-262 3rd Edition    11.13.2 */
2894 HRESULT assign_rrshift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2895 {
2896     binary_expression_t *expr = (binary_expression_t*)_expr;
2897
2898     TRACE("\n");
2899
2900     return assign_oper_eval(ctx, expr->expression1, expr->expression2, rshift2_eval, ei, ret);
2901 }
2902
2903 /* ECMA-262 3rd Edition    11.13.2 */
2904 HRESULT assign_add_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2905 {
2906     binary_expression_t *expr = (binary_expression_t*)_expr;
2907
2908     TRACE("\n");
2909
2910     return assign_oper_eval(ctx, expr->expression1, expr->expression2, add_eval, ei, ret);
2911 }
2912
2913 /* ECMA-262 3rd Edition    11.13.2 */
2914 HRESULT assign_sub_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2915 {
2916     binary_expression_t *expr = (binary_expression_t*)_expr;
2917
2918     TRACE("\n");
2919
2920     return assign_oper_eval(ctx, expr->expression1, expr->expression2, sub_eval, ei, ret);
2921 }
2922
2923 /* ECMA-262 3rd Edition    11.13.2 */
2924 HRESULT assign_mul_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2925 {
2926     binary_expression_t *expr = (binary_expression_t*)_expr;
2927
2928     TRACE("\n");
2929
2930     return assign_oper_eval(ctx, expr->expression1, expr->expression2, mul_eval, ei, ret);
2931 }
2932
2933 /* ECMA-262 3rd Edition    11.13.2 */
2934 HRESULT assign_div_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2935 {
2936     binary_expression_t *expr = (binary_expression_t*)_expr;
2937
2938     TRACE("\n");
2939
2940     return assign_oper_eval(ctx, expr->expression1, expr->expression2, div_eval, ei, ret);
2941 }
2942
2943 HRESULT assign_mod_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2944 {
2945     FIXME("\n");
2946     return E_NOTIMPL;
2947 }
2948
2949 /* ECMA-262 3rd Edition    11.13.2 */
2950 HRESULT assign_and_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2951 {
2952     binary_expression_t *expr = (binary_expression_t*)_expr;
2953
2954     TRACE("\n");
2955
2956     return assign_oper_eval(ctx, expr->expression1, expr->expression2, bitand_eval, ei, ret);
2957 }
2958
2959 /* ECMA-262 3rd Edition    11.13.2 */
2960 HRESULT assign_or_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2961 {
2962     binary_expression_t *expr = (binary_expression_t*)_expr;
2963
2964     TRACE("\n");
2965
2966     return assign_oper_eval(ctx, expr->expression1, expr->expression2, bitor_eval, ei, ret);
2967 }
2968
2969 /* ECMA-262 3rd Edition    11.13.2 */
2970 HRESULT assign_xor_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
2971 {
2972     binary_expression_t *expr = (binary_expression_t*)_expr;
2973
2974     TRACE("\n");
2975
2976     return assign_oper_eval(ctx, expr->expression1, expr->expression2, xor_eval, ei, ret);
2977 }