Home | History | Annotate | Download | only in compiler
      1 // Copyright 2012 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 
     30 // Test that we can inline functions containing materialized literals.
     31 
     32 function a2(b, c) {
     33   return [b, c, b + c];
     34 }
     35 
     36 function a1(a, b, c) {
     37   return [a, a2(b, c)];
     38 }
     39 
     40 function TestArrayLiteral(a, b, c) {
     41   var expected = [a, [b, c, b + c]];
     42   var result = a1(a, b, c);
     43   assertEquals(expected, result, "TestArrayLiteral");
     44 }
     45 
     46 TestArrayLiteral(1, 2, 3);
     47 TestArrayLiteral(1, 2, 3);
     48 %OptimizeFunctionOnNextCall(TestArrayLiteral);
     49 TestArrayLiteral(1, 2, 3);
     50 TestArrayLiteral('a', 'b', 'c');
     51 
     52 function o2(b, c) {
     53   return { 'b':b, 'c':c, 'y':b + c };
     54 }
     55 
     56 function o1(a, b, c) {
     57   return { 'a':a, 'x':o2(b, c) };
     58 }
     59 
     60 function TestObjectLiteral(a, b, c) {
     61   var expected = { 'a':a, 'x':{ 'b':b, 'c':c, 'y':b + c } };
     62   var result = o1(a, b, c);
     63   assertEquals(expected, result, "TestObjectLiteral");
     64 }
     65 
     66 TestObjectLiteral(1, 2, 3);
     67 TestObjectLiteral(1, 2, 3);
     68 %OptimizeFunctionOnNextCall(TestObjectLiteral);
     69 TestObjectLiteral(1, 2, 3);
     70 TestObjectLiteral('a', 'b', 'c');
     71 
     72 function r2(s, x, y) {
     73   return s.replace(/a/, x + y);
     74 }
     75 
     76 function r1(s, x, y) {
     77   return r2(s, x, y).replace(/b/, y + x);
     78 }
     79 
     80 function TestRegExpLiteral(s, x, y, expected) {
     81   var result = r1(s, x, y);
     82   assertEquals(expected, result, "TestRegExpLiteral");
     83 }
     84 
     85 TestRegExpLiteral("a-", "reg", "exp", "regexp-");
     86 TestRegExpLiteral("-b", "reg", "exp", "-expreg");
     87 %OptimizeFunctionOnNextCall(TestRegExpLiteral);
     88 TestRegExpLiteral("ab", "reg", "exp", "regexpexpreg");
     89 TestRegExpLiteral("ab", 12345, 54321, "6666666666");
     90 
     91 function f2(b, c) {
     92   var closure = function(b, c) { return b + c; }
     93   var value = b + c;
     94   return closure;
     95 }
     96 
     97 function f1(a, b, c) {
     98   return a + f2(b, c)(b, c);
     99 }
    100 
    101 function TestFunctionLiteral(a, b, c, expected) {
    102   var result = f1(a, b, c);
    103   assertEquals(expected, result, "TestFunctionLiteral");
    104 }
    105 
    106 TestFunctionLiteral(1, 2, 3, 6);
    107 TestFunctionLiteral(4, 5, 6, 15);
    108 %OptimizeFunctionOnNextCall(TestFunctionLiteral);
    109 TestFunctionLiteral(7, 8, 9, 24);
    110 TestFunctionLiteral("a", "b", "c", "abc");
    111