Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 06a8458549104a088925775540e4a10e38d05c5a..c38ca8cb26ac6240b47e248b711312c33c57eec1 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -13109,19 +13109,38 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_MarkOneShotGetter) { |
} |
-// Retrieve the raw stack trace collected on stack overflow and delete |
-// it since it is used only once to avoid keeping it alive. |
-RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOverflowedRawStackTrace) { |
+// Retrieve the stack trace. This could be the raw stack trace collected |
+// on stack overflow or the already formatted stack trace string. |
+RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOverflowedStackTrace) { |
+ HandleScope scope(isolate); |
ASSERT_EQ(args.length(), 1); |
CONVERT_ARG_CHECKED(JSObject, error_object, 0); |
String* key = isolate->heap()->hidden_stack_trace_symbol(); |
Object* result = error_object->GetHiddenProperty(key); |
- RUNTIME_ASSERT(result->IsJSArray() || result->IsUndefined()); |
- error_object->DeleteHiddenProperty(key); |
+ RUNTIME_ASSERT(result->IsJSArray() || |
+ result->IsString() || |
+ result->IsUndefined()); |
return result; |
} |
+// Set or clear the stack trace attached to an stack overflow error object. |
+RUNTIME_FUNCTION(MaybeObject*, Runtime_SetOverflowedStackTrace) { |
+ HandleScope scope(isolate); |
+ ASSERT_EQ(args.length(), 2); |
+ CONVERT_ARG_HANDLE_CHECKED(JSObject, error_object, 0); |
+ CONVERT_ARG_HANDLE_CHECKED(HeapObject, value, 1); |
+ Handle<String> key = isolate->factory()->hidden_stack_trace_symbol(); |
+ if (value->IsUndefined()) { |
+ error_object->DeleteHiddenProperty(*key); |
+ } else { |
+ RUNTIME_ASSERT(value->IsString()); |
+ JSObject::SetHiddenProperty(error_object, key, value); |
+ } |
+ return *error_object; |
+} |
+ |
+ |
// Returns V8 version as a string. |
RUNTIME_FUNCTION(MaybeObject*, Runtime_GetV8Version) { |
ASSERT_EQ(args.length(), 0); |