13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
28c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// Redistribution and use in source and binary forms, with or without
38c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// modification, are permitted provided that the following conditions are
48c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// met:
58c569c4a1286b419597940890e04517bc59eefcdBen Murdoch//
68c569c4a1286b419597940890e04517bc59eefcdBen Murdoch//     * Redistributions of source code must retain the above copyright
78c569c4a1286b419597940890e04517bc59eefcdBen Murdoch//       notice, this list of conditions and the following disclaimer.
88c569c4a1286b419597940890e04517bc59eefcdBen Murdoch//     * Redistributions in binary form must reproduce the above
98c569c4a1286b419597940890e04517bc59eefcdBen Murdoch//       copyright notice, this list of conditions and the following
108c569c4a1286b419597940890e04517bc59eefcdBen Murdoch//       disclaimer in the documentation and/or other materials provided
118c569c4a1286b419597940890e04517bc59eefcdBen Murdoch//       with the distribution.
128c569c4a1286b419597940890e04517bc59eefcdBen Murdoch//     * Neither the name of Google Inc. nor the names of its
138c569c4a1286b419597940890e04517bc59eefcdBen Murdoch//       contributors may be used to endorse or promote products derived
148c569c4a1286b419597940890e04517bc59eefcdBen Murdoch//       from this software without specific prior written permission.
158c569c4a1286b419597940890e04517bc59eefcdBen Murdoch//
168c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
178c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
188c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
198c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
208c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
218c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
228c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
238c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
248c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
268c569c4a1286b419597940890e04517bc59eefcdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278c569c4a1286b419597940890e04517bc59eefcdBen Murdoch
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Flags: --allow-natives-syntax
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Test function.arguments.
31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction A() {}
33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction B() {}
34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction fee(x, y) {
36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (x == 1) return fee["arg" + "uments"];
37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (x == 2) return gee["arg" + "uments"];
38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return 42;
39b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction gee(x) { return this.f(2 - x, "f"); }
42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction foo(x, y) {
44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (x == 0) return foo["arg" + "uments"];
45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (x == 1) return goo["arg" + "uments"];
46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return 42;
47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction goo(x) { return this.f(x, "f"); }
50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochA.prototype.f = fee;
52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochA.prototype.g = gee;
53b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochB.prototype.f = foo;
55b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochB.prototype.g = goo;
56b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvar o = new A();
58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction hej(x) {
60b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (x == 0) return o.g(x, "h");
61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (x == 1) return o.g(x, "h");
62b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return o.g(x, "z");
63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction opt() {
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (var k=0; k<2; k++) {
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    for (var i=0; i<5; i++) o.g(i, "g");
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    for (var j=0; j<5; j++) hej(j);
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %OptimizeFunctionOnNextCall(o.g);
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %OptimizeFunctionOnNextCall(hej);
72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochopt();
75b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertArrayEquals([0, "g"], o.g(0, "g"));
76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertArrayEquals([1, "f"], o.g(1, "g"));
77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertArrayEquals([0, "h"], hej(0));
78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertArrayEquals([1, "f"], hej(1));
79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdocho = new B();
81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochopt();
83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertArrayEquals([0, "f"], o.g(0, "g"));
84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertArrayEquals([1, "g"], o.g(1, "g"));
85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertArrayEquals([0, "f"], hej(0));
86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochassertArrayEquals([1, "h"], hej(1));
87