Module: wine Branch: master Commit: 1edd64ef8b453ed44ab3f234d8b3d7be6d62e389 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1edd64ef8b453ed44ab3f234d8...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Sep 10 21:10:06 2008 +0200
jscript: Added if statement implementation.
---
dlls/jscript/engine.c | 29 ++++++++++++++++++++++++++--- dlls/jscript/tests/lang.js | 24 ++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-)
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index e594c69..90aa300 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -566,10 +566,33 @@ HRESULT expression_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_ty return S_OK; }
-HRESULT if_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +/* ECMA-262 3rd Edition 12.5 */ +HRESULT if_statement_eval(exec_ctx_t *ctx, statement_t *_stat, return_type_t *rt, VARIANT *ret) { - FIXME("\n"); - return E_NOTIMPL; + if_statement_t *stat = (if_statement_t*)_stat; + exprval_t exprval; + VARIANT_BOOL b; + HRESULT hres; + + TRACE("\n"); + + hres = expr_eval(ctx, stat->expr, 0, &rt->ei, &exprval); + if(FAILED(hres)) + return hres; + + hres = exprval_to_boolean(ctx->parser->script, &exprval, &rt->ei, &b); + exprval_release(&exprval); + if(FAILED(hres)) + return hres; + + if(b) + hres = stat_eval(ctx, stat->if_stat, rt, ret); + else if(stat->else_stat) + hres = stat_eval(ctx, stat->else_stat, rt, ret); + else + V_VT(ret) = VT_EMPTY; + + return hres; }
HRESULT dowhile_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index 4a42b9d..c6742f5 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+var tmp; + ok(true, "true is not true?"); ok(!false, "!false is not true"); ok(!undefined, "!undefined is not true"); @@ -116,4 +118,26 @@ obj2.pvar = 3; testConstr1.prototype.pvar = 1; ok(obj2.pvar === 3, "obj2.pvar is not 3");
+tmp = 0; +if(true) + tmp = 1; +else + ok(false, "else evaluated"); +ok(tmp === 1, "tmp !== 1, if not evaluated?"); + +tmp = 0; +if(1 === 0) + ok(false, "if evaluated"); +else + tmp = 1; +ok(tmp === 1, "tmp !== 1, if not evaluated?"); + +if(false) + ok(false, "if(false) evaluated"); + +tmp = 0; +if(true) + tmp = 1; +ok(tmp === 1, "tmp !== 1, if(true) not evaluated?"); + reportSuccess();