LCOV - code coverage report
Current view: top level - test/cctest/compiler - test-run-deopt.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 38 38 100.0 %
Date: 2017-10-20 Functions: 9 9 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/frames-inl.h"
       6             : #include "test/cctest/cctest.h"
       7             : #include "test/cctest/compiler/function-tester.h"
       8             : 
       9             : namespace v8 {
      10             : namespace internal {
      11             : namespace compiler {
      12             : 
      13          72 : static void IsOptimized(const v8::FunctionCallbackInfo<v8::Value>& args) {
      14          36 :   JavaScriptFrameIterator it(CcTest::i_isolate());
      15             :   JavaScriptFrame* frame = it.frame();
      16          72 :   return args.GetReturnValue().Set(frame->is_optimized());
      17             : }
      18             : 
      19             : 
      20          24 : static void InstallIsOptimizedHelper(v8::Isolate* isolate) {
      21          24 :   v8::Local<v8::Context> context = isolate->GetCurrentContext();
      22             :   v8::Local<v8::FunctionTemplate> t =
      23          24 :       v8::FunctionTemplate::New(isolate, IsOptimized);
      24         120 :   CHECK(context->Global()
      25             :             ->Set(context, v8_str("IsOptimized"),
      26             :                   t->GetFunction(context).ToLocalChecked())
      27             :             .FromJust());
      28          24 : }
      29             : 
      30             : 
      31       23724 : TEST(DeoptSimple) {
      32           6 :   FLAG_allow_natives_syntax = true;
      33             : 
      34             :   FunctionTester T(
      35             :       "(function f(a) {"
      36             :       "  var b = 1;"
      37             :       "  if (!IsOptimized()) return 0;"
      38             :       "  %DeoptimizeFunction(f);"
      39             :       "  if (IsOptimized()) return 0;"
      40             :       "  return a + b;"
      41           6 :       "})");
      42             : 
      43           6 :   InstallIsOptimizedHelper(CcTest::isolate());
      44           6 :   T.CheckCall(T.Val(2), T.Val(1));
      45           6 : }
      46             : 
      47             : 
      48       23724 : TEST(DeoptSimpleInExpr) {
      49           6 :   FLAG_allow_natives_syntax = true;
      50             : 
      51             :   FunctionTester T(
      52             :       "(function f(a) {"
      53             :       "  var b = 1;"
      54             :       "  var c = 2;"
      55             :       "  if (!IsOptimized()) return 0;"
      56             :       "  var d = b + (%DeoptimizeFunction(f), c);"
      57             :       "  if (IsOptimized()) return 0;"
      58             :       "  return d + a;"
      59           6 :       "})");
      60             : 
      61           6 :   InstallIsOptimizedHelper(CcTest::isolate());
      62           6 :   T.CheckCall(T.Val(6), T.Val(3));
      63           6 : }
      64             : 
      65             : 
      66       23724 : TEST(DeoptExceptionHandlerCatch) {
      67           6 :   FLAG_allow_natives_syntax = true;
      68             : 
      69             :   FunctionTester T(
      70             :       "(function f() {"
      71             :       "  var is_opt = IsOptimized;"
      72             :       "  try {"
      73             :       "    DeoptAndThrow(f);"
      74             :       "  } catch (e) {"
      75             :       "    return is_opt();"
      76             :       "  }"
      77           6 :       "})");
      78             : 
      79             :   CompileRun("function DeoptAndThrow(f) { %DeoptimizeFunction(f); throw 0; }");
      80           6 :   InstallIsOptimizedHelper(CcTest::isolate());
      81           6 :   T.CheckCall(T.false_value());
      82           6 : }
      83             : 
      84             : 
      85       23724 : TEST(DeoptExceptionHandlerFinally) {
      86           6 :   FLAG_allow_natives_syntax = true;
      87             : 
      88             :   FunctionTester T(
      89             :       "(function f() {"
      90             :       "  var is_opt = IsOptimized;"
      91             :       "  try {"
      92             :       "    DeoptAndThrow(f);"
      93             :       "  } finally {"
      94             :       "    return is_opt();"
      95             :       "  }"
      96           6 :       "})");
      97             : 
      98             :   CompileRun("function DeoptAndThrow(f) { %DeoptimizeFunction(f); throw 0; }");
      99           6 :   InstallIsOptimizedHelper(CcTest::isolate());
     100           6 :   T.CheckCall(T.false_value());
     101           6 : }
     102             : 
     103             : 
     104       23724 : TEST(DeoptTrivial) {
     105           6 :   FLAG_allow_natives_syntax = true;
     106             : 
     107             :   FunctionTester T(
     108             :       "(function foo() {"
     109             :       "  %DeoptimizeFunction(foo);"
     110             :       "  return 1;"
     111           6 :       "})");
     112             : 
     113           6 :   T.CheckCall(T.Val(1));
     114           6 : }
     115             : 
     116             : }  // namespace compiler
     117             : }  // namespace internal
     118       71154 : }  // namespace v8

Generated by: LCOV version 1.10