Module: wine Branch: master Commit: 10c2a2bba456d5c8f70f4c98384196dfebf1d2e1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=10c2a2bba456d5c8f70f4c9838...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Dec 14 11:06:28 2012 +0100
jscript: Properly handle return value evaluation in comma expression.
---
dlls/jscript/compile.c | 12 ++++-------- dlls/jscript/tests/lang.js | 9 +++++++-- dlls/jscript/tests/run.c | 6 ++++-- 3 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c index 4effda4..a3dab82 100644 --- a/dlls/jscript/compile.c +++ b/dlls/jscript/compile.c @@ -474,18 +474,15 @@ static HRESULT compile_increment_expression(compiler_ctx_t *ctx, unary_expressio }
/* ECMA-262 3rd Edition 11.14 */ -static HRESULT compile_comma_expression(compiler_ctx_t *ctx, binary_expression_t *expr) +static HRESULT compile_comma_expression(compiler_ctx_t *ctx, binary_expression_t *expr, BOOL emit_ret) { HRESULT hres;
- hres = compile_expression(ctx, expr->expression1, TRUE); + hres = compile_expression(ctx, expr->expression1, FALSE); if(FAILED(hres)) return hres;
- if(!push_instr(ctx, OP_pop)) - return E_OUTOFMEMORY; - - return compile_expression(ctx, expr->expression2, TRUE); + return compile_expression(ctx, expr->expression2, emit_ret); }
/* ECMA-262 3rd Edition 11.11 */ @@ -938,8 +935,7 @@ static HRESULT compile_expression(compiler_ctx_t *ctx, expression_t *expr, BOOL case EXPR_CALL: return compile_call_expression(ctx, (call_expression_t*)expr, emit_ret); case EXPR_COMMA: - hres = compile_comma_expression(ctx, (binary_expression_t*)expr); - break; + return compile_comma_expression(ctx, (binary_expression_t*)expr, emit_ret); case EXPR_COND: hres = compile_conditional_expression(ctx, (conditional_expression_t*)expr); break; diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index 640d171..23e12cc 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -189,14 +189,19 @@ tmp = eval("1;"); ok(tmp === 1, "tmp = " + tmp); tmp = eval("1,2;"); ok(tmp === 2, "tmp = " + tmp); +tmp = eval("testNoRes(),2;"); +ok(tmp === 2, "tmp = " + tmp); tmp = eval("if(true) {3}"); ok(tmp === 3, "tmp = " + tmp); -testNoRes(); eval("testRes(); testRes()"); tmp = eval("3; if(false) {4;} else {};;;") ok(tmp === 3, "tmp = " + tmp);
-tmp = (function(){ return testRes();})(); +testNoRes(); +testRes() && testRes(); +testNoRes(), testNoRes(); + +tmp = (function(){ return testNoRes(), testRes();})();
var obj1 = new Object(); ok(typeof(obj1) === "object", "typeof(obj1) is not object"); diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c index 32b7c4c..55b1398 100644 --- a/dlls/jscript/tests/run.c +++ b/dlls/jscript/tests/run.c @@ -749,8 +749,10 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
case DISPID_GLOBAL_TESTRES: ok(pvarRes != NULL, "pvarRes = NULL\n"); - if(pvarRes) - V_VT(pvarRes) = VT_NULL; + if(pvarRes) { + V_VT(pvarRes) = VT_BOOL; + V_BOOL(pvarRes) = VARIANT_TRUE; + } return S_OK;
case DISPID_GLOBAL_TESTNORES: