jscript: Cut arguments circular reference after returning from the function.

This commit is contained in:
Jacek Caban 2012-11-30 13:02:50 +01:00 committed by Alexandre Julliard
parent d9d8c8b716
commit 956cb343b2
1 changed files with 22 additions and 12 deletions

View File

@ -221,25 +221,35 @@ static HRESULT invoke_source(script_ctx_t *ctx, FunctionInstance *function, IDis
}
hres = jsdisp_propput(var_disp, argumentsW, PROPF_DONTDELETE, jsval_obj(arg_disp));
if(FAILED(hres)) {
jsdisp_release(arg_disp);
jsdisp_release(var_disp);
return hres;
}
hres = scope_push(function->scope_chain, var_disp, to_disp(var_disp), &scope);
if(SUCCEEDED(hres)) {
hres = scope_push(function->scope_chain, var_disp, to_disp(var_disp), &scope);
hres = create_exec_ctx(ctx, this_obj, var_disp, scope, FALSE, &exec_ctx);
scope_release(scope);
if(SUCCEEDED(hres)) {
hres = create_exec_ctx(ctx, this_obj, var_disp, scope, FALSE, &exec_ctx);
scope_release(scope);
jsdisp_t *prev_args;
prev_args = function->arguments;
function->arguments = arg_disp;
hres = exec_source(exec_ctx, function->code, function->func_code, FALSE, r);
function->arguments = prev_args;
exec_release(exec_ctx);
}
}
jsdisp_release(var_disp);
if(SUCCEEDED(hres)) {
jsdisp_t *prev_args;
prev_args = function->arguments;
function->arguments = arg_disp;
hres = exec_source(exec_ctx, function->code, function->func_code, FALSE, r);
function->arguments = prev_args;
}
/* Reset arguments value to cut the reference cycle. Note that since all activation contexts have
* their own arguments property, it's impossible to use prototype's one during name lookup */
jsdisp_propput_name(var_disp, argumentsW, jsval_undefined());
jsdisp_release(arg_disp);
exec_release(exec_ctx);
jsdisp_release(var_disp);
return hres;
}