Chromium Code Reviews| 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) |