summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/arguments/args-attributes.js
blob: 51822023715a9485a34a2d4653edc7e295e55c25 (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
function strictArgs() {
    return (function (a, b, c) {'use strict'; return arguments; })(1, 2);
}

function normalArgs() {
    return (function (a, b, c) { return arguments; })(1, 2);
}

function checkProperty(options, prop, shouldThrow) {
    var desc, orig;
    var obj = options.strict ? strictArgs() : normalArgs();
    var objType = options.strict ? "strict arguments." : "normal arguments.";

    function check() {
        orig = Object.getOwnPropertyDescriptor(obj, prop);

        var threw = false;
        try {
            obj[prop] = obj[prop];
        }
        catch (e) {
            threw = true;
        }
        assertEq(threw, shouldThrow, objType + prop + " threw");

        if (orig === undefined) {
            // The property wasn't defined, so we can skip it.
            return;
        }

        desc = Object.getOwnPropertyDescriptor(obj, prop);
        if ("value" in orig) {
            assertEq(desc.value, orig.value, objType + prop + " value");
        } else {
            assertEq(desc.get, orig.get, objType + prop + " get");
            assertEq(desc.set, orig.set, objType + prop + " set");
        }
        assertEq(desc.writable, orig.writable, objType + prop + " writable");
        assertEq(desc.enumerable, orig.enumerable, objType + prop + " enumerable");
        assertEq(desc.configurable, orig.configurable, objType + prop + " configurable");
    }

    check();

    if (orig && orig.configurable) {
        if(options.refresh) { obj = options.strict ? strictArgs() : normalArgs(); }
        Object.defineProperty(obj, prop, {writable: false, enumerable: true});
        check();

        if(options.refresh) { obj = options.strict ? strictArgs() : normalArgs(); }
        Object.defineProperty(obj, prop, {writable: true, enumerable: false});
        check();

        if(options.refresh) { obj = options.strict ? strictArgs() : normalArgs(); }
        Object.defineProperty(obj, prop, {writable: false, configurable: false});
        check();
    }
}

checkProperty({strict: true, refresh: true}, 'callee', true);
checkProperty({strict: true, refresh: false}, 'callee', true);
checkProperty({strict: false, refresh: true}, 'callee', false);
checkProperty({strict: false, refresh: false}, 'callee', false);

checkProperty({strict: true, refresh: true}, 'length', false);
checkProperty({strict: true, refresh: false}, 'length', false);
checkProperty({strict: false, refresh: true}, 'length', false);
checkProperty({strict: false, refresh: false}, 'length', false);

for (var i = 0; i <= 5; i++) {
    checkProperty({strict: true, refresh: true}, "" + i, false);
    checkProperty({strict: true, refresh: false}, "" + i, false);
    checkProperty({strict: false, refresh: true}, "" + i, false);
    checkProperty({strict: false, refresh: false}, "" + i, false);
}