LCOV - code coverage report
Current view: top level - src/builtins - builtins-error.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 29 34 85.3 %
Date: 2017-04-26 Functions: 13 25 52.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/builtins/builtins.h"
       6             : #include "src/builtins/builtins-utils.h"
       7             : 
       8             : #include "src/counters.h"
       9             : #include "src/messages.h"
      10             : #include "src/objects-inl.h"
      11             : #include "src/property-descriptor.h"
      12             : #include "src/string-builder.h"
      13             : 
      14             : namespace v8 {
      15             : namespace internal {
      16             : 
      17             : // ES6 section 19.5.1.1 Error ( message )
      18       84348 : BUILTIN(ErrorConstructor) {
      19             :   HandleScope scope(isolate);
      20             : 
      21             :   FrameSkipMode mode = SKIP_FIRST;
      22             :   Handle<Object> caller;
      23             : 
      24             :   // When we're passed a JSFunction as new target, we can skip frames until that
      25             :   // specific function is seen instead of unconditionally skipping the first
      26             :   // frame.
      27       28116 :   if (args.new_target()->IsJSFunction()) {
      28             :     mode = SKIP_UNTIL_SEEN;
      29       27427 :     caller = args.new_target();
      30             :   }
      31             : 
      32       84333 :   RETURN_RESULT_OR_FAILURE(
      33             :       isolate, ErrorUtils::Construct(isolate, args.target(),
      34             :                                      Handle<Object>::cast(args.new_target()),
      35             :                                      args.atOrUndefined(isolate, 1), mode,
      36             :                                      caller, false));
      37             : }
      38             : 
      39             : // static
      40         900 : BUILTIN(ErrorCaptureStackTrace) {
      41             :   HandleScope scope(isolate);
      42             :   Handle<Object> object_obj = args.atOrUndefined(isolate, 1);
      43         300 :   if (!object_obj->IsJSObject()) {
      44          30 :     THROW_NEW_ERROR_RETURN_FAILURE(
      45             :         isolate, NewTypeError(MessageTemplate::kInvalidArgument, object_obj));
      46             :   }
      47             :   Handle<JSObject> object = Handle<JSObject>::cast(object_obj);
      48             :   Handle<Object> caller = args.atOrUndefined(isolate, 2);
      49         285 :   FrameSkipMode mode = caller->IsJSFunction() ? SKIP_UNTIL_SEEN : SKIP_FIRST;
      50             : 
      51             :   // Collect the stack trace.
      52             : 
      53         570 :   RETURN_FAILURE_ON_EXCEPTION(isolate,
      54             :                               isolate->CaptureAndSetDetailedStackTrace(object));
      55             : 
      56             :   // Eagerly format the stack trace and set the stack property.
      57             : 
      58             :   Handle<Object> stack_trace =
      59         285 :       isolate->CaptureSimpleStackTrace(object, mode, caller);
      60         285 :   if (!stack_trace->IsJSArray()) return isolate->heap()->undefined_value();
      61             : 
      62             :   Handle<Object> formatted_stack_trace;
      63         540 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
      64             :       isolate, formatted_stack_trace,
      65             :       ErrorUtils::FormatStackTrace(isolate, object, stack_trace));
      66             : 
      67             :   PropertyDescriptor desc;
      68             :   desc.set_configurable(true);
      69             :   desc.set_writable(true);
      70             :   desc.set_value(formatted_stack_trace);
      71             :   Maybe<bool> status = JSReceiver::DefineOwnProperty(
      72             :       isolate, object, isolate->factory()->stack_string(), &desc,
      73         255 :       Object::THROW_ON_ERROR);
      74         255 :   if (!status.IsJust()) return isolate->heap()->exception();
      75         210 :   CHECK(status.FromJust());
      76         210 :   return isolate->heap()->undefined_value();
      77             : }
      78             : 
      79             : // ES6 section 19.5.3.4 Error.prototype.toString ( )
      80     1451631 : BUILTIN(ErrorPrototypeToString) {
      81             :   HandleScope scope(isolate);
      82     1425966 :   RETURN_RESULT_OR_FAILURE(isolate,
      83             :                            ErrorUtils::ToString(isolate, args.receiver()));
      84             : }
      85             : 
      86             : namespace {
      87             : 
      88       21896 : Object* MakeGenericError(Isolate* isolate, BuiltinArguments args,
      89             :                          Handle<JSFunction> constructor) {
      90             :   Handle<Object> template_index = args.atOrUndefined(isolate, 1);
      91       21896 :   Handle<Object> arg0 = args.atOrUndefined(isolate, 2);
      92       21896 :   Handle<Object> arg1 = args.atOrUndefined(isolate, 3);
      93       21896 :   Handle<Object> arg2 = args.atOrUndefined(isolate, 4);
      94             : 
      95             :   DCHECK(template_index->IsSmi());
      96             : 
      97       65688 :   RETURN_RESULT_OR_FAILURE(
      98             :       isolate, ErrorUtils::MakeGenericError(isolate, constructor,
      99             :                                             Smi::cast(*template_index)->value(),
     100             :                                             arg0, arg1, arg2, SKIP_NONE));
     101             : }
     102             : 
     103             : }  // namespace
     104             : 
     105          24 : BUILTIN(MakeError) {
     106             :   HandleScope scope(isolate);
     107          16 :   return MakeGenericError(isolate, args, isolate->error_function());
     108             : }
     109             : 
     110        1545 : BUILTIN(MakeRangeError) {
     111             :   HandleScope scope(isolate);
     112        1030 :   return MakeGenericError(isolate, args, isolate->range_error_function());
     113             : }
     114             : 
     115           0 : BUILTIN(MakeSyntaxError) {
     116             :   HandleScope scope(isolate);
     117           0 :   return MakeGenericError(isolate, args, isolate->syntax_error_function());
     118             : }
     119             : 
     120       64119 : BUILTIN(MakeTypeError) {
     121             :   HandleScope scope(isolate);
     122       42746 :   return MakeGenericError(isolate, args, isolate->type_error_function());
     123             : }
     124             : 
     125           0 : BUILTIN(MakeURIError) {
     126             :   HandleScope scope(isolate);
     127           0 :   Handle<JSFunction> constructor = isolate->uri_error_function();
     128             :   Handle<Object> undefined = isolate->factory()->undefined_value();
     129             :   const int template_index = MessageTemplate::kURIMalformed;
     130           0 :   RETURN_RESULT_OR_FAILURE(
     131             :       isolate,
     132             :       ErrorUtils::MakeGenericError(isolate, constructor, template_index,
     133             :                                    undefined, undefined, undefined, SKIP_NONE));
     134             : }
     135             : 
     136             : }  // namespace internal
     137             : }  // namespace v8

Generated by: LCOV version 1.10