| 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 | 
|  |