From e7786d1d4588934d3ba9ccf1f457adfa1c16d89d Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 10 Sep 2008 21:10:23 +0200 Subject: [PATCH] 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 90aa300b978..6f77eb4b0b7 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 c6742f54c84..f7090159cc9 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();