From 2950c3fa2d9726af00adedd05083d58b11e67ee0 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 11 Sep 2008 23:58:48 +0200 Subject: [PATCH] jscript: Added postfix decrement expression implementation. --- dlls/jscript/engine.c | 35 ++++++++++++++++++++++++++++++++--- dlls/jscript/tests/lang.js | 2 ++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 5b175721dbd..2a1bf15580a 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -1571,10 +1571,39 @@ HRESULT post_increment_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWO return S_OK; } -HRESULT post_decrement_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +/* ECMA-262 3rd Edition 11.3.2 */ +HRESULT post_decrement_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; + VARIANT val, num; + exprval_t exprval; + HRESULT hres; + + TRACE("\n"); + + hres = expr_eval(ctx, expr->expression, EXPR_NEWREF, ei, &exprval); + if(FAILED(hres)) + return hres; + + hres = exprval_value(ctx->parser->script, &exprval, ei, &val); + if(SUCCEEDED(hres)) { + hres = to_number(ctx->parser->script, &val, ei, &num); + VariantClear(&val); + } + + if(SUCCEEDED(hres)) { + VARIANT dec; + num_set_val(&dec, num_val(&num)-1.0); + hres = put_value(ctx->parser->script, &exprval, &dec, ei); + } + + exprval_release(&exprval); + if(FAILED(hres)) + return hres; + + ret->type = EXPRVAL_VARIANT; + ret->u.var = num; + return S_OK; } /* ECMA-262 3rd Edition 11.4.4 */ diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index 7f51dde7774..fef840308b0 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -230,5 +230,7 @@ ok(--tmp === 1, "--tmp (2) is not 1"); ok(tmp === 1, "decremented tmp is not 1"); ok(tmp++ === 1, "tmp++ (1) is not 1"); ok(tmp === 2, "incremented tmp(1) is not 2"); +ok(tmp-- === 2, "tmp-- (2) is not 2"); +ok(tmp === 1, "decremented tmp is not 1"); reportSuccess();