| Index: extensions/common/stack_frame.cc
|
| diff --git a/extensions/common/stack_frame.cc b/extensions/common/stack_frame.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d2874963e30ecefa9cff08eee234df9a67bfe86e
|
| --- /dev/null
|
| +++ b/extensions/common/stack_frame.cc
|
| @@ -0,0 +1,80 @@
|
| +// Copyright 2013 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 "extensions/common/stack_frame.h"
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "third_party/re2/re2/re2.h"
|
| +
|
| +namespace extensions {
|
| +
|
| +namespace {
|
| +const char kAnonymousFunction[] = "(anonymous function)";
|
| +}
|
| +
|
| +StackFrame::StackFrame() : line_number(1), column_number(1) {
|
| +}
|
| +
|
| +StackFrame::StackFrame(const StackFrame& frame)
|
| + : line_number(frame.line_number),
|
| + column_number(frame.column_number),
|
| + source(frame.source),
|
| + function(frame.function) {
|
| +}
|
| +
|
| +StackFrame::StackFrame(size_t line_number,
|
| + size_t column_number,
|
| + const base::string16& source,
|
| + const base::string16& function)
|
| + : line_number(line_number),
|
| + column_number(column_number),
|
| + source(source),
|
| + function(function.empty() ? base::UTF8ToUTF16(kAnonymousFunction)
|
| + : function) {
|
| +}
|
| +
|
| +StackFrame::~StackFrame() {
|
| +}
|
| +
|
| +// Create a stack frame from the passed text. The text must follow one of two
|
| +// formats:
|
| +// - "function_name (source:line_number:column_number)"
|
| +// - "source:line_number:column_number"
|
| +// (We have to recognize two formats because V8 will report stack traces in
|
| +// both ways. If we reconcile this, we can clean this up.)
|
| +// static
|
| +scoped_ptr<StackFrame> StackFrame::CreateFromText(
|
| + const base::string16& frame_text) {
|
| + // We need to use utf8 for re2 matching.
|
| + std::string text = base::UTF16ToUTF8(frame_text);
|
| +
|
| + size_t line = 1;
|
| + size_t column = 1;
|
| + std::string source;
|
| + std::string function;
|
| + if (!re2::RE2::FullMatch(text,
|
| + "(.+) \\(([^\\(\\)]+):(\\d+):(\\d+)\\)",
|
| + &function, &source, &line, &column) &&
|
| + !re2::RE2::FullMatch(text,
|
| + "([^\\(\\)]+):(\\d+):(\\d+)",
|
| + &source, &line, &column)) {
|
| + return scoped_ptr<StackFrame>();
|
| + }
|
| +
|
| + return scoped_ptr<StackFrame>(new StackFrame(line,
|
| + column,
|
| + base::UTF8ToUTF16(source),
|
| + base::UTF8ToUTF16(function)));
|
| +}
|
| +
|
| +bool StackFrame::operator==(const StackFrame& rhs) const {
|
| + return line_number == rhs.line_number &&
|
| + column_number == rhs.column_number &&
|
| + source == rhs.source &&
|
| + function == rhs.function;
|
| +}
|
| +
|
| +} // namespace extensions
|
|
|