Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index 2e8d4ae94ec1a7a481278a8d8c437f6b460141e4..717cfb340b21417ec0d296cb68829c1238d63ca0 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -17627,6 +17627,7 @@ TEST(CaptureStackTrace) { |
static void StackTraceForUncaughtExceptionListener( |
v8::Handle<v8::Message> message, |
v8::Handle<Value>) { |
+ report_count++; |
v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); |
CHECK_EQ(2, stack_trace->GetFrameCount()); |
checkStackFrame("origin", "foo", 2, 3, false, false, |
@@ -17657,6 +17658,38 @@ TEST(CaptureStackTraceForUncaughtException) { |
Function::Cast(*trouble)->Call(global, 0, NULL); |
v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); |
v8::V8::RemoveMessageListeners(StackTraceForUncaughtExceptionListener); |
+ CHECK_EQ(1, report_count); |
+} |
+ |
+ |
+TEST(GetStackTraceForUncaughtExceptionFromSimpleStackTrace) { |
+ report_count = 0; |
+ LocalContext env; |
+ v8::HandleScope scope(env->GetIsolate()); |
+ |
+ // Create an Error object first. |
+ CompileRunWithOrigin( |
+ "function foo() {\n" |
+ "e=new Error('err');\n" |
+ "};\n" |
+ "function bar() {\n" |
+ " foo();\n" |
+ "};\n" |
+ "var e;", |
+ "origin"); |
+ v8::Local<v8::Object> global = env->Global(); |
+ Local<Value> trouble = global->Get(v8_str("bar")); |
+ CHECK(trouble->IsFunction()); |
+ Function::Cast(*trouble)->Call(global, 0, NULL); |
+ |
+ // Enable capturing detailed stack trace late, and throw the exception. |
+ // The detailed stack trace should be extracted from the simple stack. |
+ v8::V8::AddMessageListener(StackTraceForUncaughtExceptionListener); |
+ v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); |
+ CompileRunWithOrigin("throw e", "origin"); |
+ v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); |
+ v8::V8::RemoveMessageListeners(StackTraceForUncaughtExceptionListener); |
+ CHECK_EQ(1, report_count); |
} |