[PATCH] jscript: Also add function name to its detached scope in ES5 mode.

Paul Gofman pgofman at codeweavers.com
Mon Aug 9 08:55:41 CDT 2021


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/jscript/engine.c    |  4 ++++
 dlls/mshtml/tests/es5.js | 29 +++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index cb9ea5cd9ac..47b4e56e8e4 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -573,6 +573,7 @@ HRESULT jsval_strict_equal(jsval_t lval, jsval_t rval, BOOL *ret)
 
 static HRESULT detach_scope(script_ctx_t *ctx, call_frame_t *frame, scope_chain_t *scope)
 {
+    function_code_t *func = frame->function;
     unsigned int i, index;
     HRESULT hres;
 
@@ -591,6 +592,9 @@ static HRESULT detach_scope(script_ctx_t *ctx, call_frame_t *frame, scope_chain_
         scope->obj = to_disp(scope->jsobj);
     }
 
+    if (scope == frame->base_scope && func->name && ctx->version >= SCRIPTLANGUAGEVERSION_ES5)
+        jsdisp_propput_name(scope->jsobj, func->name, jsval_obj(jsdisp_addref(frame->function_instance)));
+
     index = scope->scope_index;
     for(i = 0; i < frame->function->local_scopes[index].locals_cnt; i++)
     {
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
index e57aed5ca35..81c06a4145e 100644
--- a/dlls/mshtml/tests/es5.js
+++ b/dlls/mshtml/tests/es5.js
@@ -1447,6 +1447,35 @@ sync_test("functions scope", function() {
     val = with_function();
     ok(val == 8, "val != 8");
     ok(w == 9, "w != 9");
+
+    var func, func_outer, ret;
+    var o = new Object();
+
+    func_outer = function e()
+    {
+        function func_inner()
+        {
+            ok(typeof e == "function", "typeof e == " + typeof e);
+            ret = e
+        }
+        func = func_inner
+    }
+    func_outer();
+    func();
+    ok(ret === func_outer, "ret != func_outer");
+
+    func_outer = function f(f)
+    {
+        function func_inner()
+        {
+            ok(typeof f == "object", "typeof f == " + typeof f);
+            ret = f
+        }
+        func = func_inner
+    }
+    func_outer(o);
+    func();
+    ok(ret === o, "ret != o");
 });
 
 sync_test("console", function() {
-- 
2.31.1




More information about the wine-devel mailing list