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