[PATCH 04/10] jscript: Defer lookup to the actual locals for function statements.

Jacek Caban jacek at codeweavers.com
Tue Apr 12 13:16:40 CDT 2022


Hi Gabriel,

On 4/12/22 16:47, Gabriel Ivăncescu wrote:
> diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
> index e8ee713..2c08080 100644
> --- a/dlls/mshtml/tests/es5.js
> +++ b/dlls/mshtml/tests/es5.js
> @@ -1691,6 +1691,65 @@ sync_test("functions scope", function() {
>       func_outer(o);
>       func();
>       ok(ret === o, "ret != o");
> +
> +    func_outer = function g(i)
> +    {
> +        ok(ret === (i ? 42 : o), "ret during g(" + i + ") = " + ret);
> +        ok(typeof g == "function", "typeof g == " + typeof g);
> +
> +        g = function() { ok(false, "redefined g was executed"); }
> +        ret = 42;
> +        if(!i) g(1);
> +    }
> +    func_outer(0);
> +
> +    function h()
> +    {
> +        ok(typeof h == "function", "typeof h == " + typeof h);
> +        var f = function func_inner(i)
> +        {
> +            if(i === 101) {
> +                ok(h === "string", "h during old h(101) = " + h);
> +                ret = -2;
> +                return;
> +            }
> +            if(i === 100) {
> +                ok(h.toString() === "function foo() {}", "h.toString() during old h(100) = " + h.toString());
> +                h = "string";
> +                ok(h === "string", "h during old h(100) after set to string = " + h);
> +                ret = -1;
> +                return;
> +            }
> +            if(i === 1) {
> +                ok(h !== func_inner, "h during h(1) === func_inner");
> +                return;
> +            }
> +            ok(h === func_inner, "h during h() !== func_inner");
> +            if(i) {
> +                ok(ret === 42, "ret during h(2) = " + ret);
> +                return;
> +            }
> +            ret = 13;
> +        }
> +        f(1);
> +        h = f;
> +        h(2);
> +    }
> +    func_outer = h;
> +    h();
> +    ok(ret === 42, "ret after calling h() first time = " + ret);
> +    ok(func_outer !== h, "func_outer after calling h() first time === h");
> +    func_outer = h;
> +    h();
> +    ok(ret === 13, "ret after calling h() second time = " + ret);
> +    ok(func_outer === h, "func_outer after calling h() second time === h");
> +    h = function foo() {}
> +    ok(func_outer !== h, "func_outer after setting h to empty function === h");
> +    func_outer(100);
> +    ok(ret === -1, "ret after calling old h(100) = " + ret);
> +    ok(h === "string", "h after calling old h(100) = " + h);
> +    func_outer(101);
> +    ok(ret === -2, "ret after calling old h(101) = " + ret);
>   });


I think that you made it much more complicated than it needs to be. See 
the attached patch for an example how it could be made more readable.


Thanks,

Jacek
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.diff
Type: text/x-patch
Size: 700 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20220412/03fe8300/attachment.bin>


More information about the wine-devel mailing list