Jacek Caban : jscript: Added if statement implementation.

Alexandre Julliard julliard at winehq.org
Thu Sep 11 08:00:55 CDT 2008


Module: wine
Branch: master
Commit: 1edd64ef8b453ed44ab3f234d8b3d7be6d62e389
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1edd64ef8b453ed44ab3f234d8b3d7be6d62e389

Author: Jacek Caban <jacek at 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();




More information about the wine-cvs mailing list