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-04-17 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       26643 : TEST(Conditional) {
      13           4 :   FunctionTester T("(function(a) { return a ? 23 : 42; })");
      14             : 
      15           4 :   T.CheckCall(T.Val(23), T.true_value(), T.undefined());
      16           4 :   T.CheckCall(T.Val(42), T.false_value(), T.undefined());
      17           4 :   T.CheckCall(T.Val(42), T.undefined(), T.undefined());
      18           4 :   T.CheckCall(T.Val(42), T.Val(0.0), T.undefined());
      19           4 :   T.CheckCall(T.Val(23), T.Val(999), T.undefined());
      20           8 :   T.CheckCall(T.Val(23), T.Val("x"), T.undefined());
      21           4 : }
      22             : 
      23             : 
      24       26643 : TEST(LogicalAnd) {
      25           4 :   FunctionTester T("(function(a,b) { return a && b; })");
      26             : 
      27           4 :   T.CheckCall(T.true_value(), T.true_value(), T.true_value());
      28           4 :   T.CheckCall(T.false_value(), T.false_value(), T.true_value());
      29           4 :   T.CheckCall(T.false_value(), T.true_value(), T.false_value());
      30           4 :   T.CheckCall(T.false_value(), T.false_value(), T.false_value());
      31             : 
      32           4 :   T.CheckCall(T.Val(999), T.Val(777), T.Val(999));
      33           4 :   T.CheckCall(T.Val(0.0), T.Val(0.0), T.Val(999));
      34          16 :   T.CheckCall(T.Val("b"), T.Val("a"), T.Val("b"));
      35           4 : }
      36             : 
      37             : 
      38       26643 : TEST(LogicalOr) {
      39           4 :   FunctionTester T("(function(a,b) { return a || b; })");
      40             : 
      41           4 :   T.CheckCall(T.true_value(), T.true_value(), T.true_value());
      42           4 :   T.CheckCall(T.true_value(), T.false_value(), T.true_value());
      43           4 :   T.CheckCall(T.true_value(), T.true_value(), T.false_value());
      44           4 :   T.CheckCall(T.false_value(), T.false_value(), T.false_value());
      45             : 
      46           4 :   T.CheckCall(T.Val(777), T.Val(777), T.Val(999));
      47           4 :   T.CheckCall(T.Val(999), T.Val(0.0), T.Val(999));
      48          16 :   T.CheckCall(T.Val("a"), T.Val("a"), T.Val("b"));
      49           4 : }
      50             : 
      51             : 
      52       26643 : TEST(LogicalEffect) {
      53           4 :   FunctionTester T("(function(a,b) { a && (b = a); return b; })");
      54             : 
      55           4 :   T.CheckCall(T.true_value(), T.true_value(), T.true_value());
      56           4 :   T.CheckCall(T.true_value(), T.false_value(), T.true_value());
      57           4 :   T.CheckCall(T.true_value(), T.true_value(), T.false_value());
      58           4 :   T.CheckCall(T.false_value(), T.false_value(), T.false_value());
      59             : 
      60           4 :   T.CheckCall(T.Val(777), T.Val(777), T.Val(999));
      61           4 :   T.CheckCall(T.Val(999), T.Val(0.0), T.Val(999));
      62          16 :   T.CheckCall(T.Val("a"), T.Val("a"), T.Val("b"));
      63           4 : }
      64             : 
      65             : 
      66       26643 : TEST(IfStatement) {
      67           4 :   FunctionTester T("(function(a) { if (a) { return 1; } else { return 2; } })");
      68             : 
      69           4 :   T.CheckCall(T.Val(1), T.true_value(), T.undefined());
      70           4 :   T.CheckCall(T.Val(2), T.false_value(), T.undefined());
      71           4 :   T.CheckCall(T.Val(2), T.undefined(), T.undefined());
      72           4 :   T.CheckCall(T.Val(2), T.Val(0.0), T.undefined());
      73           4 :   T.CheckCall(T.Val(1), T.Val(999), T.undefined());
      74           8 :   T.CheckCall(T.Val(1), T.Val("x"), T.undefined());
      75           4 : }
      76             : 
      77             : 
      78       26643 : TEST(DoWhileStatement) {
      79           4 :   FunctionTester T("(function(a,b) { do { a+=23; } while(a < b) return a; })");
      80             : 
      81           4 :   T.CheckCall(T.Val(24), T.Val(1), T.Val(1));
      82           4 :   T.CheckCall(T.Val(24), T.Val(1), T.Val(23));
      83           4 :   T.CheckCall(T.Val(47), T.Val(1), T.Val(25));
      84          16 :   T.CheckCall(T.Val("str23"), T.Val("str"), T.Val("str"));
      85           4 : }
      86             : 
      87             : 
      88       26643 : TEST(WhileStatement) {
      89           4 :   FunctionTester T("(function(a,b) { while(a < b) { a+=23; } return a; })");
      90             : 
      91           4 :   T.CheckCall(T.Val(1), T.Val(1), T.Val(1));
      92           4 :   T.CheckCall(T.Val(24), T.Val(1), T.Val(23));
      93           4 :   T.CheckCall(T.Val(47), T.Val(1), T.Val(25));
      94          16 :   T.CheckCall(T.Val("str"), T.Val("str"), T.Val("str"));
      95           4 : }
      96             : 
      97             : 
      98       26643 : TEST(ForStatement) {
      99           4 :   FunctionTester T("(function(a,b) { for (; a < b; a+=23) {} return a; })");
     100             : 
     101           4 :   T.CheckCall(T.Val(1), T.Val(1), T.Val(1));
     102           4 :   T.CheckCall(T.Val(24), T.Val(1), T.Val(23));
     103           4 :   T.CheckCall(T.Val(47), T.Val(1), T.Val(25));
     104          16 :   T.CheckCall(T.Val("str"), T.Val("str"), T.Val("str"));
     105           4 : }
     106             : 
     107       26643 : 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           4 :   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          12 :   T.CheckCall(T.Val("-"), T.NewObject("wrap([])"), T.true_value());
     129          12 :   T.CheckCall(T.Val("-1-2-"), T.NewObject("wrap([1,2])"), T.true_value());
     130          12 :   T.CheckCall(T.Val("-1-X-2-X-"), T.NewObject("wrap([1,2])"), T.false_value());
     131           4 : }
     132             : 
     133             : 
     134       26643 : 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           4 :   FunctionTester T(src);
     147             : 
     148          16 :   T.CheckCall(T.Val("-X-B-D-Y-"), T.Val("x"), T.Val("B"));
     149          16 :   T.CheckCall(T.Val("-B-D-Y-"), T.Val("Bb"), T.Val("B"));
     150          16 :   T.CheckCall(T.Val("-D-Y-"), T.Val("z"), T.Val("B"));
     151          16 :   T.CheckCall(T.Val("-Y-"), T.Val("y"), T.Val("B"));
     152             : 
     153             :   CompileRun("var c = 0; var o = { toString:function(){return c++} };");
     154          16 :   T.CheckCall(T.Val("-D-Y-"), T.Val("1b"), T.NewObject("o"));
     155          16 :   T.CheckCall(T.Val("-B-D-Y-"), T.Val("1b"), T.NewObject("o"));
     156          16 :   T.CheckCall(T.Val("-D-Y-"), T.Val("1b"), T.NewObject("o"));
     157           4 : }
     158             : 
     159             : 
     160       26643 : TEST(BlockBreakStatement) {
     161           4 :   FunctionTester T("(function(a,b) { L:{ if (a) break L; b=1; } return b; })");
     162             : 
     163           4 :   T.CheckCall(T.Val(7), T.true_value(), T.Val(7));
     164           4 :   T.CheckCall(T.Val(1), T.false_value(), T.Val(7));
     165           4 : }
     166             : 
     167             : 
     168       26643 : TEST(BlockReturnStatement) {
     169           4 :   FunctionTester T("(function(a,b) { L:{ if (a) b=1; return b; } })");
     170             : 
     171           4 :   T.CheckCall(T.Val(1), T.true_value(), T.Val(7));
     172           4 :   T.CheckCall(T.Val(7), T.false_value(), T.Val(7));
     173           4 : }
     174             : 
     175             : 
     176       26643 : TEST(NestedIfConditional) {
     177           4 :   FunctionTester T("(function(a,b) { if (a) { b = (b?b:7) + 1; } return b; })");
     178             : 
     179           4 :   T.CheckCall(T.Val(4), T.false_value(), T.Val(4));
     180           4 :   T.CheckCall(T.Val(6), T.true_value(), T.Val(5));
     181           4 :   T.CheckCall(T.Val(8), T.true_value(), T.undefined());
     182           4 : }
     183             : 
     184             : 
     185       26643 : TEST(NestedIfLogical) {
     186             :   const char* src =
     187             :       "(function(a,b) {"
     188             :       "  if (a || b) { return 1; } else { return 2; }"
     189             :       "})";
     190           4 :   FunctionTester T(src);
     191             : 
     192           4 :   T.CheckCall(T.Val(1), T.true_value(), T.true_value());
     193           4 :   T.CheckCall(T.Val(1), T.false_value(), T.true_value());
     194           4 :   T.CheckCall(T.Val(1), T.true_value(), T.false_value());
     195           4 :   T.CheckCall(T.Val(2), T.false_value(), T.false_value());
     196           4 :   T.CheckCall(T.Val(1), T.Val(1.0), T.Val(1.0));
     197           4 :   T.CheckCall(T.Val(1), T.Val(0.0), T.Val(1.0));
     198           4 :   T.CheckCall(T.Val(1), T.Val(1.0), T.Val(0.0));
     199           4 :   T.CheckCall(T.Val(2), T.Val(0.0), T.Val(0.0));
     200           4 : }
     201             : 
     202             : 
     203       26643 : 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           4 :   FunctionTester T(src);
     210             : 
     211           4 :   T.CheckCall(T.Val(1), T.false_value(), T.Val(4));
     212           4 :   T.CheckCall(T.Val(2), T.true_value(), T.Val(2));
     213           4 :   T.CheckCall(T.Val(3), T.Val(3), T.Val(1));
     214           4 : }
     215             : 
     216             : 
     217       26643 : TEST(NestedWhileWhile) {
     218             :   const char* src =
     219             :       "(function(a) {"
     220             :       "  var i = a; while (false) while(false) return i;"
     221             :       "  return i;"
     222             :       "})";
     223           4 :   FunctionTester T(src);
     224             : 
     225           4 :   T.CheckCall(T.Val(2.0), T.Val(2.0), T.Val(-1.0));
     226           4 :   T.CheckCall(T.Val(65.0), T.Val(65.0), T.Val(-1.0));
     227           4 : }
     228             : 
     229             : 
     230       26643 : TEST(NestedForIf) {
     231           4 :   FunctionTester T("(function(a,b) { for (; a > 1; a--) if (b) return 1; })");
     232             : 
     233           4 :   T.CheckCall(T.Val(1), T.Val(3), T.true_value());
     234           4 :   T.CheckCall(T.undefined(), T.Val(2), T.false_value());
     235           4 :   T.CheckCall(T.undefined(), T.Val(1), T.null());
     236           4 : }
     237             : 
     238             : 
     239       26643 : TEST(NestedForConditional) {
     240           4 :   FunctionTester T("(function(a,b) { for (; a > 1; a--) return b ? 1 : 2; })");
     241             : 
     242           4 :   T.CheckCall(T.Val(1), T.Val(3), T.true_value());
     243           4 :   T.CheckCall(T.Val(2), T.Val(2), T.false_value());
     244           4 :   T.CheckCall(T.undefined(), T.Val(1), T.null());
     245           4 : }
     246             : 
     247             : 
     248       26643 : TEST(IfTrue) {
     249           4 :   FunctionTester T("(function(a,b) { if (true) return a; return b; })");
     250             : 
     251           4 :   T.CheckCall(T.Val(55), T.Val(55), T.Val(11));
     252           4 :   T.CheckCall(T.Val(666), T.Val(666), T.Val(-444));
     253           4 : }
     254             : 
     255             : 
     256       26643 : TEST(TernaryTrue) {
     257           4 :   FunctionTester T("(function(a,b) { return true ? a : b; })");
     258             : 
     259           4 :   T.CheckCall(T.Val(77), T.Val(77), T.Val(11));
     260           4 :   T.CheckCall(T.Val(111), T.Val(111), T.Val(-444));
     261           4 : }
     262             : 
     263             : 
     264       26643 : TEST(IfFalse) {
     265           4 :   FunctionTester T("(function(a,b) { if (false) return a; return b; })");
     266             : 
     267           4 :   T.CheckCall(T.Val(11), T.Val(22), T.Val(11));
     268           4 :   T.CheckCall(T.Val(-555), T.Val(333), T.Val(-555));
     269           4 : }
     270             : 
     271             : 
     272       26643 : TEST(TernaryFalse) {
     273           4 :   FunctionTester T("(function(a,b) { return false ? a : b; })");
     274             : 
     275           4 :   T.CheckCall(T.Val(99), T.Val(33), T.Val(99));
     276           4 :   T.CheckCall(T.Val(-99), T.Val(-33), T.Val(-99));
     277           4 : }
     278             : 
     279             : 
     280       26643 : TEST(WhileTrue) {
     281           4 :   FunctionTester T("(function(a,b) { while (true) return a; return b; })");
     282             : 
     283           4 :   T.CheckCall(T.Val(551), T.Val(551), T.Val(111));
     284           4 :   T.CheckCall(T.Val(661), T.Val(661), T.Val(-444));
     285           4 : }
     286             : 
     287             : 
     288       26643 : TEST(WhileFalse) {
     289           4 :   FunctionTester T("(function(a,b) { while (false) return a; return b; })");
     290             : 
     291           4 :   T.CheckCall(T.Val(115), T.Val(551), T.Val(115));
     292           4 :   T.CheckCall(T.Val(-445), T.Val(661), T.Val(-445));
     293           4 : }
     294             : 
     295             : 
     296       26643 : TEST(DoWhileTrue) {
     297             :   FunctionTester T(
     298           4 :       "(function(a,b) { do { return a; } while (true); return b; })");
     299             : 
     300           4 :   T.CheckCall(T.Val(7551), T.Val(7551), T.Val(7111));
     301           4 :   T.CheckCall(T.Val(7661), T.Val(7661), T.Val(-7444));
     302           4 : }
     303             : 
     304             : 
     305       26643 : TEST(DoWhileFalse) {
     306             :   FunctionTester T(
     307             :       "(function(a,b) { do { "
     308           4 :       "; } while (false); return b; })");
     309             : 
     310           4 :   T.CheckCall(T.Val(8115), T.Val(8551), T.Val(8115));
     311           4 :   T.CheckCall(T.Val(-8445), T.Val(8661), T.Val(-8445));
     312           4 : }
     313             : 
     314             : 
     315       26643 : TEST(EmptyFor) {
     316           4 :   FunctionTester T("(function(a,b) { if (a) for(;;) ; return b; })");
     317             : 
     318           4 :   T.CheckCall(T.Val(8126.1), T.Val(0.0), T.Val(8126.1));
     319           4 :   T.CheckCall(T.Val(1123.1), T.Val(0.0), T.Val(1123.1));
     320           4 : }
     321             : 
     322             : }  // namespace compiler
     323             : }  // namespace internal
     324       79917 : }  // namespace v8

Generated by: LCOV version 1.10