Commit 956cb343 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

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

parent d9d8c8b7
...@@ -221,14 +221,17 @@ static HRESULT invoke_source(script_ctx_t *ctx, FunctionInstance *function, IDis ...@@ -221,14 +221,17 @@ static HRESULT invoke_source(script_ctx_t *ctx, FunctionInstance *function, IDis
} }
hres = jsdisp_propput(var_disp, argumentsW, PROPF_DONTDELETE, jsval_obj(arg_disp)); hres = jsdisp_propput(var_disp, argumentsW, PROPF_DONTDELETE, jsval_obj(arg_disp));
if(SUCCEEDED(hres)) { 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); hres = scope_push(function->scope_chain, var_disp, to_disp(var_disp), &scope);
if(SUCCEEDED(hres)) { if(SUCCEEDED(hres)) {
hres = create_exec_ctx(ctx, this_obj, var_disp, scope, FALSE, &exec_ctx); hres = create_exec_ctx(ctx, this_obj, var_disp, scope, FALSE, &exec_ctx);
scope_release(scope); scope_release(scope);
}
}
jsdisp_release(var_disp);
if(SUCCEEDED(hres)) { if(SUCCEEDED(hres)) {
jsdisp_t *prev_args; jsdisp_t *prev_args;
...@@ -236,10 +239,17 @@ static HRESULT invoke_source(script_ctx_t *ctx, FunctionInstance *function, IDis ...@@ -236,10 +239,17 @@ static HRESULT invoke_source(script_ctx_t *ctx, FunctionInstance *function, IDis
function->arguments = arg_disp; function->arguments = arg_disp;
hres = exec_source(exec_ctx, function->code, function->func_code, FALSE, r); hres = exec_source(exec_ctx, function->code, function->func_code, FALSE, r);
function->arguments = prev_args; function->arguments = prev_args;
exec_release(exec_ctx);
} }
}
/* 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); jsdisp_release(arg_disp);
exec_release(exec_ctx); jsdisp_release(var_disp);
return hres; return hres;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment