summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/lexical-environment/unscopables-mutation.js
blob: 2f35e1dd3cc535a9fa1bf203d12e8edf4f816601 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// When obj[@@unscopables].x changes, bindings appear and disappear accordingly.

let x = "global";
function getX() { return x; }

let unscopables = {x: true};
let obj = {x: "obj", [Symbol.unscopables]: unscopables};

with (obj) {
    assertEq(x, "global");
    x = "global-1";
    assertEq(x, "global-1");
    assertEq(obj.x, "obj");

    unscopables.x = false;  // suddenly x appears in the with-environment

    assertEq(x, "obj");
    x = "obj-1";
    assertEq(getX(), "global-1");  // unchanged
    assertEq(obj.x, "obj-1");

    unscopables.x = true;  // *poof*

    assertEq(x, "global-1");
    x = "global-2";
    assertEq(getX(), "global-2");
    assertEq(obj.x, "obj-1");  // unchanged

    // The determination of which binding is assigned happens when the LHS of
    // assignment is evaluated, before the RHS. This is observable if we make
    // the binding appear or disappear during evaluation of the RHS, before
    // assigning.
    x = (unscopables.x = false, "global-3");
    assertEq(getX(), "global-3");
    assertEq(obj.x, "obj-1");

    x = (unscopables.x = true, "obj-2");
    assertEq(getX(), "global-3");
    assertEq(obj.x, "obj-2");
}

assertEq(x, "global-3");

reportCompare(0, 0);