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 28var obj = { 29 a: 7, 30 b: { x: 12, y: 24 }, 31 c: 'Zebra' 32} 33 34assertEquals(7, obj.a); 35assertEquals(12, obj.b.x); 36assertEquals(24, obj.b.y); 37assertEquals('Zebra', obj.c); 38 39var z = 24; 40 41var obj2 = { 42 a: 7, 43 b: { x: 12, y: z }, 44 c: 'Zebra' 45} 46 47assertEquals(7, obj2.a); 48assertEquals(12, obj2.b.x); 49assertEquals(24, obj2.b.y); 50assertEquals('Zebra', obj2.c); 51 52var arr = []; 53for (var i = 0; i < 2; i++) { 54 arr[i] = { 55 a: 7, 56 b: { x: 12, y: 24 }, 57 c: 'Zebra' 58 } 59} 60 61arr[0].b.x = 2; 62assertEquals(2, arr[0].b.x); 63assertEquals(12, arr[1].b.x); 64 65 66function makeSparseArray() { 67 return { 68 '0': { x: 12, y: 24 }, 69 '1000000': { x: 0, y: 0 } 70 }; 71} 72 73var sa1 = makeSparseArray(); 74sa1[0].x = 0; 75var sa2 = makeSparseArray(); 76assertEquals(12, sa2[0].x); 77 78// Test that non-constant literals work. 79var n = new Object(); 80 81function makeNonConstantArray() { return [ [ n ] ]; } 82 83var a = makeNonConstantArray(); 84a[0][0].foo = "bar"; 85assertEquals("bar", n.foo); 86 87function makeNonConstantObject() { return { a: { b: n } }; } 88 89a = makeNonConstantObject(); 90a.a.b.bar = "foo"; 91assertEquals("foo", n.bar); 92 93// Test that exceptions for regexps still hold. 94function makeRegexpInArray() { return [ [ /a*/, {} ] ]; } 95 96a = makeRegexpInArray(); 97var b = makeRegexpInArray(); 98assertTrue(a[0][0] === b[0][0]); 99assertFalse(a[0][1] === b[0][1]); 100 101function makeRegexpInObject() { return { a: { b: /b*/, c: {} } }; } 102a = makeRegexpInObject(); 103b = makeRegexpInObject(); 104assertTrue(a.a.b === b.a.b); 105assertFalse(a.a.c === b.a.c); 106