LCOV - code coverage report
Current view: top level - src/builtins - builtins-callsite.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 52 73 71.2 %
Date: 2017-04-26 Functions: 23 49 46.9 %

          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/builtins/builtins.h"
       6             : #include "src/builtins/builtins-utils.h"
       7             : 
       8             : #include "src/counters.h"
       9             : #include "src/objects-inl.h"
      10             : #include "src/objects/frame-array-inl.h"
      11             : #include "src/string-builder.h"
      12             : #include "src/wasm/wasm-module.h"
      13             : 
      14             : namespace v8 {
      15             : namespace internal {
      16             : 
      17             : #define CHECK_CALLSITE(recv, method)                                          \
      18             :   CHECK_RECEIVER(JSObject, recv, method);                                     \
      19             :   if (!JSReceiver::HasOwnProperty(                                            \
      20             :            recv, isolate->factory()->call_site_frame_array_symbol())          \
      21             :            .FromMaybe(false)) {                                               \
      22             :     THROW_NEW_ERROR_RETURN_FAILURE(                                           \
      23             :         isolate,                                                              \
      24             :         NewTypeError(MessageTemplate::kCallSiteMethod,                        \
      25             :                      isolate->factory()->NewStringFromAsciiChecked(method))); \
      26             :   }
      27             : 
      28             : namespace {
      29             : 
      30        1740 : Object* PositiveNumberOrNull(int value, Isolate* isolate) {
      31        3480 :   if (value >= 0) return *isolate->factory()->NewNumberFromInt(value);
      32           0 :   return isolate->heap()->null_value();
      33             : }
      34             : 
      35             : Handle<FrameArray> GetFrameArray(Isolate* isolate, Handle<JSObject> object) {
      36             :   Handle<Object> frame_array_obj = JSObject::GetDataProperty(
      37       75426 :       object, isolate->factory()->call_site_frame_array_symbol());
      38             :   return Handle<FrameArray>::cast(frame_array_obj);
      39             : }
      40             : 
      41             : int GetFrameIndex(Isolate* isolate, Handle<JSObject> object) {
      42             :   Handle<Object> frame_index_obj = JSObject::GetDataProperty(
      43       75426 :       object, isolate->factory()->call_site_frame_index_symbol());
      44             :   return Smi::cast(*frame_index_obj)->value();
      45             : }
      46             : 
      47             : }  // namespace
      48             : 
      49        2070 : BUILTIN(CallSitePrototypeGetColumnNumber) {
      50             :   HandleScope scope(isolate);
      51        2070 :   CHECK_CALLSITE(recv, "getColumnNumber");
      52             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      53         690 :                         GetFrameIndex(isolate, recv));
      54         690 :   return PositiveNumberOrNull(it.Frame()->GetColumnNumber(), isolate);
      55             : }
      56             : 
      57         711 : BUILTIN(CallSitePrototypeGetEvalOrigin) {
      58             :   HandleScope scope(isolate);
      59         711 :   CHECK_CALLSITE(recv, "getEvalOrigin");
      60             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      61         237 :                         GetFrameIndex(isolate, recv));
      62         474 :   return *it.Frame()->GetEvalOrigin();
      63             : }
      64             : 
      65        2970 : BUILTIN(CallSitePrototypeGetFileName) {
      66             :   HandleScope scope(isolate);
      67        2970 :   CHECK_CALLSITE(recv, "getFileName");
      68             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      69         990 :                         GetFrameIndex(isolate, recv));
      70        1980 :   return *it.Frame()->GetFileName();
      71             : }
      72             : 
      73        2070 : BUILTIN(CallSitePrototypeGetFunction) {
      74             :   HandleScope scope(isolate);
      75        2070 :   CHECK_CALLSITE(recv, "getFunction");
      76             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      77         690 :                         GetFrameIndex(isolate, recv));
      78             : 
      79         690 :   StackFrameBase* frame = it.Frame();
      80         690 :   if (frame->IsStrict()) return isolate->heap()->undefined_value();
      81        1140 :   return *frame->GetFunction();
      82             : }
      83             : 
      84       69966 : BUILTIN(CallSitePrototypeGetFunctionName) {
      85             :   HandleScope scope(isolate);
      86       69966 :   CHECK_CALLSITE(recv, "getFunctionName");
      87             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      88       23322 :                         GetFrameIndex(isolate, recv));
      89       46644 :   return *it.Frame()->GetFunctionName();
      90             : }
      91             : 
      92        3150 : BUILTIN(CallSitePrototypeGetLineNumber) {
      93             :   HandleScope scope(isolate);
      94        3150 :   CHECK_CALLSITE(recv, "getLineNumber");
      95             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      96        1050 :                         GetFrameIndex(isolate, recv));
      97        1050 :   return PositiveNumberOrNull(it.Frame()->GetLineNumber(), isolate);
      98             : }
      99             : 
     100         495 : BUILTIN(CallSitePrototypeGetMethodName) {
     101             :   HandleScope scope(isolate);
     102         600 :   CHECK_CALLSITE(recv, "getMethodName");
     103             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     104         120 :                         GetFrameIndex(isolate, recv));
     105         240 :   return *it.Frame()->GetMethodName();
     106             : }
     107             : 
     108         540 : BUILTIN(CallSitePrototypeGetPosition) {
     109             :   HandleScope scope(isolate);
     110         540 :   CHECK_CALLSITE(recv, "getPosition");
     111             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     112         180 :                         GetFrameIndex(isolate, recv));
     113         180 :   return Smi::FromInt(it.Frame()->GetPosition());
     114             : }
     115             : 
     116           0 : BUILTIN(CallSitePrototypeGetScriptNameOrSourceURL) {
     117             :   HandleScope scope(isolate);
     118           0 :   CHECK_CALLSITE(recv, "getScriptNameOrSourceUrl");
     119             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     120           0 :                         GetFrameIndex(isolate, recv));
     121           0 :   return *it.Frame()->GetScriptNameOrSourceUrl();
     122             : }
     123             : 
     124        2565 : BUILTIN(CallSitePrototypeGetThis) {
     125             :   HandleScope scope(isolate);
     126        2565 :   CHECK_CALLSITE(recv, "getThis");
     127             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     128         855 :                         GetFrameIndex(isolate, recv));
     129             : 
     130         855 :   StackFrameBase* frame = it.Frame();
     131         855 :   if (frame->IsStrict()) return isolate->heap()->undefined_value();
     132        1470 :   return *frame->GetReceiver();
     133             : }
     134             : 
     135         360 : BUILTIN(CallSitePrototypeGetTypeName) {
     136             :   HandleScope scope(isolate);
     137         360 :   CHECK_CALLSITE(recv, "getTypeName");
     138             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     139         120 :                         GetFrameIndex(isolate, recv));
     140         240 :   return *it.Frame()->GetTypeName();
     141             : }
     142             : 
     143           0 : BUILTIN(CallSitePrototypeIsConstructor) {
     144             :   HandleScope scope(isolate);
     145           0 :   CHECK_CALLSITE(recv, "isConstructor");
     146             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     147           0 :                         GetFrameIndex(isolate, recv));
     148           0 :   return isolate->heap()->ToBoolean(it.Frame()->IsConstructor());
     149             : }
     150             : 
     151           0 : BUILTIN(CallSitePrototypeIsEval) {
     152             :   HandleScope scope(isolate);
     153           0 :   CHECK_CALLSITE(recv, "isEval");
     154             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     155           0 :                         GetFrameIndex(isolate, recv));
     156           0 :   return isolate->heap()->ToBoolean(it.Frame()->IsEval());
     157             : }
     158             : 
     159           0 : BUILTIN(CallSitePrototypeIsNative) {
     160             :   HandleScope scope(isolate);
     161           0 :   CHECK_CALLSITE(recv, "isNative");
     162             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     163           0 :                         GetFrameIndex(isolate, recv));
     164           0 :   return isolate->heap()->ToBoolean(it.Frame()->IsNative());
     165             : }
     166             : 
     167           0 : BUILTIN(CallSitePrototypeIsToplevel) {
     168             :   HandleScope scope(isolate);
     169           0 :   CHECK_CALLSITE(recv, "isToplevel");
     170             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     171           0 :                         GetFrameIndex(isolate, recv));
     172           0 :   return isolate->heap()->ToBoolean(it.Frame()->IsToplevel());
     173             : }
     174             : 
     175      141516 : BUILTIN(CallSitePrototypeToString) {
     176             :   HandleScope scope(isolate);
     177      141516 :   CHECK_CALLSITE(recv, "toString");
     178             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     179       47172 :                         GetFrameIndex(isolate, recv));
     180      141516 :   RETURN_RESULT_OR_FAILURE(isolate, it.Frame()->ToString());
     181             : }
     182             : 
     183             : #undef CHECK_CALLSITE
     184             : 
     185             : }  // namespace internal
     186             : }  // namespace v8

Generated by: LCOV version 1.10