Index: src/inspector/v8-console-message.cc |
diff --git a/src/inspector/v8-console-message.cc b/src/inspector/v8-console-message.cc |
index e37738ebe43954f5591dc0d9d3b0268ad2f61108..98b0bbeac9b2625ed6242404f01c40ddb3bab6bf 100644 |
--- a/src/inspector/v8-console-message.cc |
+++ b/src/inspector/v8-console-message.cc |
@@ -4,6 +4,7 @@ |
#include "src/inspector/v8-console-message.h" |
+#include "src/debug/debug-interface.h" |
#include "src/inspector/inspected-context.h" |
#include "src/inspector/protocol/Protocol.h" |
#include "src/inspector/string-util.h" |
@@ -58,6 +59,7 @@ String16 consoleAPITypeValue(ConsoleAPIType type) { |
} |
const unsigned maxConsoleMessageCount = 1000; |
+const int maxConsoleMessageV8Size = 10 * 1024 * 1024; |
const unsigned maxArrayItemsLimit = 10000; |
const unsigned maxStackDepthLimit = 32; |
@@ -371,9 +373,11 @@ std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForConsoleAPI( |
message->m_stackTrace = std::move(stackTrace); |
message->m_type = type; |
message->m_contextId = contextId; |
- for (size_t i = 0; i < arguments.size(); ++i) |
+ for (size_t i = 0; i < arguments.size(); ++i) { |
message->m_arguments.push_back(std::unique_ptr<v8::Global<v8::Value>>( |
new v8::Global<v8::Value>(isolate, arguments.at(i)))); |
+ message->m_v8Size += v8::debug::ValueSize(isolate, arguments.at(i)); |
+ } |
if (arguments.size()) |
message->m_message = V8ValueStringBuilder::toString(arguments[0], context); |
@@ -415,6 +419,7 @@ std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForException( |
consoleMessage->m_arguments.push_back( |
std::unique_ptr<v8::Global<v8::Value>>( |
new v8::Global<v8::Value>(isolate, exception))); |
+ consoleMessage->m_v8Size += v8::debug::ValueSize(isolate, exception); |
} |
return consoleMessage; |
} |
@@ -435,15 +440,14 @@ void V8ConsoleMessage::contextDestroyed(int contextId) { |
if (m_message.isEmpty()) m_message = "<message collected>"; |
Arguments empty; |
m_arguments.swap(empty); |
+ m_v8Size = 0; |
} |
// ------------------------ V8ConsoleMessageStorage ---------------------------- |
V8ConsoleMessageStorage::V8ConsoleMessageStorage(V8InspectorImpl* inspector, |
int contextGroupId) |
- : m_inspector(inspector), |
- m_contextGroupId(contextGroupId), |
- m_expiredCount(0) {} |
+ : m_inspector(inspector), m_contextGroupId(contextGroupId) {} |
V8ConsoleMessageStorage::~V8ConsoleMessageStorage() { clear(); } |
@@ -464,23 +468,33 @@ void V8ConsoleMessageStorage::addMessage( |
DCHECK(m_messages.size() <= maxConsoleMessageCount); |
if (m_messages.size() == maxConsoleMessageCount) { |
- ++m_expiredCount; |
+ m_estimatedSize -= m_messages.front()->estimatedSize(); |
+ m_messages.pop_front(); |
+ } |
+ while (m_estimatedSize + message->estimatedSize() > maxConsoleMessageV8Size && |
alph
2017/01/25 23:45:43
shouldn't you also count current message size?
kozy
2017/01/26 02:41:38
m_estimatedSize is current storage size, messages-
|
+ m_messages.size()) { |
alph
2017/01/25 23:45:43
nit: !m_messages.empty()
kozy
2017/01/26 02:41:38
Done.
|
+ m_estimatedSize -= m_messages.front()->estimatedSize(); |
m_messages.pop_front(); |
} |
+ |
m_messages.push_back(std::move(message)); |
+ m_estimatedSize += m_messages.back()->estimatedSize(); |
} |
void V8ConsoleMessageStorage::clear() { |
m_messages.clear(); |
- m_expiredCount = 0; |
+ m_estimatedSize = 0; |
if (V8InspectorSessionImpl* session = |
m_inspector->sessionForContextGroup(m_contextGroupId)) |
session->releaseObjectGroup("console"); |
} |
void V8ConsoleMessageStorage::contextDestroyed(int contextId) { |
- for (size_t i = 0; i < m_messages.size(); ++i) |
+ m_estimatedSize = 0; |
+ for (size_t i = 0; i < m_messages.size(); ++i) { |
m_messages[i]->contextDestroyed(contextId); |
+ m_estimatedSize += m_messages[i]->estimatedSize(); |
+ } |
} |
} // namespace v8_inspector |