Chromium Code Reviews| Index: Source/bindings/dart/DartUtilities.cpp |
| diff --git a/Source/bindings/dart/DartUtilities.cpp b/Source/bindings/dart/DartUtilities.cpp |
| index 49f7d85db026762588af6b95cd6523d86c252c63..1c84271eeabfc56b74162e12ada362b86801838f 100644 |
| --- a/Source/bindings/dart/DartUtilities.cpp |
| +++ b/Source/bindings/dart/DartUtilities.cpp |
| @@ -953,65 +953,66 @@ 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); |
| + fprintf(stderr, "-- %d \n", frameCount); |
|
siva
2013/11/12 00:37:45
fprintf is temporary debug code to be removed?
rmacnak
2013/11/12 22:32:45
Woops. Removed.
|
| + 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)) { |
| + fprintf(stderr, "GetFrame failed\n"); |
| 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_ActivationFrameInfoWithColumn(frame, &dartFunctionName, &dartScriptUrl, &lineNumber, &columnNumber); |
| + if (Dart_IsError(result)) { |
| + fprintf(stderr, "GetFrameInfo failed\n"); |
|
siva
2013/11/12 00:37:45
Ditto comment about fprintf?
|
| return 0; |
| - scriptCallStackFrames.append(ScriptCallFrame(functionName, "undefined", sourceName, lineNumber, columnNumber)); |
| + } |
| + |
| + // FIXME: 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. |
|
siva
2013/11/12 00:37:45
The comment says FIXME, is there anything to be fi
rmacnak
2013/11/12 22:32:45
Removed the "FIXME" part. The problem really lies
|
| + 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 +1137,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()) { |