Reviewers: yurys,
Message:
Yury, please take a look.
Description:
[V8] Use Function.displayName for stack frames in v8::StackTrace
If function in stack contains displayName property and this property type is
string then stack frame will contain it otherwise shared function info
DebugName.
BUG=17356
[email protected]
Please review this at https://codereview.chromium.org/917743002/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+51, -2 lines):
M src/isolate.cc
M test/cctest/test-api.cc
Index: src/isolate.cc
diff --git a/src/isolate.cc b/src/isolate.cc
index
37020da1559b70828dfceedf5eb75cb32391817b..a0c5dcbbf14bcae1ee5cc3198e096049b3c5e7a2
100644
--- a/src/isolate.cc
+++ b/src/isolate.cc
@@ -491,6 +491,8 @@ class CaptureStackTraceHelper {
STATIC_CHAR_VECTOR("scriptNameOrSourceURL"));
}
if (options & StackTrace::kFunctionName) {
+ display_name_ = factory()->InternalizeOneByteString(
+ STATIC_CHAR_VECTOR("displayName"));
function_key_ = factory()->InternalizeOneByteString(
STATIC_CHAR_VECTOR("functionName"));
}
@@ -554,8 +556,14 @@ class CaptureStackTraceHelper {
}
if (!function_key_.is_null()) {
- Handle<Object> fun_name(fun->shared()->DebugName(), isolate_);
- JSObject::AddProperty(stack_frame, function_key_, fun_name, NONE);
+ Handle<Object> display_name =
+ JSObject::GetDataProperty(fun, display_name_);
+ if (display_name->IsString()) {
+ JSObject::AddProperty(stack_frame, function_key_, display_name,
NONE);
+ } else {
+ Handle<Object> fun_name(fun->shared()->DebugName(), isolate_);
+ JSObject::AddProperty(stack_frame, function_key_, fun_name, NONE);
+ }
}
if (!eval_key_.is_null()) {
@@ -585,6 +593,7 @@ class CaptureStackTraceHelper {
Handle<String> function_key_;
Handle<String> eval_key_;
Handle<String> constructor_key_;
+ Handle<String> display_name_;
};
Index: test/cctest/test-api.cc
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index
5b11386d47c72f0bae3d5857b1e1996a139ace95..31ca6ff77ecc2f71acb101a0a2da9095f7b91f49
100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -15225,6 +15225,46 @@
TEST(CaptureStackTraceForUncaughtExceptionAndSetters) {
}
+static void StackTraceDisplayNameListener(
+ v8::Handle<v8::Message> message,
+ v8::Handle<Value>) {
+ v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace();
+ CHECK_EQ(4, stack_trace->GetFrameCount());
+ checkStackFrame("origin", "foo:0", 4, 7, false, false,
+ stack_trace->GetFrame(0));
+ checkStackFrame("origin", "foo:1", 5, 27, false, false,
+ stack_trace->GetFrame(1));
+ checkStackFrame("origin", "foo:2", 5, 27, false, false,
+ stack_trace->GetFrame(2));
+ checkStackFrame("origin", "", 1, 14, false, false,
+ stack_trace->GetFrame(3));
+}
+
+
+TEST(GetStackTraceContainsFunctionsWithDisplayName) {
+ LocalContext env;
+ v8::HandleScope scope(env->GetIsolate());
+
+ CompileRunWithOrigin(
+ "function gen(name, counter) {\n"
+ " var f = function() {\n"
+ " if (counter === 0)\n"
+ " throw 1;\n"
+ " gen(name, counter - 1)();\n"
+ " };\n"
+ " f.displayName = name + ':' + counter;\n"
+ " return f;\n"
+ "};",
+ "origin");
+
+ v8::V8::AddMessageListener(StackTraceDisplayNameListener);
+ v8::V8::SetCaptureStackTraceForUncaughtExceptions(true);
+ CompileRunWithOrigin("gen('foo', 2)();", "origin");
+ v8::V8::SetCaptureStackTraceForUncaughtExceptions(false);
+ v8::V8::RemoveMessageListeners(StackTraceDisplayNameListener);
+}
+
+
static void RethrowStackTraceHandler(v8::Handle<v8::Message> message,
v8::Handle<v8::Value> data) {
// Use the frame where JavaScript is called from.
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.