jscript: Properly handle return value evaluation in comma expression.

This commit is contained in:
Jacek Caban 2012-12-14 11:06:28 +01:00 committed by Alexandre Julliard
parent 42d5cc3c6e
commit 10c2a2bba4
3 changed files with 15 additions and 12 deletions

View File

@ -474,18 +474,15 @@ static HRESULT compile_increment_expression(compiler_ctx_t *ctx, unary_expressio
} }
/* ECMA-262 3rd Edition 11.14 */ /* 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; HRESULT hres;
hres = compile_expression(ctx, expr->expression1, TRUE); hres = compile_expression(ctx, expr->expression1, FALSE);
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
if(!push_instr(ctx, OP_pop)) return compile_expression(ctx, expr->expression2, emit_ret);
return E_OUTOFMEMORY;
return compile_expression(ctx, expr->expression2, TRUE);
} }
/* ECMA-262 3rd Edition 11.11 */ /* 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: case EXPR_CALL:
return compile_call_expression(ctx, (call_expression_t*)expr, emit_ret); return compile_call_expression(ctx, (call_expression_t*)expr, emit_ret);
case EXPR_COMMA: case EXPR_COMMA:
hres = compile_comma_expression(ctx, (binary_expression_t*)expr); return compile_comma_expression(ctx, (binary_expression_t*)expr, emit_ret);
break;
case EXPR_COND: case EXPR_COND:
hres = compile_conditional_expression(ctx, (conditional_expression_t*)expr); hres = compile_conditional_expression(ctx, (conditional_expression_t*)expr);
break; break;

View File

@ -189,14 +189,19 @@ tmp = eval("1;");
ok(tmp === 1, "tmp = " + tmp); ok(tmp === 1, "tmp = " + tmp);
tmp = eval("1,2;"); tmp = eval("1,2;");
ok(tmp === 2, "tmp = " + tmp); ok(tmp === 2, "tmp = " + tmp);
tmp = eval("testNoRes(),2;");
ok(tmp === 2, "tmp = " + tmp);
tmp = eval("if(true) {3}"); tmp = eval("if(true) {3}");
ok(tmp === 3, "tmp = " + tmp); ok(tmp === 3, "tmp = " + tmp);
testNoRes();
eval("testRes(); testRes()"); eval("testRes(); testRes()");
tmp = eval("3; if(false) {4;} else {};;;") tmp = eval("3; if(false) {4;} else {};;;")
ok(tmp === 3, "tmp = " + tmp); ok(tmp === 3, "tmp = " + tmp);
tmp = (function(){ return testRes();})(); testNoRes();
testRes() && testRes();
testNoRes(), testNoRes();
tmp = (function(){ return testNoRes(), testRes();})();
var obj1 = new Object(); var obj1 = new Object();
ok(typeof(obj1) === "object", "typeof(obj1) is not object"); ok(typeof(obj1) === "object", "typeof(obj1) is not object");

View File

@ -749,8 +749,10 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
case DISPID_GLOBAL_TESTRES: case DISPID_GLOBAL_TESTRES:
ok(pvarRes != NULL, "pvarRes = NULL\n"); ok(pvarRes != NULL, "pvarRes = NULL\n");
if(pvarRes) if(pvarRes) {
V_VT(pvarRes) = VT_NULL; V_VT(pvarRes) = VT_BOOL;
V_BOOL(pvarRes) = VARIANT_TRUE;
}
return S_OK; return S_OK;
case DISPID_GLOBAL_TESTNORES: case DISPID_GLOBAL_TESTNORES: