LCOV - code coverage report
Current view: top level - src/runtime - runtime-promise.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 78 82 95.1 %
Date: 2017-10-20 Functions: 14 29 48.3 %

          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             : #include "src/runtime/runtime-utils.h"
       5             : 
       6             : #include "src/arguments.h"
       7             : #include "src/counters.h"
       8             : #include "src/debug/debug.h"
       9             : #include "src/elements.h"
      10             : #include "src/objects-inl.h"
      11             : 
      12             : namespace v8 {
      13             : namespace internal {
      14             : 
      15             : namespace {
      16             : 
      17        1454 : void PromiseRejectEvent(Isolate* isolate, Handle<JSPromise> promise,
      18             :                         Handle<Object> rejected_promise, Handle<Object> value,
      19             :                         bool debug_event) {
      20             :   isolate->RunPromiseHook(PromiseHookType::kResolve, promise,
      21         727 :                           isolate->factory()->undefined_value());
      22             : 
      23         727 :   if (isolate->debug()->is_active() && debug_event) {
      24         290 :     isolate->debug()->OnPromiseReject(rejected_promise, value);
      25             :   }
      26             : 
      27             :   // Report only if we don't actually have a handler.
      28         727 :   if (!promise->has_handler()) {
      29             :     isolate->ReportPromiseReject(promise, value,
      30         727 :                                  v8::kPromiseRejectWithNoHandler);
      31             :   }
      32         727 : }
      33             : 
      34             : }  // namespace
      35             : 
      36        2761 : RUNTIME_FUNCTION(Runtime_PromiseRejectEventFromStack) {
      37             :   DCHECK_EQ(2, args.length());
      38         727 :   HandleScope scope(isolate);
      39        1454 :   CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
      40         727 :   CONVERT_ARG_HANDLE_CHECKED(Object, value, 1);
      41             : 
      42             :   Handle<Object> rejected_promise = promise;
      43         727 :   if (isolate->debug()->is_active()) {
      44             :     // If the Promise.reject call is caught, then this will return
      45             :     // undefined, which will be interpreted by PromiseRejectEvent
      46             :     // as being a caught exception event.
      47         290 :     rejected_promise = isolate->GetPromiseOnStackOnThrow();
      48             :     isolate->debug()->OnAsyncTaskEvent(
      49             :         debug::kDebugEnqueuePromiseReject,
      50         580 :         isolate->debug()->NextAsyncTaskId(promise), 0);
      51             :   }
      52         727 :   PromiseRejectEvent(isolate, promise, rejected_promise, value, true);
      53         727 :   return isolate->heap()->undefined_value();
      54             : }
      55             : 
      56       24182 : RUNTIME_FUNCTION(Runtime_ReportPromiseReject) {
      57             :   DCHECK_EQ(2, args.length());
      58       12091 :   HandleScope scope(isolate);
      59       24182 :   CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
      60       12091 :   CONVERT_ARG_HANDLE_CHECKED(Object, value, 1);
      61       12091 :   isolate->ReportPromiseReject(promise, value, v8::kPromiseRejectWithNoHandler);
      62       12091 :   return isolate->heap()->undefined_value();
      63             : }
      64             : 
      65        9734 : RUNTIME_FUNCTION(Runtime_PromiseRevokeReject) {
      66             :   DCHECK_EQ(1, args.length());
      67        4867 :   HandleScope scope(isolate);
      68        9734 :   CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
      69             :   // At this point, no revocation has been issued before
      70        4867 :   CHECK(!promise->has_handler());
      71             :   isolate->ReportPromiseReject(promise, Handle<Object>(),
      72        4867 :                                v8::kPromiseHandlerAddedAfterReject);
      73        4867 :   return isolate->heap()->undefined_value();
      74             : }
      75             : 
      76      351116 : RUNTIME_FUNCTION(Runtime_EnqueuePromiseReactionJob) {
      77      175558 :   HandleScope scope(isolate);
      78             :   DCHECK_EQ(1, args.length());
      79      351116 :   CONVERT_ARG_HANDLE_CHECKED(PromiseReactionJobInfo, info, 0);
      80      175558 :   isolate->EnqueueMicrotask(info);
      81      175558 :   return isolate->heap()->undefined_value();
      82             : }
      83             : 
      84       51324 : RUNTIME_FUNCTION(Runtime_EnqueuePromiseResolveThenableJob) {
      85       25662 :   HandleScope scope(isolate);
      86             :   DCHECK_EQ(args.length(), 1);
      87       51324 :   CONVERT_ARG_HANDLE_CHECKED(PromiseResolveThenableJobInfo, info, 0);
      88       25662 :   isolate->EnqueueMicrotask(info);
      89       25662 :   return isolate->heap()->undefined_value();
      90             : }
      91             : 
      92         566 : RUNTIME_FUNCTION(Runtime_EnqueueMicrotask) {
      93         283 :   HandleScope scope(isolate);
      94             :   DCHECK_EQ(1, args.length());
      95         566 :   CONVERT_ARG_HANDLE_CHECKED(JSFunction, microtask, 0);
      96         283 :   isolate->EnqueueMicrotask(microtask);
      97         283 :   return isolate->heap()->undefined_value();
      98             : }
      99             : 
     100       15348 : RUNTIME_FUNCTION(Runtime_RunMicrotasks) {
     101        7674 :   HandleScope scope(isolate);
     102             :   DCHECK_EQ(0, args.length());
     103        7674 :   isolate->RunMicrotasks();
     104        7674 :   return isolate->heap()->undefined_value();
     105             : }
     106             : 
     107          30 : RUNTIME_FUNCTION(Runtime_PromiseStatus) {
     108          15 :   HandleScope scope(isolate);
     109             :   DCHECK_EQ(1, args.length());
     110          30 :   CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
     111             : 
     112          15 :   return Smi::FromInt(promise->status());
     113             : }
     114             : 
     115           0 : RUNTIME_FUNCTION(Runtime_PromiseResult) {
     116           0 :   HandleScope scope(isolate);
     117             :   DCHECK_EQ(1, args.length());
     118           0 :   CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
     119           0 :   return promise->result();
     120             : }
     121             : 
     122          10 : RUNTIME_FUNCTION(Runtime_PromiseMarkAsHandled) {
     123             :   SealHandleScope shs(isolate);
     124             :   DCHECK_EQ(1, args.length());
     125          10 :   CONVERT_ARG_CHECKED(JSPromise, promise, 0);
     126             : 
     127           5 :   promise->set_has_handler(true);
     128           5 :   return isolate->heap()->undefined_value();
     129             : }
     130             : 
     131       86176 : RUNTIME_FUNCTION(Runtime_PromiseHookInit) {
     132       43088 :   HandleScope scope(isolate);
     133             :   DCHECK_EQ(2, args.length());
     134       86176 :   CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
     135       43088 :   CONVERT_ARG_HANDLE_CHECKED(Object, parent, 1);
     136       43088 :   isolate->RunPromiseHook(PromiseHookType::kInit, promise, parent);
     137       43088 :   return isolate->heap()->undefined_value();
     138             : }
     139             : 
     140       93774 : RUNTIME_FUNCTION(Runtime_PromiseHookResolve) {
     141       46887 :   HandleScope scope(isolate);
     142             :   DCHECK_EQ(1, args.length());
     143       93774 :   CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
     144             :   isolate->RunPromiseHook(PromiseHookType::kResolve, promise,
     145       93774 :                           isolate->factory()->undefined_value());
     146       46887 :   return isolate->heap()->undefined_value();
     147             : }
     148             : 
     149       27114 : RUNTIME_FUNCTION(Runtime_PromiseHookBefore) {
     150       13557 :   HandleScope scope(isolate);
     151             :   DCHECK_EQ(1, args.length());
     152       27114 :   CONVERT_ARG_HANDLE_CHECKED(JSObject, promise, 0);
     153       13557 :   if (promise->IsJSPromise()) {
     154             :     isolate->RunPromiseHook(PromiseHookType::kBefore,
     155             :                             Handle<JSPromise>::cast(promise),
     156       27096 :                             isolate->factory()->undefined_value());
     157             :   }
     158       13557 :   return isolate->heap()->undefined_value();
     159             : }
     160             : 
     161       27086 : RUNTIME_FUNCTION(Runtime_PromiseHookAfter) {
     162       13543 :   HandleScope scope(isolate);
     163             :   DCHECK_EQ(1, args.length());
     164       27086 :   CONVERT_ARG_HANDLE_CHECKED(JSObject, promise, 0);
     165       13543 :   if (promise->IsJSPromise()) {
     166             :     isolate->RunPromiseHook(PromiseHookType::kAfter,
     167             :                             Handle<JSPromise>::cast(promise),
     168       27086 :                             isolate->factory()->undefined_value());
     169             :   }
     170       13543 :   return isolate->heap()->undefined_value();
     171             : }
     172             : 
     173             : }  // namespace internal
     174             : }  // namespace v8

Generated by: LCOV version 1.10