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