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

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

Issue 55433007: Dartium: do not call back into Dart code to parse or generate a stack trace. (Closed) Base URL: svn://svn.chromium.org/multivm/trunk/webkit
Patch Set: rebase Created 7 years, 1 month 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/dart/DartUtilities.cpp
diff --git a/Source/bindings/dart/DartUtilities.cpp b/Source/bindings/dart/DartUtilities.cpp
index 49f7d85db026762588af6b95cd6523d86c252c63..935980d9c54411856e18132ca52ec2dd4fdceac2 100644
--- a/Source/bindings/dart/DartUtilities.cpp
+++ b/Source/bindings/dart/DartUtilities.cpp
@@ -953,65 +953,63 @@ PassRefPtr<ScriptArguments> DartUtilities::createScriptArguments(Dart_Handle arg
return ScriptArguments::create(DartUtilities::currentScriptState(), arguments);
}
-static PassRefPtr<ScriptCallStack> createScriptCallStackFromParsedStackTrace(Dart_Handle parsedStackTrace, Dart_Handle exception)
+static PassRefPtr<ScriptCallStack> createScriptCallStackFromStackTrace(Dart_StackTrace stackTrace)
{
- Vector<Dart_Handle> callFrames;
- DartUtilities::extractListElements(parsedStackTrace, exception, callFrames);
- if (exception)
+ intptr_t frameCount = 0;
+ Dart_Handle result = Dart_StackTraceLength(stackTrace, &frameCount);
+ if (Dart_IsError(result))
return 0;
- size_t frameCount = callFrames.size();
if (frameCount > ScriptCallStack::maxCallStackSizeToCapture)
frameCount = ScriptCallStack::maxCallStackSizeToCapture;
Vector<ScriptCallFrame> scriptCallStackFrames;
- for (size_t i = 0; i < frameCount; i++) {
- Dart_Handle callFrame = callFrames[i];
- Vector<Dart_Handle> fields;
- DartUtilities::extractListElements(callFrame, exception, fields);
- if (exception)
- return 0;
- ASSERT(fields.size() == 4);
- String functionName = DartUtilities::toString(fields[0]);
- String sourceName = DartUtilities::toString(fields[1]);
- int lineNumber = DartUtilities::toInteger(fields[2], exception);
- if (exception)
+ for (intptr_t frameIndex = 0; frameIndex < frameCount; frameIndex++) {
+ Dart_ActivationFrame frame = 0;
+ result = Dart_GetActivationFrame(stackTrace, frameIndex, &frame);
+ if (Dart_IsError(result)) {
return 0;
- int columnNumber = DartUtilities::toInteger(fields[3], exception);
- if (exception)
+ }
+ ASSERT(frame);
+
+ Dart_Handle dartFunctionName;
+ Dart_Handle dartScriptUrl;
+ intptr_t lineNumber = 0;
+ intptr_t columnNumber = 0;
+ result = Dart_ActivationFrameInfo(frame, &dartFunctionName, &dartScriptUrl, &lineNumber, &columnNumber);
+ if (Dart_IsError(result)) {
return 0;
- scriptCallStackFrames.append(ScriptCallFrame(functionName, "undefined", sourceName, lineNumber, columnNumber));
+ }
+
+ // This skips frames where source is unavailable. WebKit code for the
+ // console assumes that console.log et al. are implemented directly
+ // as natives, i.e. that the top-of-stack will be the caller of
+ // console.log. The Dart implementation involves intermediate Dart
+ // calls, which are skipped by this clause.
+ if (columnNumber == -1)
+ continue;
+
+ String functionName = DartUtilities::toString(dartFunctionName);
+ String scriptUrl = DartUtilities::toString(dartScriptUrl);
+
+ // FIXME: Cause of sources tab sometimes interpreting line/column information relative to the page instead of the script tag body?
+ const char* scriptName = "undefined";
+ scriptCallStackFrames.append(ScriptCallFrame(functionName, scriptName, scriptUrl, lineNumber, columnNumber));
}
- if (!frameCount)
+ if (scriptCallStackFrames.isEmpty())
scriptCallStackFrames.append(ScriptCallFrame("undefined", "undefined", "undefined", 0, 0));
return ScriptCallStack::create(scriptCallStackFrames);
}
-static PassRefPtr<ScriptCallStack> createScriptCallStackFromStackTrace(Dart_Handle stackTrace, Dart_Handle& exception)
-{
- Dart_Handle parsedStackTrace = DartUtilities::invokeUtilsMethod("parseStackTrace", 1, &stackTrace);
- if (!DartUtilities::checkResult(parsedStackTrace, exception))
- return 0;
-
- return createScriptCallStackFromParsedStackTrace(parsedStackTrace, exception);
-}
-
PassRefPtr<ScriptCallStack> DartUtilities::createScriptCallStack()
{
- Dart_ExceptionPauseInfo previousPauseInfo = Dart_GetExceptionPauseInfo();
- if (previousPauseInfo != kNoPauseOnExceptions)
- Dart_SetExceptionPauseInfo(kNoPauseOnExceptions);
- Dart_Handle exception = 0;
- Dart_Handle parsedStackTrace = DartUtilities::invokeUtilsMethod("captureParsedStackTrace", 0, 0);
-
- if (previousPauseInfo != kNoPauseOnExceptions)
- Dart_SetExceptionPauseInfo(previousPauseInfo);
-
- if (!DartUtilities::checkResult(parsedStackTrace, exception))
- return 0;
-
- return createScriptCallStackFromParsedStackTrace(parsedStackTrace, exception);
+ Dart_StackTrace trace = 0;
+ Dart_Handle result = Dart_GetStackTrace(&trace);
+ ASSERT(!Dart_IsError(result));
+ ASSERT(!Dart_IsNull(result));
+ ASSERT(trace);
+ return createScriptCallStackFromStackTrace(trace);
}
Dart_WeakPersistentHandle DartUtilities::createPrologueWeakPersistentHandle(Dart_Handle object, void* peer, Dart_WeakPersistentHandleFinalizer weakCallback)
@@ -1136,12 +1134,10 @@ void DartUtilities::reportProblem(ScriptExecutionContext* context, Dart_Handle r
errorMessage = String("Exception: ") + DartUtilities::toString(exception);
// Print the stack trace.
- Dart_Handle stacktrace = Dart_ErrorGetStacktrace(result);
- ASSERT(!Dart_IsError(stacktrace));
- Dart_Handle stackTraceConversionException = 0;
- callStack = createScriptCallStackFromStackTrace(stacktrace, stackTraceConversionException);
- if (stackTraceConversionException)
- errorMessage.append(String("\nError converting stack trace to a string: ") + DartUtilities::toString(stackTraceConversionException));
+ Dart_StackTrace stacktrace;
+ Dart_Handle traceResult = Dart_GetStackTraceFromError(result, &stacktrace);
+ ASSERT(!Dart_IsError(traceResult));
+ callStack = createScriptCallStackFromStackTrace(stacktrace);
}
if (context && context->isDocument()) {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698