js/src/tests/js1_8_5/regress/regress-591846.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/tests/js1_8_5/regress/regress-591846.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,67 @@
     1.4 +/*
     1.5 + * Any copyright is dedicated to the Public Domain.
     1.6 + * http://creativecommons.org/licenses/publicdomain/
     1.7 + */
     1.8 +
     1.9 +function check(obj, name, value, readonly) {
    1.10 +    // Start with a non-configurable, writable data property implemented via
    1.11 +    // js::PropertyOp getter and setter.
    1.12 +    var pd = Object.getOwnPropertyDescriptor(obj, name);
    1.13 +
    1.14 +    assertEq(pd.configurable, false, "non-configurable " + name);
    1.15 +    assertEq(pd.writable, !readonly, "writable " + name);
    1.16 +
    1.17 +    try {
    1.18 +        // Do not allow a transition from js::PropertyOp to writable js::Value
    1.19 +        // data property.
    1.20 +        Object.defineProperty(obj, name, {writable: true});
    1.21 +        assertEq(0, 1);
    1.22 +    } catch (e) {
    1.23 +        assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'");
    1.24 +    }
    1.25 +
    1.26 +    if (!readonly) {
    1.27 +        try {
    1.28 +            // Do not allow the property denoted by name to become a true data
    1.29 +            // property via a descriptor that preserves the native property's
    1.30 +            // writable attribute.
    1.31 +            Object.defineProperty(obj, name, {value: value});
    1.32 +            assertEq(0, 1);
    1.33 +        } catch (e) {
    1.34 +            assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'");
    1.35 +        }
    1.36 +    }
    1.37 +
    1.38 +    try {
    1.39 +        // Do not allow the property to be frozen at some bogus value.
    1.40 +        Object.defineProperty(obj, name, {value: "bogus", writable: false});
    1.41 +        assertEq(0, 1);
    1.42 +    } catch (e) {
    1.43 +        assertEq('' + e, "TypeError: can't redefine non-configurable property '" + name + "'");
    1.44 +    }
    1.45 +
    1.46 +    // Now make name non-writable.
    1.47 +    Object.defineProperty(obj, name, {writable: false})
    1.48 +
    1.49 +    // Assert that the right getter result "stuck".
    1.50 +    assertEq(obj[name], value);
    1.51 +
    1.52 +    // Test that it is operationally non-writable now.
    1.53 +    obj[name] = "eek!";
    1.54 +    assertEq(obj[name], value);
    1.55 +}
    1.56 +
    1.57 +check(Object, 'caller', null, false);
    1.58 +check(Object, 'arguments', null, false);
    1.59 +
    1.60 +// Reset RegExp.leftContext to the empty string.
    1.61 +/x/.test('x');
    1.62 +
    1.63 +var d = Object.getOwnPropertyDescriptor(RegExp, "leftContext");
    1.64 +assertEq(d.set, undefined);
    1.65 +assertEq(typeof d.get, "function");
    1.66 +assertEq(d.enumerable, true);
    1.67 +assertEq(d.configurable, false);
    1.68 +assertEq(d.get.call(RegExp), "");
    1.69 +
    1.70 +reportCompare(0, 0, "ok");

mercurial