1// Copyright 2009 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28// Test that getters can be defined and called with an index as a parameter. 29 30var o = {}; 31o.x = 42; 32o.__defineGetter__('0', function() { return o.x; }); 33assertEquals(o.x, o[0]); 34assertEquals(o.x, o.__lookupGetter__('0')()); 35 36o.__defineSetter__('0', function(y) { o.x = y; }); 37assertEquals(o.x, o[0]); 38assertEquals(o.x, o.__lookupGetter__('0')()); 39o[0] = 21; 40assertEquals(21, o.x); 41o.__lookupSetter__(0)(7); 42assertEquals(7, o.x); 43 44function Pair(x, y) { 45 this.x = x; 46 this.y = y; 47}; 48Pair.prototype.__defineGetter__('0', function() { return this.x; }); 49Pair.prototype.__defineGetter__('1', function() { return this.y; }); 50Pair.prototype.__defineSetter__('0', function(x) { this.x = x; }); 51Pair.prototype.__defineSetter__('1', function(y) { this.y = y; }); 52 53var p = new Pair(2, 3); 54assertEquals(2, p[0]); 55assertEquals(3, p[1]); 56p.x = 7; 57p[1] = 8; 58assertEquals(7, p[0]); 59assertEquals(7, p.x); 60assertEquals(8, p[1]); 61assertEquals(8, p.y); 62 63 64// Testing that a defined getter doesn't get lost due to inline caching. 65var expected = {}; 66var actual = {}; 67for (var i = 0; i < 10; i++) { 68 expected[i] = actual[i] = i; 69} 70function testArray() { 71 for (var i = 0; i < 10; i++) { 72 assertEquals(expected[i], actual[i]); 73 } 74} 75actual[1000000] = -1; 76testArray(); 77testArray(); 78actual.__defineGetter__('0', function() { return expected[0]; }); 79expected[0] = 42; 80testArray(); 81expected[0] = 111; 82testArray(); 83 84// Using a setter where only a getter is defined does not throw an exception, 85// unless we are in strict mode. 86var q = {}; 87q.__defineGetter__('0', function() { return 42; }); 88assertDoesNotThrow('q[0] = 7'); 89 90// Using a getter where only a setter is defined returns undefined. 91var q1 = {}; 92q1.__defineSetter__('0', function() {q1.b = 17;}); 93assertEquals(q1[0], undefined); 94// Setter works 95q1[0] = 3; 96assertEquals(q1[0], undefined); 97assertEquals(q1.b, 17); 98 99// Complex case of using an undefined getter. 100// From http://code.google.com/p/v8/issues/detail?id=298 101// Reported by nth10sd. 102 103a = function() {}; 104__defineSetter__("0", function() {}); 105if (a |= '') {}; 106assertThrows('this[a].__parent__'); 107assertEquals(a, 0); 108assertEquals(this[a], undefined); 109