Index: Source/bindings/dart/DartUtilities.cpp |
diff --git a/Source/bindings/dart/DartUtilities.cpp b/Source/bindings/dart/DartUtilities.cpp |
index 25a3b2e7c28680a5fd7475307edcdea1a7352d15..3cacfc7d6c683c235282318650ef53962a4fcfcc 100644 |
--- a/Source/bindings/dart/DartUtilities.cpp |
+++ b/Source/bindings/dart/DartUtilities.cpp |
@@ -56,6 +56,7 @@ |
#include "core/frame/LocalDOMWindow.h" |
#include "core/frame/LocalFrame.h" |
#include "core/html/canvas/DataView.h" |
+#include "core/inspector/InspectorInstrumentation.h" |
#include "core/inspector/ScriptArguments.h" |
#include "core/inspector/ScriptCallStack.h" |
#include "core/loader/FrameLoader.h" |
@@ -85,10 +86,9 @@ V8Scope::V8Scope(DartDOMData* dartDOMData, v8::Handle<v8::Context> context) |
, m_dartDOMData(dartDOMData) |
, m_handleScope(m_v8Isolate) |
, m_contextScope(context) |
- , m_recursionScope(m_v8Isolate, DartUtilities::scriptExecutionContext()) |
+ , m_recursionScope(m_v8Isolate, DartUtilities::scriptExecutionContext(), false) |
{ |
- if (m_dartDOMData) |
- (*m_dartDOMData->recursion())++; |
+ incrementRecursionLevel(); |
} |
V8Scope::V8Scope(DartDOMData* dartDOMData) |
@@ -96,16 +96,24 @@ V8Scope::V8Scope(DartDOMData* dartDOMData) |
, m_dartDOMData(dartDOMData) |
, m_handleScope(m_v8Isolate) |
, m_contextScope(DartUtilities::currentV8Context()) |
- , m_recursionScope(m_v8Isolate, DartUtilities::scriptExecutionContext()) |
+ , m_recursionScope(m_v8Isolate, DartUtilities::scriptExecutionContext(), false) |
{ |
- if (m_dartDOMData) |
- (*m_dartDOMData->recursion())++; |
+ incrementRecursionLevel(); |
} |
V8Scope::~V8Scope() |
{ |
if (m_dartDOMData) |
- (*m_dartDOMData->recursion())--; |
+ m_dartDOMData->stackTraceTimestampTracker()->decrementRecursionLevel(); |
+} |
+ |
+void V8Scope::incrementRecursionLevel() |
+{ |
+ if (!m_dartDOMData) |
+ return; |
+ StackTraceTimestampTracker* tracker = m_dartDOMData->stackTraceTimestampTracker(); |
+ tracker->incrementRecursionLevel(InspectorInstrumentation::hasFrontends() && tracker->recursionLevel() > 0 ? |
+ DartUtilities::currentStackDepth() : 0); |
} |
DartStringPeer* DartStringPeer::emptyString() |
@@ -1071,6 +1079,18 @@ ScriptCallFrame DartUtilities::toScriptCallFrame(Dart_ActivationFrame frame, Dar |
return ScriptCallFrame(DartUtilities::toString(functionName), "undefined", DartUtilities::toString(scriptUrl), lineNumber, columnNumber); |
} |
+size_t DartUtilities::currentStackDepth() |
+{ |
+ intptr_t stackDepth = 0; |
+ Dart_StackTrace trace = 0; |
+ Dart_Handle ALLOW_UNUSED result = Dart_GetStackTrace(&trace); |
+ ASSERT(!Dart_IsError(result)); |
+ ASSERT(!Dart_IsNull(result)); |
+ result = Dart_StackTraceLength(trace, &stackDepth); |
+ ASSERT(!Dart_IsError(result)); |
+ return stackDepth; |
+} |
+ |
PassRefPtr<ScriptCallStack> DartUtilities::createScriptCallStack() |
{ |
Dart_StackTrace trace = 0; |