Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "build/build_config.h"
      6 
      7 #if defined(COMPILER_MSVC)
      8 #include <intrin.h>
      9 #endif
     10 
     11 #include "base/location.h"
     12 #include "base/strings/string_number_conversions.h"
     13 #include "base/strings/stringprintf.h"
     14 
     15 namespace tracked_objects {
     16 
     17 Location::Location(const char* function_name,
     18                    const char* file_name,
     19                    int line_number,
     20                    const void* program_counter)
     21     : function_name_(function_name),
     22       file_name_(file_name),
     23       line_number_(line_number),
     24       program_counter_(program_counter) {
     25 }
     26 
     27 Location::Location()
     28     : function_name_("Unknown"),
     29       file_name_("Unknown"),
     30       line_number_(-1),
     31       program_counter_(NULL) {
     32 }
     33 
     34 std::string Location::ToString() const {
     35   return std::string(function_name_) + "@" + file_name_ + ":" +
     36       base::IntToString(line_number_);
     37 }
     38 
     39 void Location::Write(bool display_filename, bool display_function_name,
     40                      std::string* output) const {
     41   base::StringAppendF(output, "%s[%d] ",
     42       display_filename ? file_name_ : "line",
     43       line_number_);
     44 
     45   if (display_function_name) {
     46     WriteFunctionName(output);
     47     output->push_back(' ');
     48   }
     49 }
     50 
     51 void Location::WriteFunctionName(std::string* output) const {
     52   // Translate "<" to "&lt;" for HTML safety.
     53   // TODO(jar): Support ASCII or html for logging in ASCII.
     54   for (const char *p = function_name_; *p; p++) {
     55     switch (*p) {
     56       case '<':
     57         output->append("&lt;");
     58         break;
     59 
     60       case '>':
     61         output->append("&gt;");
     62         break;
     63 
     64       default:
     65         output->push_back(*p);
     66         break;
     67     }
     68   }
     69 }
     70 
     71 //------------------------------------------------------------------------------
     72 LocationSnapshot::LocationSnapshot() : line_number(-1) {
     73 }
     74 
     75 LocationSnapshot::LocationSnapshot(
     76     const tracked_objects::Location& location)
     77     : file_name(location.file_name()),
     78       function_name(location.function_name()),
     79       line_number(location.line_number()) {
     80 }
     81 
     82 LocationSnapshot::~LocationSnapshot() {
     83 }
     84 
     85 //------------------------------------------------------------------------------
     86 #if defined(COMPILER_MSVC)
     87 __declspec(noinline)
     88 #endif
     89 BASE_EXPORT const void* GetProgramCounter() {
     90 #if defined(COMPILER_MSVC)
     91   return _ReturnAddress();
     92 #elif defined(COMPILER_GCC) && !defined(OS_NACL)
     93   return __builtin_extract_return_addr(__builtin_return_address(0));
     94 #else
     95   return NULL;
     96 #endif
     97 }
     98 
     99 }  // namespace tracked_objects
    100