1// Copyright 2010 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// Flags: --allow-natives-syntax 29 30// Check that constants and computed properties are overwriting each other 31// correctly, i.e., the last initializer for any name is stored in the object. 32 33 34// Tests for the full code generator (if active). 35 36var foo1 = { 37 bar: 6, 38 bar: 7 39}; 40 41var foo2 = { 42 bar: function(a){}, 43 bar: 7 44}; 45 46var foo3 = { 47 bar: function(a){}, 48 bar: function(b){}, 49 bar: 7 50}; 51 52var foo4 = { 53 bar: function(b){}, 54 bar: 4, 55 bar: function(){return 7}, 56}; 57 58var foo5 = { 59 13: function(a){}, 60 13: 7 61} 62 63var foo6 = { 64 14.31: function(a){}, 65 14.31: 7 66} 67 68var foo7 = { 69 15: 6, 70 15: 7 71} 72 73function foo8(i) { 74 var obj = { 75 x: {a: i}, 76 x: 7 77 }; 78 return obj.x; 79}; 80 81assertEquals(7, foo1.bar); 82assertEquals(7, foo2.bar); 83assertEquals(7, foo3.bar); 84assertEquals(7, foo4.bar()); 85assertEquals(7, foo5[13]); 86assertEquals(7, foo6[14.31]); 87assertEquals(7, foo7[15]); 88 89assertEquals(7, foo8(1)); 90assertEquals(7, foo8(1)); 91%OptimizeFunctionOnNextCall(foo8); 92assertEquals(7, foo8(1)); 93 94 95// Test for the classic code generator. 96 97function fun(x) { 98 var inner = { j: function(x) { return x; }, j: 7 }; 99 return inner.j; 100} 101 102assertEquals(7, fun(7) ); 103 104// Check that the initializers of computed properties are executed, even if 105// no store instructions are generated for the literals. 106 107var glob1 = 0; 108 109var bar1 = { x: glob1++, x: glob1++, x: glob1++, x: 7}; 110 111assertEquals(3, glob1); 112 113 114var glob2 = 0; 115 116function fun2() { 117 var r = { y: glob2++, y: glob2++, y: glob2++, y: 7}; 118 return r.y; 119} 120 121var y = fun2(); 122assertEquals(7, y); 123assertEquals(3, glob2); 124 125var glob3 = 0; 126 127function fun3() { 128 var r = { 113: glob3++, 113: glob3++, 113: glob3++, 113: 7}; 129 return r[113]; 130} 131 132var y = fun3(); 133assertEquals(7, y); 134assertEquals(3, glob3); 135