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");