diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c index 9d135f865d8..03a9bdcf56a 100644 --- a/dlls/jscript/compile.c +++ b/dlls/jscript/compile.c @@ -558,7 +558,15 @@ static HRESULT compile_new_expression(compiler_ctx_t *ctx, call_expression_t *ex arg_cnt++; } - return push_instr_uint(ctx, OP_new, arg_cnt); + hres = push_instr_uint(ctx, OP_new, arg_cnt); + if(FAILED(hres)) + return hres; + + hres = push_instr_uint(ctx, OP_pop, arg_cnt+1); + if(FAILED(hres)) + return hres; + + return push_instr(ctx, OP_push_ret) ? S_OK : E_OUTOFMEMORY; } static HRESULT compile_call_expression(compiler_ctx_t *ctx, call_expression_t *expr, BOOL emit_ret) diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index a4e8de60831..314a35b579e 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -201,6 +201,11 @@ static inline jsval_t steal_ret(call_frame_t *frame) return r; } +static inline void clear_ret(call_frame_t *frame) +{ + jsval_release(steal_ret(frame)); +} + static void exprval_release(exprval_t *val) { switch(val->type) { @@ -941,8 +946,8 @@ static HRESULT interp_refval(script_ctx_t *ctx) static HRESULT interp_new(script_ctx_t *ctx) { const unsigned argc = get_op_uint(ctx, 0); - jsval_t r, constr; - HRESULT hres; + call_frame_t *frame = ctx->call_ctx; + jsval_t constr; TRACE("%d\n", argc); @@ -957,12 +962,9 @@ static HRESULT interp_new(script_ctx_t *ctx) else if(!get_object(constr)) return throw_type_error(ctx, JS_E_INVALID_PROPERTY, NULL); - hres = disp_call_value(ctx, get_object(constr), NULL, DISPATCH_CONSTRUCT, argc, stack_args(ctx, argc), &r); - if(FAILED(hres)) - return hres; - - stack_popn(ctx, argc+1); - return stack_push(ctx, r); + clear_ret(frame); + return disp_call_value(ctx, get_object(constr), NULL, DISPATCH_CONSTRUCT, + argc, stack_args(ctx, argc), &frame->ret); } /* ECMA-262 3rd Edition 11.2.3 */ @@ -2353,6 +2355,19 @@ static HRESULT interp_setret(script_ctx_t *ctx) return S_OK; } +static HRESULT interp_push_ret(script_ctx_t *ctx) +{ + call_frame_t *frame = ctx->call_ctx; + HRESULT hres; + + TRACE("\n"); + + hres = stack_push(ctx, frame->ret); + if(SUCCEEDED(hres)) + frame->ret = jsval_undefined(); + return hres; +} + typedef HRESULT (*op_func_t)(script_ctx_t*); static const op_func_t op_funcs[] = { diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h index 3af3eacfbbc..7c266671de4 100644 --- a/dlls/jscript/engine.h +++ b/dlls/jscript/engine.h @@ -70,6 +70,7 @@ X(postinc, 1, ARG_INT, 0) \ X(preinc, 1, ARG_INT, 0) \ X(push_except,1, ARG_ADDR, ARG_BSTR) \ + X(push_ret, 1, 0,0) \ X(push_scope, 1, 0,0) \ X(regexp, 1, ARG_STR, ARG_UINT) \ X(rshift, 1, 0,0) \