Home | History | Annotate | Download | only in common
      1 // Copyright 2013 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 "extensions/common/stack_frame.h"
      6 
      7 #include <string>
      8 
      9 #include "base/strings/utf_string_conversions.h"
     10 #include "third_party/re2/re2/re2.h"
     11 
     12 namespace extensions {
     13 
     14 namespace {
     15 const char kAnonymousFunction[] = "(anonymous function)";
     16 }
     17 
     18 StackFrame::StackFrame() : line_number(1), column_number(1) {
     19 }
     20 
     21 StackFrame::StackFrame(const StackFrame& frame)
     22     : line_number(frame.line_number),
     23       column_number(frame.column_number),
     24       source(frame.source),
     25       function(frame.function) {
     26 }
     27 
     28 StackFrame::StackFrame(size_t line_number,
     29                        size_t column_number,
     30                        const base::string16& source,
     31                        const base::string16& function)
     32     : line_number(line_number),
     33       column_number(column_number),
     34       source(source),
     35       function(function.empty() ? base::UTF8ToUTF16(kAnonymousFunction)
     36                    : function) {
     37 }
     38 
     39 StackFrame::~StackFrame() {
     40 }
     41 
     42 // Create a stack frame from the passed text. The text must follow one of two
     43 // formats:
     44 //   - "function_name (source:line_number:column_number)"
     45 //   - "source:line_number:column_number"
     46 // (We have to recognize two formats because V8 will report stack traces in
     47 // both ways. If we reconcile this, we can clean this up.)
     48 // static
     49 scoped_ptr<StackFrame> StackFrame::CreateFromText(
     50     const base::string16& frame_text) {
     51   // We need to use utf8 for re2 matching.
     52   std::string text = base::UTF16ToUTF8(frame_text);
     53 
     54   size_t line = 1;
     55   size_t column = 1;
     56   std::string source;
     57   std::string function;
     58   if (!re2::RE2::FullMatch(text,
     59                            "(.+) \\(([^\\(\\)]+):(\\d+):(\\d+)\\)",
     60                            &function, &source, &line, &column) &&
     61       !re2::RE2::FullMatch(text,
     62                            "([^\\(\\)]+):(\\d+):(\\d+)",
     63                            &source, &line, &column)) {
     64     return scoped_ptr<StackFrame>();
     65   }
     66 
     67   return scoped_ptr<StackFrame>(new StackFrame(line,
     68                                                column,
     69                                                base::UTF8ToUTF16(source),
     70                                                base::UTF8ToUTF16(function)));
     71 }
     72 
     73 bool StackFrame::operator==(const StackFrame& rhs) const {
     74   return line_number == rhs.line_number &&
     75          column_number == rhs.column_number &&
     76          source == rhs.source &&
     77          function == rhs.function;
     78 }
     79 
     80 }  // namespace extensions
     81