Index: tools/findit/component_dictionary.py |
diff --git a/tools/findit/component_dictionary.py b/tools/findit/component_dictionary.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..55ea2daf1ca62bd2f4ccd0b8f6cf02de09e81329 |
--- /dev/null |
+++ b/tools/findit/component_dictionary.py |
@@ -0,0 +1,115 @@ |
+# Copyright (c) 2014 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. |
+import os |
stgao
2014/07/31 19:48:58
Usually we leave a blank line between code and the
|
+ |
+ |
+class FileDictionary(object): |
+ """Maps file in a stacktrace to its crash information. |
+ |
+ It maps file to another dictionary, which maps the file's path to crashed |
+ lines, stack frame indices and crashed functions. |
+ """ |
+ |
+ def __init__(self): |
+ """Initializes the file dictionary.""" |
+ self.file_dic = {} |
+ |
+ def AddFile(self, file_name, file_path, crashed_line_number, |
+ stack_frame_index, function): |
+ """Adds file and its crash information to the map. |
+ |
+ Args: |
+ file_name: name of the crashed file |
+ file_path: path of the crashed file |
+ crashed_line_number: crashed line of the file |
+ stack_frame_index: the file's position in the callstack |
+ function: name of the crashed function |
+ """ |
+ # Populate the dictionary if this file/path has not been added before. |
+ if file_name not in self.file_dic: |
+ self.file_dic[file_name] = {} |
+ |
+ if file_path not in self.file_dic[file_name]: |
+ self.file_dic[file_name][file_path] = {} |
+ |
+ if 'lines' not in self.file_dic[file_name][file_path]: |
+ self.file_dic[file_name][file_path]['lines'] = [] |
+ |
+ if 'stack_frame_index' not in self.file_dic[file_name][file_path]: |
+ self.file_dic[file_name][file_path]['stack_frame_index'] = [] |
+ |
+ if 'function' not in self.file_dic[file_name][file_path]: |
+ self.file_dic[file_name][file_path]['function'] = [] |
+ |
+ # Add the crashed line, frame index and function name. |
+ self.file_dic[file_name][file_path]['lines'].append(crashed_line_number) |
+ self.file_dic[file_name][file_path]['stack_frame_index'].append( |
+ stack_frame_index) |
+ self.file_dic[file_name][file_path]['function'].append(function) |
+ |
+ def GetPathDic(self, file_name): |
+ """Returns file's path and crash information.""" |
+ return self.file_dic[file_name] |
+ |
+ def GetCrashedLines(self, file_path): |
+ """Returns crashed lines given a file name and path.""" |
+ file_name = os.path.basename(file_path) |
+ return self.file_dic[file_name][file_path]['lines'] |
+ |
+ def GetCrashStackFrameindex(self, file_path): |
+ """Returns stack frame indices given a file name and path.""" |
+ file_name = os.path.basename(file_path) |
+ return self.file_dic[file_name][file_path]['stack_frame_index'] |
+ |
+ def GetCrashFunction(self, file_path): |
+ """Returns list of crashed functions given a file name and path.""" |
+ file_name = os.path.basename(file_path) |
+ return self.file_dic[file_name][file_path]['function'] |
+ |
+ def __iter__(self): |
+ return iter(self.file_dic) |
+ |
+ |
+class ComponentDictionary(object): |
+ """Represents a file dictionary. |
+ |
+ It maps each component (blink, chrome, etc) to a file dictionary. |
+ """ |
+ |
+ def __init__(self, components): |
+ """Initializes the dictionary with given components.""" |
+ self.component_dic = {} |
+ |
+ # Create file dictionary for all the components. |
+ for component in components: |
+ self.component_dic[component] = FileDictionary() |
+ |
+ def __iter__(self): |
+ return iter(self.component_dic) |
+ |
+ def GetFileDic(self, component): |
+ """Returns a file dictionary for a given component.""" |
+ return self.component_dic[component] |
+ |
+ def FromStacktrace(self, stack_frame_list): |
+ """Parses stacktrace, given an instance of StackFrame list.""" |
+ # Iterate through the list of stackframe objects. |
+ for stackframe in stack_frame_list: |
+ # If the component of this line is not in the list of components to |
+ # look for, ignore this line. |
+ component = stackframe.component |
+ if component not in self.component_dic: |
+ continue |
+ |
+ # Get values of the variables |
+ file_name = stackframe.file_name |
+ file_path = stackframe.file_path |
+ crashed_line_number = stackframe.crashed_line_number |
+ stack_frame_index = stackframe.index |
+ function = stackframe.function |
+ |
+ # Add the file to this component's dictionary of files. |
+ file_dic = self.component_dic[component] |
+ file_dic.AddFile(file_name, file_path, crashed_line_number, |
+ stack_frame_index, function) |