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? |
vsm
2013/11/12 23:07:27
Are we seeing the wrong offset for inline scripts?
rmacnak
2013/11/15 23:48:26
Filed http://dartbug.com/15106
|
+ 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()) { |