Chromium Code Reviews| Index: runtime/vm/trace_buffer.cc |
| =================================================================== |
| --- runtime/vm/trace_buffer.cc (revision 37244) |
| +++ runtime/vm/trace_buffer.cc (working copy) |
| @@ -4,6 +4,7 @@ |
| #include "vm/isolate.h" |
| #include "vm/json_stream.h" |
| +#include "vm/object.h" |
| #include "vm/os.h" |
| #include "vm/trace_buffer.h" |
| @@ -40,56 +41,98 @@ |
| entry.micros = 0; |
| free(entry.message); |
| entry.message = NULL; |
| + entry.message_is_escaped = false; |
| } |
| ring_cursor_ = 0; |
| } |
| -void TraceBuffer::Fill(TraceBufferEntry* entry, int64_t micros, char* msg) { |
| +void TraceBuffer::Fill(TraceBufferEntry* entry, int64_t micros, |
| + char* msg, bool msg_is_escaped) { |
| if (entry->message != NULL) { |
| // Recycle TraceBufferEntry. |
| free(entry->message); |
| } |
| entry->message = msg; |
| + entry->message_is_escaped = msg_is_escaped; |
| entry->micros = micros; |
| } |
| -void TraceBuffer::AppendTrace(int64_t micros, char* message) { |
| +void TraceBuffer::AppendTrace(int64_t micros, char* msg, bool msg_is_escaped) { |
| const intptr_t index = ring_cursor_; |
| TraceBufferEntry* trace_entry = &ring_[index]; |
| - Fill(trace_entry, micros, message); |
| + Fill(trace_entry, micros, msg, msg_is_escaped); |
| ring_cursor_ = RingIndex(ring_cursor_ + 1); |
| } |
| -void TraceBuffer::Trace(int64_t micros, const char* message) { |
| - ASSERT(message != NULL); |
| - char* message_copy = strdup(message); |
| - AppendTrace(micros, message_copy); |
| +void TraceBuffer::Trace(int64_t micros, const char* msg, bool msg_is_escaped) { |
| + ASSERT(msg != NULL); |
| + char* message_copy = strdup(msg); |
| + AppendTrace(micros, message_copy, msg_is_escaped); |
| } |
| -void TraceBuffer::Trace(const char* message) { |
| - Trace(OS::GetCurrentTimeMicros(), message); |
| +void TraceBuffer::Trace(const char* msg, bool msg_is_escaped) { |
| + Trace(OS::GetCurrentTimeMicros(), msg, msg_is_escaped); |
| } |
| void TraceBuffer::TraceF(const char* format, ...) { |
| - int64_t micros = OS::GetCurrentTimeMicros(); |
| + const int64_t micros = OS::GetCurrentTimeMicros(); |
| va_list args; |
| va_start(args, format); |
| - intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| + const intptr_t len = OS::VSNPrint(NULL, 0, format, args); |
| va_end(args); |
| char* p = reinterpret_cast<char*>(malloc(len+1)); |
| va_start(args, format); |
| - intptr_t len2 = OS::VSNPrint(p, len+1, format, args); |
| + const intptr_t len2 = OS::VSNPrint(p, len+1, format, args); |
| va_end(args); |
| ASSERT(len == len2); |
| AppendTrace(micros, p); |
| } |
| +void TraceBuffer::TraceWarningF(Isolate* isolate, |
| + const Script& script, intptr_t token_pos, |
| + const char* format, ...) { |
| + va_list args; |
| + va_start(args, format); |
| + TraceWarningV(isolate, script, token_pos, format, args); |
| + va_end(args); |
| +} |
| + |
| + |
| +void TraceBuffer::TraceWarningV(Isolate* isolate, |
| + const Script& script, intptr_t token_pos, |
| + const char* format, va_list args) { |
| + const int64_t micros = OS::GetCurrentTimeMicros(); |
| + TraceBuffer* trace_buffer = isolate->trace_buffer(); |
| + if (trace_buffer == NULL) { |
| + Init(isolate); |
| + trace_buffer = isolate->trace_buffer(); |
| + } |
| + JSONStream js; |
| + { |
| + JSONObject trace_warning(&js); |
| + trace_warning.AddProperty("type", "Warning"); |
|
Cutch
2014/06/12 21:09:05
Please use a different type than "Warning". We wil
regis
2014/06/13 00:04:37
I've called it JSCompatibilityWarning for now.
A l
|
| + trace_warning.AddProperty("script", script); |
| + trace_warning.AddProperty("tokenPos", token_pos); |
| + va_list args_copy; |
| + va_copy(args_copy, args); |
| + const intptr_t len = OS::VSNPrint(NULL, 0, format, args_copy); |
| + va_end(args_copy); |
| + char* msg = reinterpret_cast<char*>(malloc(len + 1)); |
| + va_copy(args_copy, args); |
| + OS::VSNPrint(msg, len + 1, format, args_copy); |
| + va_end(args_copy); |
| + trace_warning.AddProperty("message", msg); |
| + } |
| + trace_buffer->Trace(micros, js.ToCString(), true); // Already escaped. |
| +} |
| + |
| + |
| void TraceBuffer::PrintToJSONStream(JSONStream* stream) const { |
| JSONObject json_trace_buffer(stream); |
| json_trace_buffer.AddProperty("type", "TraceBuffer"); |
| @@ -121,7 +164,11 @@ |
| double seconds = static_cast<double>(entry.micros) / |
| static_cast<double>(kMicrosecondsPerSecond); |
| trace_entry.AddProperty("time", seconds); |
| - trace_entry.AddProperty("message", entry.message); |
| + if (entry.message_is_escaped) { |
| + trace_entry.AddPropertyNoEscape("message", entry.message); |
| + } else { |
| + trace_entry.AddProperty("message", entry.message); |
| + } |
| } |
| } |