From 5c1c923d5efd86a03bbddb9e574dc90727485691 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 16 Sep 2008 20:47:43 +0200 Subject: [PATCH] jscript: Added minus expression implementation. --- dlls/jscript/engine.c | 29 ++++++++++++++++++++++++++--- dlls/jscript/tests/lang.js | 4 ++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 93cfc6c1cde..b700d3316cc 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -1674,10 +1674,33 @@ HRESULT typeof_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags return S_OK; } -HRESULT minus_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +/* ECMA-262 3rd Edition 11.4.7 */ +HRESULT minus_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) { - FIXME("\n"); - return E_NOTIMPL; + unary_expression_t *expr = (unary_expression_t*)_expr; + exprval_t exprval; + VARIANT val, num; + HRESULT hres; + + TRACE("\n"); + + hres = expr_eval(ctx, expr->expression, 0, ei, &exprval); + if(FAILED(hres)) + return hres; + + hres = exprval_to_value(ctx->parser->script, &exprval, ei, &val); + exprval_release(&exprval); + if(FAILED(hres)) + return hres; + + hres = to_number(ctx->parser->script, &val, ei, &num); + VariantClear(&val); + if(FAILED(hres)) + return hres; + + ret->type = EXPRVAL_VARIANT; + num_set_val(&ret->u.var, -num_val(&num)); + return S_OK; } HRESULT plus_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 911aa405c2f..bd2cfc935ff 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -181,6 +181,10 @@ tmp = 4.5-2; ok(tmp === 2.5, "4.5-2 !== 2.5"); ok(getVT(tmp) === "VT_R8", "getVT(4-2) !== VT_R8"); +tmp = -2; +ok(tmp === 0-2, "-2 !== 0-2"); +ok(getVT(tmp) === "VT_I4", "getVT(-2) !== VT_I4"); + tmp = 2*3; ok(tmp === 6, "2*3 !== 6"); ok(getVT(tmp) === "VT_I4", "getVT(2*3) !== VT_I4");