LCOV - code coverage report
Current view: top level - test/cctest/compiler - test-run-jsbranches.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 181 181 100.0 %
Date: 2019-01-20 Functions: 29 29 100.0 %

          Line data    Source code
       1             : // Copyright 2014 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #include "src/objects-inl.h"
       6             : #include "test/cctest/compiler/function-tester.h"
       7             : 
       8             : namespace v8 {
       9             : namespace internal {
      10             : namespace compiler {
      11             : 
      12       28342 : TEST(Conditional) {
      13           5 :   FunctionTester T("(function(a) { return a ? 23 : 42; })");
      14             : 
      15           5 :   T.CheckCall(T.Val(23), T.true_value(), T.undefined());
      16           5 :   T.CheckCall(T.Val(42), T.false_value(), T.undefined());
      17           5 :   T.CheckCall(T.Val(42), T.undefined(), T.undefined());
      18           5 :   T.CheckCall(T.Val(42), T.Val(0.0), T.undefined());
      19           5 :   T.CheckCall(T.Val(23), T.Val(999), T.undefined());
      20          10 :   T.CheckCall(T.Val(23), T.Val("x"), T.undefined());
      21           5 : }
      22             : 
      23             : 
      24       28342 : TEST(LogicalAnd) {
      25           5 :   FunctionTester T("(function(a,b) { return a && b; })");
      26             : 
      27           5 :   T.CheckCall(T.true_value(), T.true_value(), T.true_value());
      28           5 :   T.CheckCall(T.false_value(), T.false_value(), T.true_value());
      29           5 :   T.CheckCall(T.false_value(), T.true_value(), T.false_value());
      30           5 :   T.CheckCall(T.false_value(), T.false_value(), T.false_value());
      31             : 
      32           5 :   T.CheckCall(T.Val(999), T.Val(777), T.Val(999));
      33           5 :   T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(999));
      34          20 :   T.CheckCall(T.Val("b"), T.Val("a"), T.Val("b"));
      35           5 : }
      36             : 
      37             : 
      38       28342 : TEST(LogicalOr) {
      39           5 :   FunctionTester T("(function(a,b) { return a || b; })");
      40             : 
      41           5 :   T.CheckCall(T.true_value(), T.true_value(), T.true_value());
      42           5 :   T.CheckCall(T.true_value(), T.false_value(), T.true_value());
      43           5 :   T.CheckCall(T.true_value(), T.true_value(), T.false_value());
      44           5 :   T.CheckCall(T.false_value(), T.false_value(), T.false_value());
      45             : 
      46           5 :   T.CheckCall(T.Val(777), T.Val(777), T.Val(999));
      47           5 :   T.CheckCall(T.Val(999), T.Val(0.0), T.Val(999));
      48          20 :   T.CheckCall(T.Val("a"), T.Val("a"), T.Val("b"));
      49           5 : }
      50             : 
      51             : 
      52       28342 : TEST(LogicalEffect) {
      53           5 :   FunctionTester T("(function(a,b) { a && (b = a); return b; })");
      54             : 
      55           5 :   T.CheckCall(T.true_value(), T.true_value(), T.true_value());
      56           5 :   T.CheckCall(T.true_value(), T.false_value(), T.true_value());
      57           5 :   T.CheckCall(T.true_value(), T.true_value(), T.false_value());
      58           5 :   T.CheckCall(T.false_value(), T.false_value(), T.false_value());
      59             : 
      60           5 :   T.CheckCall(T.Val(777), T.Val(777), T.Val(999));
      61           5 :   T.CheckCall(T.Val(999), T.Val(0.0), T.Val(999));
      62          20 :   T.CheckCall(T.Val("a"), T.Val("a"), T.Val("b"));
      63           5 : }
      64             : 
      65             : 
      66       28342 : TEST(IfStatement) {
      67           5 :   FunctionTester T("(function(a) { if (a) { return 1; } else { return 2; } })");
      68             : 
      69           5 :   T.CheckCall(T.Val(1), T.true_value(), T.undefined());
      70           5 :   T.CheckCall(T.Val(2), T.false_value(), T.undefined());
      71           5 :   T.CheckCall(T.Val(2), T.undefined(), T.undefined());
      72           5 :   T.CheckCall(T.Val(2), T.Val(0.0), T.undefined());
      73           5 :   T.CheckCall(T.Val(1), T.Val(999), T.undefined());
      74          10 :   T.CheckCall(T.Val(1), T.Val("x"), T.undefined());
      75           5 : }
      76             : 
      77             : 
      78       28342 : TEST(DoWhileStatement) {
      79           5 :   FunctionTester T("(function(a,b) { do { a+=23; } while(a < b) return a; })");
      80             : 
      81           5 :   T.CheckCall(T.Val(24), T.Val(1), T.Val(1));
      82           5 :   T.CheckCall(T.Val(24), T.Val(1), T.Val(23));
      83           5 :   T.CheckCall(T.Val(47), T.Val(1), T.Val(25));
      84          20 :   T.CheckCall(T.Val("str23"), T.Val("str"), T.Val("str"));
      85           5 : }
      86             : 
      87             : 
      88       28342 : TEST(WhileStatement) {
      89           5 :   FunctionTester T("(function(a,b) { while(a < b) { a+=23; } return a; })");
      90             : 
      91           5 :   T.CheckCall(T.Val(1), T.Val(1), T.Val(1));
      92           5 :   T.CheckCall(T.Val(24), T.Val(1), T.Val(23));
      93           5 :   T.CheckCall(T.Val(47), T.Val(1), T.Val(25));
      94          20 :   T.CheckCall(T.Val("str"), T.Val("str"), T.Val("str"));
      95           5 : }
      96             : 
      97             : 
      98       28342 : TEST(ForStatement) {
      99           5 :   FunctionTester T("(function(a,b) { for (; a < b; a+=23) {} return a; })");
     100             : 
     101           5 :   T.CheckCall(T.Val(1), T.Val(1), T.Val(1));
     102           5 :   T.CheckCall(T.Val(24), T.Val(1), T.Val(23));
     103           5 :   T.CheckCall(T.Val(47), T.Val(1), T.Val(25));
     104          20 :   T.CheckCall(T.Val("str"), T.Val("str"), T.Val("str"));
     105           5 : }
     106             : 
     107       28342 : TEST(ForOfContinueStatement) {
     108             :   const char* src =
     109             :       "(function(a,b) {"
     110             :       "  var r = '-';"
     111             :       "  for (var x of a) {"
     112             :       "    r += x + '-';"
     113             :       "    if (b) continue;"
     114             :       "    r += 'X-';"
     115             :       "  }"
     116             :       "  return r;"
     117             :       "})";
     118           5 :   FunctionTester T(src);
     119             : 
     120             :   CompileRun(
     121             :       "function wrap(v) {"
     122             :       "  var iterable = {};"
     123             :       "  function next() { return { done:!v.length, value:v.shift() }; };"
     124             :       "  iterable[Symbol.iterator] = function() { return { next:next }; };"
     125             :       "  return iterable;"
     126             :       "}");
     127             : 
     128          15 :   T.CheckCall(T.Val("-"), T.NewObject("wrap([])"), T.true_value());
     129          15 :   T.CheckCall(T.Val("-1-2-"), T.NewObject("wrap([1,2])"), T.true_value());
     130          15 :   T.CheckCall(T.Val("-1-X-2-X-"), T.NewObject("wrap([1,2])"), T.false_value());
     131           5 : }
     132             : 
     133             : 
     134       28342 : TEST(SwitchStatement) {
     135             :   const char* src =
     136             :       "(function(a,b) {"
     137             :       "  var r = '-';"
     138             :       "  switch (a) {"
     139             :       "    case 'x'    : r += 'X-';"
     140             :       "    case b + 'b': r += 'B-';"
     141             :       "    default     : r += 'D-';"
     142             :       "    case 'y'    : r += 'Y-';"
     143             :       "  }"
     144             :       "  return r;"
     145             :       "})";
     146           5 :   FunctionTester T(src);
     147             : 
     148          20 :   T.CheckCall(T.Val("-X-B-D-Y-"), T.Val("x"), T.Val("B"));
     149          20 :   T.CheckCall(T.Val("-B-D-Y-"), T.Val("Bb"), T.Val("B"));
     150          20 :   T.CheckCall(T.Val("-D-Y-"), T.Val("z"), T.Val("B"));
     151          20 :   T.CheckCall(T.Val("-Y-"), T.Val("y"), T.Val("B"));
     152             : 
     153             :   CompileRun("var c = 0; var o = { toString:function(){return c++} };");
     154          20 :   T.CheckCall(T.Val("-D-Y-"), T.Val("1b"), T.NewObject("o"));
     155          20 :   T.CheckCall(T.Val("-B-D-Y-"), T.Val("1b"), T.NewObject("o"));
     156          20 :   T.CheckCall(T.Val("-D-Y-"), T.Val("1b"), T.NewObject("o"));
     157           5 : }
     158             : 
     159             : 
     160       28342 : TEST(BlockBreakStatement) {
     161           5 :   FunctionTester T("(function(a,b) { L:{ if (a) break L; b=1; } return b; })");
     162             : 
     163           5 :   T.CheckCall(T.Val(7), T.true_value(), T.Val(7));
     164           5 :   T.CheckCall(T.Val(1), T.false_value(), T.Val(7));
     165           5 : }
     166             : 
     167             : 
     168       28342 : TEST(BlockReturnStatement) {
     169           5 :   FunctionTester T("(function(a,b) { L:{ if (a) b=1; return b; } })");
     170             : 
     171           5 :   T.CheckCall(T.Val(1), T.true_value(), T.Val(7));
     172           5 :   T.CheckCall(T.Val(7), T.false_value(), T.Val(7));
     173           5 : }
     174             : 
     175             : 
     176       28342 : TEST(NestedIfConditional) {
     177           5 :   FunctionTester T("(function(a,b) { if (a) { b = (b?b:7) + 1; } return b; })");
     178             : 
     179           5 :   T.CheckCall(T.Val(4), T.false_value(), T.Val(4));
     180           5 :   T.CheckCall(T.Val(6), T.true_value(), T.Val(5));
     181           5 :   T.CheckCall(T.Val(8), T.true_value(), T.undefined());
     182           5 : }
     183             : 
     184             : 
     185       28342 : TEST(NestedIfLogical) {
     186             :   const char* src =
     187             :       "(function(a,b) {"
     188             :       "  if (a || b) { return 1; } else { return 2; }"
     189             :       "})";
     190           5 :   FunctionTester T(src);
     191             : 
     192           5 :   T.CheckCall(T.Val(1), T.true_value(), T.true_value());
     193           5 :   T.CheckCall(T.Val(1), T.false_value(), T.true_value());
     194           5 :   T.CheckCall(T.Val(1), T.true_value(), T.false_value());
     195           5 :   T.CheckCall(T.Val(2), T.false_value(), T.false_value());
     196           5 :   T.CheckCall(T.Val(1), T.Val(1.0), T.Val(1.0));
     197           5 :   T.CheckCall(T.Val(1), T.Val(0.0), T.Val(1.0));
     198           5 :   T.CheckCall(T.Val(1), T.Val(1.0), T.Val(0.0));
     199           5 :   T.CheckCall(T.Val(2), T.Val(0.0), T.Val(0.0));
     200           5 : }
     201             : 
     202             : 
     203       28342 : TEST(NestedIfElseFor) {
     204             :   const char* src =
     205             :       "(function(a,b) {"
     206             :       "  if (!a) { return b - 3; } else { for (; a < b; a++); }"
     207             :       "  return a;"
     208             :       "})";
     209           5 :   FunctionTester T(src);
     210             : 
     211           5 :   T.CheckCall(T.Val(1), T.false_value(), T.Val(4));
     212           5 :   T.CheckCall(T.Val(2), T.true_value(), T.Val(2));
     213           5 :   T.CheckCall(T.Val(3), T.Val(3), T.Val(1));
     214           5 : }
     215             : 
     216             : 
     217       28342 : TEST(NestedWhileWhile) {
     218             :   const char* src =
     219             :       "(function(a) {"
     220             :       "  var i = a; while (false) while(false) return i;"
     221             :       "  return i;"
     222             :       "})";
     223           5 :   FunctionTester T(src);
     224             : 
     225           5 :   T.CheckCall(T.Val(2.0), T.Val(2.0), T.Val(-1.0));
     226           5 :   T.CheckCall(T.Val(65.0), T.Val(65.0), T.Val(-1.0));
     227           5 : }
     228             : 
     229             : 
     230       28342 : TEST(NestedForIf) {
     231           5 :   FunctionTester T("(function(a,b) { for (; a > 1; a--) if (b) return 1; })");
     232             : 
     233           5 :   T.CheckCall(T.Val(1), T.Val(3), T.true_value());
     234           5 :   T.CheckCall(T.undefined(), T.Val(2), T.false_value());
     235           5 :   T.CheckCall(T.undefined(), T.Val(1), T.null());
     236           5 : }
     237             : 
     238             : 
     239       28342 : TEST(NestedForConditional) {
     240           5 :   FunctionTester T("(function(a,b) { for (; a > 1; a--) return b ? 1 : 2; })");
     241             : 
     242           5 :   T.CheckCall(T.Val(1), T.Val(3), T.true_value());
     243           5 :   T.CheckCall(T.Val(2), T.Val(2), T.false_value());
     244           5 :   T.CheckCall(T.undefined(), T.Val(1), T.null());
     245           5 : }
     246             : 
     247             : 
     248       28342 : TEST(IfTrue) {
     249           5 :   FunctionTester T("(function(a,b) { if (true) return a; return b; })");
     250             : 
     251           5 :   T.CheckCall(T.Val(55), T.Val(55), T.Val(11));
     252           5 :   T.CheckCall(T.Val(666), T.Val(666), T.Val(-444));
     253           5 : }
     254             : 
     255             : 
     256       28342 : TEST(TernaryTrue) {
     257           5 :   FunctionTester T("(function(a,b) { return true ? a : b; })");
     258             : 
     259           5 :   T.CheckCall(T.Val(77), T.Val(77), T.Val(11));
     260           5 :   T.CheckCall(T.Val(111), T.Val(111), T.Val(-444));
     261           5 : }
     262             : 
     263             : 
     264       28342 : TEST(IfFalse) {
     265           5 :   FunctionTester T("(function(a,b) { if (false) return a; return b; })");
     266             : 
     267           5 :   T.CheckCall(T.Val(11), T.Val(22), T.Val(11));
     268           5 :   T.CheckCall(T.Val(-555), T.Val(333), T.Val(-555));
     269           5 : }
     270             : 
     271             : 
     272       28342 : TEST(TernaryFalse) {
     273           5 :   FunctionTester T("(function(a,b) { return false ? a : b; })");
     274             : 
     275           5 :   T.CheckCall(T.Val(99), T.Val(33), T.Val(99));
     276           5 :   T.CheckCall(T.Val(-99), T.Val(-33), T.Val(-99));
     277           5 : }
     278             : 
     279             : 
     280       28342 : TEST(WhileTrue) {
     281           5 :   FunctionTester T("(function(a,b) { while (true) return a; return b; })");
     282             : 
     283           5 :   T.CheckCall(T.Val(551), T.Val(551), T.Val(111));
     284           5 :   T.CheckCall(T.Val(661), T.Val(661), T.Val(-444));
     285           5 : }
     286             : 
     287             : 
     288       28342 : TEST(WhileFalse) {
     289           5 :   FunctionTester T("(function(a,b) { while (false) return a; return b; })");
     290             : 
     291           5 :   T.CheckCall(T.Val(115), T.Val(551), T.Val(115));
     292           5 :   T.CheckCall(T.Val(-445), T.Val(661), T.Val(-445));
     293           5 : }
     294             : 
     295             : 
     296       28342 : TEST(DoWhileTrue) {
     297             :   FunctionTester T(
     298           5 :       "(function(a,b) { do { return a; } while (true); return b; })");
     299             : 
     300           5 :   T.CheckCall(T.Val(7551), T.Val(7551), T.Val(7111));
     301           5 :   T.CheckCall(T.Val(7661), T.Val(7661), T.Val(-7444));
     302           5 : }
     303             : 
     304             : 
     305       28342 : TEST(DoWhileFalse) {
     306             :   FunctionTester T(
     307             :       "(function(a,b) { do { "
     308           5 :       "; } while (false); return b; })");
     309             : 
     310           5 :   T.CheckCall(T.Val(8115), T.Val(8551), T.Val(8115));
     311           5 :   T.CheckCall(T.Val(-8445), T.Val(8661), T.Val(-8445));
     312           5 : }
     313             : 
     314             : 
     315       28342 : TEST(EmptyFor) {
     316           5 :   FunctionTester T("(function(a,b) { if (a) for(;;) ; return b; })");
     317             : 
     318           5 :   T.CheckCall(T.Val(8126.1), T.Val(0.0), T.Val(8126.1));
     319           5 :   T.CheckCall(T.Val(1123.1), T.Val(0.0), T.Val(1123.1));
     320           5 : }
     321             : 
     322             : }  // namespace compiler
     323             : }  // namespace internal
     324       85011 : }  // namespace v8

Generated by: LCOV version 1.10