LCOV - code coverage report
Current view: top level - src/builtins - builtins-callsite.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 69 73 94.5 %
Date: 2017-10-20 Functions: 31 49 63.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             : 
       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             : 
      13             : namespace v8 {
      14             : namespace internal {
      15             : 
      16             : #define CHECK_CALLSITE(recv, method)                                          \
      17             :   CHECK_RECEIVER(JSObject, recv, method);                                     \
      18             :   if (!JSReceiver::HasOwnProperty(                                            \
      19             :            recv, isolate->factory()->call_site_frame_array_symbol())          \
      20             :            .FromMaybe(false)) {                                               \
      21             :     THROW_NEW_ERROR_RETURN_FAILURE(                                           \
      22             :         isolate,                                                              \
      23             :         NewTypeError(MessageTemplate::kCallSiteMethod,                        \
      24             :                      isolate->factory()->NewStringFromAsciiChecked(method))); \
      25             :   }
      26             : 
      27             : namespace {
      28             : 
      29       72248 : Object* PositiveNumberOrNull(int value, Isolate* isolate) {
      30      144456 :   if (value >= 0) return *isolate->factory()->NewNumberFromInt(value);
      31          40 :   return isolate->heap()->null_value();
      32             : }
      33             : 
      34             : Handle<FrameArray> GetFrameArray(Isolate* isolate, Handle<JSObject> object) {
      35             :   Handle<Object> frame_array_obj = JSObject::GetDataProperty(
      36      351264 :       object, isolate->factory()->call_site_frame_array_symbol());
      37             :   return Handle<FrameArray>::cast(frame_array_obj);
      38             : }
      39             : 
      40             : int GetFrameIndex(Isolate* isolate, Handle<JSObject> object) {
      41             :   Handle<Object> frame_index_obj = JSObject::GetDataProperty(
      42      351264 :       object, isolate->factory()->call_site_frame_index_symbol());
      43             :   return Smi::ToInt(*frame_index_obj);
      44             : }
      45             : 
      46             : }  // namespace
      47             : 
      48      107787 : BUILTIN(CallSitePrototypeGetColumnNumber) {
      49             :   HandleScope scope(isolate);
      50      107787 :   CHECK_CALLSITE(recv, "getColumnNumber");
      51             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      52       35929 :                         GetFrameIndex(isolate, recv));
      53       35929 :   return PositiveNumberOrNull(it.Frame()->GetColumnNumber(), isolate);
      54             : }
      55             : 
      56         558 : BUILTIN(CallSitePrototypeGetEvalOrigin) {
      57             :   HandleScope scope(isolate);
      58         558 :   CHECK_CALLSITE(recv, "getEvalOrigin");
      59             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      60         186 :                         GetFrameIndex(isolate, recv));
      61         372 :   return *it.Frame()->GetEvalOrigin();
      62             : }
      63             : 
      64      186999 : BUILTIN(CallSitePrototypeGetFileName) {
      65             :   HandleScope scope(isolate);
      66      186999 :   CHECK_CALLSITE(recv, "getFileName");
      67             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      68       62333 :                         GetFrameIndex(isolate, recv));
      69      124666 :   return *it.Frame()->GetFileName();
      70             : }
      71             : 
      72        1380 : BUILTIN(CallSitePrototypeGetFunction) {
      73             :   HandleScope scope(isolate);
      74        1380 :   CHECK_CALLSITE(recv, "getFunction");
      75             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      76         460 :                         GetFrameIndex(isolate, recv));
      77             : 
      78         460 :   StackFrameBase* frame = it.Frame();
      79         460 :   if (frame->IsStrict()) return isolate->heap()->undefined_value();
      80         760 :   return *frame->GetFunction();
      81             : }
      82             : 
      83      109257 : BUILTIN(CallSitePrototypeGetFunctionName) {
      84             :   HandleScope scope(isolate);
      85      109257 :   CHECK_CALLSITE(recv, "getFunctionName");
      86             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      87       36419 :                         GetFrameIndex(isolate, recv));
      88       72838 :   return *it.Frame()->GetFunctionName();
      89             : }
      90             : 
      91      108957 : BUILTIN(CallSitePrototypeGetLineNumber) {
      92             :   HandleScope scope(isolate);
      93      108957 :   CHECK_CALLSITE(recv, "getLineNumber");
      94             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
      95       36319 :                         GetFrameIndex(isolate, recv));
      96       36319 :   return PositiveNumberOrNull(it.Frame()->GetLineNumber(), isolate);
      97             : }
      98             : 
      99         390 : BUILTIN(CallSitePrototypeGetMethodName) {
     100             :   HandleScope scope(isolate);
     101         460 :   CHECK_CALLSITE(recv, "getMethodName");
     102             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     103         100 :                         GetFrameIndex(isolate, recv));
     104         200 :   return *it.Frame()->GetMethodName();
     105             : }
     106             : 
     107         750 : BUILTIN(CallSitePrototypeGetPosition) {
     108             :   HandleScope scope(isolate);
     109         500 :   CHECK_CALLSITE(recv, "getPosition");
     110             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     111         250 :                         GetFrameIndex(isolate, recv));
     112         250 :   return Smi::FromInt(it.Frame()->GetPosition());
     113             : }
     114             : 
     115           0 : BUILTIN(CallSitePrototypeGetScriptNameOrSourceURL) {
     116             :   HandleScope scope(isolate);
     117           0 :   CHECK_CALLSITE(recv, "getScriptNameOrSourceUrl");
     118             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     119           0 :                         GetFrameIndex(isolate, recv));
     120           0 :   return *it.Frame()->GetScriptNameOrSourceUrl();
     121             : }
     122             : 
     123        1710 : BUILTIN(CallSitePrototypeGetThis) {
     124             :   HandleScope scope(isolate);
     125        1710 :   CHECK_CALLSITE(recv, "getThis");
     126             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     127         570 :                         GetFrameIndex(isolate, recv));
     128             : 
     129         570 :   StackFrameBase* frame = it.Frame();
     130         570 :   if (frame->IsStrict()) return isolate->heap()->undefined_value();
     131         980 :   return *frame->GetReceiver();
     132             : }
     133             : 
     134        1329 : BUILTIN(CallSitePrototypeGetTypeName) {
     135             :   HandleScope scope(isolate);
     136        1329 :   CHECK_CALLSITE(recv, "getTypeName");
     137             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     138         443 :                         GetFrameIndex(isolate, recv));
     139         886 :   return *it.Frame()->GetTypeName();
     140             : }
     141             : 
     142      106407 : BUILTIN(CallSitePrototypeIsConstructor) {
     143             :   HandleScope scope(isolate);
     144      106407 :   CHECK_CALLSITE(recv, "isConstructor");
     145             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     146       35469 :                         GetFrameIndex(isolate, recv));
     147       35469 :   return isolate->heap()->ToBoolean(it.Frame()->IsConstructor());
     148             : }
     149             : 
     150      212934 : BUILTIN(CallSitePrototypeIsEval) {
     151             :   HandleScope scope(isolate);
     152      212934 :   CHECK_CALLSITE(recv, "isEval");
     153             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     154       70978 :                         GetFrameIndex(isolate, recv));
     155       70978 :   return isolate->heap()->ToBoolean(it.Frame()->IsEval());
     156             : }
     157             : 
     158      106377 : BUILTIN(CallSitePrototypeIsNative) {
     159             :   HandleScope scope(isolate);
     160      106377 :   CHECK_CALLSITE(recv, "isNative");
     161             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     162       35459 :                         GetFrameIndex(isolate, recv));
     163       35459 :   return isolate->heap()->ToBoolean(it.Frame()->IsNative());
     164             : }
     165             : 
     166      106377 : BUILTIN(CallSitePrototypeIsToplevel) {
     167             :   HandleScope scope(isolate);
     168      106377 :   CHECK_CALLSITE(recv, "isToplevel");
     169             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     170       35459 :                         GetFrameIndex(isolate, recv));
     171       35459 :   return isolate->heap()->ToBoolean(it.Frame()->IsToplevel());
     172             : }
     173             : 
     174        2670 : BUILTIN(CallSitePrototypeToString) {
     175             :   HandleScope scope(isolate);
     176        2670 :   CHECK_CALLSITE(recv, "toString");
     177             :   FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
     178         890 :                         GetFrameIndex(isolate, recv));
     179        2670 :   RETURN_RESULT_OR_FAILURE(isolate, it.Frame()->ToString());
     180             : }
     181             : 
     182             : #undef CHECK_CALLSITE
     183             : 
     184             : }  // namespace internal
     185             : }  // namespace v8

Generated by: LCOV version 1.10