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

Jacek Caban jacek at codeweavers.com
Wed Apr 13 08:18:37 CDT 2022


On 4/13/22 13:43, Gabriel Ivăncescu wrote:
> On 12/04/2022 21:16, Jacek Caban wrote:
>> 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
>
> Hi Jacek,
>
> I wanted to be thorough with the tests and include weird cases (such 
> as when it's detached vs not) just to make sure, but if you think your 
> tests are enough I'd be happy to resort to it. 


Having thorough tests is obviously welcomed, but it doesn't mean that 
they need to be so hard to read. The version that I sent you already 
tests detached function statement scopes, it should be easy to test 
function expressions in a similar way. Is there anything else we'd miss 
from your tests?


Thanks,

Jacek




More information about the wine-devel mailing list