1// Copyright 2011 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
30function burn() {
31  var a = new Array(3);
32  a[0] = 10;
33  a[1] = 15.5;
34  a[2] = 20;
35  return a;
36}
37
38function check(a) {
39  assertEquals(10, a[0]);
40  assertEquals(15.5, a[1]);
41  assertEquals(20, a[2]);
42}
43
44var b;
45for (var i = 0; i < 3; ++i) {
46  b = burn();
47  check(b);  // all OK
48}
49%OptimizeFunctionOnNextCall(burn);
50b = burn();
51check(b);  // fails
52
53
54function loop_test(x) {
55  for (i=0;i<3;i++) {
56    x[i] = (i+1) * 0.5;
57  }
58}
59
60function check2(b) {
61  assertEquals(0.5, b[0]);
62  assertEquals(1.0, b[1]);
63  assertEquals(1.5, b[2]);
64}
65
66for (var i = 0; i < 3; ++i) {
67  b = [0,1,2];
68  loop_test(b);
69  check2(b);
70}
71%OptimizeFunctionOnNextCall(loop_test);
72b = [0,1,2];
73loop_test(b);
74check2(b);
75