Module: wine Branch: master Commit: e7786d1d4588934d3ba9ccf1f457adfa1c16d89d URL: http://source.winehq.org/git/wine.git/?a=commit;h=e7786d1d4588934d3ba9ccf1f4...
Author: Jacek Caban jacek@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();