Add column number and call timing support to LegacyProfiler.
authortimothy@apple.com <timothy@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 31 Jan 2014 01:34:54 +0000 (01:34 +0000)
committertimothy@apple.com <timothy@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 31 Jan 2014 01:34:54 +0000 (01:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=127764

Reviewed by Joseph Pecoraro.

Source/JavaScriptCore:

* interpreter/Interpreter.cpp:
(JSC::Interpreter::execute):
* profiler/CallIdentifier.h:
(JSC::CallIdentifier::CallIdentifier):
(JSC::CallIdentifier::functionName):
(JSC::CallIdentifier::url):
(JSC::CallIdentifier::lineNumber):
(JSC::CallIdentifier::columnNumber):
(JSC::CallIdentifier::operator==):
(JSC::CallIdentifier::operator!=):
(JSC::CallIdentifier::Hash::hash):
(WTF::HashTraits<JSC::CallIdentifier>::constructDeletedValue):
(WTF::HashTraits<JSC::CallIdentifier>::isDeletedValue):
* profiler/LegacyProfiler.cpp:
(JSC::LegacyProfiler::willExecute):
(JSC::LegacyProfiler::didExecute):
(JSC::LegacyProfiler::exceptionUnwind):
(JSC::LegacyProfiler::createCallIdentifier):
(JSC::createCallIdentifierFromFunctionImp):
* profiler/LegacyProfiler.h:
* profiler/Profile.cpp:
(JSC::Profile::Profile):
* profiler/Profile.h:
(JSC::Profile::uid):
(JSC::Profile::idleTime):
(JSC::Profile::setIdleTime):
* profiler/ProfileGenerator.cpp:
(JSC::AddParentForConsoleStartFunctor::operator()):
(JSC::ProfileGenerator::addParentForConsoleStart):
(JSC::ProfileGenerator::willExecute):
(JSC::ProfileGenerator::didExecute):
(JSC::ProfileGenerator::stopProfiling):
(JSC::ProfileGenerator::removeProfileStart):
(JSC::ProfileGenerator::removeProfileEnd):
* profiler/ProfileNode.cpp:
(JSC::ProfileNode::ProfileNode):
(JSC::ProfileNode::stopProfiling):
(JSC::ProfileNode::endAndRecordCall):
(JSC::ProfileNode::startTimer):
(JSC::ProfileNode::debugPrintData):
* profiler/ProfileNode.h:
(JSC::ProfileNode::Call::Call):
(JSC::ProfileNode::Call::startTime):
(JSC::ProfileNode::Call::setStartTime):
(JSC::ProfileNode::Call::totalTime):
(JSC::ProfileNode::Call::setTotalTime):
(JSC::ProfileNode::id):
(JSC::ProfileNode::functionName):
(JSC::ProfileNode::url):
(JSC::ProfileNode::lineNumber):
(JSC::ProfileNode::columnNumber):
(JSC::ProfileNode::calls):
(JSC::ProfileNode::lastCall):
(JSC::ProfileNode::numberOfCalls):

Source/WebCore:

* bindings/js/ScriptProfile.cpp:
(WebCore::ScriptProfile::idleTime):
(WebCore::buildInspectorObjectFor):
(WebCore::ScriptProfile::buildInspectorObject):
* bindings/js/ScriptProfile.h:
* inspector/InspectorHeapProfilerAgent.cpp:
(WebCore::InspectorHeapProfilerAgent::createSnapshotHeader):
* inspector/InspectorProfilerAgent.cpp:
(WebCore::InspectorProfilerAgent::createSnapshotHeader):
(WebCore::InspectorProfilerAgent::getCPUProfile):
* inspector/ScriptProfileNode.idl:
* inspector/TimelineRecordFactory.cpp:
(WebCore::TimelineRecordFactory::appendProfile):
* inspector/protocol/Profiler.json:

LayoutTests:

Update test and results to include column numbers.

* fast/profiler/anonymous-event-handler-expected.txt:
* fast/profiler/anonymous-function-called-from-different-contexts-expected.txt:
* fast/profiler/anonymous-function-calls-built-in-functions-expected.txt:
* fast/profiler/anonymous-function-calls-eval-expected.txt:
* fast/profiler/anonymous-functions-with-display-names-expected.txt:
* fast/profiler/apply-expected.txt:
* fast/profiler/built-in-function-calls-anonymous-expected.txt:
* fast/profiler/built-in-function-calls-user-defined-function-expected.txt:
* fast/profiler/call-expected.txt:
* fast/profiler/calling-the-function-that-started-the-profiler-from-another-scope-expected.txt:
* fast/profiler/compare-multiple-profiles-expected.txt:
* fast/profiler/constructor-expected.txt:
* fast/profiler/dead-time-expected.txt:
* fast/profiler/document-dot-write-expected.txt:
* fast/profiler/event-handler-expected.txt:
* fast/profiler/execution-context-and-eval-on-same-line-expected.txt:
* fast/profiler/inline-event-handler-expected.txt:
* fast/profiler/many-calls-in-the-same-scope-expected.txt:
* fast/profiler/multiple-and-different-scoped-anonymous-function-calls-expected.txt:
* fast/profiler/multiple-and-different-scoped-function-calls-expected.txt:
* fast/profiler/multiple-anonymous-functions-called-from-the-same-function-expected.txt:
* fast/profiler/multiple-frames-expected.txt:
* fast/profiler/named-functions-with-display-names-expected.txt:
* fast/profiler/nested-anonymous-functon-expected.txt:
* fast/profiler/nested-start-and-stop-profiler-expected.txt:
* fast/profiler/one-execution-context-expected.txt:
* fast/profiler/profile-calls-in-included-file-expected.txt:
* fast/profiler/profile-with-no-title-expected.txt:
* fast/profiler/profiling-from-a-nested-location-but-stop-profiling-outside-the-nesting-expected.txt:
* fast/profiler/profiling-from-a-nested-location-expected.txt:
* fast/profiler/resources/profiler-test-JS-resources.js:
(printProfileNodeWithoutTime):
* fast/profiler/simple-event-call-expected.txt:
* fast/profiler/simple-no-level-change-expected.txt:
* fast/profiler/start-and-stop-profiler-multiple-times-expected.txt:
* fast/profiler/start-and-stop-profiling-in-the-same-function-expected.txt:
* fast/profiler/stop-profiling-after-setTimeout-expected.txt:
* fast/profiler/stop-then-function-call-expected.txt:
* fast/profiler/two-execution-contexts-expected.txt:
* fast/profiler/user-defined-function-calls-built-in-functions-expected.txt:
* fast/profiler/window-dot-eval-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@163140 268f45cc-cd09-0410-ab3c-d52691b4dbfc

60 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/profiler/anonymous-event-handler-expected.txt
LayoutTests/fast/profiler/anonymous-function-called-from-different-contexts-expected.txt
LayoutTests/fast/profiler/anonymous-function-calls-built-in-functions-expected.txt
LayoutTests/fast/profiler/anonymous-function-calls-eval-expected.txt
LayoutTests/fast/profiler/anonymous-functions-with-display-names-expected.txt
LayoutTests/fast/profiler/apply-expected.txt
LayoutTests/fast/profiler/built-in-function-calls-anonymous-expected.txt
LayoutTests/fast/profiler/built-in-function-calls-user-defined-function-expected.txt
LayoutTests/fast/profiler/call-expected.txt
LayoutTests/fast/profiler/calling-the-function-that-started-the-profiler-from-another-scope-expected.txt
LayoutTests/fast/profiler/compare-multiple-profiles-expected.txt
LayoutTests/fast/profiler/constructor-expected.txt
LayoutTests/fast/profiler/dead-time-expected.txt
LayoutTests/fast/profiler/document-dot-write-expected.txt
LayoutTests/fast/profiler/event-handler-expected.txt
LayoutTests/fast/profiler/execution-context-and-eval-on-same-line-expected.txt
LayoutTests/fast/profiler/inline-event-handler-expected.txt
LayoutTests/fast/profiler/many-calls-in-the-same-scope-expected.txt
LayoutTests/fast/profiler/multiple-and-different-scoped-anonymous-function-calls-expected.txt
LayoutTests/fast/profiler/multiple-and-different-scoped-function-calls-expected.txt
LayoutTests/fast/profiler/multiple-anonymous-functions-called-from-the-same-function-expected.txt
LayoutTests/fast/profiler/multiple-frames-expected.txt
LayoutTests/fast/profiler/named-functions-with-display-names-expected.txt
LayoutTests/fast/profiler/nested-anonymous-functon-expected.txt
LayoutTests/fast/profiler/nested-start-and-stop-profiler-expected.txt
LayoutTests/fast/profiler/one-execution-context-expected.txt
LayoutTests/fast/profiler/profile-calls-in-included-file-expected.txt
LayoutTests/fast/profiler/profile-with-no-title-expected.txt
LayoutTests/fast/profiler/profiling-from-a-nested-location-but-stop-profiling-outside-the-nesting-expected.txt
LayoutTests/fast/profiler/profiling-from-a-nested-location-expected.txt
LayoutTests/fast/profiler/resources/profiler-test-JS-resources.js
LayoutTests/fast/profiler/simple-event-call-expected.txt
LayoutTests/fast/profiler/simple-no-level-change-expected.txt
LayoutTests/fast/profiler/start-and-stop-profiler-multiple-times-expected.txt
LayoutTests/fast/profiler/start-and-stop-profiling-in-the-same-function-expected.txt
LayoutTests/fast/profiler/stop-profiling-after-setTimeout-expected.txt
LayoutTests/fast/profiler/stop-then-function-call-expected.txt
LayoutTests/fast/profiler/two-execution-contexts-expected.txt
LayoutTests/fast/profiler/user-defined-function-calls-built-in-functions-expected.txt
LayoutTests/fast/profiler/window-dot-eval-expected.txt
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/interpreter/Interpreter.cpp
Source/JavaScriptCore/profiler/CallIdentifier.h
Source/JavaScriptCore/profiler/LegacyProfiler.cpp
Source/JavaScriptCore/profiler/LegacyProfiler.h
Source/JavaScriptCore/profiler/Profile.cpp
Source/JavaScriptCore/profiler/Profile.h
Source/JavaScriptCore/profiler/ProfileGenerator.cpp
Source/JavaScriptCore/profiler/ProfileGenerator.h
Source/JavaScriptCore/profiler/ProfileNode.cpp
Source/JavaScriptCore/profiler/ProfileNode.h
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/ScriptProfile.cpp
Source/WebCore/bindings/js/ScriptProfile.h
Source/WebCore/inspector/InspectorHeapProfilerAgent.cpp
Source/WebCore/inspector/InspectorProfilerAgent.cpp
Source/WebCore/inspector/ScriptProfileNode.idl
Source/WebCore/inspector/TimelineRecordFactory.cpp
Source/WebCore/inspector/protocol/Profiler.json

index 9d066f5..1b73afd 100644 (file)
@@ -1,3 +1,55 @@
+2014-01-28  Timothy Hatcher  <timothy@apple.com>
+
+        Add column number and call timing support to LegacyProfiler.
+
+        https://bugs.webkit.org/show_bug.cgi?id=127764
+
+        Reviewed by Joseph Pecoraro.
+
+        Update test and results to include column numbers.
+
+        * fast/profiler/anonymous-event-handler-expected.txt:
+        * fast/profiler/anonymous-function-called-from-different-contexts-expected.txt:
+        * fast/profiler/anonymous-function-calls-built-in-functions-expected.txt:
+        * fast/profiler/anonymous-function-calls-eval-expected.txt:
+        * fast/profiler/anonymous-functions-with-display-names-expected.txt:
+        * fast/profiler/apply-expected.txt:
+        * fast/profiler/built-in-function-calls-anonymous-expected.txt:
+        * fast/profiler/built-in-function-calls-user-defined-function-expected.txt:
+        * fast/profiler/call-expected.txt:
+        * fast/profiler/calling-the-function-that-started-the-profiler-from-another-scope-expected.txt:
+        * fast/profiler/compare-multiple-profiles-expected.txt:
+        * fast/profiler/constructor-expected.txt:
+        * fast/profiler/dead-time-expected.txt:
+        * fast/profiler/document-dot-write-expected.txt:
+        * fast/profiler/event-handler-expected.txt:
+        * fast/profiler/execution-context-and-eval-on-same-line-expected.txt:
+        * fast/profiler/inline-event-handler-expected.txt:
+        * fast/profiler/many-calls-in-the-same-scope-expected.txt:
+        * fast/profiler/multiple-and-different-scoped-anonymous-function-calls-expected.txt:
+        * fast/profiler/multiple-and-different-scoped-function-calls-expected.txt:
+        * fast/profiler/multiple-anonymous-functions-called-from-the-same-function-expected.txt:
+        * fast/profiler/multiple-frames-expected.txt:
+        * fast/profiler/named-functions-with-display-names-expected.txt:
+        * fast/profiler/nested-anonymous-functon-expected.txt:
+        * fast/profiler/nested-start-and-stop-profiler-expected.txt:
+        * fast/profiler/one-execution-context-expected.txt:
+        * fast/profiler/profile-calls-in-included-file-expected.txt:
+        * fast/profiler/profile-with-no-title-expected.txt:
+        * fast/profiler/profiling-from-a-nested-location-but-stop-profiling-outside-the-nesting-expected.txt:
+        * fast/profiler/profiling-from-a-nested-location-expected.txt:
+        * fast/profiler/resources/profiler-test-JS-resources.js:
+        (printProfileNodeWithoutTime):
+        * fast/profiler/simple-event-call-expected.txt:
+        * fast/profiler/simple-no-level-change-expected.txt:
+        * fast/profiler/start-and-stop-profiler-multiple-times-expected.txt:
+        * fast/profiler/start-and-stop-profiling-in-the-same-function-expected.txt:
+        * fast/profiler/stop-profiling-after-setTimeout-expected.txt:
+        * fast/profiler/stop-then-function-call-expected.txt:
+        * fast/profiler/two-execution-contexts-expected.txt:
+        * fast/profiler/user-defined-function-calls-built-in-functions-expected.txt:
+        * fast/profiler/window-dot-eval-expected.txt:
+
 2014-01-30  Alexey Proskuryakov  <ap@apple.com>
 
         http/tests/security/cross-origin-plugin-private-browsing-toggled.html is flaky on WK2
index e1faf18..91e9ba7 100644 (file)
@@ -3,16 +3,16 @@ This page has an anonymous event handler.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. It should show the anonymous function at the same level as the onload handler. 
 
 Profile title: Anonymous event handler
-Thread_1 (no file) (line 0)
-   startTest anonymous-event-handler.html (line 11)
-      getElementById (no file) (line 0)
-      click (no file) (line 0)
-         onclick anonymous-event-handler.html (line 15)
-            insertNewText profiler-test-JS-resources.js (line 17)
-               createElement (no file) (line 0)
-               createTextNode (no file) (line 0)
-               appendChild (no file) (line 0)
-               getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest anonymous-event-handler.html (line 11:1)
+      getElementById (no file) (line 0:0)
+      click (no file) (line 0:0)
+         onclick anonymous-event-handler.html (line 15:54)
+            insertNewText profiler-test-JS-resources.js (line 17:26)
+               createElement (no file) (line 0:0)
+               createTextNode (no file) (line 0:0)
+               appendChild (no file) (line 0:0)
+               getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index afe210f..35cbf7f 100644 (file)
@@ -3,22 +3,22 @@ This page's JavaScript calls an anonymous function from different contexts.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. Beneath onload and startTest it should show three children, an anonymous function, script context, and the endTest call.
 
 Profile title: Same anonymous function called from different contexts
-Thread_1 (no file) (line 0)
-   startTest anonymous-function-called-from-different-contexts.html (line 11)
-      anonymousFunction profiler-test-JS-resources.js (line 29)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      eval (no file) (line 0)
-         (program) (no file) (line 1)
-            anonymousFunction profiler-test-JS-resources.js (line 29)
-               insertNewText profiler-test-JS-resources.js (line 17)
-                  createElement (no file) (line 0)
-                  createTextNode (no file) (line 0)
-                  appendChild (no file) (line 0)
-                  getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest anonymous-function-called-from-different-contexts.html (line 11:1)
+      anonymousFunction profiler-test-JS-resources.js (line 29:37)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      eval (no file) (line 0:0)
+         (program) (no file) (line 1:1)
+            anonymousFunction profiler-test-JS-resources.js (line 29:37)
+               insertNewText profiler-test-JS-resources.js (line 17:26)
+                  createElement (no file) (line 0:0)
+                  createTextNode (no file) (line 0:0)
+                  appendChild (no file) (line 0:0)
+                  getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index e66f6ac..f38c9f8 100644 (file)
@@ -3,14 +3,14 @@ This page has an anonymous JavaScript function that calls built-in functions.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. Beneath onload and startTest it should show three children, an anonymous function, script context, and the endTest call.
 
 Profile title: Anonymous function calls built-in functions
-Thread_1 (no file) (line 0)
-   startTest anonymous-function-calls-built-in-functions.html (line 11)
-      anonymousFunction profiler-test-JS-resources.js (line 29)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest anonymous-function-calls-built-in-functions.html (line 11:1)
+      anonymousFunction profiler-test-JS-resources.js (line 29:37)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 7bd8560..39997a5 100644 (file)
@@ -3,16 +3,16 @@ This page's JavaScript calls an anonymous function which calls eval().
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. Beneath onload and startTest it should show an (anonymous function) which has a (program) child.
 
 Profile title: Anonymous function calles eval
-Thread_1 (no file) (line 0)
-   startTest anonymous-function-calls-eval.html (line 11)
-      variableThatPointsToAnAnonymousFunction anonymous-function-calls-eval.html (line 14)
-         eval (no file) (line 0)
-            (program) (no file) (line 1)
-               insertNewText profiler-test-JS-resources.js (line 17)
-                  createElement (no file) (line 0)
-                  createTextNode (no file) (line 0)
-                  appendChild (no file) (line 0)
-                  getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest anonymous-function-calls-eval.html (line 11:1)
+      variableThatPointsToAnAnonymousFunction anonymous-function-calls-eval.html (line 14:62)
+         eval (no file) (line 0:0)
+            (program) (no file) (line 1:1)
+               insertNewText profiler-test-JS-resources.js (line 17:26)
+                  createElement (no file) (line 0:0)
+                  createTextNode (no file) (line 0:0)
+                  appendChild (no file) (line 0:0)
+                  getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 1e669bf..335f63d 100644 (file)
@@ -3,14 +3,14 @@ This page's JavaScript calls anonymous functions with display names.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. You should see functions named "[x] iterations function", and no anonymous functions.
 
 Profile title: Anonymous functions with display names
-Thread_1 (no file) (line 0)
-   startTest anonymous-functions-with-display-names.html (line 23)
-      anonymousFunctionGenerator anonymous-functions-with-display-names.html (line 11)
-      0 iterations function anonymous-functions-with-display-names.html (line 13)
-      1 iterations function anonymous-functions-with-display-names.html (line 13)
-      2 iterations function anonymous-functions-with-display-names.html (line 13)
-      20 iterations function anonymous-functions-with-display-names.html (line 13)
-      1000 iterations function anonymous-functions-with-display-names.html (line 13)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest anonymous-functions-with-display-names.html (line 23:1)
+      anonymousFunctionGenerator anonymous-functions-with-display-names.html (line 11:1)
+      0 iterations function anonymous-functions-with-display-names.html (line 13:5)
+      1 iterations function anonymous-functions-with-display-names.html (line 13:5)
+      2 iterations function anonymous-functions-with-display-names.html (line 13:5)
+      20 iterations function anonymous-functions-with-display-names.html (line 13:5)
+      1000 iterations function anonymous-functions-with-display-names.html (line 13:5)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 1348f6c..eeea07f 100644 (file)
@@ -3,10 +3,10 @@ This page's JavaScript has a call to apply() in it.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be a call to fakeInteriorFunction() and a call to apply().
 
 Profile title: Using the apply() method
-Thread_1 (no file) (line 0)
-   startTest apply.html (line 11)
-      fakeObject apply.html (line 18)
-         fakeInteriorFunction apply.html (line 24)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest apply.html (line 11:1)
+      fakeObject apply.html (line 18:1)
+         fakeInteriorFunction apply.html (line 24:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 7e41913..73a1e08 100644 (file)
@@ -3,12 +3,12 @@ This page uses a built-in function to call an anonymous function.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile map() should be the sibling of an (anonymous function) which has arrayOperatorFunction() as a child.
 
 Profile title: Built-in function calls an anonymous function
-Thread_1 (no file) (line 0)
-   startTest built-in-function-calls-anonymous.html (line 11)
-      Array (no file) (line 0)
-      map (no file) (line 0)
-         myFunction built-in-function-calls-anonymous.html (line 14)
-            arrayOperatorFunction profiler-test-JS-resources.js (line 25)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest built-in-function-calls-anonymous.html (line 11:1)
+      Array (no file) (line 0:0)
+      map (no file) (line 0:0)
+         myFunction built-in-function-calls-anonymous.html (line 14:45)
+            arrayOperatorFunction profiler-test-JS-resources.js (line 25:46)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 1b5a348..1d8e97e 100644 (file)
@@ -3,11 +3,11 @@ This page uses a built-in function to call a user defined function.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile map() should have arrayOperatorFunction() as a child.
 
 Profile title: Built-in function calls a user defined function
-Thread_1 (no file) (line 0)
-   startTest built-in-function-calls-user-defined-function.html (line 11)
-      Array (no file) (line 0)
-      map (no file) (line 0)
-         arrayOperatorFunction profiler-test-JS-resources.js (line 25)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest built-in-function-calls-user-defined-function.html (line 11:1)
+      Array (no file) (line 0:0)
+      map (no file) (line 0:0)
+         arrayOperatorFunction profiler-test-JS-resources.js (line 25:46)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index fc2c302..536d11c 100644 (file)
@@ -3,10 +3,10 @@ This page's JavaScript has a call to call() in it.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be a call to fakeObject() with call() as its child and a fakeInteriorFunction() as call()'s child.
 
 Profile title: Using the call() method
-Thread_1 (no file) (line 0)
-   startTest call.html (line 11)
-      fakeObject call.html (line 20)
-         fakeInteriorFunction call.html (line 26)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest call.html (line 11:1)
+      fakeObject call.html (line 20:1)
+         fakeInteriorFunction call.html (line 26:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 2558fe2..4c5cfcb 100644 (file)
@@ -3,10 +3,10 @@ This page's JavaScript starts profiling from within a function which is then cal
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profiler you should see a call to indirection() and functionWichStartsAndStopsTheProfiler()
 
 Profile title: Calling the same function where the profile started from another function
-Thread_1 (no file) (line 0)
-   indirection calling-the-function-that-started-the-profiler-from-another-scope.html (line 18)
-      functionWichStartsAndStopsTheProfiler calling-the-function-that-started-the-profiler-from-another-scope.html (line 24)
-   functionWichStartsAndStopsTheProfiler calling-the-function-that-started-the-profiler-from-another-scope.html (line 24)
-   endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   indirection calling-the-function-that-started-the-profiler-from-another-scope.html (line 18:1)
+      functionWichStartsAndStopsTheProfiler calling-the-function-that-started-the-profiler-from-another-scope.html (line 24:1)
+   functionWichStartsAndStopsTheProfiler calling-the-function-that-started-the-profiler-from-another-scope.html (line 24:1)
+   endTest profiler-test-JS-resources.js (line 1:20)
 
 
index fb4bf10..d0e06fe 100644 (file)
@@ -3,15 +3,15 @@ This page has multiple profiles with the same name.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. It should not crash or hang and there should be multiple runs of the same named profile.
 
 Profile title: Test
-Thread_1 (no file) (line 0)
-   startTest compare-multiple-profiles.html (line 23)
-      test compare-multiple-profiles.html (line 11)
-         test2 compare-multiple-profiles.html (line 17)
+Thread_1 (no file) (line 0:0)
+   startTest compare-multiple-profiles.html (line 23:1)
+      test compare-multiple-profiles.html (line 11:20)
+         test2 compare-multiple-profiles.html (line 17:21)
 
 Profile title: Test
-Thread_1 (no file) (line 0)
-   startTest compare-multiple-profiles.html (line 23)
-      test compare-multiple-profiles.html (line 11)
-         test2 compare-multiple-profiles.html (line 17)
+Thread_1 (no file) (line 0:0)
+   startTest compare-multiple-profiles.html (line 23:1)
+      test compare-multiple-profiles.html (line 11:20)
+         test2 compare-multiple-profiles.html (line 17:21)
 
 
index 551d77c..2c761b1 100644 (file)
@@ -3,10 +3,10 @@ This page's JavaScript has a call to new() in it.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be a call to fakeObject() and Array() in it.
 
 Profile title: Using a constructor.
-Thread_1 (no file) (line 0)
-   startTest constructor.html (line 11)
-      fakeObject constructor.html (line 20)
-         Array (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest constructor.html (line 11:1)
+      fakeObject constructor.html (line 20:1)
+         Array (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index e6f2532..f1cbf4f 100644 (file)
@@ -3,11 +3,11 @@ This page's JavaScript Has some dead time in the profile.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be a large amount of the % spent in (non-JavaScript).
 
 Profile title: Dead time in profile.
-Thread_1 (no file) (line 0)
-   onload dead-time.html (line 21)
-      startTest dead-time.html (line 13)
-         setTimeout (no file) (line 0)
-   (program) dead-time.html (line 1)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   onload dead-time.html (line 21:1)
+      startTest dead-time.html (line 13:1)
+         setTimeout (no file) (line 0:0)
+   (program) dead-time.html (line 1:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 8dadf86..daf4560 100644 (file)
@@ -1,8 +1,8 @@
 
 Profile title: Call Document.write()
-Thread_1 (no file) (line 0)
-   startTest document-dot-write.html (line 11)
-      write (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest document-dot-write.html (line 11:1)
+      write (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 9b89db2..7ad37c2 100644 (file)
@@ -3,16 +3,16 @@ This page has an event handler.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile insertnewText() should be a sibling to onload(). 
 
 Profile title: Event handler
-Thread_1 (no file) (line 0)
-   startTest event-handler.html (line 11)
-      getElementById (no file) (line 0)
-      addEventListener (no file) (line 0)
-      click (no file) (line 0)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest event-handler.html (line 11:1)
+      getElementById (no file) (line 0:0)
+      addEventListener (no file) (line 0:0)
+      click (no file) (line 0:0)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 7e3721e..271d6a5 100644 (file)
@@ -3,14 +3,14 @@ This page has a call to eval and a script tag on the same line.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be multiple (program) elements and one that represents the eval().
 
 Profile title: Two Execution Contexts on the same line
-Thread_1 (no file) (line 0)
-   startTest execution-context-and-eval-on-same-line.html (line 11)
-      evalFunction (no file) (line 1)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest execution-context-and-eval-on-same-line.html (line 11:1)
+      evalFunction (no file) (line 1:25)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 38a3012..ef6ee8d 100644 (file)
@@ -3,18 +3,18 @@ This page has an inline event handler.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile onclick() should be a sibling to onload() and onclick() should have eventListener() as a child. 
 
 Profile title: Inline event handler
-Thread_1 (no file) (line 0)
-   startTest inline-event-handler.html (line 11)
-      getElementById (no file) (line 0)
-      click (no file) (line 0)
-         onclick inline-event-handler.html (line 31)
-            eventListener inline-event-handler.html (line 17)
-               anonymousFunction profiler-test-JS-resources.js (line 29)
-                  insertNewText profiler-test-JS-resources.js (line 17)
-                     createElement (no file) (line 0)
-                     createTextNode (no file) (line 0)
-                     appendChild (no file) (line 0)
-                     getElementById (no file) (line 0)
-               endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest inline-event-handler.html (line 11:1)
+      getElementById (no file) (line 0:0)
+      click (no file) (line 0:0)
+         onclick inline-event-handler.html (line 31:1)
+            eventListener inline-event-handler.html (line 17:26)
+               anonymousFunction profiler-test-JS-resources.js (line 29:37)
+                  insertNewText profiler-test-JS-resources.js (line 17:26)
+                     createElement (no file) (line 0:0)
+                     createTextNode (no file) (line 0:0)
+                     appendChild (no file) (line 0:0)
+                     getElementById (no file) (line 0:0)
+               endTest profiler-test-JS-resources.js (line 1:20)
 
 
index d66e054..d5d169f 100644 (file)
@@ -3,34 +3,34 @@ This page's JavaScript has many function calls in the same scope.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile many functions should be the children of startTest. Use the sorting capabilites to make sure the similarly named functions are sorted correctly.
 
 Profile title: Many Calls In The Same Scope
-Thread_1 (no file) (line 0)
-   startTest many-calls-in-the-same-scope.html (line 11)
-      insertNewText profiler-test-JS-resources.js (line 17)
-         createElement (no file) (line 0)
-         createTextNode (no file) (line 0)
-         appendChild (no file) (line 0)
-         getElementById (no file) (line 0)
-      insertGivenText profiler-test-JS-resources.js (line 9)
-         createElement (no file) (line 0)
-         createTextNode (no file) (line 0)
-         appendChild (no file) (line 0)
-         getElementById (no file) (line 0)
-      arrayOperatorFunction profiler-test-JS-resources.js (line 25)
-      intermediaryFunction profiler-test-JS-resources.js (line 33)
-         anonymousFunction profiler-test-JS-resources.js (line 29)
-            insertNewText profiler-test-JS-resources.js (line 17)
-               createElement (no file) (line 0)
-               createTextNode (no file) (line 0)
-               appendChild (no file) (line 0)
-               getElementById (no file) (line 0)
-      anonymousFunction profiler-test-JS-resources.js (line 29)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      end many-calls-in-the-same-scope.html (line 27)
-      endT many-calls-in-the-same-scope.html (line 32)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest many-calls-in-the-same-scope.html (line 11:1)
+      insertNewText profiler-test-JS-resources.js (line 17:26)
+         createElement (no file) (line 0:0)
+         createTextNode (no file) (line 0:0)
+         appendChild (no file) (line 0:0)
+         getElementById (no file) (line 0:0)
+      insertGivenText profiler-test-JS-resources.js (line 9:32)
+         createElement (no file) (line 0:0)
+         createTextNode (no file) (line 0:0)
+         appendChild (no file) (line 0:0)
+         getElementById (no file) (line 0:0)
+      arrayOperatorFunction profiler-test-JS-resources.js (line 25:46)
+      intermediaryFunction profiler-test-JS-resources.js (line 33:1)
+         anonymousFunction profiler-test-JS-resources.js (line 29:37)
+            insertNewText profiler-test-JS-resources.js (line 17:26)
+               createElement (no file) (line 0:0)
+               createTextNode (no file) (line 0:0)
+               appendChild (no file) (line 0:0)
+               getElementById (no file) (line 0:0)
+      anonymousFunction profiler-test-JS-resources.js (line 29:37)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      end many-calls-in-the-same-scope.html (line 27:1)
+      endT many-calls-in-the-same-scope.html (line 32:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index d19c6c9..47daac9 100644 (file)
@@ -3,21 +3,21 @@ This page's JavaScript calls the same anonymous function from multiple and diffe
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be a call to fakeObject with fakeInteriorFunction as its child, but call() should not be shown.
 
 Profile title: Multiple and different scoped calls to the same anonymous function
-Thread_1 (no file) (line 0)
-   startTest multiple-and-different-scoped-anonymous-function-calls.html (line 11)
-      anonymousFunction profiler-test-JS-resources.js (line 29)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      intermediaryFunction profiler-test-JS-resources.js (line 33)
-         anonymousFunction profiler-test-JS-resources.js (line 29)
-            insertNewText profiler-test-JS-resources.js (line 17)
-               createElement (no file) (line 0)
-               createTextNode (no file) (line 0)
-               appendChild (no file) (line 0)
-               getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest multiple-and-different-scoped-anonymous-function-calls.html (line 11:1)
+      anonymousFunction profiler-test-JS-resources.js (line 29:37)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      intermediaryFunction profiler-test-JS-resources.js (line 33:1)
+         anonymousFunction profiler-test-JS-resources.js (line 29:37)
+            insertNewText profiler-test-JS-resources.js (line 17:26)
+               createElement (no file) (line 0:0)
+               createTextNode (no file) (line 0:0)
+               appendChild (no file) (line 0:0)
+               getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 5fd27d9..46f60f5 100644 (file)
@@ -3,20 +3,20 @@ This page's JavaScript calls the same function from multiple and differently sco
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be two calls to insertNewText under startTest() and one under an (anonymous function) under intermediaryFunction().
 
 Profile title: Multiple and different scoped calls to the same function
-Thread_1 (no file) (line 0)
-   startTest multiple-and-different-scoped-function-calls.html (line 11)
-      insertNewText profiler-test-JS-resources.js (line 17)
-         createElement (no file) (line 0)
-         createTextNode (no file) (line 0)
-         appendChild (no file) (line 0)
-         getElementById (no file) (line 0)
-      intermediaryFunction profiler-test-JS-resources.js (line 33)
-         anonymousFunction profiler-test-JS-resources.js (line 29)
-            insertNewText profiler-test-JS-resources.js (line 17)
-               createElement (no file) (line 0)
-               createTextNode (no file) (line 0)
-               appendChild (no file) (line 0)
-               getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest multiple-and-different-scoped-function-calls.html (line 11:1)
+      insertNewText profiler-test-JS-resources.js (line 17:26)
+         createElement (no file) (line 0:0)
+         createTextNode (no file) (line 0:0)
+         appendChild (no file) (line 0:0)
+         getElementById (no file) (line 0:0)
+      intermediaryFunction profiler-test-JS-resources.js (line 33:1)
+         anonymousFunction profiler-test-JS-resources.js (line 29:37)
+            insertNewText profiler-test-JS-resources.js (line 17:26)
+               createElement (no file) (line 0:0)
+               createTextNode (no file) (line 0:0)
+               appendChild (no file) (line 0:0)
+               getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 08af384..6946445 100644 (file)
@@ -3,20 +3,20 @@ This page's JavaScript calls the different anonymous functions the same scope.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be a call two entries named to (anonymous function), as opposed to one entry called twice.
 
 Profile title: Multiple calls to different anonymous functions
-Thread_1 (no file) (line 0)
-   startTest multiple-anonymous-functions-called-from-the-same-function.html (line 11)
-      anonymousFunction profiler-test-JS-resources.js (line 29)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      anotherAnonymousFunction profiler-test-JS-resources.js (line 30)
-         insertGivenText profiler-test-JS-resources.js (line 9)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest multiple-anonymous-functions-called-from-the-same-function.html (line 11:1)
+      anonymousFunction profiler-test-JS-resources.js (line 29:37)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      anotherAnonymousFunction profiler-test-JS-resources.js (line 30:44)
+         insertGivenText profiler-test-JS-resources.js (line 9:32)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index f7e74f8..96a76ee 100644 (file)
@@ -3,16 +3,16 @@ This test has JS executing in another window.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be a call to functionInOtherFrame().
 
 Profile title: Other window executing JavaScript
-Thread_1 (no file) (line 0)
-   startTest multiple-frames.html (line 11)
-      getElementById (no file) (line 0)
-      functionInOtherFrame other-frame.html (line 4)
-         functionInParentFrame multiple-frames.html (line 21)
-      insertGivenText profiler-test-JS-resources.js (line 9)
-         createElement (no file) (line 0)
-         createTextNode (no file) (line 0)
-         appendChild (no file) (line 0)
-         getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest multiple-frames.html (line 11:1)
+      getElementById (no file) (line 0:0)
+      functionInOtherFrame other-frame.html (line 4:33)
+         functionInParentFrame multiple-frames.html (line 21:34)
+      insertGivenText profiler-test-JS-resources.js (line 9:32)
+         createElement (no file) (line 0:0)
+         createTextNode (no file) (line 0:0)
+         appendChild (no file) (line 0:0)
+         getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 3c0a4f9..c70e717 100644 (file)
@@ -3,14 +3,14 @@ This page's JavaScript calls named functions and changes their display names.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. You should see functions named "[x] iteration[s] function", and not "function[x]"
 
 Profile title: Named functions with display names
-Thread_1 (no file) (line 0)
-   startTest named-functions-with-display-names.html (line 54)
-      0 iterations function named-functions-with-display-names.html (line 11)
-      1 iteration function named-functions-with-display-names.html (line 18)
-      2 iterations function named-functions-with-display-names.html (line 25)
-      20 iterations function named-functions-with-display-names.html (line 32)
-      1000 iterations function named-functions-with-display-names.html (line 39)
-      bogusDisplayNameFunction named-functions-with-display-names.html (line 47)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest named-functions-with-display-names.html (line 54:1)
+      0 iterations function named-functions-with-display-names.html (line 11:1)
+      1 iteration function named-functions-with-display-names.html (line 18:1)
+      2 iterations function named-functions-with-display-names.html (line 25:1)
+      20 iterations function named-functions-with-display-names.html (line 32:1)
+      1000 iterations function named-functions-with-display-names.html (line 39:1)
+      bogusDisplayNameFunction named-functions-with-display-names.html (line 47:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 56a1dff..078ec1a 100644 (file)
@@ -3,15 +3,15 @@ This page's JavaScript calls an anonymous which calls a nested anonymous functio
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be an (anonymous function) with a child (anonymous function).
 
 Profile title: Nested anonymous functions called
-Thread_1 (no file) (line 0)
-   startTest nested-anonymous-functon.html (line 11)
-      AnonymousFunctionWichCallsAnAnonymousFunction nested-anonymous-functon.html (line 14)
-         anonymousFunction profiler-test-JS-resources.js (line 29)
-            insertNewText profiler-test-JS-resources.js (line 17)
-               createElement (no file) (line 0)
-               createTextNode (no file) (line 0)
-               appendChild (no file) (line 0)
-               getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest nested-anonymous-functon.html (line 11:1)
+      AnonymousFunctionWichCallsAnAnonymousFunction nested-anonymous-functon.html (line 14:68)
+         anonymousFunction profiler-test-JS-resources.js (line 29:37)
+            insertNewText profiler-test-JS-resources.js (line 17:26)
+               createElement (no file) (line 0:0)
+               createTextNode (no file) (line 0:0)
+               appendChild (no file) (line 0:0)
+               getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index a89c870..103bdca 100644 (file)
@@ -3,126 +3,126 @@ This page's JavaScript calls console.profile() three times then console.profileE
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profiler there should be three profiles.
 
 Profile title: Start the profiler the third time.
-Thread_1 (no file) (line 0)
-   startTest nested-start-and-stop-profiler.html (line 11)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest nested-start-and-stop-profiler.html (line 11:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
 Profile title: Start the profiler the third time.
-Thread_1 (no file) (line 0)
-   startTest nested-start-and-stop-profiler.html (line 11)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest nested-start-and-stop-profiler.html (line 11:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 Profile title: Start the profiler the second time.
-Thread_1 (no file) (line 0)
-   startTest nested-start-and-stop-profiler.html (line 11)
-      endTest profiler-test-JS-resources.js (line 1)
-         profileEnd (no file) (line 0)
-         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 63)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-               replace (no file) (line 0)
-               createTextNode (no file) (line 0)
-               appendChild (no file) (line 0)
-               children (no file) (line 0)
-               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-                  replace (no file) (line 0)
-                  createTextNode (no file) (line 0)
-                  appendChild (no file) (line 0)
-                  children (no file) (line 0)
-                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-                     replace (no file) (line 0)
-                     createTextNode (no file) (line 0)
-                     appendChild (no file) (line 0)
-                     children (no file) (line 0)
-            getElementById (no file) (line 0)
-         notifyDone (no file) (line 0)
+Thread_1 (no file) (line 0:0)
+   startTest nested-start-and-stop-profiler.html (line 11:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
+         profileEnd (no file) (line 0:0)
+         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 63:1)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+               replace (no file) (line 0:0)
+               createTextNode (no file) (line 0:0)
+               appendChild (no file) (line 0:0)
+               children (no file) (line 0:0)
+               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                  replace (no file) (line 0:0)
+                  createTextNode (no file) (line 0:0)
+                  appendChild (no file) (line 0:0)
+                  children (no file) (line 0:0)
+                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                     replace (no file) (line 0:0)
+                     createTextNode (no file) (line 0:0)
+                     appendChild (no file) (line 0:0)
+                     children (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+         notifyDone (no file) (line 0:0)
 
 
 Profile title: Start the profiler the third time.
-Thread_1 (no file) (line 0)
-   startTest nested-start-and-stop-profiler.html (line 11)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest nested-start-and-stop-profiler.html (line 11:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 Profile title: Start the profiler the second time.
-Thread_1 (no file) (line 0)
-   startTest nested-start-and-stop-profiler.html (line 11)
-      endTest profiler-test-JS-resources.js (line 1)
-         profileEnd (no file) (line 0)
-         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 63)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-               replace (no file) (line 0)
-               createTextNode (no file) (line 0)
-               appendChild (no file) (line 0)
-               children (no file) (line 0)
-               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-                  replace (no file) (line 0)
-                  createTextNode (no file) (line 0)
-                  appendChild (no file) (line 0)
-                  children (no file) (line 0)
-                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-                     replace (no file) (line 0)
-                     createTextNode (no file) (line 0)
-                     appendChild (no file) (line 0)
-                     children (no file) (line 0)
-            getElementById (no file) (line 0)
-         notifyDone (no file) (line 0)
+Thread_1 (no file) (line 0:0)
+   startTest nested-start-and-stop-profiler.html (line 11:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
+         profileEnd (no file) (line 0:0)
+         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 63:1)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+               replace (no file) (line 0:0)
+               createTextNode (no file) (line 0:0)
+               appendChild (no file) (line 0:0)
+               children (no file) (line 0:0)
+               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                  replace (no file) (line 0:0)
+                  createTextNode (no file) (line 0:0)
+                  appendChild (no file) (line 0:0)
+                  children (no file) (line 0:0)
+                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                     replace (no file) (line 0:0)
+                     createTextNode (no file) (line 0:0)
+                     appendChild (no file) (line 0:0)
+                     children (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+         notifyDone (no file) (line 0:0)
 
 Profile title: Start the profiler the first time.
-Thread_1 (no file) (line 0)
-   startTest nested-start-and-stop-profiler.html (line 11)
-      endTest profiler-test-JS-resources.js (line 1)
-         profileEnd (no file) (line 0)
-         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 63)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-               replace (no file) (line 0)
-               createTextNode (no file) (line 0)
-               appendChild (no file) (line 0)
-               children (no file) (line 0)
-               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-                  replace (no file) (line 0)
-                  createTextNode (no file) (line 0)
-                  appendChild (no file) (line 0)
-                  children (no file) (line 0)
-                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-                     replace (no file) (line 0)
-                     createTextNode (no file) (line 0)
-                     appendChild (no file) (line 0)
-                     children (no file) (line 0)
-                     printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-                        replace (no file) (line 0)
-                        createTextNode (no file) (line 0)
-                        appendChild (no file) (line 0)
-                        children (no file) (line 0)
-                        printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-                           replace (no file) (line 0)
-                           createTextNode (no file) (line 0)
-                           appendChild (no file) (line 0)
-                           children (no file) (line 0)
-                           printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-                              replace (no file) (line 0)
-                              createTextNode (no file) (line 0)
-                              appendChild (no file) (line 0)
-                              children (no file) (line 0)
-                              printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-                                 replace (no file) (line 0)
-                                 createTextNode (no file) (line 0)
-                                 appendChild (no file) (line 0)
-                                 children (no file) (line 0)
-                                 printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78)
-                                    replace (no file) (line 0)
-                                    createTextNode (no file) (line 0)
-                                    appendChild (no file) (line 0)
-                                    children (no file) (line 0)
-            getElementById (no file) (line 0)
-         notifyDone (no file) (line 0)
+Thread_1 (no file) (line 0:0)
+   startTest nested-start-and-stop-profiler.html (line 11:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
+         profileEnd (no file) (line 0:0)
+         printProfilesDataWithoutTime profiler-test-JS-resources.js (line 63:1)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+               replace (no file) (line 0:0)
+               createTextNode (no file) (line 0:0)
+               appendChild (no file) (line 0:0)
+               children (no file) (line 0:0)
+               printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                  replace (no file) (line 0:0)
+                  createTextNode (no file) (line 0:0)
+                  appendChild (no file) (line 0:0)
+                  children (no file) (line 0:0)
+                  printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                     replace (no file) (line 0:0)
+                     createTextNode (no file) (line 0:0)
+                     appendChild (no file) (line 0:0)
+                     children (no file) (line 0:0)
+                     printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                        replace (no file) (line 0:0)
+                        createTextNode (no file) (line 0:0)
+                        appendChild (no file) (line 0:0)
+                        children (no file) (line 0:0)
+                        printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                           replace (no file) (line 0:0)
+                           createTextNode (no file) (line 0:0)
+                           appendChild (no file) (line 0:0)
+                           children (no file) (line 0:0)
+                           printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                              replace (no file) (line 0:0)
+                              createTextNode (no file) (line 0:0)
+                              appendChild (no file) (line 0:0)
+                              children (no file) (line 0:0)
+                              printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                                 replace (no file) (line 0:0)
+                                 createTextNode (no file) (line 0:0)
+                                 appendChild (no file) (line 0:0)
+                                 children (no file) (line 0:0)
+                                 printProfileNodeWithoutTime profiler-test-JS-resources.js (line 78:1)
+                                    replace (no file) (line 0:0)
+                                    createTextNode (no file) (line 0:0)
+                                    appendChild (no file) (line 0:0)
+                                    children (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+         notifyDone (no file) (line 0:0)
 
 
index 96b7fdd..acdde43 100644 (file)
@@ -3,8 +3,8 @@ This page has a single script tag with some simple JavaScript.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile.
 
 Profile title: One Execution Context
-Thread_1 (no file) (line 0)
-   startTest one-execution-context.html (line 11)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest one-execution-context.html (line 11:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index d5121d9..98c59dd 100644 (file)
@@ -3,8 +3,8 @@ This page calls the profiler from the included file.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. If there is a profile that is sufficient for this test.
 
 Profile title: Profile call in included file
-Thread_1 (no file) (line 0)
-   startProfile profiler-test-JS-resources.js (line 43)
-   endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startProfile profiler-test-JS-resources.js (line 43:1)
+   endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 6156650..a519622 100644 (file)
@@ -3,8 +3,8 @@ This page creates a profile without a title.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. If there is a profile that is sufficient for this test.
 
 Profile title: org.webkit.profiles.user-initiated.1
-Thread_1 (no file) (line 0)
-   startTest profile-with-no-title.html (line 11)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest profile-with-no-title.html (line 11:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 2e78365..58fce40 100644 (file)
@@ -3,8 +3,8 @@ This page's JavaScript starts profiling from within a nested location but stops
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be a call to functionWichStartsAndStopsTheProfiler().
 
 Profile title: Profiling From A Nested Location But Stop Profiling Outside The Nesting
-Thread_1 (no file) (line 0)
-   functionWichStartsTheProfiler profiling-from-a-nested-location-but-stop-profiling-outside-the-nesting.html (line 17)
-   endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   functionWichStartsTheProfiler profiling-from-a-nested-location-but-stop-profiling-outside-the-nesting.html (line 17:1)
+   endTest profiler-test-JS-resources.js (line 1:20)
 
 
index bbe38e6..13d9958 100644 (file)
@@ -3,8 +3,8 @@ This page's JavaScript starts profiling from within a nested location.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be a call to functionWichStartsAndStopsTheProfiler().
 
 Profile title: Profiling From A Nested Location
-Thread_1 (no file) (line 0)
-   functionWichStartsAndStopsTheProfiler profiling-from-a-nested-location.html (line 16)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   functionWichStartsAndStopsTheProfiler profiling-from-a-nested-location.html (line 16:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index f4599c0..4fd5a05 100644 (file)
@@ -76,9 +76,6 @@ function printProfilesDataWithoutTime()
 
 function printProfileNodeWithoutTime(preElement, node, indentLevel)
 {
-    if (node.functionName == "(idle)")
-        return;
-
     var space = "";
     for (var i = 0; i < indentLevel; ++i)
         space += "   "
@@ -89,7 +86,7 @@ function printProfileNodeWithoutTime(preElement, node, indentLevel)
     if (!strippedURL)
         strippedURL = "(no file)";
 
-    var line = space + node.functionName + " " + strippedURL + " (line " + node.lineNumber + ")\n";
+    var line = space + node.functionName + " " + strippedURL + " (line " + node.lineNumber + ":" + node.columnNumber + ")\n";
     preElement.appendChild(document.createTextNode(line));
 
     var children = node.children();
index c34f4bf..b6a8331 100644 (file)
@@ -3,8 +3,8 @@ This page's JavaScript has an onload event.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. There should be only one onload node.
 
 Profile title: A simple profile test where an event happens.
-Thread_1 (no file) (line 0)
-   startTest simple-event-call.html (line 11)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest simple-event-call.html (line 11:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 65192d2..6afc34e 100644 (file)
@@ -3,8 +3,8 @@ This page's JavaScript starts and stops profiling from the same scope.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. There should be no function calls between console.profile() and console.profileEnd().
 
 Profile title: A simple profile test where no scope chagnes
-Thread_1 (no file) (line 0)
-   functionWichStartsAndStopsTheProfiler simple-no-level-change.html (line 16)
-      getElementById (no file) (line 0)
+Thread_1 (no file) (line 0:0)
+   functionWichStartsAndStopsTheProfiler simple-no-level-change.html (line 16:1)
+      getElementById (no file) (line 0:0)
 
 
index bd441b4..473dea4 100644 (file)
@@ -3,71 +3,71 @@ This page's JavaScript calls console.profile() and console.profileEnd() three ti
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profiler there should be three profiles.
 
 Profile title: Start the profiler the first time.
-Thread_1 (no file) (line 0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11)
-      anonymousFunction profiler-test-JS-resources.js (line 29)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
+      anonymousFunction profiler-test-JS-resources.js (line 29:37)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
 Profile title: Start the profiler the first time.
-Thread_1 (no file) (line 0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11)
-      anonymousFunction profiler-test-JS-resources.js (line 29)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
+      anonymousFunction profiler-test-JS-resources.js (line 29:37)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 Profile title: Start the profiler the second time.
-Thread_1 (no file) (line 0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11)
-      anonymousFunction profiler-test-JS-resources.js (line 29)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
+      anonymousFunction profiler-test-JS-resources.js (line 29:37)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
 Profile title: Start the profiler the first time.
-Thread_1 (no file) (line 0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11)
-      anonymousFunction profiler-test-JS-resources.js (line 29)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
+      anonymousFunction profiler-test-JS-resources.js (line 29:37)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 Profile title: Start the profiler the second time.
-Thread_1 (no file) (line 0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11)
-      anonymousFunction profiler-test-JS-resources.js (line 29)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
+      anonymousFunction profiler-test-JS-resources.js (line 29:37)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 Profile title: Start the profiler the third time.
-Thread_1 (no file) (line 0)
-   startTest start-and-stop-profiler-multiple-times.html (line 11)
-      anonymousFunction profiler-test-JS-resources.js (line 29)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest start-and-stop-profiler-multiple-times.html (line 11:1)
+      anonymousFunction profiler-test-JS-resources.js (line 29:37)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index d63a939..bffc653 100644 (file)
@@ -3,8 +3,8 @@ This page's JavaScript starts profiling from within a nested location.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be a call to functionWichStopsTheProfiler().
 
 Profile title: Profiling From A Nested Location
-Thread_1 (no file) (line 0)
-   startTest start-and-stop-profiling-in-the-same-function.html (line 11)
-      functionWichStopsTheProfiler start-and-stop-profiling-in-the-same-function.html (line 18)
+Thread_1 (no file) (line 0:0)
+   startTest start-and-stop-profiling-in-the-same-function.html (line 11:1)
+      functionWichStopsTheProfiler start-and-stop-profiling-in-the-same-function.html (line 18:1)
 
 
index 39a64e9..6bc4a2e 100644 (file)
@@ -3,11 +3,11 @@ This page's JavaScript stops profiling from a timeout.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile endProfile() should not be a child of (program).
 
 Profile title: Stop profiling from a timeout
-Thread_1 (no file) (line 0)
-   onload stop-profiling-after-setTimeout.html (line 21)
-      startTest stop-profiling-after-setTimeout.html (line 13)
-         setTimeout (no file) (line 0)
-   (program) stop-profiling-after-setTimeout.html (line 1)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   onload stop-profiling-after-setTimeout.html (line 21:1)
+      startTest stop-profiling-after-setTimeout.html (line 13:1)
+         setTimeout (no file) (line 0:0)
+   (program) stop-profiling-after-setTimeout.html (line 1:1)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 1f6e487..07e8570 100644 (file)
@@ -3,8 +3,8 @@ This page has an anonymous JavaScript function that calls built-in functions.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. There should be two nodes in the profile, a "(program)" node with one child that is "test".
 
 Profile title: Test
-Thread_1 (no file) (line 0)
-   (program) (no file) (line 1)
-      test stop-then-function-call.html (line 11)
+Thread_1 (no file) (line 0:0)
+   (program) (no file) (line 1:16)
+      test stop-then-function-call.html (line 11:20)
 
 
index a8979ce..102c081 100644 (file)
@@ -3,9 +3,9 @@ This page has two script tags with some simple JavaScript.
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be two (program) elements.
 
 Profile title: Two Execution Contexts
-Thread_1 (no file) (line 0)
-   startTest two-execution-contexts.html (line 11)
-      intermediaryFunction two-execution-contexts.html (line 18)
-         testEnd two-execution-contexts.html (line 33)
+Thread_1 (no file) (line 0:0)
+   startTest two-execution-contexts.html (line 11:1)
+      intermediaryFunction two-execution-contexts.html (line 18:1)
+         testEnd two-execution-contexts.html (line 33:20)
 
 
index e02a845..f0c2e41 100644 (file)
@@ -5,12 +5,12 @@ This is inserted Text
 
 
 Profile title: User defined function calles built-in functions
-Thread_1 (no file) (line 0)
-   startTest user-defined-function-calls-built-in-functions.html (line 11)
-      createElement (no file) (line 0)
-      createTextNode (no file) (line 0)
-      appendChild (no file) (line 0)
-      getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest user-defined-function-calls-built-in-functions.html (line 11:1)
+      createElement (no file) (line 0:0)
+      createTextNode (no file) (line 0:0)
+      appendChild (no file) (line 0:0)
+      getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 0d75818..8507288 100644 (file)
@@ -3,14 +3,14 @@ This page has a call to window.eval().
 To run this test manually, load it in the browser then load the WebInspector and look at the profile. In the profile there should be a call to eval().
 
 Profile title: Call window.eval()
-Thread_1 (no file) (line 0)
-   startTest window-dot-eval.html (line 11)
-      evalFunction (no file) (line 1)
-         insertNewText profiler-test-JS-resources.js (line 17)
-            createElement (no file) (line 0)
-            createTextNode (no file) (line 0)
-            appendChild (no file) (line 0)
-            getElementById (no file) (line 0)
-      endTest profiler-test-JS-resources.js (line 1)
+Thread_1 (no file) (line 0:0)
+   startTest window-dot-eval.html (line 11:1)
+      evalFunction (no file) (line 1:25)
+         insertNewText profiler-test-JS-resources.js (line 17:26)
+            createElement (no file) (line 0:0)
+            createTextNode (no file) (line 0:0)
+            appendChild (no file) (line 0:0)
+            getElementById (no file) (line 0:0)
+      endTest profiler-test-JS-resources.js (line 1:20)
 
 
index 279ab19..6893b0b 100644 (file)
@@ -1,3 +1,66 @@
+2014-01-28  Timothy Hatcher  <timothy@apple.com>
+
+        Add column number and call timing support to LegacyProfiler.
+
+        https://bugs.webkit.org/show_bug.cgi?id=127764
+
+        Reviewed by Joseph Pecoraro.
+
+        * interpreter/Interpreter.cpp:
+        (JSC::Interpreter::execute):
+        * profiler/CallIdentifier.h:
+        (JSC::CallIdentifier::CallIdentifier):
+        (JSC::CallIdentifier::functionName):
+        (JSC::CallIdentifier::url):
+        (JSC::CallIdentifier::lineNumber):
+        (JSC::CallIdentifier::columnNumber):
+        (JSC::CallIdentifier::operator==):
+        (JSC::CallIdentifier::operator!=):
+        (JSC::CallIdentifier::Hash::hash):
+        (WTF::HashTraits<JSC::CallIdentifier>::constructDeletedValue):
+        (WTF::HashTraits<JSC::CallIdentifier>::isDeletedValue):
+        * profiler/LegacyProfiler.cpp:
+        (JSC::LegacyProfiler::willExecute):
+        (JSC::LegacyProfiler::didExecute):
+        (JSC::LegacyProfiler::exceptionUnwind):
+        (JSC::LegacyProfiler::createCallIdentifier):
+        (JSC::createCallIdentifierFromFunctionImp):
+        * profiler/LegacyProfiler.h:
+        * profiler/Profile.cpp:
+        (JSC::Profile::Profile):
+        * profiler/Profile.h:
+        (JSC::Profile::uid):
+        (JSC::Profile::idleTime):
+        (JSC::Profile::setIdleTime):
+        * profiler/ProfileGenerator.cpp:
+        (JSC::AddParentForConsoleStartFunctor::operator()):
+        (JSC::ProfileGenerator::addParentForConsoleStart):
+        (JSC::ProfileGenerator::willExecute):
+        (JSC::ProfileGenerator::didExecute):
+        (JSC::ProfileGenerator::stopProfiling):
+        (JSC::ProfileGenerator::removeProfileStart):
+        (JSC::ProfileGenerator::removeProfileEnd):
+        * profiler/ProfileNode.cpp:
+        (JSC::ProfileNode::ProfileNode):
+        (JSC::ProfileNode::stopProfiling):
+        (JSC::ProfileNode::endAndRecordCall):
+        (JSC::ProfileNode::startTimer):
+        (JSC::ProfileNode::debugPrintData):
+        * profiler/ProfileNode.h:
+        (JSC::ProfileNode::Call::Call):
+        (JSC::ProfileNode::Call::startTime):
+        (JSC::ProfileNode::Call::setStartTime):
+        (JSC::ProfileNode::Call::totalTime):
+        (JSC::ProfileNode::Call::setTotalTime):
+        (JSC::ProfileNode::id):
+        (JSC::ProfileNode::functionName):
+        (JSC::ProfileNode::url):
+        (JSC::ProfileNode::lineNumber):
+        (JSC::ProfileNode::columnNumber):
+        (JSC::ProfileNode::calls):
+        (JSC::ProfileNode::lastCall):
+        (JSC::ProfileNode::numberOfCalls):
+
 2014-01-26  Timothy Hatcher  <timothy@apple.com>
 
         Include profile with FunctionCall and EvaluateScript Timeline records.
index ca890b0..fa88e0f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2009, 2010, 2012, 2013, 2014 Apple Inc. All rights reserved.
  * Copyright (C) 2008 Cameron Zwarich <cwzwarich@uwaterloo.ca>
  *
  * Redistribution and use in source and binary forms, with or without
@@ -890,7 +890,7 @@ failedJSONP:
     protoCallFrame.init(codeBlock, scope, 0, thisObj, 1);
 
     if (LegacyProfiler* profiler = vm.enabledProfiler())
-        profiler->willExecute(callFrame, program->sourceURL(), program->lineNo());
+        profiler->willExecute(callFrame, program->sourceURL(), program->lineNo(), program->startColumn());
 
     // Execute the code:
     JSValue result;
@@ -902,7 +902,7 @@ failedJSONP:
     }
 
     if (LegacyProfiler* profiler = vm.enabledProfiler())
-        profiler->didExecute(callFrame, program->sourceURL(), program->lineNo());
+        profiler->didExecute(callFrame, program->sourceURL(), program->lineNo(), program->startColumn());
 
     return checkedReturn(result);
 }
@@ -1169,7 +1169,7 @@ JSValue Interpreter::execute(EvalExecutable* eval, CallFrame* callFrame, JSValue
     protoCallFrame.init(codeBlock, scope, 0, thisValue, 1);
 
     if (LegacyProfiler* profiler = vm.enabledProfiler())
-        profiler->willExecute(callFrame, eval->sourceURL(), eval->lineNo());
+        profiler->willExecute(callFrame, eval->sourceURL(), eval->lineNo(), eval->startColumn());
 
     // Execute the code:
     JSValue result;
@@ -1181,7 +1181,7 @@ JSValue Interpreter::execute(EvalExecutable* eval, CallFrame* callFrame, JSValue
     }
 
     if (LegacyProfiler* profiler = vm.enabledProfiler())
-        profiler->didExecute(callFrame, eval->sourceURL(), eval->lineNo());
+        profiler->didExecute(callFrame, eval->sourceURL(), eval->lineNo(), eval->startColumn());
 
     return checkedReturn(result);
 }
index bf9f904..57683cf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2008, 2014 Apple Inc. All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -36,32 +36,37 @@ namespace JSC {
     struct CallIdentifier {
         WTF_MAKE_FAST_ALLOCATED;
     public:
-        String m_name;
-        String m_url;
-        unsigned m_lineNumber;
-
         CallIdentifier()
             : m_lineNumber(0)
+            , m_columnNumber(0)
         {
         }
 
-        CallIdentifier(const String& name, const String& url, int lineNumber)
-            : m_name(name)
+        CallIdentifier(const String& functionName, const String& url, unsigned lineNumber, unsigned columnNumber)
+            : m_functionName(functionName)
             , m_url(!url.isNull() ? url : "")
             , m_lineNumber(lineNumber)
+            , m_columnNumber(columnNumber)
         {
         }
 
-        inline bool operator==(const CallIdentifier& ci) const { return ci.m_lineNumber == m_lineNumber && ci.m_name == m_name && ci.m_url == m_url; }
-        inline bool operator!=(const CallIdentifier& ci) const { return !(*this == ci); }
+        const String& functionName() const { return m_functionName; }
+
+        const String& url() const { return m_url; }
+        unsigned lineNumber() const { return m_lineNumber; }
+        unsigned columnNumber() const { return m_columnNumber; }
+
+        inline bool operator==(const CallIdentifier& other) const { return other.m_lineNumber == m_lineNumber && other.m_columnNumber == m_columnNumber && other.m_functionName == m_functionName && other.m_url == m_url; }
+        inline bool operator!=(const CallIdentifier& other) const { return !(*this == other); }
 
         struct Hash {
             static unsigned hash(const CallIdentifier& key)
             {
-                unsigned hashCodes[3] = {
-                    key.m_name.impl()->hash(),
+                unsigned hashCodes[4] = {
+                    key.m_functionName.impl()->hash(),
                     key.m_url.impl()->hash(),
-                    key.m_lineNumber
+                    key.m_lineNumber,
+                    key.m_columnNumber
                 };
                 return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes);
             }
@@ -76,6 +81,12 @@ namespace JSC {
         operator const char*() const { return c_str(); }
         const char* c_str() const { return m_name.utf8().data(); }
 #endif
+
+    private:
+        String m_functionName;
+        String m_url;
+        unsigned m_lineNumber;
+        unsigned m_columnNumber;
     };
 
 } // namespace JSC
@@ -87,15 +98,15 @@ namespace WTF {
     template<> struct HashTraits<JSC::CallIdentifier> : GenericHashTraits<JSC::CallIdentifier> {
         static void constructDeletedValue(JSC::CallIdentifier& slot)
         {
-            new (NotNull, &slot) JSC::CallIdentifier(String(), String(), std::numeric_limits<unsigned>::max());
+            new (NotNull, &slot) JSC::CallIdentifier(String(), String(), std::numeric_limits<unsigned>::max(), std::numeric_limits<unsigned>::max());
         }
+
         static bool isDeletedValue(const JSC::CallIdentifier& value)
         {
-            return value.m_name.isNull() && value.m_url.isNull() && value.m_lineNumber == std::numeric_limits<unsigned>::max();
+            return value.functionName().isNull() && value.url().isNull() && value.lineNumber() == std::numeric_limits<unsigned>::max() && value.columnNumber() == std::numeric_limits<unsigned>::max();
         }
     };
 
 } // namespace WTF
 
 #endif  // CallIdentifier_h
-
index dd2acd9..680abba 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2012, 2014 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -47,7 +47,7 @@ static const char* GlobalCodeExecution = "(program)";
 static const char* AnonymousFunction = "(anonymous function)";
 static unsigned ProfilesUID = 0;
 
-static CallIdentifier createCallIdentifierFromFunctionImp(ExecState*, JSObject*, const String& defaultSourceURL, int defaultLineNumber);
+static CallIdentifier createCallIdentifierFromFunctionImp(ExecState*, JSObject*, const String& defaultSourceURL, unsigned defaultLineNumber, unsigned defaultColumnNumber);
 
 LegacyProfiler* LegacyProfiler::s_sharedLegacyProfiler = 0;
 
@@ -128,14 +128,14 @@ void LegacyProfiler::willExecute(ExecState* callerCallFrame, JSValue function)
 {
     ASSERT(!m_currentProfiles.isEmpty());
 
-    dispatchFunctionToProfiles(callerCallFrame, m_currentProfiles, &ProfileGenerator::willExecute, createCallIdentifier(callerCallFrame, function, "", 0), callerCallFrame->lexicalGlobalObject()->profileGroup());
+    dispatchFunctionToProfiles(callerCallFrame, m_currentProfiles, &ProfileGenerator::willExecute, createCallIdentifier(callerCallFrame, function, ASCIILiteral(""), 0, 0), callerCallFrame->lexicalGlobalObject()->profileGroup());
 }
 
-void LegacyProfiler::willExecute(ExecState* callerCallFrame, const String& sourceURL, int startingLineNumber)
+void LegacyProfiler::willExecute(ExecState* callerCallFrame, const String& sourceURL, unsigned startingLineNumber, unsigned startingColumnNumber)
 {
     ASSERT(!m_currentProfiles.isEmpty());
 
-    CallIdentifier callIdentifier = createCallIdentifier(callerCallFrame, JSValue(), sourceURL, startingLineNumber);
+    CallIdentifier callIdentifier = createCallIdentifier(callerCallFrame, JSValue(), sourceURL, startingLineNumber, startingColumnNumber);
 
     dispatchFunctionToProfiles(callerCallFrame, m_currentProfiles, &ProfileGenerator::willExecute, callIdentifier, callerCallFrame->lexicalGlobalObject()->profileGroup());
 }
@@ -144,41 +144,41 @@ void LegacyProfiler::didExecute(ExecState* callerCallFrame, JSValue function)
 {
     ASSERT(!m_currentProfiles.isEmpty());
 
-    dispatchFunctionToProfiles(callerCallFrame, m_currentProfiles, &ProfileGenerator::didExecute, createCallIdentifier(callerCallFrame, function, "", 0), callerCallFrame->lexicalGlobalObject()->profileGroup());
+    dispatchFunctionToProfiles(callerCallFrame, m_currentProfiles, &ProfileGenerator::didExecute, createCallIdentifier(callerCallFrame, function, ASCIILiteral(""), 0, 0), callerCallFrame->lexicalGlobalObject()->profileGroup());
 }
 
-void LegacyProfiler::didExecute(ExecState* callerCallFrame, const String& sourceURL, int startingLineNumber)
+void LegacyProfiler::didExecute(ExecState* callerCallFrame, const String& sourceURL, unsigned startingLineNumber, unsigned startingColumnNumber)
 {
     ASSERT(!m_currentProfiles.isEmpty());
 
-    dispatchFunctionToProfiles(callerCallFrame, m_currentProfiles, &ProfileGenerator::didExecute, createCallIdentifier(callerCallFrame, JSValue(), sourceURL, startingLineNumber), callerCallFrame->lexicalGlobalObject()->profileGroup());
+    dispatchFunctionToProfiles(callerCallFrame, m_currentProfiles, &ProfileGenerator::didExecute, createCallIdentifier(callerCallFrame, JSValue(), sourceURL, startingLineNumber, startingColumnNumber), callerCallFrame->lexicalGlobalObject()->profileGroup());
 }
 
 void LegacyProfiler::exceptionUnwind(ExecState* handlerCallFrame)
 {
     ASSERT(!m_currentProfiles.isEmpty());
 
-    dispatchFunctionToProfiles(handlerCallFrame, m_currentProfiles, &ProfileGenerator::exceptionUnwind, createCallIdentifier(handlerCallFrame, JSValue(), "", 0), handlerCallFrame->lexicalGlobalObject()->profileGroup());
+    dispatchFunctionToProfiles(handlerCallFrame, m_currentProfiles, &ProfileGenerator::exceptionUnwind, createCallIdentifier(handlerCallFrame, JSValue(), ASCIILiteral(""), 0, 0), handlerCallFrame->lexicalGlobalObject()->profileGroup());
 }
 
-CallIdentifier LegacyProfiler::createCallIdentifier(ExecState* exec, JSValue functionValue, const String& defaultSourceURL, int defaultLineNumber)
+CallIdentifier LegacyProfiler::createCallIdentifier(ExecState* exec, JSValue functionValue, const String& defaultSourceURL, unsigned defaultLineNumber, unsigned defaultColumnNumber)
 {
     if (!functionValue)
-        return CallIdentifier(GlobalCodeExecution, defaultSourceURL, defaultLineNumber);
+        return CallIdentifier(ASCIILiteral(GlobalCodeExecution), defaultSourceURL, defaultLineNumber, defaultColumnNumber);
     if (!functionValue.isObject())
-        return CallIdentifier("(unknown)", defaultSourceURL, defaultLineNumber);
+        return CallIdentifier(ASCIILiteral("(unknown)"), defaultSourceURL, defaultLineNumber, defaultColumnNumber);
     if (asObject(functionValue)->inherits(JSFunction::info()) || asObject(functionValue)->inherits(InternalFunction::info()))
-        return createCallIdentifierFromFunctionImp(exec, asObject(functionValue), defaultSourceURL, defaultLineNumber);
-    return CallIdentifier(makeString("(", asObject(functionValue)->methodTable()->className(asObject(functionValue)), " object)"), defaultSourceURL, defaultLineNumber);
+        return createCallIdentifierFromFunctionImp(exec, asObject(functionValue), defaultSourceURL, defaultLineNumber, defaultColumnNumber);
+    return CallIdentifier(asObject(functionValue)->methodTable()->className(asObject(functionValue)), defaultSourceURL, defaultLineNumber, defaultColumnNumber);
 }
 
-CallIdentifier createCallIdentifierFromFunctionImp(ExecState* exec, JSObject* function, const String& defaultSourceURL, int defaultLineNumber)
+CallIdentifier createCallIdentifierFromFunctionImp(ExecState* exec, JSObject* function, const String& defaultSourceURL, unsigned defaultLineNumber, unsigned defaultColumnNumber)
 {
     const String& name = getCalculatedDisplayName(exec, function);
     JSFunction* jsFunction = jsDynamicCast<JSFunction*>(function);
     if (jsFunction && !jsFunction->isHostFunction())
-        return CallIdentifier(name.isEmpty() ? AnonymousFunction : name, jsFunction->jsExecutable()->sourceURL(), jsFunction->jsExecutable()->lineNo());
-    return CallIdentifier(name.isEmpty() ? AnonymousFunction : name, defaultSourceURL, defaultLineNumber);
+        return CallIdentifier(name.isEmpty() ? ASCIILiteral(AnonymousFunction) : name, jsFunction->jsExecutable()->sourceURL(), jsFunction->jsExecutable()->lineNo(), jsFunction->jsExecutable()->startColumn());
+    return CallIdentifier(name.isEmpty() ? ASCIILiteral(AnonymousFunction) : name, defaultSourceURL, defaultLineNumber, defaultColumnNumber);
 }
 
 } // namespace JSC
index 607ddec..ac268de 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2012, 2014 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -48,16 +48,16 @@ class LegacyProfiler {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     JS_EXPORT_PRIVATE static LegacyProfiler* profiler(); 
-    static CallIdentifier createCallIdentifier(ExecState*, JSValue, const WTF::String& sourceURL, int lineNumber);
+    static CallIdentifier createCallIdentifier(ExecState*, JSValue, const WTF::String& sourceURL, unsigned defaultLineNumber, unsigned defaultColumnNumber);
 
     JS_EXPORT_PRIVATE void startProfiling(ExecState*, const WTF::String& title);
     JS_EXPORT_PRIVATE PassRefPtr<Profile> stopProfiling(ExecState*, const WTF::String& title);
     void stopProfiling(JSGlobalObject*);
 
     void willExecute(ExecState* callerCallFrame, JSValue function);
-    void willExecute(ExecState* callerCallFrame, const WTF::String& sourceURL, int startingLineNumber);
+    void willExecute(ExecState* callerCallFrame, const WTF::String& sourceURL, unsigned startingLineNumber, unsigned startingColumnNumber);
     void didExecute(ExecState* callerCallFrame, JSValue function);
-    void didExecute(ExecState* callerCallFrame, const WTF::String& sourceURL, int startingLineNumber);
+    void didExecute(ExecState* callerCallFrame, const WTF::String& sourceURL, unsigned startingLineNumber, unsigned startingColumnNumber);
 
     void exceptionUnwind(ExecState* handlerCallFrame);
 
index ed21e78..b5e0224 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2008, 2014 Apple Inc. All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -39,10 +39,11 @@ PassRefPtr<Profile> Profile::create(const String& title, unsigned uid)
 Profile::Profile(const String& title, unsigned uid)
     : m_title(title)
     , m_uid(uid)
+    , m_idleTime(0)
 {
     // FIXME: When multi-threading is supported this will be a vector and calls
     // into the profiler will need to know which thread it is executing on.
-    m_head = ProfileNode::create(0, CallIdentifier("Thread_1", String(), 0), 0, 0);
+    m_head = ProfileNode::create(0, CallIdentifier("Thread_1", String(), 0, 0), 0, 0);
 }
 
 Profile::~Profile()
index b1f093d..ff291bf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2008, 2014 Apple Inc. All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -39,10 +39,15 @@ namespace JSC {
         virtual ~Profile();
 
         const String& title() const { return m_title; }
+        unsigned uid() const { return m_uid; }
+
         ProfileNode* head() const { return m_head.get(); }
         void setHead(PassRefPtr<ProfileNode> head) { m_head = head; }
+
         double totalTime() const { return m_head->totalTime(); }
-        unsigned int uid() const { return m_uid; }
+
+        double idleTime() const { return m_idleTime; }
+        void setIdleTime(double idleTime) { m_idleTime = idleTime; }
 
         void forEach(void (ProfileNode::*)());
 
@@ -61,6 +66,7 @@ namespace JSC {
         String m_title;
         RefPtr<ProfileNode> m_head;
         unsigned int m_uid;
+        double m_idleTime;
     };
 
 } // namespace JSC
index 9361caf..6d5ae2a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2008, 2014 Apple Inc. All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -40,8 +40,6 @@
 
 namespace JSC {
 
-static const char* NonJSExecution = "(idle)";
-
 PassRefPtr<ProfileGenerator> ProfileGenerator::create(ExecState* exec, const String& title, unsigned uid)
 {
     return adoptRef(new ProfileGenerator(exec, title, uid));
@@ -50,6 +48,7 @@ PassRefPtr<ProfileGenerator> ProfileGenerator::create(ExecState* exec, const Str
 ProfileGenerator::ProfileGenerator(ExecState* exec, const String& title, unsigned uid)
     : m_origin(exec ? exec->lexicalGlobalObject() : 0)
     , m_profileGroup(exec ? exec->lexicalGlobalObject()->profileGroup() : 0)
+    , m_foundConsoleStartParent(false)
 {
     m_profile = Profile::create(title, uid);
     m_currentNode = m_head = m_profile->head();
@@ -78,9 +77,9 @@ public:
         }
 
         unsigned line = 0;
-        unsigned unusedColumn = 0;
-        visitor->computeLineAndColumn(line, unusedColumn);
-        m_currentNode = ProfileNode::create(m_exec, LegacyProfiler::createCallIdentifier(m_exec, visitor->callee(), visitor->sourceURL(), line), m_head.get(), m_head.get());
+        unsigned column = 0;
+        visitor->computeLineAndColumn(line, column);
+        m_currentNode = ProfileNode::create(m_exec, LegacyProfiler::createCallIdentifier(m_exec, visitor->callee(), visitor->sourceURL(), line, column), m_head.get(), m_head.get());
         m_head->insertNode(m_currentNode.get());
 
         m_foundParent = true;
@@ -100,10 +99,7 @@ void ProfileGenerator::addParentForConsoleStart(ExecState* exec)
     AddParentForConsoleStartFunctor functor(exec, m_head, m_currentNode);
     exec->iterate(functor);
 
-    if (!functor.foundParent()) {
-        m_currentNode = ProfileNode::create(exec, LegacyProfiler::createCallIdentifier(exec, JSValue(), String(), 0), m_head.get(), m_head.get());
-        m_head->insertNode(m_currentNode.get());
-    }
+    m_foundConsoleStartParent = functor.foundParent();
 }
 
 const String& ProfileGenerator::title() const
@@ -114,9 +110,9 @@ const String& ProfileGenerator::title() const
 void ProfileGenerator::willExecute(ExecState* callerCallFrame, const CallIdentifier& callIdentifier)
 {
     if (JAVASCRIPTCORE_PROFILE_WILL_EXECUTE_ENABLED()) {
-        CString name = callIdentifier.m_name.utf8();
-        CString url = callIdentifier.m_url.utf8();
-        JAVASCRIPTCORE_PROFILE_WILL_EXECUTE(m_profileGroup, const_cast<char*>(name.data()), const_cast<char*>(url.data()), callIdentifier.m_lineNumber);
+        CString name = callIdentifier.functionName().utf8();
+        CString url = callIdentifier.url().utf8();
+        JAVASCRIPTCORE_PROFILE_WILL_EXECUTE(m_profileGroup, const_cast<char*>(name.data()), const_cast<char*>(url.data()), callIdentifier.lineNumber());
     }
 
     if (!m_origin)
@@ -129,9 +125,9 @@ void ProfileGenerator::willExecute(ExecState* callerCallFrame, const CallIdentif
 void ProfileGenerator::didExecute(ExecState* callerCallFrame, const CallIdentifier& callIdentifier)
 {
     if (JAVASCRIPTCORE_PROFILE_DID_EXECUTE_ENABLED()) {
-        CString name = callIdentifier.m_name.utf8();
-        CString url = callIdentifier.m_url.utf8();
-        JAVASCRIPTCORE_PROFILE_DID_EXECUTE(m_profileGroup, const_cast<char*>(name.data()), const_cast<char*>(url.data()), callIdentifier.m_lineNumber);
+        CString name = callIdentifier.functionName().utf8();
+        CString url = callIdentifier.url().utf8();
+        JAVASCRIPTCORE_PROFILE_DID_EXECUTE(m_profileGroup, const_cast<char*>(name.data()), const_cast<char*>(url.data()), callIdentifier.lineNumber());
     }
 
     if (!m_origin)
@@ -140,7 +136,7 @@ void ProfileGenerator::didExecute(ExecState* callerCallFrame, const CallIdentifi
     ASSERT(m_currentNode);
     if (m_currentNode->callIdentifier() != callIdentifier) {
         RefPtr<ProfileNode> returningNode = ProfileNode::create(callerCallFrame, callIdentifier, m_head.get(), m_currentNode.get());
-        returningNode->setStartTime(m_currentNode->startTime());
+        returningNode->lastCall().setStartTime(m_currentNode->lastCall().startTime());
         returningNode->didExecute();
         m_currentNode->insertNode(returningNode.release());
         return;
@@ -164,8 +160,10 @@ void ProfileGenerator::stopProfiling()
 {
     m_profile->forEach(&ProfileNode::stopProfiling);
 
-    removeProfileStart();
-    removeProfileEnd();
+    if (m_foundConsoleStartParent) {
+        removeProfileStart();
+        removeProfileEnd();
+    }
 
     ASSERT(m_currentNode);
 
@@ -173,14 +171,9 @@ void ProfileGenerator::stopProfiling()
     // will not get didExecute call.
     m_currentNode = m_currentNode->parent();
 
-   if (double headSelfTime = m_head->selfTime()) {
-        RefPtr<ProfileNode> idleNode = ProfileNode::create(0, CallIdentifier(NonJSExecution, String(), 0), m_head.get(), m_head.get());
-
-        idleNode->setTotalTime(headSelfTime);
-        idleNode->setSelfTime(headSelfTime);
-
+    if (double headSelfTime = m_head->selfTime()) {
         m_head->setSelfTime(0.0);
-        m_head->addChild(idleNode.release());
+        m_profile->setIdleTime(headSelfTime);
     }
 }
 
@@ -191,7 +184,7 @@ void ProfileGenerator::removeProfileStart()
     for (ProfileNode* next = m_head.get(); next; next = next->firstChild())
         currentNode = next;
 
-    if (currentNode->callIdentifier().m_name != "profile")
+    if (currentNode->callIdentifier().functionName() != "profile")
         return;
 
     // Attribute the time of the node aobut to be removed to the self time of its parent
@@ -206,7 +199,7 @@ void ProfileGenerator::removeProfileEnd()
     for (ProfileNode* next = m_head.get(); next; next = next->lastChild())
         currentNode = next;
 
-    if (currentNode->callIdentifier().m_name != "profileEnd")
+    if (currentNode->callIdentifier().functionName() != "profileEnd")
         return;
 
     // Attribute the time of the node aobut to be removed to the self time of its parent
index 40cc8de..03de069 100644 (file)
@@ -72,6 +72,7 @@ namespace JSC {
         unsigned m_profileGroup;
         RefPtr<ProfileNode> m_head;
         RefPtr<ProfileNode> m_currentNode;
+        bool m_foundConsoleStartParent;
     };
 
 } // namespace JSC
index fe2342e..16cb24c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2014 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #include <wtf/DataLog.h>
 #include <wtf/text/StringHash.h>
 
-#if OS(WINDOWS)
-#include <windows.h>
-#endif
-
 using namespace WTF;
 
 namespace JSC {
 
-static double getCount()
-{
-#if OS(WINDOWS)
-    static LARGE_INTEGER frequency;
-    if (!frequency.QuadPart)
-        QueryPerformanceFrequency(&frequency);
-    LARGE_INTEGER counter;
-    QueryPerformanceCounter(&counter);
-    return static_cast<double>(counter.QuadPart) / frequency.QuadPart;
-#else
-    return currentTimeMS();
-#endif
-}
-
 ProfileNode::ProfileNode(ExecState* callerCallFrame, const CallIdentifier& callIdentifier, ProfileNode* headNode, ProfileNode* parentNode)
     : m_callerCallFrame(callerCallFrame)
     , m_callIdentifier(callIdentifier)
     , m_head(headNode)
     , m_parent(parentNode)
-    , m_nextSibling(0)
-    , m_startTime(0.0)
-    , m_totalTime(0.0)
-    , m_selfTime(0.0)
-    , m_numberOfCalls(0)
+    , m_nextSibling(nullptr)
+    , m_totalTime(0)
+    , m_selfTime(0)
 {
     startTimer();
 }
@@ -76,10 +56,9 @@ ProfileNode::ProfileNode(ExecState* callerCallFrame, ProfileNode* headNode, Prof
     , m_head(headNode)
     , m_parent(nodeToCopy->parent())
     , m_nextSibling(0)
-    , m_startTime(0.0)
     , m_totalTime(nodeToCopy->totalTime())
     , m_selfTime(nodeToCopy->selfTime())
-    , m_numberOfCalls(nodeToCopy->numberOfCalls())
+    , m_calls(nodeToCopy->calls())
 {
 }
 
@@ -142,10 +121,10 @@ void ProfileNode::insertNode(PassRefPtr<ProfileNode> prpNode)
 
 void ProfileNode::stopProfiling()
 {
-    if (m_startTime)
-        endAndRecordCall();
+    ASSERT(!m_calls.isEmpty());
 
-    ASSERT(m_selfTime == 0.0 && m_startTime == 0.0);
+    if (isnan(m_calls.last().totalTime()))
+        endAndRecordCall();
 
     // Because we iterate in post order all of our children have been stopped before us.
     for (unsigned i = 0; i < m_children.size(); ++i)
@@ -167,16 +146,17 @@ ProfileNode* ProfileNode::traverseNextNodePostOrder() const
 
 void ProfileNode::endAndRecordCall()
 {
-    m_totalTime += m_startTime ? getCount() - m_startTime : 0.0;
-    m_startTime = 0.0;
+    Call& last = lastCall();
+    ASSERT(isnan(last.totalTime()));
+
+    last.setTotalTime(currentTime() - last.startTime());
 
-    ++m_numberOfCalls;
+    m_totalTime += last.totalTime();
 }
 
 void ProfileNode::startTimer()
 {
-    if (!m_startTime)
-        m_startTime = getCount();
+    m_calls.append(Call(currentTime()));
 }
 
 void ProfileNode::resetChildrensSiblings()
@@ -193,9 +173,9 @@ void ProfileNode::debugPrintData(int indentLevel) const
     for (int i = 0; i < indentLevel; ++i)
         dataLogF("  ");
 
-    dataLogF("Function Name %s %d SelfTime %.3fms/%.3f%% TotalTime %.3fms/%.3f%% Next Sibling %s\n",
-        functionName().utf8().data(), 
-        m_numberOfCalls, m_selfTime, selfPercent(), m_totalTime, totalPercent(),
+    dataLogF("Function Name %s %zu SelfTime %.3fms/%.3f%% TotalTime %.3fms/%.3f%% Next Sibling %s\n",
+        functionName().utf8().data(),
+        numberOfCalls(), m_selfTime, selfPercent(), m_totalTime, totalPercent(),
         m_nextSibling ? m_nextSibling->functionName().utf8().data() : "");
 
     ++indentLevel;
index e21b422..261df24 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2014 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -54,6 +54,25 @@ namespace JSC {
             return adoptRef(new ProfileNode(callerCallFrame, headNode, node));
         }
 
+        struct Call {
+        public:
+            Call(double startTime, double totalTime = NAN)
+                : m_startTime(startTime)
+                , m_totalTime(totalTime)
+            {
+            }
+
+            double startTime() const { return m_startTime; }
+            void setStartTime(double time) { m_startTime = time; }
+
+            double totalTime() const { return m_totalTime; }
+            void setTotalTime(double time) { m_totalTime = time; }
+
+        private:
+            double m_startTime;
+            double m_totalTime;
+        };
+
         bool operator==(ProfileNode* node) { return m_callIdentifier == node->callIdentifier(); }
 
         ProfileNode* willExecute(ExecState* callerCallFrame, const CallIdentifier&);
@@ -64,10 +83,11 @@ namespace JSC {
         // CallIdentifier members
         ExecState* callerCallFrame() const { return m_callerCallFrame; }
         const CallIdentifier& callIdentifier() const { return m_callIdentifier; }
-        unsigned long callUID() const { return m_callIdentifier.hash(); };
-        const String& functionName() const { return m_callIdentifier.m_name; }
-        const String& url() const { return m_callIdentifier.m_url; }
-        unsigned lineNumber() const { return m_callIdentifier.m_lineNumber; }
+        unsigned id() const { return m_callIdentifier.hash(); }
+        const String& functionName() const { return m_callIdentifier.functionName(); }
+        const String& url() const { return m_callIdentifier.url(); }
+        unsigned lineNumber() const { return m_callIdentifier.lineNumber(); }
+        unsigned columnNumber() const { return m_callIdentifier.columnNumber(); }
 
         // Relationships
         ProfileNode* head() const { return m_head; }
@@ -80,9 +100,6 @@ namespace JSC {
         void setNextSibling(ProfileNode* nextSibling) { m_nextSibling = nextSibling; }
 
         // Time members
-        double startTime() const { return m_startTime; }
-        void setStartTime(double startTime) { m_startTime = startTime; }
-
         double totalTime() const { return m_totalTime; }
         void setTotalTime(double time) { m_totalTime = time; }
 
@@ -92,7 +109,9 @@ namespace JSC {
         double totalPercent() const { return (m_totalTime / (m_head ? m_head->totalTime() : totalTime())) * 100.0; }
         double selfPercent() const { return (m_selfTime / (m_head ? m_head->totalTime() : totalTime())) * 100.0; }
 
-        unsigned numberOfCalls() const { return m_numberOfCalls; }
+        Vector<Call> calls() const { return m_calls; }
+        Call& lastCall() { ASSERT(!m_calls.isEmpty()); return m_calls.last(); }
+        size_t numberOfCalls() const { return m_calls.size(); }
 
         // Children members
         const Vector<RefPtr<ProfileNode>>& children() const { return m_children; }
@@ -104,8 +123,6 @@ namespace JSC {
 
         ProfileNode* traverseNextNodePostOrder() const;
 
-        void endAndRecordCall();
-
 #ifndef NDEBUG
         const char* c_str() const { return m_callIdentifier; }
         void debugPrintData(int indentLevel) const;
@@ -120,6 +137,7 @@ namespace JSC {
 
         void startTimer();
         void resetChildrensSiblings();
+        void endAndRecordCall();
 
         ExecState* m_callerCallFrame;
         CallIdentifier m_callIdentifier;
@@ -127,11 +145,10 @@ namespace JSC {
         ProfileNode* m_parent;
         ProfileNode* m_nextSibling;
 
-        double m_startTime;
         double m_totalTime;
         double m_selfTime;
-        unsigned m_numberOfCalls;
 
+        Vector<Call, 1> m_calls;
         Vector<RefPtr<ProfileNode>> m_children;
     };
 
index 2421218..f7b8bba 100644 (file)
@@ -1,3 +1,26 @@
+2014-01-28  Timothy Hatcher  <timothy@apple.com>
+
+        Add column number and call timing support to LegacyProfiler.
+
+        https://bugs.webkit.org/show_bug.cgi?id=127764
+
+        Reviewed by Joseph Pecoraro.
+
+        * bindings/js/ScriptProfile.cpp:
+        (WebCore::ScriptProfile::idleTime):
+        (WebCore::buildInspectorObjectFor):
+        (WebCore::ScriptProfile::buildInspectorObject):
+        * bindings/js/ScriptProfile.h:
+        * inspector/InspectorHeapProfilerAgent.cpp:
+        (WebCore::InspectorHeapProfilerAgent::createSnapshotHeader):
+        * inspector/InspectorProfilerAgent.cpp:
+        (WebCore::InspectorProfilerAgent::createSnapshotHeader):
+        (WebCore::InspectorProfilerAgent::getCPUProfile):
+        * inspector/ScriptProfileNode.idl:
+        * inspector/TimelineRecordFactory.cpp:
+        (WebCore::TimelineRecordFactory::appendProfile):
+        * inspector/protocol/Profiler.json:
+
 2014-01-26  Timothy Hatcher  <timothy@apple.com>
 
         Include profile with FunctionCall and EvaluateScript Timeline records.
index c8778a5..d1a9c7b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2014 Apple Inc. All rights reserved.
  * Copyright (C) 2010 Google Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -68,39 +68,60 @@ ScriptProfileNode* ScriptProfile::head() const
 
 double ScriptProfile::idleTime() const
 {
-    return 0.0;
+    return m_profile->idleTime();
 }
 
 #if ENABLE(INSPECTOR)
+static PassRefPtr<Inspector::TypeBuilder::Profiler::CPUProfileNodeCall> buildInspectorObjectFor(const JSC::ProfileNode::Call& call)
+{
+    RefPtr<Inspector::TypeBuilder::Profiler::CPUProfileNodeCall> result = Inspector::TypeBuilder::Profiler::CPUProfileNodeCall::create()
+        .setStartTime(call.startTime())
+        .setTotalTime(call.totalTime());
+    return result.release();
+}
+
 static PassRefPtr<Inspector::TypeBuilder::Profiler::CPUProfileNode> buildInspectorObjectFor(const JSC::ProfileNode* node)
 {
-    typedef Vector<RefPtr<JSC::ProfileNode>> ProfileNodesList;
-    const ProfileNodesList& nodeChildren = node->children();
-    ProfileNodesList::const_iterator end = nodeChildren.end();
-    RefPtr<Inspector::TypeBuilder::Array<Inspector::TypeBuilder::Profiler::CPUProfileNode>> children = Inspector::TypeBuilder::Array<Inspector::TypeBuilder::Profiler::CPUProfileNode>::create();
-    for (ProfileNodesList::const_iterator iter = nodeChildren.begin(); iter != end; ++iter)
-        children->addItem(buildInspectorObjectFor(iter->get()));
+    RefPtr<Inspector::TypeBuilder::Array<Inspector::TypeBuilder::Profiler::CPUProfileNodeCall>> calls = Inspector::TypeBuilder::Array<Inspector::TypeBuilder::Profiler::CPUProfileNodeCall>::create();
+    for (const JSC::ProfileNode::Call& call : node->calls())
+        calls->addItem(buildInspectorObjectFor(call));
 
     RefPtr<Inspector::TypeBuilder::Profiler::CPUProfileNode> result = Inspector::TypeBuilder::Profiler::CPUProfileNode::create()
-        .setFunctionName(node->functionName())
-        .setUrl(node->url())
-        .setLineNumber(node->lineNumber())
-        .setTotalTime(node->totalTime())
-        .setSelfTime(node->selfTime())
-        .setNumberOfCalls(node->numberOfCalls())
-        .setCallUID(node->callIdentifier().hash())
-        .setChildren(children.release());
+        .setId(node->id())
+        .setCalls(calls.release());
+
+    if (!node->functionName().isEmpty())
+        result->setFunctionName(node->functionName());
+
+    if (!node->url().isEmpty()) {
+        result->setUrl(node->url());
+        result->setLineNumber(node->lineNumber());
+        result->setColumnNumber(node->columnNumber());
+    }
+
+    if (!node->children().isEmpty()) {
+        RefPtr<Inspector::TypeBuilder::Array<Inspector::TypeBuilder::Profiler::CPUProfileNode>> children = Inspector::TypeBuilder::Array<Inspector::TypeBuilder::Profiler::CPUProfileNode>::create();
+        for (RefPtr<JSC::ProfileNode> profileNode : node->children())
+            children->addItem(buildInspectorObjectFor(profileNode.get()));
+        result->setChildren(children);
+    }
+
     return result.release();
 }
 
-PassRefPtr<Inspector::TypeBuilder::Profiler::CPUProfileNode> ScriptProfile::buildInspectorObjectForHead() const
+PassRefPtr<Inspector::TypeBuilder::Profiler::CPUProfile> ScriptProfile::buildInspectorObject() const
 {
-    return buildInspectorObjectFor(m_profile->head());
-}
+    RefPtr<Inspector::TypeBuilder::Array<Inspector::TypeBuilder::Profiler::CPUProfileNode>> rootNodes = Inspector::TypeBuilder::Array<Inspector::TypeBuilder::Profiler::CPUProfileNode>::create();
+    for (RefPtr<JSC::ProfileNode> profileNode : m_profile->head()->children())
+        rootNodes->addItem(buildInspectorObjectFor(profileNode.get()));
 
-PassRefPtr<Inspector::TypeBuilder::Profiler::CPUProfileNode> ScriptProfile::buildInspectorObjectForBottomUpHead() const
-{
-    return 0;
+    RefPtr<Inspector::TypeBuilder::Profiler::CPUProfile> result = Inspector::TypeBuilder::Profiler::CPUProfile::create()
+        .setRootNodes(rootNodes);
+
+    if (m_profile->idleTime())
+        result->setIdleTime(m_profile->idleTime());
+
+    return result.release();
 }
 #endif
 
index 1f4c03e..4f706ee 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2014 Apple Inc. All rights reserved.
  * Copyright (C) 2010 Google Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -54,8 +54,7 @@ public:
     double idleTime() const;
 
 #if ENABLE(INSPECTOR)
-    PassRefPtr<Inspector::TypeBuilder::Profiler::CPUProfileNode> buildInspectorObjectForHead() const;
-    PassRefPtr<Inspector::TypeBuilder::Profiler::CPUProfileNode> buildInspectorObjectForBottomUpHead() const;
+    PassRefPtr<Inspector::TypeBuilder::Profiler::CPUProfile> buildInspectorObject() const;
 #endif
 
 private:
@@ -64,7 +63,6 @@ private:
     RefPtr<JSC::Profile> m_profile;
 };
 
-
 } // namespace WebCore
 
 #endif // ScriptProfile_h
index ccfe2f8..f4484cb 100644 (file)
@@ -103,7 +103,6 @@ PassRefPtr<Inspector::TypeBuilder::HeapProfiler::ProfileHeader> InspectorHeapPro
     RefPtr<Inspector::TypeBuilder::HeapProfiler::ProfileHeader> header = Inspector::TypeBuilder::HeapProfiler::ProfileHeader::create()
         .setUid(snapshot.uid())
         .setTitle(snapshot.title());
-    header->setMaxJSObjectId(snapshot.maxSnapshotJSObjectId());
     return header.release();
 }
 
index 5acc3a1..e8407ee 100644 (file)
@@ -186,7 +186,6 @@ PassRefPtr<Inspector::TypeBuilder::Profiler::ProfileHeader> InspectorProfilerAge
         .setTypeId(Inspector::TypeBuilder::Profiler::ProfileHeader::TypeId::HEAP)
         .setUid(snapshot.uid())
         .setTitle(snapshot.title());
-    header->setMaxJSObjectId(snapshot.maxSnapshotJSObjectId());
     return header.release();
 }
 
@@ -273,9 +272,8 @@ void InspectorProfilerAgent::getCPUProfile(ErrorString* errorString, int rawUid,
         *errorString = "Profile wasn't found";
         return;
     }
-    profileObject = Inspector::TypeBuilder::Profiler::CPUProfile::create();
-    profileObject->setHead(it->value->buildInspectorObjectForHead());
-    profileObject->setIdleTime(it->value->idleTime());
+
+    profileObject = it->value->buildInspectorObject();
 }
 
 void InspectorProfilerAgent::getHeapSnapshot(ErrorString* errorString, int rawUid)
index b0769de..930f35c 100644 (file)
     NoInterfaceObject,
     ImplementationLacksVTable
 ] interface ScriptProfileNode {
+    readonly attribute unsigned long id;
+
     readonly attribute DOMString functionName;
+
     readonly attribute DOMString url;
     readonly attribute unsigned long lineNumber;
+    readonly attribute unsigned long columnNumber;
+
     readonly attribute double totalTime;
     readonly attribute double selfTime;
+
     readonly attribute unsigned long numberOfCalls;
+
     sequence<ScriptProfileNode> children();
-    readonly attribute unsigned long callUID;
 };
-
index 3ccf8fb..17593b8 100644 (file)
@@ -254,7 +254,7 @@ void TimelineRecordFactory::appendLayoutRoot(InspectorObject* data, const FloatQ
 
 void TimelineRecordFactory::appendProfile(InspectorObject* data, PassRefPtr<ScriptProfile> profile)
 {
-    data->setValue("profile", profile->buildInspectorObjectForHead());
+    data->setValue(ASCIILiteral("profile"), profile->buildInspectorObject());
 }
 
 } // namespace WebCore
index 791d50a..994e7e7 100644 (file)
@@ -6,10 +6,18 @@
             "type": "object",
             "description": "Profile header.",
             "properties": [
-                { "name": "typeId", "type": "string", "enum": ["CPU", "CSS", "HEAP"], "description": "Profile type name." },
+                { "name": "typeId", "type": "string", "enum": ["CPU", "HEAP"], "description": "Profile type name." },
                 { "name": "title", "type": "string", "description": "Profile title." },
-                { "name": "uid", "type": "integer", "description": "Unique identifier of the profile." },
-                { "name": "maxJSObjectId", "type": "integer", "optional": true, "description": "Last seen JS object Id." }
+                { "name": "uid", "type": "integer", "description": "Unique identifier of the profile." }
+            ]
+        },
+        {
+            "id": "CPUProfileNodeCall",
+            "type": "object",
+            "description": "CPU Profile call info. Holds time information for a specific call that happened on a node.",
+            "properties": [
+                { "name": "startTime", "type": "number", "description": "Start time for the call." },
+                { "name": "totalTime", "type": "number", "description": "Total execution time for the call." }
             ]
         },
         {
             "type": "object",
             "description": "CPU Profile node. Holds callsite information, execution statistics and child nodes.",
             "properties": [
-                { "name": "functionName", "type": "string", "description": "Function name." },
-                { "name": "url", "type": "string", "description": "URL." },
-                { "name": "lineNumber", "type": "integer", "description": "Line number." },
-                { "name": "totalTime", "type": "number", "description": "Total execution time." },
-                { "name": "selfTime", "type": "number", "description": "Self time." },
-                { "name": "numberOfCalls", "type": "integer", "description": "Number of calls." },
-                { "name": "callUID", "type": "number", "description": "Call UID." },
-                { "name": "children", "type": "array", "items": { "$ref": "CPUProfileNode" }, "description": "Child nodes." },
-                { "name": "id", "optional": true, "type": "integer", "description": "Unique id of the node." }
+                { "name": "id", "type": "integer", "description": "Unique identifier for this call site." },
+                { "name": "calls", "type": "array", "items": { "$ref": "CPUProfileNodeCall" }, "description": "Calls making up this node." },
+                { "name": "functionName", "type": "string", "optional": true, "description": "Function name." },
+                { "name": "url", "type": "string", "optional": true, "description": "URL." },
+                { "name": "lineNumber", "type": "integer", "optional": true, "description": "Line number." },
+                { "name": "columnNumber", "type": "integer", "optional": true, "description": "Column number." },
+                { "name": "children", "type": "array", "items": { "$ref": "CPUProfileNode" }, "optional": true, "description": "Child nodes." }
             ]
         },
         {
@@ -33,9 +39,8 @@
             "type": "object",
             "description": "Profile.",
             "properties": [
-                { "name": "head", "$ref": "CPUProfileNode", "optional": true },
-                { "name": "idleTime", "type": "number", "optional": true },
-                { "name": "samples", "optional": true, "type": "array", "items": { "type": "integer" }, "description": "Ids of samples top nodes." }
+                { "name": "rootNodes", "type": "array", "items": { "$ref": "CPUProfileNode" }, "description": "Top level nodes in the stack." },
+                { "name": "idleTime", "type": "number", "optional": true }
             ]
         },
         {