LCOV - code coverage report
Current view: top level - test/cctest/compiler - test-run-jsops.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 352 352 100.0 %
Date: 2019-04-17 Functions: 46 46 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(BinopAdd) {
      13           4 :   FunctionTester T("(function(a,b) { return a + b; })");
      14             : 
      15           4 :   T.CheckCall(3, 1, 2);
      16           4 :   T.CheckCall(-11, -2, -9);
      17           4 :   T.CheckCall(-11, -1.5, -9.5);
      18          16 :   T.CheckCall(T.Val("AB"), T.Val("A"), T.Val("B"));
      19          12 :   T.CheckCall(T.Val("A11"), T.Val("A"), T.Val(11));
      20          12 :   T.CheckCall(T.Val("12B"), T.Val(12), T.Val("B"));
      21          16 :   T.CheckCall(T.Val("38"), T.Val("3"), T.Val("8"));
      22          16 :   T.CheckCall(T.Val("31"), T.Val("3"), T.NewObject("([1])"));
      23          16 :   T.CheckCall(T.Val("3[object Object]"), T.Val("3"), T.NewObject("({})"));
      24           4 : }
      25             : 
      26             : 
      27       26643 : TEST(BinopSubtract) {
      28           4 :   FunctionTester T("(function(a,b) { return a - b; })");
      29             : 
      30           4 :   T.CheckCall(3, 4, 1);
      31           4 :   T.CheckCall(3.0, 4.5, 1.5);
      32           8 :   T.CheckCall(T.Val(-9), T.Val("0"), T.Val(9));
      33           8 :   T.CheckCall(T.Val(-9), T.Val(0.0), T.Val("9"));
      34          12 :   T.CheckCall(T.Val(1), T.Val("3"), T.Val("2"));
      35          12 :   T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
      36          12 :   T.CheckCall(T.Val(2), T.Val("3"), T.NewObject("([1])"));
      37          12 :   T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
      38           4 : }
      39             : 
      40             : 
      41       26643 : TEST(BinopMultiply) {
      42           4 :   FunctionTester T("(function(a,b) { return a * b; })");
      43             : 
      44           4 :   T.CheckCall(6, 3, 2);
      45           4 :   T.CheckCall(4.5, 2.0, 2.25);
      46           8 :   T.CheckCall(T.Val(6), T.Val("3"), T.Val(2));
      47           8 :   T.CheckCall(T.Val(4.5), T.Val(2.0), T.Val("2.25"));
      48          12 :   T.CheckCall(T.Val(6), T.Val("3"), T.Val("2"));
      49          12 :   T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
      50          12 :   T.CheckCall(T.Val(3), T.Val("3"), T.NewObject("([1])"));
      51          12 :   T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
      52           4 : }
      53             : 
      54             : 
      55       26643 : TEST(BinopDivide) {
      56           4 :   FunctionTester T("(function(a,b) { return a / b; })");
      57             : 
      58           4 :   T.CheckCall(2, 8, 4);
      59           4 :   T.CheckCall(2.1, 8.4, 4);
      60           4 :   T.CheckCall(V8_INFINITY, 8, 0);
      61           4 :   T.CheckCall(-V8_INFINITY, -8, 0);
      62           8 :   T.CheckCall(T.infinity(), T.Val(8), T.Val("0"));
      63           8 :   T.CheckCall(T.minus_infinity(), T.Val("-8"), T.Val(0.0));
      64          12 :   T.CheckCall(T.Val(1.5), T.Val("3"), T.Val("2"));
      65          12 :   T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
      66          12 :   T.CheckCall(T.Val(1.5), T.Val("3"), T.NewObject("([2])"));
      67          12 :   T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
      68           4 : }
      69             : 
      70             : 
      71       26643 : TEST(BinopModulus) {
      72           4 :   FunctionTester T("(function(a,b) { return a % b; })");
      73             : 
      74           4 :   T.CheckCall(3, 8, 5);
      75           8 :   T.CheckCall(T.Val(3), T.Val("8"), T.Val(5));
      76           8 :   T.CheckCall(T.Val(3), T.Val(8), T.Val("5"));
      77          12 :   T.CheckCall(T.Val(1), T.Val("3"), T.Val("2"));
      78          12 :   T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
      79          12 :   T.CheckCall(T.Val(1), T.Val("3"), T.NewObject("([2])"));
      80          12 :   T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
      81           4 : }
      82             : 
      83             : 
      84       26643 : TEST(BinopShiftLeft) {
      85           4 :   FunctionTester T("(function(a,b) { return a << b; })");
      86             : 
      87           4 :   T.CheckCall(4, 2, 1);
      88           8 :   T.CheckCall(T.Val(4), T.Val("2"), T.Val(1));
      89           8 :   T.CheckCall(T.Val(4), T.Val(2), T.Val("1"));
      90           4 : }
      91             : 
      92             : 
      93       26643 : TEST(BinopShiftRight) {
      94           4 :   FunctionTester T("(function(a,b) { return a >> b; })");
      95             : 
      96           4 :   T.CheckCall(4, 8, 1);
      97           4 :   T.CheckCall(-4, -8, 1);
      98           8 :   T.CheckCall(T.Val(4), T.Val("8"), T.Val(1));
      99           8 :   T.CheckCall(T.Val(4), T.Val(8), T.Val("1"));
     100           4 : }
     101             : 
     102             : 
     103       26643 : TEST(BinopShiftRightLogical) {
     104           4 :   FunctionTester T("(function(a,b) { return a >>> b; })");
     105             : 
     106           4 :   T.CheckCall(4, 8, 1);
     107           4 :   T.CheckCall(0x7FFFFFFC, -8, 1);
     108           8 :   T.CheckCall(T.Val(4), T.Val("8"), T.Val(1));
     109           8 :   T.CheckCall(T.Val(4), T.Val(8), T.Val("1"));
     110           4 : }
     111             : 
     112             : 
     113       26643 : TEST(BinopAnd) {
     114           4 :   FunctionTester T("(function(a,b) { return a & b; })");
     115             : 
     116           4 :   T.CheckCall(7, 7, 15);
     117           4 :   T.CheckCall(7, 15, 7);
     118           8 :   T.CheckCall(T.Val(7), T.Val("15"), T.Val(7));
     119           8 :   T.CheckCall(T.Val(7), T.Val(15), T.Val("7"));
     120           4 : }
     121             : 
     122             : 
     123       26643 : TEST(BinopOr) {
     124           4 :   FunctionTester T("(function(a,b) { return a | b; })");
     125             : 
     126           4 :   T.CheckCall(6, 4, 2);
     127           4 :   T.CheckCall(6, 2, 4);
     128           8 :   T.CheckCall(T.Val(6), T.Val("2"), T.Val(4));
     129           8 :   T.CheckCall(T.Val(6), T.Val(2), T.Val("4"));
     130           4 : }
     131             : 
     132             : 
     133       26643 : TEST(BinopXor) {
     134           4 :   FunctionTester T("(function(a,b) { return a ^ b; })");
     135             : 
     136           4 :   T.CheckCall(7, 15, 8);
     137           4 :   T.CheckCall(7, 8, 15);
     138           8 :   T.CheckCall(T.Val(7), T.Val("8"), T.Val(15));
     139           8 :   T.CheckCall(T.Val(7), T.Val(8), T.Val("15"));
     140           4 : }
     141             : 
     142             : 
     143       26643 : TEST(BinopStrictEqual) {
     144           4 :   FunctionTester T("(function(a,b) { return a === b; })");
     145             : 
     146           4 :   T.CheckTrue(7, 7);
     147           4 :   T.CheckFalse(7, 8);
     148           4 :   T.CheckTrue(7.1, 7.1);
     149           4 :   T.CheckFalse(7.1, 8.1);
     150             : 
     151           4 :   T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
     152           4 :   T.CheckFalse(T.Val(7.1), T.Val("7.1"));
     153           4 :   T.CheckFalse(T.Val(7), T.undefined());
     154           4 :   T.CheckFalse(T.undefined(), T.Val(7));
     155             : 
     156             :   CompileRun("var o = { desc : 'I am a singleton' }");
     157           4 :   T.CheckFalse(T.NewObject("([1])"), T.NewObject("([1])"));
     158           4 :   T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
     159           4 :   T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
     160           4 : }
     161             : 
     162             : 
     163       26643 : TEST(BinopEqual) {
     164           4 :   FunctionTester T("(function(a,b) { return a == b; })");
     165             : 
     166           4 :   T.CheckTrue(7, 7);
     167           4 :   T.CheckFalse(7, 8);
     168           4 :   T.CheckTrue(7.1, 7.1);
     169           4 :   T.CheckFalse(7.1, 8.1);
     170             : 
     171           4 :   T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
     172           4 :   T.CheckTrue(T.Val(7.1), T.Val("7.1"));
     173             : 
     174             :   CompileRun("var o = { desc : 'I am a singleton' }");
     175           4 :   T.CheckFalse(T.NewObject("([1])"), T.NewObject("([1])"));
     176           4 :   T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
     177           4 :   T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
     178           4 : }
     179             : 
     180             : 
     181       26643 : TEST(BinopNotEqual) {
     182           4 :   FunctionTester T("(function(a,b) { return a != b; })");
     183             : 
     184           4 :   T.CheckFalse(7, 7);
     185           4 :   T.CheckTrue(7, 8);
     186           4 :   T.CheckFalse(7.1, 7.1);
     187           4 :   T.CheckTrue(7.1, 8.1);
     188             : 
     189           4 :   T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
     190           4 :   T.CheckFalse(T.Val(7.1), T.Val("7.1"));
     191             : 
     192             :   CompileRun("var o = { desc : 'I am a singleton' }");
     193           4 :   T.CheckTrue(T.NewObject("([1])"), T.NewObject("([1])"));
     194           4 :   T.CheckTrue(T.NewObject("({})"), T.NewObject("({})"));
     195           4 :   T.CheckFalse(T.NewObject("(o)"), T.NewObject("(o)"));
     196           4 : }
     197             : 
     198             : 
     199       26643 : TEST(BinopLessThan) {
     200           4 :   FunctionTester T("(function(a,b) { return a < b; })");
     201             : 
     202           4 :   T.CheckTrue(7, 8);
     203           4 :   T.CheckFalse(8, 7);
     204           4 :   T.CheckTrue(-8.1, -8);
     205           4 :   T.CheckFalse(-8, -8.1);
     206           4 :   T.CheckFalse(0.111, 0.111);
     207             : 
     208           4 :   T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
     209           4 :   T.CheckFalse(T.Val(7.1), T.Val("6.1"));
     210           4 :   T.CheckFalse(T.Val(7.1), T.Val("7.1"));
     211           4 :   T.CheckTrue(T.Val(7.1), T.Val("8.1"));
     212           4 : }
     213             : 
     214             : 
     215       26643 : TEST(BinopLessThanOrEqual) {
     216           4 :   FunctionTester T("(function(a,b) { return a <= b; })");
     217             : 
     218           4 :   T.CheckTrue(7, 8);
     219           4 :   T.CheckFalse(8, 7);
     220           4 :   T.CheckTrue(-8.1, -8);
     221           4 :   T.CheckFalse(-8, -8.1);
     222           4 :   T.CheckTrue(0.111, 0.111);
     223             : 
     224           4 :   T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
     225           4 :   T.CheckFalse(T.Val(7.1), T.Val("6.1"));
     226           4 :   T.CheckTrue(T.Val(7.1), T.Val("7.1"));
     227           4 :   T.CheckTrue(T.Val(7.1), T.Val("8.1"));
     228           4 : }
     229             : 
     230             : 
     231       26643 : TEST(BinopGreaterThan) {
     232           4 :   FunctionTester T("(function(a,b) { return a > b; })");
     233             : 
     234           4 :   T.CheckFalse(7, 8);
     235           4 :   T.CheckTrue(8, 7);
     236           4 :   T.CheckFalse(-8.1, -8);
     237           4 :   T.CheckTrue(-8, -8.1);
     238           4 :   T.CheckFalse(0.111, 0.111);
     239             : 
     240           4 :   T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
     241           4 :   T.CheckTrue(T.Val(7.1), T.Val("6.1"));
     242           4 :   T.CheckFalse(T.Val(7.1), T.Val("7.1"));
     243           4 :   T.CheckFalse(T.Val(7.1), T.Val("8.1"));
     244           4 : }
     245             : 
     246             : 
     247       26643 : TEST(BinopGreaterThanOrEqual) {
     248           4 :   FunctionTester T("(function(a,b) { return a >= b; })");
     249             : 
     250           4 :   T.CheckFalse(7, 8);
     251           4 :   T.CheckTrue(8, 7);
     252           4 :   T.CheckFalse(-8.1, -8);
     253           4 :   T.CheckTrue(-8, -8.1);
     254           4 :   T.CheckTrue(0.111, 0.111);
     255             : 
     256           4 :   T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
     257           4 :   T.CheckTrue(T.Val(7.1), T.Val("6.1"));
     258           4 :   T.CheckTrue(T.Val(7.1), T.Val("7.1"));
     259           4 :   T.CheckFalse(T.Val(7.1), T.Val("8.1"));
     260           4 : }
     261             : 
     262             : 
     263       26643 : TEST(BinopIn) {
     264           4 :   FunctionTester T("(function(a,b) { return a in b; })");
     265             : 
     266           4 :   T.CheckTrue(T.Val("x"), T.NewObject("({x:23})"));
     267           4 :   T.CheckFalse(T.Val("y"), T.NewObject("({x:42})"));
     268           4 :   T.CheckFalse(T.Val(123), T.NewObject("({x:65})"));
     269           4 :   T.CheckTrue(T.Val(1), T.NewObject("([1,2,3])"));
     270           4 : }
     271             : 
     272             : 
     273       26643 : TEST(BinopInstanceOf) {
     274           4 :   FunctionTester T("(function(a,b) { return a instanceof b; })");
     275             : 
     276           4 :   T.CheckTrue(T.NewObject("(new Number(23))"), T.NewObject("Number"));
     277           4 :   T.CheckFalse(T.NewObject("(new Number(23))"), T.NewObject("String"));
     278           4 :   T.CheckFalse(T.NewObject("(new String('a'))"), T.NewObject("Number"));
     279           4 :   T.CheckTrue(T.NewObject("(new String('b'))"), T.NewObject("String"));
     280           4 :   T.CheckFalse(T.Val(1), T.NewObject("Number"));
     281           4 :   T.CheckFalse(T.Val("abc"), T.NewObject("String"));
     282             : 
     283             :   CompileRun("var bound = (function() {}).bind(undefined)");
     284           4 :   T.CheckTrue(T.NewObject("(new bound())"), T.NewObject("bound"));
     285           4 :   T.CheckTrue(T.NewObject("(new bound())"), T.NewObject("Object"));
     286           4 :   T.CheckFalse(T.NewObject("(new bound())"), T.NewObject("Number"));
     287           4 : }
     288             : 
     289             : 
     290       26643 : TEST(UnopNot) {
     291           4 :   FunctionTester T("(function(a) { return !a; })");
     292             : 
     293           4 :   T.CheckCall(T.true_value(), T.false_value(), T.undefined());
     294           4 :   T.CheckCall(T.false_value(), T.true_value(), T.undefined());
     295           4 :   T.CheckCall(T.true_value(), T.Val(0.0), T.undefined());
     296           4 :   T.CheckCall(T.false_value(), T.Val(123), T.undefined());
     297           8 :   T.CheckCall(T.false_value(), T.Val("x"), T.undefined());
     298           4 :   T.CheckCall(T.true_value(), T.undefined(), T.undefined());
     299           4 :   T.CheckCall(T.true_value(), T.nan(), T.undefined());
     300           4 : }
     301             : 
     302             : 
     303       26643 : TEST(UnopCountPost) {
     304           4 :   FunctionTester T("(function(a) { return a++; })");
     305             : 
     306           4 :   T.CheckCall(T.Val(0.0), T.Val(0.0), T.undefined());
     307           4 :   T.CheckCall(T.Val(2.3), T.Val(2.3), T.undefined());
     308           4 :   T.CheckCall(T.Val(123), T.Val(123), T.undefined());
     309           8 :   T.CheckCall(T.Val(7), T.Val("7"), T.undefined());
     310           8 :   T.CheckCall(T.nan(), T.Val("x"), T.undefined());
     311           4 :   T.CheckCall(T.nan(), T.undefined(), T.undefined());
     312           4 :   T.CheckCall(T.Val(1.0), T.true_value(), T.undefined());
     313           4 :   T.CheckCall(T.Val(0.0), T.false_value(), T.undefined());
     314           4 :   T.CheckCall(T.nan(), T.nan(), T.undefined());
     315           4 : }
     316             : 
     317             : 
     318       26643 : TEST(UnopCountPre) {
     319           4 :   FunctionTester T("(function(a) { return ++a; })");
     320             : 
     321           4 :   T.CheckCall(T.Val(1.0), T.Val(0.0), T.undefined());
     322           4 :   T.CheckCall(T.Val(3.3), T.Val(2.3), T.undefined());
     323           4 :   T.CheckCall(T.Val(124), T.Val(123), T.undefined());
     324           8 :   T.CheckCall(T.Val(8), T.Val("7"), T.undefined());
     325           8 :   T.CheckCall(T.nan(), T.Val("x"), T.undefined());
     326           4 :   T.CheckCall(T.nan(), T.undefined(), T.undefined());
     327           4 :   T.CheckCall(T.Val(2.0), T.true_value(), T.undefined());
     328           4 :   T.CheckCall(T.Val(1.0), T.false_value(), T.undefined());
     329           4 :   T.CheckCall(T.nan(), T.nan(), T.undefined());
     330           4 : }
     331             : 
     332             : 
     333       26643 : TEST(PropertyNamedLoad) {
     334           4 :   FunctionTester T("(function(a,b) { return a.x; })");
     335             : 
     336           8 :   T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.undefined());
     337           8 :   T.CheckCall(T.undefined(), T.NewObject("({y:23})"), T.undefined());
     338           4 : }
     339             : 
     340             : 
     341       26643 : TEST(PropertyKeyedLoad) {
     342           4 :   FunctionTester T("(function(a,b) { return a[b]; })");
     343             : 
     344          12 :   T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.Val("x"));
     345           8 :   T.CheckCall(T.Val(42), T.NewObject("([23,42,65])"), T.Val(1));
     346          12 :   T.CheckCall(T.undefined(), T.NewObject("({x:23})"), T.Val("y"));
     347           8 :   T.CheckCall(T.undefined(), T.NewObject("([23,42,65])"), T.Val(4));
     348           4 : }
     349             : 
     350             : 
     351       26643 : TEST(PropertyNamedStore) {
     352           4 :   FunctionTester T("(function(a) { a.x = 7; return a.x; })");
     353             : 
     354           8 :   T.CheckCall(T.Val(7), T.NewObject("({})"), T.undefined());
     355           8 :   T.CheckCall(T.Val(7), T.NewObject("({x:23})"), T.undefined());
     356           4 : }
     357             : 
     358             : 
     359       26643 : TEST(PropertyKeyedStore) {
     360           4 :   FunctionTester T("(function(a,b) { a[b] = 7; return a.x; })");
     361             : 
     362          12 :   T.CheckCall(T.Val(7), T.NewObject("({})"), T.Val("x"));
     363          12 :   T.CheckCall(T.Val(7), T.NewObject("({x:23})"), T.Val("x"));
     364          12 :   T.CheckCall(T.Val(9), T.NewObject("({x:9})"), T.Val("y"));
     365           4 : }
     366             : 
     367             : 
     368       26643 : TEST(PropertyNamedDelete) {
     369           4 :   FunctionTester T("(function(a) { return delete a.x; })");
     370             : 
     371             :   CompileRun("var o = Object.create({}, { x: { value:23 } });");
     372           4 :   T.CheckTrue(T.NewObject("({x:42})"), T.undefined());
     373           4 :   T.CheckTrue(T.NewObject("({})"), T.undefined());
     374           4 :   T.CheckFalse(T.NewObject("(o)"), T.undefined());
     375           4 : }
     376             : 
     377             : 
     378       26643 : TEST(PropertyKeyedDelete) {
     379           4 :   FunctionTester T("(function(a, b) { return delete a[b]; })");
     380             : 
     381             :   CompileRun("function getX() { return 'x'; }");
     382             :   CompileRun("var o = Object.create({}, { x: { value:23 } });");
     383           4 :   T.CheckTrue(T.NewObject("({x:42})"), T.Val("x"));
     384           4 :   T.CheckFalse(T.NewObject("(o)"), T.Val("x"));
     385           4 :   T.CheckFalse(T.NewObject("(o)"), T.NewObject("({toString:getX})"));
     386           4 : }
     387             : 
     388             : 
     389       26643 : TEST(GlobalLoad) {
     390           4 :   FunctionTester T("(function() { return g; })");
     391             : 
     392           4 :   T.CheckThrows(T.undefined(), T.undefined());
     393             :   CompileRun("var g = 23;");
     394           4 :   T.CheckCall(T.Val(23));
     395           4 : }
     396             : 
     397             : 
     398       26643 : TEST(GlobalStoreStrict) {
     399           4 :   FunctionTester T("(function(a,b) { 'use strict'; g = a + b; return g; })");
     400             : 
     401           4 :   T.CheckThrows(T.Val(22), T.Val(11));
     402             :   CompileRun("var g = 'a global variable';");
     403           4 :   T.CheckCall(T.Val(33), T.Val(22), T.Val(11));
     404           4 : }
     405             : 
     406             : 
     407       26643 : TEST(ContextLoad) {
     408           4 :   FunctionTester T("(function(a,b) { (function(){a}); return a + b; })");
     409             : 
     410           4 :   T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
     411          16 :   T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
     412           4 : }
     413             : 
     414             : 
     415       26643 : TEST(ContextStore) {
     416           4 :   FunctionTester T("(function(a,b) { (function(){x}); var x = a; return x; })");
     417             : 
     418           4 :   T.CheckCall(T.Val(23), T.Val(23), T.undefined());
     419          12 :   T.CheckCall(T.Val("a"), T.Val("a"), T.undefined());
     420           4 : }
     421             : 
     422             : 
     423       26643 : TEST(LookupLoad) {
     424           4 :   FunctionTester T("(function(a,b) { with(a) { return x + b; } })");
     425             : 
     426           8 :   T.CheckCall(T.Val(24), T.NewObject("({x:23})"), T.Val(1));
     427           8 :   T.CheckCall(T.Val(32), T.NewObject("({x:23, b:9})"), T.Val(2));
     428           8 :   T.CheckCall(T.Val(45), T.NewObject("({__proto__:{x:42}})"), T.Val(3));
     429           8 :   T.CheckCall(T.Val(69), T.NewObject("({get x() { return 65; }})"), T.Val(4));
     430           4 : }
     431             : 
     432             : 
     433       26643 : TEST(LookupStore) {
     434           4 :   FunctionTester T("(function(a,b) { var x; with(a) { x = b; } return x; })");
     435             : 
     436           8 :   T.CheckCall(T.undefined(), T.NewObject("({x:23})"), T.Val(1));
     437           8 :   T.CheckCall(T.Val(2), T.NewObject("({y:23})"), T.Val(2));
     438           8 :   T.CheckCall(T.Val(23), T.NewObject("({b:23})"), T.Val(3));
     439           8 :   T.CheckCall(T.undefined(), T.NewObject("({__proto__:{x:42}})"), T.Val(4));
     440           4 : }
     441             : 
     442             : 
     443       26643 : TEST(BlockLoadStore) {
     444           4 :   FunctionTester T("(function(a) { 'use strict'; { let x = a+a; return x; }})");
     445             : 
     446           4 :   T.CheckCall(T.Val(46), T.Val(23));
     447           4 :   T.CheckCall(T.Val("aa"), T.Val("a"));
     448           4 : }
     449             : 
     450             : 
     451       26643 : TEST(BlockLoadStoreNested) {
     452             :   const char* src =
     453             :       "(function(a,b) {"
     454             :       "'use strict';"
     455             :       "{ let x = a, y = a;"
     456             :       "  { let y = b;"
     457             :       "    return x + y;"
     458             :       "  }"
     459             :       "}})";
     460           4 :   FunctionTester T(src);
     461             : 
     462           4 :   T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
     463          16 :   T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
     464           4 : }
     465             : 
     466             : 
     467       26643 : TEST(ObjectLiteralComputed) {
     468           4 :   FunctionTester T("(function(a,b) { o = { x:a+b }; return o.x; })");
     469             : 
     470           4 :   T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
     471          16 :   T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
     472           4 : }
     473             : 
     474             : 
     475       26643 : TEST(ObjectLiteralNonString) {
     476           4 :   FunctionTester T("(function(a,b) { o = { 7:a+b }; return o[7]; })");
     477             : 
     478           4 :   T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
     479          16 :   T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
     480           4 : }
     481             : 
     482             : 
     483       26643 : TEST(ObjectLiteralPrototype) {
     484           4 :   FunctionTester T("(function(a) { o = { __proto__:a }; return o.x; })");
     485             : 
     486           8 :   T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.undefined());
     487           8 :   T.CheckCall(T.undefined(), T.NewObject("({y:42})"), T.undefined());
     488           4 : }
     489             : 
     490             : 
     491       26643 : TEST(ObjectLiteralGetter) {
     492           4 :   FunctionTester T("(function(a) { o = { get x() {return a} }; return o.x; })");
     493             : 
     494           4 :   T.CheckCall(T.Val(23), T.Val(23), T.undefined());
     495          12 :   T.CheckCall(T.Val("x"), T.Val("x"), T.undefined());
     496           4 : }
     497             : 
     498             : 
     499       26643 : TEST(ArrayLiteral) {
     500           4 :   FunctionTester T("(function(a,b) { o = [1, a + b, 3]; return o[1]; })");
     501             : 
     502           4 :   T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
     503          16 :   T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
     504           4 : }
     505             : 
     506             : 
     507       26643 : TEST(RegExpLiteral) {
     508           4 :   FunctionTester T("(function(a) { o = /b/; return o.test(a); })");
     509             : 
     510           8 :   T.CheckTrue(T.Val("abc"));
     511           8 :   T.CheckFalse(T.Val("xyz"));
     512           4 : }
     513             : 
     514             : 
     515       26643 : TEST(ClassLiteral) {
     516             :   const char* src =
     517             :       "(function(a,b) {"
     518             :       "  class C {"
     519             :       "    x() { return a; }"
     520             :       "    static y() { return b; }"
     521             :       "    get z() { return 0; }"
     522             :       "    constructor() {}"
     523             :       "  }"
     524             :       "  return new C().x() + C.y();"
     525             :       "})";
     526           4 :   FunctionTester T(src);
     527             : 
     528           4 :   T.CheckCall(T.Val(65), T.Val(23), T.Val(42));
     529          16 :   T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
     530           4 : }
     531             : 
     532             : }  // namespace compiler
     533             : }  // namespace internal
     534       79917 : }  // namespace v8

Generated by: LCOV version 1.10