Index: base/location.cc |
diff --git a/base/location.cc b/base/location.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cda51595908a21efbb0d6b0717ff07cb17281da2 |
--- /dev/null |
+++ b/base/location.cc |
@@ -0,0 +1,87 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "build/build_config.h" |
+ |
+#if defined(COMPILER_MSVC) |
+// MSDN says to #include <intrin.h>, but that breaks the VS2005 build. |
+extern "C" { |
+ void* _ReturnAddress(); |
+} |
+#endif |
+ |
+#include "base/location.h" |
+#include "base/string_number_conversions.h" |
+#include "base/stringprintf.h" |
+ |
+namespace tracked_objects { |
+ |
+Location::Location(const char* function_name, |
+ const char* file_name, |
+ int line_number, |
+ const void* program_counter) |
+ : function_name_(function_name), |
+ file_name_(file_name), |
+ line_number_(line_number), |
+ program_counter_(program_counter) { |
+} |
+ |
+Location::Location() |
+ : function_name_("Unknown"), |
+ file_name_("Unknown"), |
+ line_number_(-1), |
+ program_counter_(NULL) { |
+} |
+ |
+std::string Location::ToString() const { |
+ return std::string(function_name_) + "@" + file_name_ + ":" + |
+ base::IntToString(line_number_); |
+} |
+ |
+void Location::Write(bool display_filename, bool display_function_name, |
+ std::string* output) const { |
+ base::StringAppendF(output, "%s[%d] ", |
+ display_filename ? file_name_ : "line", |
+ line_number_); |
+ |
+ if (display_function_name) { |
+ WriteFunctionName(output); |
+ output->push_back(' '); |
+ } |
+} |
+ |
+void Location::WriteFunctionName(std::string* output) const { |
+ // Translate "<" to "<" for HTML safety. |
+ // TODO(jar): Support ASCII or html for logging in ASCII. |
+ for (const char *p = function_name_; *p; p++) { |
+ switch (*p) { |
+ case '<': |
+ output->append("<"); |
+ break; |
+ |
+ case '>': |
+ output->append(">"); |
+ break; |
+ |
+ default: |
+ output->push_back(*p); |
+ break; |
+ } |
+ } |
+} |
+ |
+#if defined(COMPILER_MSVC) |
+__declspec(noinline) |
+#endif |
+BASE_EXPORT const void* GetProgramCounter() { |
+#if defined(COMPILER_MSVC) |
+ return _ReturnAddress(); |
+#elif defined(COMPILER_GCC) |
+ return __builtin_extract_return_addr(__builtin_return_address(0)); |
+#endif // COMPILER_GCC |
+ |
+ return NULL; |
+} |
+ |
+} // namespace tracked_objects |