133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Copyright 2010 the V8 project authors. All rights reserved. 233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Redistribution and use in source and binary forms, with or without 333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// modification, are permitted provided that the following conditions are 433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// met: 533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// 633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// * Redistributions of source code must retain the above copyright 733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// notice, this list of conditions and the following disclaimer. 833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// * Redistributions in binary form must reproduce the above 933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// copyright notice, this list of conditions and the following 1033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// disclaimer in the documentation and/or other materials provided 1133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// with the distribution. 1233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// * Neither the name of Google Inc. nor the names of its 1333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// contributors may be used to endorse or promote products derived 1433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// from this software without specific prior written permission. 1533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// 1633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// This file only tests very simple descriptors that always have 2933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// configurable, enumerable, and writable set to true. 3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// A range of more elaborate tests are performed in 3133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// object-define-property.js 3233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Flags: --stress-runs=5 3433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfunction get() { return x; } 3633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfunction set(x) { this.x = x; } 3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar obj = {x: 1}; 3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgobj.__defineGetter__("accessor", get); 4033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgobj.__defineSetter__("accessor", set); 4133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar a = new Array(); 4233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orga[1] = 42; 4333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgobj[1] = 42; 4433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 4533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar descIsData = Object.getOwnPropertyDescriptor(obj, 'x'); 4633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descIsData.enumerable); 4733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descIsData.writable); 4833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descIsData.configurable); 4933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar descIsAccessor = Object.getOwnPropertyDescriptor(obj, 'accessor'); 5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descIsAccessor.enumerable); 5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descIsAccessor.configurable); 5333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descIsAccessor.get == get); 5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descIsAccessor.set == set); 5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar descIsNotData = Object.getOwnPropertyDescriptor(obj, 'not-x'); 5733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descIsNotData == undefined); 5833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar descIsNotAccessor = Object.getOwnPropertyDescriptor(obj, 'not-accessor'); 6033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descIsNotAccessor == undefined); 6133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar descArray = Object.getOwnPropertyDescriptor(a, '1'); 6333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descArray.enumerable); 6433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descArray.configurable); 6533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descArray.writable); 6633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertEquals(descArray.value, 42); 6733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar descObjectElement = Object.getOwnPropertyDescriptor(obj, '1'); 6933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descObjectElement.enumerable); 7033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descObjectElement.configurable); 7133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descObjectElement.writable); 7233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertEquals(descObjectElement.value, 42); 7333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// String objects. 7533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar a = new String('foobar'); 7633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfor (var i = 0; i < a.length; i++) { 7733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org var descStringObject = Object.getOwnPropertyDescriptor(a, i); 7833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assertTrue(descStringObject.enumerable); 7933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assertFalse(descStringObject.configurable); 8033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assertFalse(descStringObject.writable); 8133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assertEquals(descStringObject.value, a.substring(i, i+1)); 8233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org} 8333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 8433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Support for additional attributes on string objects. 8533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orga.x = 42; 8633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orga[10] = 'foo'; 8733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar descStringProperty = Object.getOwnPropertyDescriptor(a, 'x'); 8833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descStringProperty.enumerable); 8933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descStringProperty.configurable); 9033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descStringProperty.writable); 9133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertEquals(descStringProperty.value, 42); 9233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 9333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar descStringElement = Object.getOwnPropertyDescriptor(a, '10'); 9433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descStringElement.enumerable); 9533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descStringElement.configurable); 9633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertTrue(descStringElement.writable); 9733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertEquals(descStringElement.value, 'foo'); 9833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 9933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Test that elements in the prototype chain is not returned. 10033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar proto = {}; 10133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgproto[10] = 42; 10233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 10333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar objWithProto = new Array(); 10433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgobjWithProto.prototype = proto; 10533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgobjWithProto[0] = 'bar'; 10633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar descWithProto = Object.getOwnPropertyDescriptor(objWithProto, '10'); 10733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertEquals(undefined, descWithProto); 10833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 10933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org// Test elements on global proxy object. 11033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar global = (function() { return this; })(); 11133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 11233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgglobal[42] = 42; 11333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 11433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfunction el_getter() { return 239; }; 11533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfunction el_setter() {}; 11633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgObject.defineProperty(global, '239', {get: el_getter, set: el_setter}); 11733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 11833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar descRegularElement = Object.getOwnPropertyDescriptor(global, '42'); 11933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertEquals(42, descRegularElement.value); 12033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 12133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvar descAccessorElement = Object.getOwnPropertyDescriptor(global, '239'); 12233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertEquals(el_getter, descAccessorElement.get); 12333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgassertEquals(el_setter, descAccessorElement.set); 124