diff options
Diffstat (limited to 'src/3rdparty/v8/test/mjsunit/object-define-property.js')
-rw-r--r-- | src/3rdparty/v8/test/mjsunit/object-define-property.js | 1192 |
1 files changed, 0 insertions, 1192 deletions
diff --git a/src/3rdparty/v8/test/mjsunit/object-define-property.js b/src/3rdparty/v8/test/mjsunit/object-define-property.js deleted file mode 100644 index 970a803..0000000 --- a/src/3rdparty/v8/test/mjsunit/object-define-property.js +++ /dev/null @@ -1,1192 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Tests the object.defineProperty method - ES 15.2.3.6 - -// Flags: --allow-natives-syntax --es5-readonly - -// Check that an exception is thrown when null is passed as object. -var exception = false; -try { - Object.defineProperty(null, null, null); -} catch (e) { - exception = true; - assertTrue(/called on non-object/.test(e)); -} -assertTrue(exception); - -// Check that an exception is thrown when undefined is passed as object. -exception = false; -try { - Object.defineProperty(undefined, undefined, undefined); -} catch (e) { - exception = true; - assertTrue(/called on non-object/.test(e)); -} -assertTrue(exception); - -// Check that an exception is thrown when non-object is passed as object. -exception = false; -try { - Object.defineProperty(0, "foo", undefined); -} catch (e) { - exception = true; - assertTrue(/called on non-object/.test(e)); -} -assertTrue(exception); - -// Object. -var obj1 = {}; - -// Values. -var val1 = 0; -var val2 = 0; -var val3 = 0; - -function setter1() {val1++; } -function getter1() {return val1; } - -function setter2() {val2++; } -function getter2() {return val2; } - -function setter3() {val3++; } -function getter3() {return val3; } - - -// Descriptors. -var emptyDesc = {}; - -var accessorConfigurable = { - set: setter1, - get: getter1, - configurable: true -}; - -var accessorNoConfigurable = { - set: setter2, - get: getter2, - configurable: false -}; - -var accessorOnlySet = { - set: setter3, - configurable: true -}; - -var accessorOnlyGet = { - get: getter3, - configurable: true -}; - -var accessorDefault = {set: function(){} }; - -var dataConfigurable = { value: 1000, configurable: true }; - -var dataNoConfigurable = { value: 2000, configurable: false }; - -var dataWritable = { value: 3000, writable: true}; - - -// Check that we can't add property with undefined attributes. -try { - Object.defineProperty(obj1, "foo", undefined); - assertTrue(false); -} catch (e) { - assertTrue(/must be an object/.test(e)); -} - -// Make sure that we can add a property with an empty descriptor and -// that it has the default descriptor values. -Object.defineProperty(obj1, "foo", emptyDesc); - -// foo should be undefined as it has no get, set or value -assertEquals(undefined, obj1.foo); - -// We should, however, be able to retrieve the propertydescriptor which should -// have all default values (according to 8.6.1). -var desc = Object.getOwnPropertyDescriptor(obj1, "foo"); -assertFalse(desc.configurable); -assertFalse(desc.enumerable); -assertFalse(desc.writable); -assertEquals(desc.get, undefined); -assertEquals(desc.set, undefined); -assertEquals(desc.value, undefined); - -// Make sure that getOwnPropertyDescriptor does not return a descriptor -// with default values if called with non existing property (otherwise -// the test above is invalid). -desc = Object.getOwnPropertyDescriptor(obj1, "bar"); -assertEquals(desc, undefined); - -// Make sure that foo can't be reset (as configurable is false). -try { - Object.defineProperty(obj1, "foo", accessorConfigurable); -} catch (e) { - assertTrue(/Cannot redefine property/.test(e)); -} - - -// Accessor properties - -Object.defineProperty(obj1, "bar", accessorConfigurable); -desc = Object.getOwnPropertyDescriptor(obj1, "bar"); -assertTrue(desc.configurable); -assertFalse(desc.enumerable); -assertEquals(desc.writable, undefined); -assertEquals(desc.get, accessorConfigurable.get); -assertEquals(desc.set, accessorConfigurable.set); -assertEquals(desc.value, undefined); -assertEquals(1, obj1.bar = 1); -assertEquals(1, val1); -assertEquals(1, obj1.bar = 1); -assertEquals(2, val1); -assertEquals(2, obj1.bar); - -// Redefine bar with non configurable test -Object.defineProperty(obj1, "bar", accessorNoConfigurable); -desc = Object.getOwnPropertyDescriptor(obj1, "bar"); -assertFalse(desc.configurable); -assertFalse(desc.enumerable); -assertEquals(desc.writable, undefined); -assertEquals(desc.get, accessorNoConfigurable.get); -assertEquals(desc.set, accessorNoConfigurable.set); -assertEquals(desc.value, undefined); -assertEquals(1, obj1.bar = 1); -assertEquals(2, val1); -assertEquals(1, val2); -assertEquals(1, obj1.bar = 1) -assertEquals(2, val1); -assertEquals(2, val2); -assertEquals(2, obj1.bar); - -// Try to redefine bar again - should fail as configurable is false. -try { - Object.defineProperty(obj1, "bar", accessorConfigurable); - assertTrue(false); -} catch(e) { - assertTrue(/Cannot redefine property/.test(e)); -} - -// Try to redefine bar again using the data descriptor - should fail. -try { - Object.defineProperty(obj1, "bar", dataConfigurable); - assertTrue(false); -} catch(e) { - assertTrue(/Cannot redefine property/.test(e)); -} - -// Redefine using same descriptor - should succeed. -Object.defineProperty(obj1, "bar", accessorNoConfigurable); -desc = Object.getOwnPropertyDescriptor(obj1, "bar"); -assertFalse(desc.configurable); -assertFalse(desc.enumerable); -assertEquals(desc.writable, undefined); -assertEquals(desc.get, accessorNoConfigurable.get); -assertEquals(desc.set, accessorNoConfigurable.set); -assertEquals(desc.value, undefined); -assertEquals(1, obj1.bar = 1); -assertEquals(2, val1); -assertEquals(3, val2); -assertEquals(1, obj1.bar = 1) -assertEquals(2, val1); -assertEquals(4, val2); -assertEquals(4, obj1.bar); - -// Define an accessor that has only a setter. -Object.defineProperty(obj1, "setOnly", accessorOnlySet); -desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); -assertTrue(desc.configurable); -assertFalse(desc.enumerable); -assertEquals(desc.set, accessorOnlySet.set); -assertEquals(desc.writable, undefined); -assertEquals(desc.value, undefined); -assertEquals(desc.get, undefined); -assertEquals(1, obj1.setOnly = 1); -assertEquals(1, val3); - -// Add a getter - should not touch the setter. -Object.defineProperty(obj1, "setOnly", accessorOnlyGet); -desc = Object.getOwnPropertyDescriptor(obj1, "setOnly"); -assertTrue(desc.configurable); -assertFalse(desc.enumerable); -assertEquals(desc.get, accessorOnlyGet.get); -assertEquals(desc.set, accessorOnlySet.set); -assertEquals(desc.writable, undefined); -assertEquals(desc.value, undefined); -assertEquals(1, obj1.setOnly = 1); -assertEquals(2, val3); - -// The above should also work if redefining just a getter or setter on -// an existing property with both a getter and a setter. -Object.defineProperty(obj1, "both", accessorConfigurable); - -Object.defineProperty(obj1, "both", accessorOnlySet); -desc = Object.getOwnPropertyDescriptor(obj1, "both"); -assertTrue(desc.configurable); -assertFalse(desc.enumerable); -assertEquals(desc.set, accessorOnlySet.set); -assertEquals(desc.get, accessorConfigurable.get); -assertEquals(desc.writable, undefined); -assertEquals(desc.value, undefined); -assertEquals(1, obj1.both = 1); -assertEquals(3, val3); - - -// Data properties - -Object.defineProperty(obj1, "foobar", dataConfigurable); -desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); -assertEquals(obj1.foobar, 1000); -assertEquals(desc.value, 1000); -assertTrue(desc.configurable); -assertFalse(desc.writable); -assertFalse(desc.enumerable); -assertEquals(desc.get, undefined); -assertEquals(desc.set, undefined); -//Try writing to non writable attribute - should remain 1000 -obj1.foobar = 1001; -assertEquals(obj1.foobar, 1000); - - -// Redefine to writable descriptor - now writing to foobar should be allowed. -Object.defineProperty(obj1, "foobar", dataWritable); -desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); -assertEquals(obj1.foobar, 3000); -assertEquals(desc.value, 3000); -// Note that since dataWritable does not define configurable the configurable -// setting from the redefined property (in this case true) is used. -assertTrue(desc.configurable); -assertTrue(desc.writable); -assertFalse(desc.enumerable); -assertEquals(desc.get, undefined); -assertEquals(desc.set, undefined); -// Writing to the property should now be allowed -obj1.foobar = 1001; -assertEquals(obj1.foobar, 1001); - - -// Redefine with non configurable data property. -Object.defineProperty(obj1, "foobar", dataNoConfigurable); -desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); -assertEquals(obj1.foobar, 2000); -assertEquals(desc.value, 2000); -assertFalse(desc.configurable); -assertTrue(desc.writable); -assertFalse(desc.enumerable); -assertEquals(desc.get, undefined); -assertEquals(desc.set, undefined); - -// Try redefine again - shold fail because configurable is now false. -try { - Object.defineProperty(obj1, "foobar", dataConfigurable); - assertTrue(false); -} catch (e) { - assertTrue(/Cannot redefine property/.test(e)); -} - -// Try redefine again with accessor property - shold also fail. -try { - Object.defineProperty(obj1, "foobar", dataConfigurable); - assertTrue(false); -} catch (e) { - assertTrue(/Cannot redefine property/.test(e)); -} - - -// Redifine with the same descriptor - should succeed (step 6). -Object.defineProperty(obj1, "foobar", dataNoConfigurable); -desc = Object.getOwnPropertyDescriptor(obj1, "foobar"); -assertEquals(obj1.foobar, 2000); -assertEquals(desc.value, 2000); -assertFalse(desc.configurable); -assertTrue(desc.writable); -assertFalse(desc.enumerable); -assertEquals(desc.get, undefined); -assertEquals(desc.set, undefined); - - -// New object -var obj2 = {}; - -// Make accessor - redefine to data -Object.defineProperty(obj2, "foo", accessorConfigurable); - -// Redefine to data property -Object.defineProperty(obj2, "foo", dataConfigurable); -desc = Object.getOwnPropertyDescriptor(obj2, "foo"); -assertEquals(obj2.foo, 1000); -assertEquals(desc.value, 1000); -assertTrue(desc.configurable); -assertFalse(desc.writable); -assertFalse(desc.enumerable); -assertEquals(desc.get, undefined); -assertEquals(desc.set, undefined); - - -// Redefine back to accessor -Object.defineProperty(obj2, "foo", accessorConfigurable); -desc = Object.getOwnPropertyDescriptor(obj2, "foo"); -assertTrue(desc.configurable); -assertFalse(desc.enumerable); -assertEquals(desc.writable, undefined); -assertEquals(desc.get, accessorConfigurable.get); -assertEquals(desc.set, accessorConfigurable.set); -assertEquals(desc.value, undefined); -assertEquals(1, obj2.foo = 1); -assertEquals(3, val1); -assertEquals(4, val2); -assertEquals(3, obj2.foo); - -// Make data - redefine to accessor -Object.defineProperty(obj2, "bar", dataConfigurable) - -// Redefine to accessor property -Object.defineProperty(obj2, "bar", accessorConfigurable); -desc = Object.getOwnPropertyDescriptor(obj2, "bar"); -assertTrue(desc.configurable); -assertFalse(desc.enumerable); -assertEquals(desc.writable, undefined); -assertEquals(desc.get, accessorConfigurable.get); -assertEquals(desc.set, accessorConfigurable.set); -assertEquals(desc.value, undefined); -assertEquals(1, obj2.bar = 1); -assertEquals(4, val1); -assertEquals(4, val2); -assertEquals(4, obj2.foo); - -// Redefine back to data property -Object.defineProperty(obj2, "bar", dataConfigurable); -desc = Object.getOwnPropertyDescriptor(obj2, "bar"); -assertEquals(obj2.bar, 1000); -assertEquals(desc.value, 1000); -assertTrue(desc.configurable); -assertFalse(desc.writable); -assertFalse(desc.enumerable); -assertEquals(desc.get, undefined); -assertEquals(desc.set, undefined); - - -// Redefinition of an accessor defined using __defineGetter__ and -// __defineSetter__. -function get(){return this.x} -function set(x){this.x=x}; - -var obj3 = {x:1000}; -obj3.__defineGetter__("foo", get); -obj3.__defineSetter__("foo", set); - -desc = Object.getOwnPropertyDescriptor(obj3, "foo"); -assertTrue(desc.configurable); -assertTrue(desc.enumerable); -assertEquals(desc.writable, undefined); -assertEquals(desc.get, get); -assertEquals(desc.set, set); -assertEquals(desc.value, undefined); -assertEquals(1, obj3.foo = 1); -assertEquals(1, obj3.x); -assertEquals(1, obj3.foo); - -// Redefine to accessor property (non configurable) - note that enumerable -// which we do not redefine should remain the same (true). -Object.defineProperty(obj3, "foo", accessorNoConfigurable); -desc = Object.getOwnPropertyDescriptor(obj3, "foo"); -assertFalse(desc.configurable); -assertTrue(desc.enumerable); -assertEquals(desc.writable, undefined); -assertEquals(desc.get, accessorNoConfigurable.get); -assertEquals(desc.set, accessorNoConfigurable.set); -assertEquals(desc.value, undefined); -assertEquals(1, obj3.foo = 1); -assertEquals(5, val2); -assertEquals(5, obj3.foo); - - -obj3.__defineGetter__("bar", get); -obj3.__defineSetter__("bar", set); - - -// Redefine back to data property -Object.defineProperty(obj3, "bar", dataConfigurable); -desc = Object.getOwnPropertyDescriptor(obj3, "bar"); -assertEquals(obj3.bar, 1000); -assertEquals(desc.value, 1000); -assertTrue(desc.configurable); -assertFalse(desc.writable); -assertTrue(desc.enumerable); -assertEquals(desc.get, undefined); -assertEquals(desc.set, undefined); - - -var obj4 = {}; -var func = function (){return 42;}; -obj4.bar = func; -assertEquals(42, obj4.bar()); - -Object.defineProperty(obj4, "bar", accessorConfigurable); -desc = Object.getOwnPropertyDescriptor(obj4, "bar"); -assertTrue(desc.configurable); -assertTrue(desc.enumerable); -assertEquals(desc.writable, undefined); -assertEquals(desc.get, accessorConfigurable.get); -assertEquals(desc.set, accessorConfigurable.set); -assertEquals(desc.value, undefined); -assertEquals(1, obj4.bar = 1); -assertEquals(5, val1); -assertEquals(5, obj4.bar); - -// Make sure an error is thrown when trying to access to redefined function. -try { - obj4.bar(); - assertTrue(false); -} catch (e) { - assertTrue(/is not a function/.test(e)); -} - - -// Test runtime calls to DefineOrRedefineDataProperty and -// DefineOrRedefineAccessorProperty - make sure we don't -// crash. -try { - %DefineOrRedefineAccessorProperty(0, 0, 0, 0, 0); -} catch (e) { - assertTrue(/illegal access/.test(e)); -} - -try { - %DefineOrRedefineDataProperty(0, 0, 0, 0); -} catch (e) { - assertTrue(/illegal access/.test(e)); -} - -try { - %DefineOrRedefineDataProperty(null, null, null, null); -} catch (e) { - assertTrue(/illegal access/.test(e)); -} - -try { - %DefineOrRedefineAccessorProperty(null, null, null, null, null); -} catch (e) { - assertTrue(/illegal access/.test(e)); -} - -try { - %DefineOrRedefineDataProperty({}, null, null, null); -} catch (e) { - assertTrue(/illegal access/.test(e)); -} - -// Defining properties null should fail even when we have -// other allowed values -try { - %DefineOrRedefineAccessorProperty(null, 'foo', func, null, 0); -} catch (e) { - assertTrue(/illegal access/.test(e)); -} - -try { - %DefineOrRedefineDataProperty(null, 'foo', 0, 0); -} catch (e) { - assertTrue(/illegal access/.test(e)); -} - -// Test that all possible differences in step 6 in DefineOwnProperty are -// exercised, i.e., any difference in the given property descriptor and the -// existing properties should not return true, but throw an error if the -// existing configurable property is false. - -var obj5 = {}; -// Enumerable will default to false. -Object.defineProperty(obj5, 'foo', accessorNoConfigurable); -desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); -// First, test that we are actually allowed to set the accessor if all -// values are of the descriptor are the same as the existing one. -Object.defineProperty(obj5, 'foo', accessorNoConfigurable); - -// Different setter. -var descDifferent = { - configurable:false, - enumerable:false, - set: setter1, - get: getter2 -}; - -try { - Object.defineProperty(obj5, 'foo', descDifferent); - assertTrue(false); -} catch (e) { - assertTrue(/Cannot redefine property/.test(e)); -} - -// Different getter. -descDifferent = { - configurable:false, - enumerable:false, - set: setter2, - get: getter1 -}; - -try { - Object.defineProperty(obj5, 'foo', descDifferent); - assertTrue(false); -} catch (e) { - assertTrue(/Cannot redefine property/.test(e)); -} - -// Different enumerable. -descDifferent = { - configurable:false, - enumerable:true, - set: setter2, - get: getter2 -}; - -try { - Object.defineProperty(obj5, 'foo', descDifferent); - assertTrue(false); -} catch (e) { - assertTrue(/Cannot redefine property/.test(e)); -} - -// Different configurable. -descDifferent = { - configurable:false, - enumerable:true, - set: setter2, - get: getter2 -}; - -try { - Object.defineProperty(obj5, 'foo', descDifferent); - assertTrue(false); -} catch (e) { - assertTrue(/Cannot redefine property/.test(e)); -} - -// No difference. -descDifferent = { - configurable:false, - enumerable:false, - set: setter2, - get: getter2 -}; -// Make sure we can still redefine if all properties are the same. -Object.defineProperty(obj5, 'foo', descDifferent); - -// Make sure that obj5 still holds the original values. -desc = Object.getOwnPropertyDescriptor(obj5, 'foo'); -assertEquals(desc.get, getter2); -assertEquals(desc.set, setter2); -assertFalse(desc.enumerable); -assertFalse(desc.configurable); - - -// Also exercise step 6 on data property, writable and enumerable -// defaults to false. -Object.defineProperty(obj5, 'bar', dataNoConfigurable); - -// Test that redefinition with the same property descriptor is possible -Object.defineProperty(obj5, 'bar', dataNoConfigurable); - -// Different value. -descDifferent = { - configurable:false, - enumerable:false, - writable: false, - value: 1999 -}; - -try { - Object.defineProperty(obj5, 'bar', descDifferent); - assertTrue(false); -} catch (e) { - assertTrue(/Cannot redefine property/.test(e)); -} - -// Different writable. -descDifferent = { - configurable:false, - enumerable:false, - writable: true, - value: 2000 -}; - -try { - Object.defineProperty(obj5, 'bar', descDifferent); - assertTrue(false); -} catch (e) { - assertTrue(/Cannot redefine property/.test(e)); -} - - -// Different enumerable. -descDifferent = { - configurable:false, - enumerable:true , - writable:false, - value: 2000 -}; - -try { - Object.defineProperty(obj5, 'bar', descDifferent); - assertTrue(false); -} catch (e) { - assertTrue(/Cannot redefine property/.test(e)); -} - - -// Different configurable. -descDifferent = { - configurable:true, - enumerable:false, - writable:false, - value: 2000 -}; - -try { - Object.defineProperty(obj5, 'bar', descDifferent); - assertTrue(false); -} catch (e) { - assertTrue(/Cannot redefine property/.test(e)); -} - -// No difference. -descDifferent = { - configurable:false, - enumerable:false, - writable:false, - value:2000 -}; -// Make sure we can still redefine if all properties are the same. -Object.defineProperty(obj5, 'bar', descDifferent); - -// Make sure that obj5 still holds the original values. -desc = Object.getOwnPropertyDescriptor(obj5, 'bar'); -assertEquals(desc.value, 2000); -assertFalse(desc.writable); -assertFalse(desc.enumerable); -assertFalse(desc.configurable); - - -// Make sure that we can't overwrite +0 with -0 and vice versa. -var descMinusZero = {value: -0, configurable: false}; -var descPlusZero = {value: +0, configurable: false}; - -Object.defineProperty(obj5, 'minuszero', descMinusZero); - -// Make sure we can redefine with -0. -Object.defineProperty(obj5, 'minuszero', descMinusZero); - -exception = false; -try { - Object.defineProperty(obj5, 'minuszero', descPlusZero); -} catch (e) { - exception = true; - assertTrue(/Cannot redefine property/.test(e)); -} -assertTrue(exception); - - -Object.defineProperty(obj5, 'pluszero', descPlusZero); - -// Make sure we can redefine with +0. -Object.defineProperty(obj5, 'pluszero', descPlusZero); - -exception = false; -try { - Object.defineProperty(obj5, 'pluszero', descMinusZero); -} catch (e) { - exception = true; - assertTrue(/Cannot redefine property/.test(e)); -} -assertTrue(exception); - - -var obj6 = {}; -obj6[1] = 'foo'; -obj6[2] = 'bar'; -obj6[3] = '42'; -obj6[4] = '43'; -obj6[5] = '44'; - -var descElement = { value: 'foobar' }; -var descElementNonConfigurable = { value: 'barfoo', configurable: false }; -var descElementNonWritable = { value: 'foofoo', writable: false }; -var descElementNonEnumerable = { value: 'barbar', enumerable: false }; -var descElementAllFalse = { value: 'foofalse', - configurable: false, - writable: false, - enumerable: false }; - - -// Redefine existing property. -Object.defineProperty(obj6, '1', descElement); -desc = Object.getOwnPropertyDescriptor(obj6, '1'); -assertEquals(desc.value, 'foobar'); -assertTrue(desc.writable); -assertTrue(desc.enumerable); -assertTrue(desc.configurable); - -// Redefine existing property with configurable: false. -Object.defineProperty(obj6, '2', descElementNonConfigurable); -desc = Object.getOwnPropertyDescriptor(obj6, '2'); -assertEquals(desc.value, 'barfoo'); -assertTrue(desc.writable); -assertTrue(desc.enumerable); -assertFalse(desc.configurable); - -// Can use defineProperty to change the value of a non -// configurable property. -try { - Object.defineProperty(obj6, '2', descElement); - desc = Object.getOwnPropertyDescriptor(obj6, '2'); - assertEquals(desc.value, 'foobar'); -} catch (e) { - assertUnreachable(); -} - -// Ensure that we can't change the descriptor of a -// non configurable property. -exception = false; -try { - var descAccessor = { get: function() { return 0; } }; - Object.defineProperty(obj6, '2', descAccessor); -} catch (e) { - exception = true; - assertTrue(/Cannot redefine property/.test(e)); -} -assertTrue(exception); - -Object.defineProperty(obj6, '2', descElementNonWritable); -desc = Object.getOwnPropertyDescriptor(obj6, '2'); -assertEquals(desc.value, 'foofoo'); -assertFalse(desc.writable); -assertTrue(desc.enumerable); -assertFalse(desc.configurable); - -Object.defineProperty(obj6, '3', descElementNonWritable); -desc = Object.getOwnPropertyDescriptor(obj6, '3'); -assertEquals(desc.value, 'foofoo'); -assertFalse(desc.writable); -assertTrue(desc.enumerable); -assertTrue(desc.configurable); - -// Redefine existing property with configurable: false. -Object.defineProperty(obj6, '4', descElementNonEnumerable); -desc = Object.getOwnPropertyDescriptor(obj6, '4'); -assertEquals(desc.value, 'barbar'); -assertTrue(desc.writable); -assertFalse(desc.enumerable); -assertTrue(desc.configurable); - -// Redefine existing property with configurable: false. -Object.defineProperty(obj6, '5', descElementAllFalse); -desc = Object.getOwnPropertyDescriptor(obj6, '5'); -assertEquals(desc.value, 'foofalse'); -assertFalse(desc.writable); -assertFalse(desc.enumerable); -assertFalse(desc.configurable); - -// Define non existing property - all attributes should default to false. -Object.defineProperty(obj6, '15', descElement); -desc = Object.getOwnPropertyDescriptor(obj6, '15'); -assertEquals(desc.value, 'foobar'); -assertFalse(desc.writable); -assertFalse(desc.enumerable); -assertFalse(desc.configurable); - -// Make sure that we can't redefine using direct access. -obj6[15] ='overwrite'; -assertEquals(obj6[15],'foobar'); - - -// Repeat the above tests on an array. -var arr = new Array(); -arr[1] = 'foo'; -arr[2] = 'bar'; -arr[3] = '42'; -arr[4] = '43'; -arr[5] = '44'; - -var descElement = { value: 'foobar' }; -var descElementNonConfigurable = { value: 'barfoo', configurable: false }; -var descElementNonWritable = { value: 'foofoo', writable: false }; -var descElementNonEnumerable = { value: 'barbar', enumerable: false }; -var descElementAllFalse = { value: 'foofalse', - configurable: false, - writable: false, - enumerable: false }; - - -// Redefine existing property. -Object.defineProperty(arr, '1', descElement); -desc = Object.getOwnPropertyDescriptor(arr, '1'); -assertEquals(desc.value, 'foobar'); -assertTrue(desc.writable); -assertTrue(desc.enumerable); -assertTrue(desc.configurable); - -// Redefine existing property with configurable: false. -Object.defineProperty(arr, '2', descElementNonConfigurable); -desc = Object.getOwnPropertyDescriptor(arr, '2'); -assertEquals(desc.value, 'barfoo'); -assertTrue(desc.writable); -assertTrue(desc.enumerable); -assertFalse(desc.configurable); - -// Can use defineProperty to change the value of a non -// configurable property of an array. -try { - Object.defineProperty(arr, '2', descElement); - desc = Object.getOwnPropertyDescriptor(arr, '2'); - assertEquals(desc.value, 'foobar'); -} catch (e) { - assertUnreachable(); -} - -// Ensure that we can't change the descriptor of a -// non configurable property. -exception = false; -try { - var descAccessor = { get: function() { return 0; } }; - Object.defineProperty(arr, '2', descAccessor); -} catch (e) { - exception = true; - assertTrue(/Cannot redefine property/.test(e)); -} -assertTrue(exception); - -Object.defineProperty(arr, '2', descElementNonWritable); -desc = Object.getOwnPropertyDescriptor(arr, '2'); -assertEquals(desc.value, 'foofoo'); -assertFalse(desc.writable); -assertTrue(desc.enumerable); -assertFalse(desc.configurable); - -Object.defineProperty(arr, '3', descElementNonWritable); -desc = Object.getOwnPropertyDescriptor(arr, '3'); -assertEquals(desc.value, 'foofoo'); -assertFalse(desc.writable); -assertTrue(desc.enumerable); -assertTrue(desc.configurable); - -// Redefine existing property with configurable: false. -Object.defineProperty(arr, '4', descElementNonEnumerable); -desc = Object.getOwnPropertyDescriptor(arr, '4'); -assertEquals(desc.value, 'barbar'); -assertTrue(desc.writable); -assertFalse(desc.enumerable); -assertTrue(desc.configurable); - -// Redefine existing property with configurable: false. -Object.defineProperty(arr, '5', descElementAllFalse); -desc = Object.getOwnPropertyDescriptor(arr, '5'); -assertEquals(desc.value, 'foofalse'); -assertFalse(desc.writable); -assertFalse(desc.enumerable); -assertFalse(desc.configurable); - -// Define non existing property - all attributes should default to false. -Object.defineProperty(arr, '15', descElement); -desc = Object.getOwnPropertyDescriptor(arr, '15'); -assertEquals(desc.value, 'foobar'); -assertFalse(desc.writable); -assertFalse(desc.enumerable); -assertFalse(desc.configurable); - -// See issue 968: http://code.google.com/p/v8/issues/detail?id=968 -var o = { x : 42 }; -Object.defineProperty(o, "x", { writable: false }); -assertEquals(42, o.x); -o.x = 37; -assertEquals(42, o.x); - -o = { x : 42 }; -Object.defineProperty(o, "x", {}); -assertEquals(42, o.x); -o.x = 37; -// Writability is preserved. -assertEquals(37, o.x); - -var o = { }; -Object.defineProperty(o, "x", { writable: false }); -assertEquals(undefined, o.x); -o.x = 37; -assertEquals(undefined, o.x); - -o = { get x() { return 87; } }; -Object.defineProperty(o, "x", { writable: false }); -assertEquals(undefined, o.x); -o.x = 37; -assertEquals(undefined, o.x); - -// Ignore inherited properties. -o = { __proto__ : { x : 87 } }; -Object.defineProperty(o, "x", { writable: false }); -assertEquals(undefined, o.x); -o.x = 37; -assertEquals(undefined, o.x); - -function testDefineProperty(obj, propertyName, desc, resultDesc) { - Object.defineProperty(obj, propertyName, desc); - var actualDesc = Object.getOwnPropertyDescriptor(obj, propertyName); - assertEquals(resultDesc.enumerable, actualDesc.enumerable); - assertEquals(resultDesc.configurable, actualDesc.configurable); - if (resultDesc.hasOwnProperty('value')) { - assertEquals(resultDesc.value, actualDesc.value); - assertEquals(resultDesc.writable, actualDesc.writable); - assertFalse(resultDesc.hasOwnProperty('get')); - assertFalse(resultDesc.hasOwnProperty('set')); - } else { - assertEquals(resultDesc.get, actualDesc.get); - assertEquals(resultDesc.set, actualDesc.set); - assertFalse(resultDesc.hasOwnProperty('value')); - assertFalse(resultDesc.hasOwnProperty('writable')); - } -} - -// tests redefining existing property with a generic descriptor -o = { p : 42 }; -testDefineProperty(o, 'p', - { }, - { value : 42, writable : true, enumerable : true, configurable : true }); - -o = { p : 42 }; -testDefineProperty(o, 'p', - { enumerable : true }, - { value : 42, writable : true, enumerable : true, configurable : true }); - -o = { p : 42 }; -testDefineProperty(o, 'p', - { configurable : true }, - { value : 42, writable : true, enumerable : true, configurable : true }); - -o = { p : 42 }; -testDefineProperty(o, 'p', - { enumerable : false }, - { value : 42, writable : true, enumerable : false, configurable : true }); - -o = { p : 42 }; -testDefineProperty(o, 'p', - { configurable : false }, - { value : 42, writable : true, enumerable : true, configurable : false }); - -o = { p : 42 }; -testDefineProperty(o, 'p', - { enumerable : true, configurable : true }, - { value : 42, writable : true, enumerable : true, configurable : true }); - -o = { p : 42 }; -testDefineProperty(o, 'p', - { enumerable : false, configurable : true }, - { value : 42, writable : true, enumerable : false, configurable : true }); - -o = { p : 42 }; -testDefineProperty(o, 'p', - { enumerable : true, configurable : false }, - { value : 42, writable : true, enumerable : true, configurable : false }); - -o = { p : 42 }; -testDefineProperty(o, 'p', - { enumerable : false, configurable : false }, - { value : 42, writable : true, enumerable : false, configurable : false }); - -// can make a writable, non-configurable field non-writable -o = { p : 42 }; -Object.defineProperty(o, 'p', { configurable: false }); -testDefineProperty(o, 'p', - { writable: false }, - { value : 42, writable : false, enumerable : true, configurable : false }); - -// redefine of get only property with generic descriptor -o = {}; -Object.defineProperty(o, 'p', - { get : getter1, enumerable: true, configurable: true }); -testDefineProperty(o, 'p', - { enumerable : false, configurable : false }, - { get: getter1, set: undefined, enumerable : false, configurable : false }); - -// redefine of get/set only property with generic descriptor -o = {}; -Object.defineProperty(o, 'p', - { get: getter1, set: setter1, enumerable: true, configurable: true }); -testDefineProperty(o, 'p', - { enumerable : false, configurable : false }, - { get: getter1, set: setter1, enumerable : false, configurable : false }); - -// redefine of set only property with generic descriptor -o = {}; -Object.defineProperty(o, 'p', - { set : setter1, enumerable: true, configurable: true }); -testDefineProperty(o, 'p', - { enumerable : false, configurable : false }, - { get: undefined, set: setter1, enumerable : false, configurable : false }); - - -// Regression test: Ensure that growing dictionaries are not ignored. -o = {}; -for (var i = 0; i < 1000; i++) { - // Non-enumerable property forces dictionary mode. - Object.defineProperty(o, i, {value: i, enumerable: false}); -} -assertEquals(999, o[999]); - - -// Regression test: Bizzare behavior on non-strict arguments object. -// TODO(yangguo): Tests disabled, needs investigation! -/* -(function test(arg0) { - // Here arguments[0] is a fast alias on arg0. - Object.defineProperty(arguments, "0", { - value:1, - enumerable:false - }); - // Here arguments[0] is a slow alias on arg0. - Object.defineProperty(arguments, "0", { - value:2, - writable:false - }); - // Here arguments[0] is no alias at all. - Object.defineProperty(arguments, "0", { - value:3 - }); - assertEquals(2, arg0); - assertEquals(3, arguments[0]); -})(0); -*/ - -// Regression test: We should never observe the hole value. -var objectWithGetter = {}; -objectWithGetter.__defineGetter__('foo', function() {}); -assertEquals(undefined, objectWithGetter.__lookupSetter__('foo')); - -var objectWithSetter = {}; -objectWithSetter.__defineSetter__('foo', function(x) {}); -assertEquals(undefined, objectWithSetter.__lookupGetter__('foo')); - -// An object with a getter on the prototype chain. -function getter() { return 111; } -function anotherGetter() { return 222; } - -function testGetterOnProto(expected, o) { - assertEquals(expected, o.quebec); -} - -obj1 = {}; -Object.defineProperty(obj1, "quebec", { get: getter, configurable: true }); -obj2 = Object.create(obj1); -obj3 = Object.create(obj2); - -testGetterOnProto(111, obj3); -testGetterOnProto(111, obj3); -%OptimizeFunctionOnNextCall(testGetterOnProto); -testGetterOnProto(111, obj3); -testGetterOnProto(111, obj3); - -Object.defineProperty(obj1, "quebec", { get: anotherGetter }); - -testGetterOnProto(222, obj3); -testGetterOnProto(222, obj3); -%OptimizeFunctionOnNextCall(testGetterOnProto); -testGetterOnProto(222, obj3); -testGetterOnProto(222, obj3); - -// An object with a setter on the prototype chain. -var modifyMe; -function setter(x) { modifyMe = x+1; } -function anotherSetter(x) { modifyMe = x+2; } - -function testSetterOnProto(expected, o) { - modifyMe = 333; - o.romeo = 444; - assertEquals(expected, modifyMe); -} - -obj1 = {}; -Object.defineProperty(obj1, "romeo", { set: setter, configurable: true }); -obj2 = Object.create(obj1); -obj3 = Object.create(obj2); - -testSetterOnProto(445, obj3); -testSetterOnProto(445, obj3); -%OptimizeFunctionOnNextCall(testSetterOnProto); -testSetterOnProto(445, obj3); -testSetterOnProto(445, obj3); - -Object.defineProperty(obj1, "romeo", { set: anotherSetter }); - -testSetterOnProto(446, obj3); -testSetterOnProto(446, obj3); -%OptimizeFunctionOnNextCall(testSetterOnProto); -testSetterOnProto(446, obj3); -testSetterOnProto(446, obj3); - -// Removing a setter on the prototype chain. -function testSetterOnProtoStrict(o) { - "use strict"; - o.sierra = 12345; -} - -obj1 = {}; -Object.defineProperty(obj1, "sierra", - { get: getter, set: setter, configurable: true }); -obj2 = Object.create(obj1); -obj3 = Object.create(obj2); - -testSetterOnProtoStrict(obj3); -testSetterOnProtoStrict(obj3); -%OptimizeFunctionOnNextCall(testSetterOnProtoStrict); -testSetterOnProtoStrict(obj3); -testSetterOnProtoStrict(obj3); - -Object.defineProperty(obj1, "sierra", - { get: getter, set: undefined, configurable: true }); - -exception = false; -try { - testSetterOnProtoStrict(obj3); -} catch (e) { - exception = true; - assertTrue(/which has only a getter/.test(e)); -} -assertTrue(exception); - -// Test assignment to a getter-only property on the prototype chain. This makes -// sure that crankshaft re-checks its assumptions and doesn't rely only on type -// feedback (which would be monomorphic here). - -function Assign(o) { - o.blubb = 123; -} - -function C() {} - -Assign(new C); -Assign(new C); -%OptimizeFunctionOnNextCall(Assign); -Object.defineProperty(C.prototype, "blubb", {get: function() { return -42; }}); -Assign(new C); |