Index: src/isolate.cc |
diff --git a/src/isolate.cc b/src/isolate.cc |
index bb55119dee965e4042cb3b4284578aef077c07fa..9bffca25a2ddedf955f3cb4e4642a0b4487504bd 100644 |
--- a/src/isolate.cc |
+++ b/src/isolate.cc |
@@ -353,23 +353,10 @@ static bool IsVisibleInStackTrace(StackFrame* raw_frame, |
} |
-Handle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSObject> error_object, |
- Handle<Object> caller) { |
- // Get stack trace limit. |
- Handle<Object> error = Object::GetProperty( |
- this, js_builtins_object(), "$Error").ToHandleChecked(); |
- if (!error->IsJSObject()) return factory()->undefined_value(); |
- |
- Handle<String> stackTraceLimit = |
- factory()->InternalizeUtf8String("stackTraceLimit"); |
- ASSERT(!stackTraceLimit.is_null()); |
- Handle<Object> stack_trace_limit = |
- JSObject::GetDataProperty(Handle<JSObject>::cast(error), |
- stackTraceLimit); |
- if (!stack_trace_limit->IsNumber()) return factory()->undefined_value(); |
- int limit = FastD2IChecked(stack_trace_limit->Number()); |
+Handle<JSArray> Isolate::CaptureSimpleStackTrace(Handle<JSObject> error_object, |
+ Handle<Object> caller, |
+ int limit) { |
limit = Max(limit, 0); // Ensure that limit is not negative. |
- |
int initial_size = Min(limit, 10); |
Handle<FixedArray> elements = |
factory()->NewFixedArrayWithHoles(initial_size * 4 + 1); |
@@ -439,25 +426,15 @@ Handle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSObject> error_object, |
void Isolate::CaptureAndSetDetailedStackTrace(Handle<JSObject> error_object) { |
if (capture_stack_trace_for_uncaught_exceptions_) { |
// Capture stack trace for a detailed exception message. |
- Handle<Name> key = factory()->detailed_stack_trace_symbol(); |
+ Handle<String> key = factory()->hidden_stack_trace_string(); |
Handle<JSArray> stack_trace = CaptureCurrentStackTrace( |
stack_trace_for_uncaught_exceptions_frame_limit_, |
stack_trace_for_uncaught_exceptions_options_); |
- JSObject::SetProperty( |
- error_object, key, stack_trace, NONE, STRICT).Assert(); |
+ JSObject::SetHiddenProperty(error_object, key, stack_trace); |
} |
} |
-void Isolate::CaptureAndSetSimpleStackTrace(Handle<JSObject> error_object, |
- Handle<Object> caller) { |
- // Capture stack trace for simple stack trace string formatting. |
- Handle<Name> key = factory()->stack_trace_symbol(); |
- Handle<Object> stack_trace = CaptureSimpleStackTrace(error_object, caller); |
- JSObject::SetProperty(error_object, key, stack_trace, NONE, STRICT).Assert(); |
-} |
- |
- |
Handle<JSArray> Isolate::CaptureCurrentStackTrace( |
int frame_limit, StackTrace::StackTraceOptions options) { |
// Ensure no negative values. |
@@ -803,7 +780,25 @@ Object* Isolate::StackOverflow() { |
Handle<JSObject> exception = factory()->CopyJSObject(boilerplate); |
DoThrow(*exception, NULL); |
- CaptureAndSetSimpleStackTrace(exception, factory()->undefined_value()); |
+ // Get stack trace limit. |
+ Handle<Object> error = Object::GetProperty( |
+ this, js_builtins_object(), "$Error").ToHandleChecked(); |
+ if (!error->IsJSObject()) return heap()->exception(); |
+ |
+ Handle<String> stackTraceLimit = |
+ factory()->InternalizeUtf8String("stackTraceLimit"); |
+ ASSERT(!stackTraceLimit.is_null()); |
+ Handle<Object> stack_trace_limit = |
+ JSObject::GetDataProperty(Handle<JSObject>::cast(error), |
+ stackTraceLimit); |
+ if (!stack_trace_limit->IsNumber()) return heap()->exception(); |
+ int limit = FastD2IChecked(stack_trace_limit->Number()); |
+ if (limit < 0) limit = 0; |
+ Handle<JSArray> stack_trace = CaptureSimpleStackTrace( |
+ exception, factory()->undefined_value(), limit); |
+ JSObject::SetHiddenProperty(exception, |
+ factory()->hidden_stack_trace_string(), |
+ stack_trace); |
return heap()->exception(); |
} |
@@ -1059,16 +1054,13 @@ void Isolate::DoThrow(Object* exception, MessageLocation* location) { |
if (capture_stack_trace_for_uncaught_exceptions_) { |
if (IsErrorObject(exception_handle)) { |
// We fetch the stack trace that corresponds to this error object. |
- Handle<Name> key = factory()->detailed_stack_trace_symbol(); |
- // Look up as own property. If the lookup fails, the exception is |
- // probably not a valid Error object. In that case, we fall through |
- // and capture the stack trace at this throw site. |
- LookupIterator lookup( |
- exception_handle, key, LookupIterator::CHECK_OWN_REAL); |
- Handle<Object> stack_trace_property; |
- if (Object::GetProperty(&lookup).ToHandle(&stack_trace_property) && |
- stack_trace_property->IsJSArray()) { |
- stack_trace_object = Handle<JSArray>::cast(stack_trace_property); |
+ Handle<String> key = factory()->hidden_stack_trace_string(); |
+ Object* stack_property = |
+ JSObject::cast(*exception_handle)->GetHiddenProperty(key); |
+ // Property lookup may have failed. In this case it's probably not |
+ // a valid Error object. |
+ if (stack_property->IsJSArray()) { |
+ stack_trace_object = Handle<JSArray>(JSArray::cast(stack_property)); |
} |
} |
if (stack_trace_object.is_null()) { |