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