Jacek Caban : jscript: Added '+=' expression implementation.

Alexandre Julliard julliard at winehq.org
Fri Sep 12 07:01:21 CDT 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Sep 11 23:54:45 2008 +0200

jscript: Added '+=' expression implementation.

---

 dlls/jscript/engine.c      |   51 +++++++++++++++++++++++++++++++++++++++++--
 dlls/jscript/tests/lang.js |    4 +++
 2 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index a952ecb..a97d23a 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -785,6 +785,47 @@ static HRESULT binary_expr_eval(exec_ctx_t *ctx, binary_expression_t *expr, oper
     return S_OK;
 }
 
+/* ECMA-262 3rd Edition    11.13.2 */
+static HRESULT assign_oper_eval(exec_ctx_t *ctx, expression_t *lexpr, expression_t *rexpr, oper_t oper,
+                                jsexcept_t *ei, exprval_t *ret)
+{
+    VARIANT retv, lval, rval;
+    exprval_t exprval, exprvalr;
+    HRESULT hres;
+
+    hres = expr_eval(ctx, lexpr, EXPR_NEWREF, ei, &exprval);
+    if(FAILED(hres))
+        return hres;
+
+    hres = exprval_value(ctx->parser->script, &exprval, ei, &lval);
+    if(SUCCEEDED(hres)) {
+        hres = expr_eval(ctx, rexpr, 0, ei, &exprvalr);
+        if(SUCCEEDED(hres)) {
+            hres = exprval_value(ctx->parser->script, &exprvalr, ei, &rval);
+            exprval_release(&exprvalr);
+        }
+        if(SUCCEEDED(hres)) {
+            hres = oper(ctx, &lval, &rval, ei, &retv);
+            VariantClear(&rval);
+        }
+        VariantClear(&lval);
+    }
+
+    if(SUCCEEDED(hres)) {
+        hres = put_value(ctx->parser->script, &exprval, &retv, ei);
+        if(FAILED(hres))
+            VariantClear(&retv);
+    }
+    exprval_release(&exprval);
+
+    if(FAILED(hres))
+        return hres;
+
+    ret->type = EXPRVAL_VARIANT;
+    ret->u.var = retv;
+    return S_OK;
+}
+
 /* ECMA-262 3rd Edition    13 */
 HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
 {
@@ -1624,10 +1665,14 @@ HRESULT assign_rrshift_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWOR
     return E_NOTIMPL;
 }
 
-HRESULT assign_add_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
+/* ECMA-262 3rd Edition    11.13.2 */
+HRESULT assign_add_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    binary_expression_t *expr = (binary_expression_t*)_expr;
+
+    TRACE("\n");
+
+    return assign_oper_eval(ctx, expr->expression1, expr->expression2, add_eval, ei, ret);
 }
 
 HRESULT assign_sub_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index 302de8d..adbb9d2 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -176,4 +176,8 @@ ok(getVT(tmp) === "VT_I4", "getVT(1.5+2.5) !== VT_I4");
 tmp = "ab" + "cd";
 ok(tmp === "abcd", "\"ab\" + \"cd\" !== \"abcd\"");
 
+tmp = 1;
+ok((tmp += 1) === 2, "tmp += 1 !== 2");
+ok(tmp === 2, "tmp !== 2");
+
 reportSuccess();




More information about the wine-cvs mailing list