Index: src/builtins/builtins-error.cc |
diff --git a/src/builtins/builtins-error.cc b/src/builtins/builtins-error.cc |
index 0311f8c6827feb591e15aad3ca14f03ef393739f..25cd9a29e46326bd536f223520ff29f2a67c87c0 100644 |
--- a/src/builtins/builtins-error.cc |
+++ b/src/builtins/builtins-error.cc |
@@ -5,7 +5,6 @@ |
#include "src/builtins/builtins.h" |
#include "src/builtins/builtins-utils.h" |
-#include "src/accessors.h" |
#include "src/bootstrapper.h" |
#include "src/messages.h" |
#include "src/property-descriptor.h" |
@@ -36,67 +35,24 @@ BUILTIN(ErrorCaptureStackTrace) { |
Handle<Object> caller = args.atOrUndefined(isolate, 2); |
FrameSkipMode mode = caller->IsJSFunction() ? SKIP_UNTIL_SEEN : SKIP_NONE; |
- // TODO(jgruber): Eagerly format the stack trace and remove accessors.h |
- // include. |
- |
- // Handle writes to the global object. |
- |
- if (object->IsJSGlobalProxy()) { |
- Map* map = object->map(); |
- if (map->has_hidden_prototype()) { |
- object = handle(JSGlobalObject::cast(map->prototype()), isolate); |
- } |
- } |
- |
- // Check if the stack property is read-only. |
- |
- bool is_extensible = true; |
- if (!JSObject::IsExtensible(object)) { |
- is_extensible = false; |
- } |
+ // Collect the stack trace. |
- PropertyDescriptor desc; |
- Maybe<bool> owned = JSReceiver::GetOwnPropertyDescriptor( |
- isolate, object, isolate->factory()->stack_string(), &desc); |
- if (owned.FromMaybe(false)) { |
- if (!desc.configurable() || !desc.writable()) { |
- is_extensible = false; |
- } |
- } |
+ RETURN_FAILURE_ON_EXCEPTION(isolate, |
+ isolate->CaptureAndSetDetailedStackTrace(object)); |
- if (!is_extensible) { |
- THROW_NEW_ERROR_RETURN_FAILURE( |
- isolate, NewTypeError(MessageTemplate::kDefineDisallowed, |
- isolate->factory()->stack_string(), object)); |
- } |
+ // Eagerly format the stack trace and set the stack property. |
- // Add stack accessors to the given object |
- |
- Handle<Map> map(object->map()); |
- PropertyAttributes attribs = DONT_ENUM; |
- Handle<AccessorInfo> error_stack = |
- Accessors::ErrorStackInfo(isolate, attribs); |
- { |
- AccessorConstantDescriptor d(Handle<Name>(Name::cast(error_stack->name())), |
- error_stack, attribs); |
- Handle<DescriptorArray> old_descriptors(map->instance_descriptors()); |
- int index = old_descriptors->SearchWithCache(isolate, *d.GetKey(), *map); |
- if (index == DescriptorArray::kNotFound) { |
- // TODO(jgruber): This ensures we do not crash when CaptureStackTrace is |
- // called on an object with an existing "stack" property. This will be |
- // removed as soon as we move to eager trace formatting. |
- Handle<Map> new_map = |
- Map::CopyInsertDescriptor(map, &d, INSERT_TRANSITION); |
- JSObject::MigrateToMap(object, new_map, 1); |
- } |
- } |
+ Handle<Object> stack_trace = |
+ isolate->CaptureSimpleStackTrace(object, mode, caller); |
- // Collect the stack trace. |
+ Handle<Object> formatted_stack_trace; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, formatted_stack_trace, |
+ FormatStackTrace(isolate, object, stack_trace)); |
- RETURN_FAILURE_ON_EXCEPTION(isolate, |
- isolate->CaptureAndSetDetailedStackTrace(object)); |
RETURN_FAILURE_ON_EXCEPTION( |
- isolate, isolate->CaptureAndSetSimpleStackTrace(object, mode, caller)); |
+ isolate, JSObject::SetProperty(object, isolate->factory()->stack_string(), |
+ formatted_stack_trace, STRICT)); |
return *isolate->factory()->undefined_value(); |
} |