diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index d9e6353f03e..5b175721dbd 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -1536,10 +1536,39 @@ HRESULT plus_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, j return E_NOTIMPL; } -HRESULT post_increment_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +/* ECMA-262 3rd Edition 11.3.1 */ +HRESULT post_increment_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 inc; + num_set_val(&inc, num_val(&num)+1.0); + hres = put_value(ctx->parser->script, &exprval, &inc, ei); + } + + exprval_release(&exprval); + if(FAILED(hres)) + return hres; + + ret->type = EXPRVAL_VARIANT; + ret->u.var = num; + return S_OK; } HRESULT post_decrement_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 ef3e4548b06..7f51dde7774 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -228,5 +228,7 @@ ok(++tmp === 2, "++tmp (1) is not 2"); ok(tmp === 2, "incremented tmp is not 2"); 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"); reportSuccess();