summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/statements/for-in-with-assignment-semantics.js
blob: f1dbb3438f290e045a9c70e26a8255af186aeab8 (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
45
46
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

const unreachable = () => { throw "unreachable"; };

// var-initializer expression is executed before for-in expression.
var log = "";
for (var x = (log += "head") in (log += "|expr", null)) unreachable();
assertEq(log, "head|expr");

log = "";
for (var x = (log += "head") in (log += "|expr", {})) unreachable();
assertEq(log, "head|expr");


// for-in expression isn't executed when var-initializer throws exception.
function ExpectedError() {}
assertThrowsInstanceOf(() => {
    var throwErr = () => { throw new ExpectedError(); };
    for (var x = throwErr() in unreachable()) unreachable();
}, ExpectedError);


// Ensure environment operations are performed correctly.
var scope = new Proxy({x: 0}, new Proxy({}, {
    get(t, pk, r) {
        log += pk + "|";
    }
}));

log = "";
with (scope) {
    for (var x = 0 in {}) ;
}
assertEq(log, "has|get|set|getOwnPropertyDescriptor|defineProperty|");

log = "";
with (scope) {
    for (var x = 0 in {p: 0}) ;
}
assertEq(log, "has|get|set|getOwnPropertyDescriptor|defineProperty|".repeat(2));


if (typeof reportCompare === "function")
    reportCompare(true, true);