| OLD | NEW |
| 1 // Copyright 2011, Google Inc. | 1 // Copyright 2011, Google Inc. |
| 2 // All rights reserved. | 2 // All rights reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
| 9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
| 10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
| (...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 946 } | 946 } |
| 947 | 947 |
| 948 PassRefPtr<ScriptArguments> DartUtilities::createScriptArguments(Dart_Handle arg
ument, Dart_Handle& exception) | 948 PassRefPtr<ScriptArguments> DartUtilities::createScriptArguments(Dart_Handle arg
ument, Dart_Handle& exception) |
| 949 { | 949 { |
| 950 v8::Handle<v8::Value> v8Argument = DartHandleProxy::create(argument); | 950 v8::Handle<v8::Value> v8Argument = DartHandleProxy::create(argument); |
| 951 Vector<ScriptValue> arguments; | 951 Vector<ScriptValue> arguments; |
| 952 arguments.append(ScriptValue(v8Argument, v8::Isolate::GetCurrent())); | 952 arguments.append(ScriptValue(v8Argument, v8::Isolate::GetCurrent())); |
| 953 return ScriptArguments::create(DartUtilities::currentScriptState(), argument
s); | 953 return ScriptArguments::create(DartUtilities::currentScriptState(), argument
s); |
| 954 } | 954 } |
| 955 | 955 |
| 956 static PassRefPtr<ScriptCallStack> createScriptCallStackFromParsedStackTrace(Dar
t_Handle parsedStackTrace, Dart_Handle exception) | 956 static PassRefPtr<ScriptCallStack> createScriptCallStackFromStackTrace(Dart_Stac
kTrace stackTrace) |
| 957 { | 957 { |
| 958 Vector<Dart_Handle> callFrames; | 958 intptr_t frameCount = 0; |
| 959 DartUtilities::extractListElements(parsedStackTrace, exception, callFrames); | 959 Dart_Handle result = Dart_StackTraceLength(stackTrace, &frameCount); |
| 960 if (exception) | 960 if (Dart_IsError(result)) |
| 961 return 0; | 961 return 0; |
| 962 | 962 |
| 963 size_t frameCount = callFrames.size(); | |
| 964 if (frameCount > ScriptCallStack::maxCallStackSizeToCapture) | 963 if (frameCount > ScriptCallStack::maxCallStackSizeToCapture) |
| 965 frameCount = ScriptCallStack::maxCallStackSizeToCapture; | 964 frameCount = ScriptCallStack::maxCallStackSizeToCapture; |
| 966 | 965 |
| 967 Vector<ScriptCallFrame> scriptCallStackFrames; | 966 Vector<ScriptCallFrame> scriptCallStackFrames; |
| 968 for (size_t i = 0; i < frameCount; i++) { | 967 for (intptr_t frameIndex = 0; frameIndex < frameCount; frameIndex++) { |
| 969 Dart_Handle callFrame = callFrames[i]; | 968 Dart_ActivationFrame frame = 0; |
| 970 Vector<Dart_Handle> fields; | 969 result = Dart_GetActivationFrame(stackTrace, frameIndex, &frame); |
| 971 DartUtilities::extractListElements(callFrame, exception, fields); | 970 if (Dart_IsError(result)) { |
| 972 if (exception) | |
| 973 return 0; | 971 return 0; |
| 974 ASSERT(fields.size() == 4); | 972 } |
| 975 String functionName = DartUtilities::toString(fields[0]); | 973 ASSERT(frame); |
| 976 String sourceName = DartUtilities::toString(fields[1]); | 974 |
| 977 int lineNumber = DartUtilities::toInteger(fields[2], exception); | 975 Dart_Handle dartFunctionName; |
| 978 if (exception) | 976 Dart_Handle dartScriptUrl; |
| 977 intptr_t lineNumber = 0; |
| 978 intptr_t columnNumber = 0; |
| 979 result = Dart_ActivationFrameInfo(frame, &dartFunctionName, &dartScriptU
rl, &lineNumber, &columnNumber); |
| 980 if (Dart_IsError(result)) { |
| 979 return 0; | 981 return 0; |
| 980 int columnNumber = DartUtilities::toInteger(fields[3], exception); | 982 } |
| 981 if (exception) | 983 |
| 982 return 0; | 984 // This skips frames where source is unavailable. WebKit code for the |
| 983 scriptCallStackFrames.append(ScriptCallFrame(functionName, "undefined",
sourceName, lineNumber, columnNumber)); | 985 // console assumes that console.log et al. are implemented directly |
| 986 // as natives, i.e. that the top-of-stack will be the caller of |
| 987 // console.log. The Dart implementation involves intermediate Dart |
| 988 // calls, which are skipped by this clause. |
| 989 if (columnNumber == -1) |
| 990 continue; |
| 991 |
| 992 String functionName = DartUtilities::toString(dartFunctionName); |
| 993 String scriptUrl = DartUtilities::toString(dartScriptUrl); |
| 994 |
| 995 // FIXME: Cause of sources tab sometimes interpreting line/column inform
ation relative to the page instead of the script tag body? |
| 996 const char* scriptName = "undefined"; |
| 997 scriptCallStackFrames.append(ScriptCallFrame(functionName, scriptName, s
criptUrl, lineNumber, columnNumber)); |
| 984 } | 998 } |
| 985 if (!frameCount) | 999 if (scriptCallStackFrames.isEmpty()) |
| 986 scriptCallStackFrames.append(ScriptCallFrame("undefined", "undefined", "
undefined", 0, 0)); | 1000 scriptCallStackFrames.append(ScriptCallFrame("undefined", "undefined", "
undefined", 0, 0)); |
| 987 | 1001 |
| 988 return ScriptCallStack::create(scriptCallStackFrames); | 1002 return ScriptCallStack::create(scriptCallStackFrames); |
| 989 } | 1003 } |
| 990 | 1004 |
| 991 static PassRefPtr<ScriptCallStack> createScriptCallStackFromStackTrace(Dart_Hand
le stackTrace, Dart_Handle& exception) | |
| 992 { | |
| 993 Dart_Handle parsedStackTrace = DartUtilities::invokeUtilsMethod("parseStackT
race", 1, &stackTrace); | |
| 994 if (!DartUtilities::checkResult(parsedStackTrace, exception)) | |
| 995 return 0; | |
| 996 | |
| 997 return createScriptCallStackFromParsedStackTrace(parsedStackTrace, exception
); | |
| 998 } | |
| 999 | |
| 1000 PassRefPtr<ScriptCallStack> DartUtilities::createScriptCallStack() | 1005 PassRefPtr<ScriptCallStack> DartUtilities::createScriptCallStack() |
| 1001 { | 1006 { |
| 1002 Dart_ExceptionPauseInfo previousPauseInfo = Dart_GetExceptionPauseInfo(); | 1007 Dart_StackTrace trace = 0; |
| 1003 if (previousPauseInfo != kNoPauseOnExceptions) | 1008 Dart_Handle result = Dart_GetStackTrace(&trace); |
| 1004 Dart_SetExceptionPauseInfo(kNoPauseOnExceptions); | 1009 ASSERT(!Dart_IsError(result)); |
| 1005 Dart_Handle exception = 0; | 1010 ASSERT(!Dart_IsNull(result)); |
| 1006 Dart_Handle parsedStackTrace = DartUtilities::invokeUtilsMethod("capturePars
edStackTrace", 0, 0); | 1011 ASSERT(trace); |
| 1007 | 1012 return createScriptCallStackFromStackTrace(trace); |
| 1008 if (previousPauseInfo != kNoPauseOnExceptions) | |
| 1009 Dart_SetExceptionPauseInfo(previousPauseInfo); | |
| 1010 | |
| 1011 if (!DartUtilities::checkResult(parsedStackTrace, exception)) | |
| 1012 return 0; | |
| 1013 | |
| 1014 return createScriptCallStackFromParsedStackTrace(parsedStackTrace, exception
); | |
| 1015 } | 1013 } |
| 1016 | 1014 |
| 1017 Dart_WeakPersistentHandle DartUtilities::createPrologueWeakPersistentHandle(Dart
_Handle object, void* peer, Dart_WeakPersistentHandleFinalizer weakCallback) | 1015 Dart_WeakPersistentHandle DartUtilities::createPrologueWeakPersistentHandle(Dart
_Handle object, void* peer, Dart_WeakPersistentHandleFinalizer weakCallback) |
| 1018 { | 1016 { |
| 1019 DartWeakCallback* callback = new DartWeakCallback(peer, weakCallback); | 1017 DartWeakCallback* callback = new DartWeakCallback(peer, weakCallback); |
| 1020 callback->m_object = Dart_NewPrologueWeakPersistentHandle(object, callback,
&weakCallbackWrapper); | 1018 callback->m_object = Dart_NewPrologueWeakPersistentHandle(object, callback,
&weakCallbackWrapper); |
| 1021 DartDOMData::current()->weakCallbacks()->add(callback); | 1019 DartDOMData::current()->weakCallbacks()->add(callback); |
| 1022 return callback->m_object; | 1020 return callback->m_object; |
| 1023 } | 1021 } |
| 1024 | 1022 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1129 Dart_Handle exception = Dart_ErrorGetException(result); | 1127 Dart_Handle exception = Dart_ErrorGetException(result); |
| 1130 ASSERT(!Dart_IsError(exception)); | 1128 ASSERT(!Dart_IsError(exception)); |
| 1131 | 1129 |
| 1132 exception = Dart_ToString(exception); | 1130 exception = Dart_ToString(exception); |
| 1133 if (Dart_IsError(exception)) | 1131 if (Dart_IsError(exception)) |
| 1134 errorMessage = String("Error converting exception to a string: ") +
Dart_GetError(exception); | 1132 errorMessage = String("Error converting exception to a string: ") +
Dart_GetError(exception); |
| 1135 else | 1133 else |
| 1136 errorMessage = String("Exception: ") + DartUtilities::toString(excep
tion); | 1134 errorMessage = String("Exception: ") + DartUtilities::toString(excep
tion); |
| 1137 | 1135 |
| 1138 // Print the stack trace. | 1136 // Print the stack trace. |
| 1139 Dart_Handle stacktrace = Dart_ErrorGetStacktrace(result); | 1137 Dart_StackTrace stacktrace; |
| 1140 ASSERT(!Dart_IsError(stacktrace)); | 1138 Dart_Handle traceResult = Dart_GetStackTraceFromError(result, &stacktrac
e); |
| 1141 Dart_Handle stackTraceConversionException = 0; | 1139 ASSERT(!Dart_IsError(traceResult)); |
| 1142 callStack = createScriptCallStackFromStackTrace(stacktrace, stackTraceCo
nversionException); | 1140 callStack = createScriptCallStackFromStackTrace(stacktrace); |
| 1143 if (stackTraceConversionException) | |
| 1144 errorMessage.append(String("\nError converting stack trace to a stri
ng: ") + DartUtilities::toString(stackTraceConversionException)); | |
| 1145 } | 1141 } |
| 1146 | 1142 |
| 1147 if (context && context->isDocument()) { | 1143 if (context && context->isDocument()) { |
| 1148 static_cast<Document*>(context)->reportException(ErrorEvent::create(erro
rMessage, sourceURL, lineNumber, 0, 0), callStack, NotSharableCrossOrigin); | 1144 static_cast<Document*>(context)->reportException(ErrorEvent::create(erro
rMessage, sourceURL, lineNumber, 0, 0), callStack, NotSharableCrossOrigin); |
| 1149 } | 1145 } |
| 1150 } | 1146 } |
| 1151 | 1147 |
| 1152 Dart_Handle DartUtilities::notImplementedException(const char* fileName, int lin
eNumber) | 1148 Dart_Handle DartUtilities::notImplementedException(const char* fileName, int lin
eNumber) |
| 1153 { | 1149 { |
| 1154 Dart_Handle args[2] = { Dart_NewStringFromCString(fileName), Dart_NewInteger
(lineNumber) }; | 1150 Dart_Handle args[2] = { Dart_NewStringFromCString(fileName), Dart_NewInteger
(lineNumber) }; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1180 if (!v) { | 1176 if (!v) { |
| 1181 return 0; | 1177 return 0; |
| 1182 } | 1178 } |
| 1183 ASSERT(valueLen > 0 && static_cast<size_t>(valueLen) > strlen(v)); | 1179 ASSERT(valueLen > 0 && static_cast<size_t>(valueLen) > strlen(v)); |
| 1184 strncpy(value, v, valueLen); | 1180 strncpy(value, v, valueLen); |
| 1185 value[valueLen - 1] = '\0'; | 1181 value[valueLen - 1] = '\0'; |
| 1186 return strlen(value); | 1182 return strlen(value); |
| 1187 #endif | 1183 #endif |
| 1188 } | 1184 } |
| 1189 } | 1185 } |
| OLD | NEW |