LCOV - code coverage report
Current view: top level - test/cctest - test-usecounters.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 71 71 100.0 %
Date: 2019-04-17 Functions: 7 7 100.0 %

          Line data    Source code
       1             : // Copyright 2016 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/v8.h"
       6             : 
       7             : #include "test/cctest/cctest.h"
       8             : 
       9             : namespace v8 {
      10             : namespace internal {
      11             : namespace test_usecounters {
      12             : 
      13             : int* global_use_counts = nullptr;
      14             : 
      15          84 : void MockUseCounterCallback(v8::Isolate* isolate,
      16             :                             v8::Isolate::UseCounterFeature feature) {
      17          84 :   ++global_use_counts[feature];
      18          84 : }
      19             : 
      20       26644 : TEST(AssigmentExpressionLHSIsCall) {
      21           5 :   v8::Isolate* isolate = CcTest::isolate();
      22          10 :   v8::HandleScope scope(isolate);
      23           5 :   LocalContext env;
      24           5 :   int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
      25           5 :   global_use_counts = use_counts;
      26           5 :   CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback);
      27             : 
      28             :   // AssignmentExpressions whose LHS is not a call do not increment counters
      29             :   CompileRun("function f(){ a = 0; a()[b] = 0; }");
      30           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
      31           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
      32             :   CompileRun("function f(){ ++a; ++a()[b]; }");
      33           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
      34           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
      35             :   CompileRun("function f(){ 'use strict'; a = 0; a()[b] = 0; }");
      36           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
      37           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
      38             :   CompileRun("function f(){ 'use strict'; ++a; ++a()[b]; }");
      39           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
      40           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
      41             : 
      42             :   // AssignmentExpressions whose LHS is a call increment appropriate counters
      43             :   CompileRun("function f(){ a() = 0; }");
      44           5 :   CHECK_NE(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
      45           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
      46           5 :   use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy] = 0;
      47             :   CompileRun("function f(){ 'use strict'; a() = 0; }");
      48           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
      49           5 :   CHECK_NE(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
      50           5 :   use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict] = 0;
      51             : 
      52             :   // UpdateExpressions whose LHS is a call increment appropriate counters
      53             :   CompileRun("function f(){ ++a(); }");
      54           5 :   CHECK_NE(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
      55           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
      56           5 :   use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy] = 0;
      57             :   CompileRun("function f(){ 'use strict'; ++a(); }");
      58           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
      59           5 :   CHECK_NE(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
      60           5 :   use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict] = 0;
      61           5 : }
      62             : 
      63       26644 : TEST(AtomicsWakeAndAtomicsNotify) {
      64           5 :   v8::Isolate* isolate = CcTest::isolate();
      65          10 :   v8::HandleScope scope(isolate);
      66           5 :   LocalContext env;
      67           5 :   int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
      68           5 :   global_use_counts = use_counts;
      69           5 :   i::FLAG_harmony_sharedarraybuffer = true;
      70           5 :   CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback);
      71             : 
      72             :   CompileRun("Atomics.wake(new Int32Array(new SharedArrayBuffer(16)), 0);");
      73           5 :   CHECK_EQ(1, use_counts[v8::Isolate::kAtomicsWake]);
      74           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAtomicsNotify]);
      75             : 
      76           5 :   use_counts[v8::Isolate::kAtomicsWake] = 0;
      77           5 :   use_counts[v8::Isolate::kAtomicsNotify] = 0;
      78             : 
      79             :   CompileRun("Atomics.notify(new Int32Array(new SharedArrayBuffer(16)), 0);");
      80           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kAtomicsWake]);
      81           5 :   CHECK_EQ(1, use_counts[v8::Isolate::kAtomicsNotify]);
      82           5 : }
      83             : 
      84       26644 : TEST(RegExpMatchIsTrueishOnNonJSRegExp) {
      85           5 :   v8::Isolate* isolate = CcTest::isolate();
      86          10 :   v8::HandleScope scope(isolate);
      87           5 :   LocalContext env;
      88           5 :   int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
      89           5 :   global_use_counts = use_counts;
      90           5 :   CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback);
      91             : 
      92             :   CompileRun("new RegExp(/./); new RegExp('');");
      93           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsTrueishOnNonJSRegExp]);
      94           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsFalseishOnJSRegExp]);
      95             : 
      96             :   CompileRun("let p = { [Symbol.match]: true }; new RegExp(p);");
      97           5 :   CHECK_EQ(1, use_counts[v8::Isolate::kRegExpMatchIsTrueishOnNonJSRegExp]);
      98           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsFalseishOnJSRegExp]);
      99           5 : }
     100             : 
     101       26644 : TEST(RegExpMatchIsFalseishOnJSRegExp) {
     102           5 :   v8::Isolate* isolate = CcTest::isolate();
     103          10 :   v8::HandleScope scope(isolate);
     104           5 :   LocalContext env;
     105           5 :   int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
     106           5 :   global_use_counts = use_counts;
     107           5 :   CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback);
     108             : 
     109             :   CompileRun("new RegExp(/./); new RegExp('');");
     110           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsTrueishOnNonJSRegExp]);
     111           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsFalseishOnJSRegExp]);
     112             : 
     113             :   CompileRun("let p = /./; p[Symbol.match] = false; new RegExp(p);");
     114           5 :   CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsTrueishOnNonJSRegExp]);
     115           5 :   CHECK_EQ(1, use_counts[v8::Isolate::kRegExpMatchIsFalseishOnJSRegExp]);
     116           5 : }
     117             : 
     118             : }  // namespace test_usecounters
     119             : }  // namespace internal
     120       79917 : }  // namespace v8

Generated by: LCOV version 1.10