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

Alexandre Julliard julliard at winehq.org
Fri Nov 30 13:48:21 CST 2012


Module: wine
Branch: master
Commit: 956cb343b28a9d28883a89826c08e867576836a8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=956cb343b28a9d28883a89826c08e867576836a8

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Nov 30 13:02:50 2012 +0100

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

---

 dlls/jscript/function.c |   34 ++++++++++++++++++++++------------
 1 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c
index 5c7f9b5..b058460 100644
--- a/dlls/jscript/function.c
+++ b/dlls/jscript/function.c
@@ -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;
 }
 




More information about the wine-cvs mailing list