Jacek Caban : jscript: Added object initialiser expression implementation.

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


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Sep 10 21:10:23 2008 +0200

jscript: Added object initialiser expression implementation.

---

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

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 90aa300..6f77eb4 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -1050,10 +1050,57 @@ HRESULT array_literal_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD
     return E_NOTIMPL;
 }
 
-HRESULT property_value_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
+/* ECMA-262 3rd Edition    11.1.5 */
+HRESULT property_value_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    property_value_expression_t *expr = (property_value_expression_t*)_expr;
+    VARIANT val, tmp;
+    DispatchEx *obj;
+    prop_val_t *iter;
+    exprval_t exprval;
+    BSTR name;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    hres = create_object(ctx->parser->script, NULL, &obj);
+    if(FAILED(hres))
+        return hres;
+
+    for(iter = expr->property_list; iter; iter = iter->next) {
+        hres = literal_to_var(iter->name, &tmp);
+        if(FAILED(hres))
+            break;
+
+        hres = to_string(ctx->parser->script, &tmp, ei, &name);
+        VariantClear(&tmp);
+        if(FAILED(hres))
+            break;
+
+        hres = expr_eval(ctx, iter->value, 0, ei, &exprval);
+        if(SUCCEEDED(hres)) {
+            hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val);
+            exprval_release(&exprval);
+            if(SUCCEEDED(hres)) {
+                hres = jsdisp_propput_name(obj, name, ctx->parser->script->lcid, &val, ei, NULL/*FIXME*/);
+                VariantClear(&val);
+            }
+        }
+
+        SysFreeString(name);
+        if(FAILED(hres))
+            break;
+    }
+
+    if(FAILED(hres)) {
+        jsdisp_release(obj);
+        return hres;
+    }
+
+    ret->type = EXPRVAL_VARIANT;
+    V_VT(&ret->u.var) = VT_DISPATCH;
+    V_DISPATCH(&ret->u.var) = (IDispatch*)_IDispatchEx_(obj);
+    return S_OK;
 }
 
 HRESULT comma_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 c6742f5..f709015 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -140,4 +140,8 @@ if(true)
     tmp = 1;
 ok(tmp === 1, "tmp !== 1, if(true) not evaluated?");
 
+var obj3 = { prop1: 1,  prop2: typeof(false) };
+ok(obj3.prop1 === 1, "obj3.prop1 is not 1");
+ok(obj3.prop2 === "boolean", "obj3.prop2 is not \"boolean\"");
+
 reportSuccess();




More information about the wine-cvs mailing list