1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2009 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Test that we can make large object literals that work. 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Also test that we can attempt to make even larger object literals without 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// crashing. 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction testLiteral(size, array_in_middle) { 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block print(size); 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var f; 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Build object-literal string. 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var literal = "function f() { return "; 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (var i = 0; i < size; i++) { 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block literal += "{a:"; 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block literal += array_in_middle ? " [42.2]" : "{a:42.2}"; 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (var i = 0; i < size; i++) { 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block literal += "}"; 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (i < size - 1) { 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block literal += ", b:42, c:/asd/, x:'foo', y:[], z:new Object()"; 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block literal += "; }"; 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Create the object literal. 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block eval(literal); 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var x = f(); 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check that the properties have the expected values. 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (var i = 0; i < size; i++) { 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block x = x.a; 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (array_in_middle) { 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(42.2, x[0]), "x array in middle"; 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block x[0] = 41.2; 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(42.2, x.a, "x object in middle"); 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block x.a = 41.2; 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var y = f(); 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (var i = 0; i < size; i++) { 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block y = y.a; 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (array_in_middle) { 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(42.2, y[0], "y array in middle"); 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block y[0] = 41.2; 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(42.2, y.a, "y object in middle"); 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block y.a = 41.2; 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The sizes to test. 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar sizes = [1, 2, 100, 200]; 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Run the test. 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfor (var i = 0; i < sizes.length; i++) { 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block testLiteral(sizes[i], false); 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block testLiteral(sizes[i], true); 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction testLiteralAndCatch(size) { 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var big_enough = false; 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block try { 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block testLiteral(size, false); 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } catch (e) { 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block big_enough = true; 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block try { 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block testLiteral(size, true); 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } catch (e) { 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block big_enough = true; 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return big_enough; 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Catch stack overflows. 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlocktestLiteralAndCatch(1000) || 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlocktestLiteralAndCatch(20000) || 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlocktestLiteralAndCatch(200000); 115