Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(246)

Unified Diff: Source/bindings/dart/DartInjectedScript.cpp

Issue 466243002: Support merged Dart-JS callstacks (Closed) Base URL: svn://svn.chromium.org/blink/branches/dart/dartium
Patch Set: ptal Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/bindings/common/common.gypi ('k') | Source/bindings/dart/DartScriptDebugServer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/dart/DartInjectedScript.cpp
diff --git a/Source/bindings/dart/DartInjectedScript.cpp b/Source/bindings/dart/DartInjectedScript.cpp
index 1db544cb97232e05f7bd4c0a257ad3cfecb849ef..e241ef0da4b89ce4e79b71c8de78b09f494deabf 100644
--- a/Source/bindings/dart/DartInjectedScript.cpp
+++ b/Source/bindings/dart/DartInjectedScript.cpp
@@ -57,6 +57,8 @@ using WebCore::TypeBuilder::Runtime::PropertyPreview;
namespace WebCore {
+static const uint64_t kMaxSafeIntegerForDouble = 0x1fffffffffffffUL;
+
Dart_Handle getLibraryUrl(Dart_Handle handle)
{
intptr_t libraryId = 0;
@@ -744,7 +746,7 @@ void DartInjectedScript::restartFrame(ErrorString* errorString, const StackTrace
void DartInjectedScript::getStepInPositions(ErrorString* errorString, const StackTrace& callFrames, const String& callFrameId, RefPtr<Array<TypeBuilder::Debugger::Location> >& positions)
{
- ASSERT(!callFrames.isJavaScript());
+ ASSERT(callFrames.isJavaScript());
if (!m_scriptState) {
*errorString = "Invalid DartInjectedScript";
return;
@@ -757,13 +759,13 @@ void DartInjectedScript::getStepInPositions(ErrorString* errorString, const Stac
void DartInjectedScript::setVariableValue(ErrorString* errorString, const StackTrace& callFrames, const String* callFrameIdOpt, const String* functionObjectIdOpt, int scopeNumber, const String& variableName, const String& newValueStr)
{
+ ASSERT(callFrames.isJavaScript());
if (!m_scriptState) {
*errorString = "Invalid DartInjectedScript";
return;
}
DartIsolateScope scope(m_scriptState->isolate());
DartApiScope apiScope;
- ASSERT(!callFrames.isJavaScript());
*errorString = "Not supported by Dart.";
return;
}
@@ -843,7 +845,7 @@ void addCompletions(Dart_Handle completions, RefPtr<TypeBuilder::Array<String> >
void DartInjectedScript::getCompletionsOnCallFrame(ErrorString* errorString, const StackTrace& callFrames, const Vector<StackTrace>& asyncCallStacks, const String& callFrameId, const String& expression, RefPtr<TypeBuilder::Array<String> >* result)
{
- ASSERT(!callFrames.isJavaScript());
+ ASSERT(callFrames.isJavaScript());
*result = TypeBuilder::Array<String>::create();
if (!m_scriptState) {
*errorString = "Invalid DartInjectedScript";
@@ -1215,8 +1217,9 @@ Dart_ActivationFrame DartInjectedScript::callFrameForId(const StackTrace& callFr
if (asyncOrdinal > 0) { // 1-based index
ASSERT(asyncOrdinal <= (int)asyncCallStacks.size());
if (asyncOrdinal <= (int)asyncCallStacks.size()) {
- ASSERT(!asyncCallStacks[asyncOrdinal-1].isJavaScript());
- result = Dart_GetActivationFrame(asyncCallStacks[asyncOrdinal-1].asDart(), ordinal, &frame);
+ StackTrace asyncCallStack = asyncCallStacks[asyncOrdinal-1];
+ ASSERT(!asyncCallStack.isJavaScript());
+ result = Dart_GetActivationFrame(asyncCallStack.asDart(), ordinal, &frame);
} else {
return 0;
}
@@ -1232,6 +1235,8 @@ PassRefPtr<Array<CallFrame> > DartInjectedScript::wrapCallFrames(const StackTrac
ASSERT(!callFrames.isJavaScript());
if (callFrames.isJavaScript())
return nullptr;
+ DartIsolateScope scope(m_scriptState->isolate());
+ DartApiScope apiScope;
Dart_StackTrace trace = callFrames.asDart();
intptr_t length = 0;
Dart_Handle ALLOW_UNUSED result;
@@ -1240,6 +1245,7 @@ PassRefPtr<Array<CallFrame> > DartInjectedScript::wrapCallFrames(const StackTrac
ASSERT(!Dart_IsError(result));
DartScriptDebugServer& debugServer = DartScriptDebugServer::shared();
Dart_Handle libraries = Dart_GetLibraryIds();
+
for (intptr_t i = 0; i < length; i++) {
Dart_ActivationFrame frame = 0;
result = Dart_GetActivationFrame(trace, i, &frame);
@@ -1247,7 +1253,9 @@ PassRefPtr<Array<CallFrame> > DartInjectedScript::wrapCallFrames(const StackTrac
Dart_Handle functionName = 0;
Dart_Handle function = 0;
Dart_CodeLocation location;
- Dart_ActivationFrameGetLocation(frame, &functionName, &function, &location);
+ result = Dart_ActivationFrameGetLocation(frame, &functionName, &function, &location);
+ ASSERT(!Dart_IsError(result));
+
const String& url = DartUtilities::toString(location.script_url);
intptr_t line = 0;
intptr_t column = 0;
@@ -1302,13 +1310,24 @@ PassRefPtr<Array<CallFrame> > DartInjectedScript::wrapCallFrames(const StackTrac
.setObject(wrapDartHandle(libraries, DartDebuggerObject::Isolate, "backtrace", false))
.release());
- ret->addItem(CallFrame::create()
+ RefPtr<CallFrame> callFrame = CallFrame::create()
.setCallFrameId(getCallFrameId(i, asyncOrdinal))
.setFunctionName(DartUtilities::toString(functionName))
.setLocation(locationJson)
.setScopeChain(scopeChain)
.setThis(thisObject)
- .release());
+ .release();
+
+ uintptr_t framePointer = 0;
+ result = Dart_ActivationFrameGetFramePointer(frame, &framePointer);
rmacnak 2014/09/08 22:51:44 Why not represent the frame pointer as a string or
Jacob 2014/09/10 17:58:56 I've switched to high and low halves instead of tr
+ // No frame pointers will actually be larger than 2^48 on a current x64
+ // machine but we truncate to 52 bits of precision to future proof the
+ // method. As we don't care about the exact frame pointer only the
+ // order of frame pointers, truncating to 52 bits will still generate the
+ // correct ordering with high probability.
+ framePointer = framePointer & kMaxSafeIntegerForDouble;
+ callFrame->setFramePointer(static_cast<double>(framePointer));
+ ret->addItem(callFrame);
}
return ret;
}
« no previous file with comments | « Source/bindings/common/common.gypi ('k') | Source/bindings/dart/DartScriptDebugServer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698