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