1755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org// Copyright 2009 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
6755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/log-utils.h"
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/string-stream.h"
9755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
10755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgnamespace v8 {
11755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgnamespace internal {
12755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
13755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
147c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgconst char* const Log::kLogToTemporaryFile = "&";
1510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgconst char* const Log::kLogToConsole = "-";
16755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
17755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
18ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgLog::Log(Logger* logger)
19030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  : is_stopped_(false),
20ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    output_handle_(NULL),
21ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    message_buffer_(NULL),
22ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    logger_(logger) {
23ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
24ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
25ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgvoid Log::Initialize(const char* log_file_name) {
27755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  message_buffer_ = NewArray<char>(kMessageBufferSize);
28ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
29ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // --log-all enables all the log flags.
30ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (FLAG_log_all) {
31ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    FLAG_log_api = true;
32ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    FLAG_log_code = true;
33ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    FLAG_log_gc = true;
34ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    FLAG_log_suspect = true;
35ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    FLAG_log_handles = true;
36ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    FLAG_log_regexp = true;
3732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    FLAG_log_internal_timer_events = true;
38ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
39ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
40ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // --prof implies --log-code.
41ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (FLAG_prof) FLAG_log_code = true;
42ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
43ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // If we're logging anything, we need to open the log file.
44ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  if (Log::InitLogAtStart()) {
4510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org    if (strcmp(log_file_name, kLogToConsole) == 0) {
46ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      OpenStdout();
4710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org    } else if (strcmp(log_file_name, kLogToTemporaryFile) == 0) {
48030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org      OpenTemporaryFile();
49030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org    } else {
5010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      OpenFile(log_file_name);
51ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
52ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
53755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
54755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
55755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
56755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Log::OpenStdout() {
57e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!IsEnabled());
58755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  output_handle_ = stdout;
59030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org}
60030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org
61030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org
62030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.orgvoid Log::OpenTemporaryFile() {
63e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!IsEnabled());
645de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  output_handle_ = base::OS::OpenTemporaryFile();
65755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
66755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
67755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
68755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgvoid Log::OpenFile(const char* name) {
69e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!IsEnabled());
705de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  output_handle_ = base::OS::FOpen(name, base::OS::LogFileOpenMode);
71755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
72755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
73755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
74030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.orgFILE* Log::Close() {
75030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  FILE* result = NULL;
76030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  if (output_handle_ != NULL) {
77030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org    if (strcmp(FLAG_logfile, kLogToTemporaryFile) != 0) {
78030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org      fclose(output_handle_);
79030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org    } else {
80030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org      result = output_handle_;
81030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org    }
82755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  }
83030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  output_handle_ = NULL;
84755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
85eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  DeleteArray(message_buffer_);
86eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  message_buffer_ = NULL;
87eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
88755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  is_stopped_ = false;
89030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  return result;
90755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
91755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
92755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
93ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgLog::MessageBuilder::MessageBuilder(Log* log)
94ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  : log_(log),
95dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org    lock_guard_(&log_->mutex_),
96ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    pos_(0) {
97e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(log_->message_buffer_ != NULL);
98755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
99755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
100755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
101ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Log::MessageBuilder::Append(const char* format, ...) {
102ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Vector<char> buf(log_->message_buffer_ + pos_,
103755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org                   Log::kMessageBufferSize - pos_);
104755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  va_list args;
105755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  va_start(args, format);
106eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  AppendVA(format, args);
107755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  va_end(args);
108e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(pos_ <= Log::kMessageBufferSize);
109755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
110755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
111755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
112ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Log::MessageBuilder::AppendVA(const char* format, va_list args) {
113ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Vector<char> buf(log_->message_buffer_ + pos_,
114755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org                   Log::kMessageBufferSize - pos_);
11570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  int result = v8::internal::VSNPrintF(buf, format, args);
116755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
117755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  // Result is -1 if output was truncated.
118755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  if (result >= 0) {
119755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    pos_ += result;
120755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  } else {
121755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    pos_ = Log::kMessageBufferSize;
122755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  }
123e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(pos_ <= Log::kMessageBufferSize);
124755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
125755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
126755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
127ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Log::MessageBuilder::Append(const char c) {
128755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  if (pos_ < Log::kMessageBufferSize) {
129ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    log_->message_buffer_[pos_++] = c;
130755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  }
131e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(pos_ <= Log::kMessageBufferSize);
132755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
133755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
134755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
135ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Log::MessageBuilder::AppendDoubleQuotedString(const char* string) {
1361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Append('"');
1371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  for (const char* p = string; *p != '\0'; p++) {
1381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (*p == '"') {
1391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      Append('\\');
1401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
1411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    Append(*p);
1421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
1431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Append('"');
1441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
1451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
1461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
147ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Log::MessageBuilder::Append(String* str) {
14879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  DisallowHeapAllocation no_gc;  // Ensure string stay valid.
149755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  int length = str->length();
150755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  for (int i = 0; i < length; i++) {
151755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    Append(static_cast<char>(str->Get(i)));
152755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  }
153755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
154755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
155755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
156ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Log::MessageBuilder::AppendAddress(Address addr) {
1575f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  Append("0x%" V8PRIxPTR, addr);
158eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
159eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
160eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
161ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Log::MessageBuilder::AppendSymbolName(Symbol* symbol) {
162e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(symbol);
163ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  Append("symbol(");
164ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  if (!symbol->name()->IsUndefined()) {
165ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    Append("\"");
166ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    AppendDetailed(String::cast(symbol->name()), false);
167ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    Append("\" ");
168ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  }
169ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  Append("hash %x)", symbol->Hash());
170ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}
171ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
172ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
173ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Log::MessageBuilder::AppendDetailed(String* str, bool show_impl_info) {
1748e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  if (str == NULL) return;
17579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  DisallowHeapAllocation no_gc;  // Ensure string stay valid.
176755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  int len = str->length();
177755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  if (len > 0x1000)
178755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    len = 0x1000;
179755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  if (show_impl_info) {
1808e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    Append(str->IsOneByteRepresentation() ? 'a' : '2');
181755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    if (StringShape(str).IsExternal())
182755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      Append('e');
1834a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    if (StringShape(str).IsInternalized())
184755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      Append('#');
185755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    Append(":%i:", str->length());
186755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  }
187755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  for (int i = 0; i < len; i++) {
188755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    uc32 c = str->Get(i);
189755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    if (c > 0xff) {
190755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      Append("\\u%04x", c);
191755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    } else if (c < 32 || c > 126) {
192755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      Append("\\x%02x", c);
193755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    } else if (c == ',') {
194755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      Append("\\,");
195755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    } else if (c == '\\') {
196755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      Append("\\\\");
1973a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    } else if (c == '\"') {
1983a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      Append("\"\"");
199755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    } else {
200755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      Append("%lc", c);
201755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org    }
202755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  }
203755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
204755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
205755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
206ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Log::MessageBuilder::AppendStringPart(const char* str, int len) {
2072bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com  if (pos_ + len > Log::kMessageBufferSize) {
2082bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com    len = Log::kMessageBufferSize - pos_;
209e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(len >= 0);
2102bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com    if (len == 0) return;
2112bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com  }
212ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Vector<char> buf(log_->message_buffer_ + pos_,
2132bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com                   Log::kMessageBufferSize - pos_);
21470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  StrNCpy(buf, str, len);
2152bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com  pos_ += len;
216e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(pos_ <= Log::kMessageBufferSize);
2172bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com}
2182bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com
2192bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com
220ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgvoid Log::MessageBuilder::WriteToLogFile() {
221e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(pos_ <= Log::kMessageBufferSize);
2229bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  // Assert that we do not already have a new line at the end.
223e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(pos_ == 0 || log_->message_buffer_[pos_ - 1] != '\n');
2249bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  if (pos_ == Log::kMessageBufferSize) pos_--;
2259bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  log_->message_buffer_[pos_++] = '\n';
226030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org  const int written = log_->WriteToFile(log_->message_buffer_, pos_);
227ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (written != pos_) {
228ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    log_->stop();
229ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    log_->logger_->LogFailure();
230755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  }
231755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
232755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
233ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
234755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} }  // namespace v8::internal
235