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