13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 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
288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Flags: --allow-natives-syntax
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Check that %NewObjectFromBound works correctly when called from optimized
318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// frame.
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction foo1(x, y, z) {
338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  assertEquals(1, x);
348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  assertEquals(2, y);
358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  assertEquals(3, z);
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction foo2(x, y, z) {
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals(1, x);
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals(2, y);
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals(undefined, z);
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction foo3(x, y, z) {
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals(1, x);
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals(2, y);
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertEquals(3, z);
483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
49c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar foob1 = foo1.bind({}, 1);
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar foob2 = foo2.bind({}, 1);
533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar foob3 = foo3.bind({}, 1);
543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f1(y, z) {
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %NewObjectFromBound(foob1);
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f2(y, z) {
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %NewObjectFromBound(foob2);
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f3(y, z) {
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %NewObjectFromBound(foob3);
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Check that %NewObjectFromBound looks at correct frame for inlined function.
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction g1(z, y) {
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return f1(y, z); /* f should be inlined into g, note rotated arguments */
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction g2(z, y, x) {
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return f2(y); /* f should be inlined into g, note argument count mismatch */
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction g3(z, y, x) {
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return f3(x, y, z); /* f should be inlined into g, note argument count mismatch */
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Check that %NewObjectFromBound looks at correct frame for inlined function.
828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction ff(x) { }
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction h1(z2, y2) {
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var local_z = z2 >> 1;
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ff(local_z);
863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var local_y = y2 >> 1;
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ff(local_y);
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return f1(local_y, local_z); /* f should be inlined into h */
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction h2(z2, y2, x2) {
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var local_z = z2 >> 1;
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ff(local_z);
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var local_y = y2 >> 1;
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ff(local_y);
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return f2(local_y); /* f should be inlined into h */
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction h3(z2, y2, x2) {
100c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  var local_z = z2 >> 1;
101c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  ff(local_z);
102c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  var local_y = y2 >> 1;
103c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  ff(local_y);
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var local_x = x2 >> 1;
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ff(local_x);
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return f3(local_x, local_y, local_z); /* f should be inlined into h */
107c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction invoke(f, args) {
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (var i = 0; i < 5; i++) f.apply(this, args);
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  %OptimizeFunctionOnNextCall(f);
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  f.apply(this, args);
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
115c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinvoke(f1, [2, 3]);
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinvoke(f2, [2]);
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinvoke(f3, [2, 3, 4]);
1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinvoke(g1, [3, 2]);
1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinvoke(g2, [3, 2, 4]);
1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinvoke(g3, [4, 3, 2]);
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinvoke(h1, [6, 4]);
1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinvoke(h2, [6, 4, 8]);
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinvoke(h3, [8, 6, 4]);
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Check that %_IsConstructCall returns correct value when inlined
1278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvar NON_CONSTRUCT_MARKER = {};
1288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvar CONSTRUCT_MARKER = {};
1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction baz(x) {
1308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  return (!%_IsConstructCall()) ? NON_CONSTRUCT_MARKER : CONSTRUCT_MARKER;
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochfunction bar(x, y, z) {
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var non_construct = baz(0); /* baz should be inlined */
1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertSame(non_construct, NON_CONSTRUCT_MARKER);
1368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  var non_construct = baz(); /* baz should be inlined */
1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertSame(non_construct, NON_CONSTRUCT_MARKER);
1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var non_construct = baz(0, 0); /* baz should be inlined */
1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertSame(non_construct, NON_CONSTRUCT_MARKER);
1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var construct = new baz(0);
1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertSame(construct, CONSTRUCT_MARKER);
1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var construct = new baz(0, 0);
1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  assertSame(construct, CONSTRUCT_MARKER);
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinvoke(bar, [1, 2, 3]);
147