summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/proxy/testDirectProxySetReceiverLookup.js
blob: e626d805a2e74b08453513f87548c1d43493447a (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
47
48
49
50
51
52
53
54
55
56
57
// Assigning to a proxy with no set handler causes the proxy's
// getOwnPropertyDescriptor handler to be called just before defineProperty
// in some cases. (ES6 draft rev 28, 2014 Oct 14, 9.1.9 step 5.c.)

var attrs = ["configurable", "enumerable", "writable", "value", "get", "set"];

function test(target, id, existingDesc, expectedDesc) {
    var log = "";
    var p = new Proxy(target, {
        getOwnPropertyDescriptor(t, idarg) {
            assertEq(idarg, id);
            log += "g";
            return existingDesc;
        },
        defineProperty(t, idarg, desc) {
            assertEq(idarg, id);
            for (var attr of attrs) {
                var args = uneval([target, id, existingDesc]).slice(1, -1);
                assertEq(attr in desc, attr in expectedDesc,
                         `test(${args}), checking existence of desc.${attr}`);
                assertEq(desc[attr], expectedDesc[attr],
                         `test(${args}), checking value of desc.${attr}`);
            }
            log += "d";
            return true;
        }
    });
    p[id] = "pizza";
    assertEq(log, "gd");
}

var fullDesc = {
    configurable: true,
    enumerable: true,
    writable: true,
    value: "pizza"
};
var valueOnlyDesc = {
    value: "pizza"
};
var sealedDesc = {
    configurable: false,
    enumerable: true,
    writable: true,
    value: "pizza"
};

test({}, "x", undefined, fullDesc);
test({}, "x", fullDesc, valueOnlyDesc);
test({x: 1}, "x", undefined, fullDesc);
test({x: 1}, "x", fullDesc, valueOnlyDesc);
test(Object.seal({x: 1}), "x", sealedDesc, valueOnlyDesc);
test(Object.create({x: 1}), "x", undefined, fullDesc);
test([0, 1, 2], "2", undefined, fullDesc);
test([0, 1, 2], "2", fullDesc, valueOnlyDesc);
test([0, 1, 2], "3", undefined, fullDesc);
test([0, 1, 2], "3", fullDesc, valueOnlyDesc);