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.

Reply via email to