Jacek Caban : jscript: Add function name to its scope chain in ES5 mode.
Alexandre Julliard
julliard at winehq.org
Mon Apr 12 16:11:26 CDT 2021
Module: wine
Branch: master
Commit: 1985f330f8a8790bc3b23b999b84b7f615d6f508
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1985f330f8a8790bc3b23b999b84b7f615d6f508
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Apr 12 15:47:58 2021 +0200
jscript: Add function name to its scope chain in ES5 mode.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/jscript/engine.c | 8 ++++++++
dlls/mshtml/tests/documentmode.js | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 44 insertions(+)
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 06b0fd673b3..f3d9d694b2a 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -661,6 +661,14 @@ static HRESULT identifier_eval(script_ctx_t *ctx, BSTR identifier, exprval_t *re
if(FAILED(hres))
return hres;
}
+
+ /* ECMA-262 5.1 Edition 13 */
+ if(func->name && ctx->version >= SCRIPTLANGUAGEVERSION_ES5 && !wcscmp(identifier, func->name)) {
+ TRACE("returning a function from scope chain\n");
+ ret->type = EXPRVAL_JSVAL;
+ ret->u.val = jsval_obj(jsdisp_addref(scope->frame->function_instance));
+ return S_OK;
+ }
}
if(scope->jsobj)
hres = jsdisp_get_id(scope->jsobj, identifier, fdexNameImplicit, &id);
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js
index 75a132e83a7..82f8aae4ed9 100644
--- a/dlls/mshtml/tests/documentmode.js
+++ b/dlls/mshtml/tests/documentmode.js
@@ -534,3 +534,39 @@ sync_test("delete_prop", function() {
todo_wine.
ok(!("globalprop4" in obj), "globalprop4 is still in obj");
});
+
+var func_scope_val = 1;
+
+sync_test("func_scope", function() {
+ var func_scope_val = 2;
+
+ var f = function func_scope_val() {
+ return func_scope_val;
+ };
+
+ func_scope_val = 3;
+ if(document.documentMode < 9) {
+ ok(f() === 3, "f() = " + f());
+ return;
+ }
+ ok(f === f(), "f() = " + f());
+
+ f = function func_scope_val(a) {
+ func_scope_val = 4;
+ return func_scope_val;
+ };
+
+ func_scope_val = 3;
+ ok(f === f(), "f() = " + f());
+ ok(func_scope_val === 3, "func_scope_val = " + func_scope_val);
+ ok(window.func_scope_val === 1, "window.func_scope_val = " + window.func_scope_val);
+
+ f = function func_scope_val(a) {
+ return (function() { return a ? func_scope_val(false) : func_scope_val; })();
+ };
+
+ ok(f === f(true), "f(true) = " + f(true));
+
+ window = 1;
+ ok(window === window.self, "window = " + window);
+});
More information about the wine-cvs
mailing list