From 154a630c9b39c7a6f358791c82b14e1567549922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Stadler?= Date: Tue, 22 Jan 2008 12:59:37 +0200 Subject: [PATCH] Fix crash with unparsable files --- debug-viewer/GstDebugViewer/GUI.py | 55 ++++++++++++++----------- debug-viewer/tests/test_models.py | 64 +++++++++++++++++++++++------- 2 files changed, 80 insertions(+), 39 deletions(-) diff --git a/debug-viewer/GstDebugViewer/GUI.py b/debug-viewer/GstDebugViewer/GUI.py index 95f567006e..9c52ef17cd 100644 --- a/debug-viewer/GstDebugViewer/GUI.py +++ b/debug-viewer/GstDebugViewer/GUI.py @@ -581,8 +581,10 @@ class FilteredLogModel (FilteredLogModelBase): def super_model_changed_range (self): range_model = self.super_model - old_start, old_end = self.__old_super_model_range - super_start, super_end = range_model.line_index_range + old_start, old_stop = self.__old_super_model_range + old_end = old_stop - 1 + super_start, super_stop = range_model.line_index_range + super_end = super_stop - 1 super_start_offset = super_start - old_start if super_start_offset < 0: @@ -630,7 +632,7 @@ class FilteredLogModel (FilteredLogModelBase): for i in range (len (self.super_index)): self.super_index[i] -= super_start_offset - self.__old_super_model_range = (super_start, super_end,) + self.__old_super_model_range = (super_start, super_stop,) def __remove_range (self, start, end): @@ -674,14 +676,16 @@ class CategoryFilter (Filter): class SubRange (object): - def __init__ (self, l, start, end): + __slots__ = ("l", "start", "stop",) - if start > end: - raise ValueError ("need start <= end") + def __init__ (self, l, start, stop): + + if start > stop: + raise ValueError ("need start <= stop (got %r, %r)" % (start, stop,)) self.l = l self.start = start - self.end = end + self.stop = stop def __getitem__ (self, i): @@ -689,14 +693,14 @@ class SubRange (object): def __len__ (self): - return self.end - self.start + 1 + return self.stop - self.start def __iter__ (self): # FIXME: Use itertools, should be faster! l = self.l i = self.start - while i <= self.end: + while i < self.stop: yield l[i] i += 1 @@ -710,25 +714,25 @@ class RangeFilteredLogModel (FilteredLogModelBase): self.line_index_range = None - def set_range (self, start_index, last_index): + def set_range (self, start_index, stop_index): - self.logger.debug ("setting range to first = %i, last = %i", - start_index, last_index) + self.logger.debug ("setting range to start = %i, stop = %i", + start_index, stop_index) - self.line_index_range = (start_index, last_index,) + self.line_index_range = (start_index, stop_index,) self.line_offsets = SubRange (self.super_model.line_offsets, - start_index, last_index) + start_index, stop_index) self.line_levels = SubRange (self.super_model.line_levels, - start_index, last_index) + start_index, stop_index) def reset (self): self.logger.debug ("reset") - first_index = 0 - last_index = len (self.super_model) - 1 + start_index = 0 + stop_index = len (self.super_model) - self.set_range (first_index, last_index,) + self.set_range (start_index, stop_index,) def line_index_to_super (self, line_index): @@ -738,9 +742,9 @@ class RangeFilteredLogModel (FilteredLogModelBase): def line_index_from_super (self, li): - start, end = self.line_index_range + start, stop = self.line_index_range - if li < start or li > end: + if li < start or li >= stop: raise IndexError ("not in range") return li - start @@ -1494,6 +1498,10 @@ class LineView (object): def handle_log_view_selection_changed (self, selection): + line_model = self.line_view.props.model + if line_model is None or len (line_model) == 0: + return + model, tree_iter = selection.get_selected () if tree_iter is None: @@ -1502,9 +1510,6 @@ class LineView (object): path = model.get_path (tree_iter) line_index = model.line_index_to_super (path[0]) - line_model = self.line_view.props.model - if line_model is None: - return if len (line_model) == 0: line_model.insert_line (0, line_index) else: @@ -1872,7 +1877,9 @@ class Window (object): last_index) self.push_view_state () - self.log_range.set_range (first_index, last_index) + start_index = first_index + stop_index = last_index + 1 + self.log_range.set_range (start_index, stop_index) if self.log_filter: self.log_filter.super_model_changed_range () self.update_model () diff --git a/debug-viewer/tests/test_models.py b/debug-viewer/tests/test_models.py index 9a23f776c2..3bcddb079e 100755 --- a/debug-viewer/tests/test_models.py +++ b/debug-viewer/tests/test_models.py @@ -31,6 +31,40 @@ from unittest import TestCase, main as test_main from GstDebugViewer import Common, Data, GUI +class TestSubRange (TestCase): + + def test_len (self): + + l = range (20) + + sr = GUI.SubRange (l, 0, 20) + self.assertEquals (len (sr), 20) + + sr = GUI.SubRange (l, 10, 20) + self.assertEquals (len (sr), 10) + + sr = GUI.SubRange (l, 0, 10) + self.assertEquals (len (sr), 10) + + sr = GUI.SubRange (l, 5, 15) + self.assertEquals (len (sr), 10) + + def test_iter (self): + + l = range (20) + + sr = GUI.SubRange (l, 0, 20) + self.assertEquals (list (sr), l) + + sr = GUI.SubRange (l, 10, 20) + self.assertEquals (list (sr), range (10, 20)) + + sr = GUI.SubRange (l, 0, 10) + self.assertEquals (list (sr), range (0, 10)) + + sr = GUI.SubRange (l, 5, 15) + self.assertEquals (list (sr), range (5, 15)) + class Model (GUI.LogModelBase): def __init__ (self): @@ -93,7 +127,7 @@ class TestDynamicFilter (TestCase): self.assertEquals (row_list (ranged_model), range (20)) self.assertEquals (row_list (filtered_model), range (20)) - ranged_model.set_range (5, 15) + ranged_model.set_range (5, 16) filtered_model.super_model_changed_range () self.assertEquals (row_list (ranged_model), range (5, 16)) @@ -127,7 +161,7 @@ class TestDynamicFilter (TestCase): filtered_model.add_filter (IdentityFilter (), Common.Data.DefaultDispatcher ()) - ranged_model.set_range (5, 15) + ranged_model.set_range (5, 16) filtered_model.super_model_changed_range () self.assertEquals (row_list (ranged_model), range (5, 16)) @@ -174,8 +208,8 @@ class TestDynamicFilter (TestCase): for i in range (10)], range (1, 20, 2)) - ranged_model.set_range (1, 19) - self.__dump_model (ranged_model, "ranged (1, 19)") + ranged_model.set_range (1, 20) + self.__dump_model (ranged_model, "ranged (1, 20)") filtered_model.super_model_changed_range () self.__dump_model (filtered_model, "filtered range") @@ -192,8 +226,8 @@ class TestDynamicFilter (TestCase): for i in range (10)], range (1, 20, 2)) - ranged_model.set_range (2, 19) - self.__dump_model (ranged_model, "ranged (2, 19)") + ranged_model.set_range (2, 20) + self.__dump_model (ranged_model, "ranged (2, 20)") filtered_model.super_model_changed_range () self.__dump_model (filtered_model, "filtered range") @@ -257,8 +291,8 @@ class TestDynamicFilter (TestCase): for i in range (20)], range (20)) - ranged_model.set_range (5, 15) - self.__dump_model (ranged_model, "ranged model (5, 15)") + ranged_model.set_range (5, 16) + self.__dump_model (ranged_model, "ranged model (5, 16)") filtered_model.super_model_changed_range () rows_ranged = row_list (ranged_model) @@ -309,8 +343,8 @@ class TestDynamicFilter (TestCase): for i in range (5, 16, 2)], range (6)) - ranged_model.set_range (7, 12) - self.__dump_model (ranged_model, "ranged model (7, 12)") + ranged_model.set_range (7, 13) + self.__dump_model (ranged_model, "ranged model (7, 13)") filtered_model.super_model_changed_range () self.assertEquals (row_list (ranged_model), range (7, 13)) @@ -362,14 +396,14 @@ class TestDynamicFilter (TestCase): random_rows = row_list (filtered_model) self.__dump_model (filtered_model) - ranged_model.set_range (10, 19) - self.__dump_model (ranged_model, "ranged_model (10, 19)") + ranged_model.set_range (10, 20) + self.__dump_model (ranged_model, "ranged_model (10, 20)") self.assertEquals (row_list (ranged_model), range (10, 20)) filtered_model.super_model_changed_range () self.__dump_model (filtered_model) self.assertEquals (row_list (filtered_model), [x for x in range (10, 20) if x in random_rows]) - ranged_model.set_range (0, 19) + ranged_model.set_range (0, 20) self.assertEquals (row_list (ranged_model), range (0, 20)) ranged_model = GUI.RangeFilteredLogModel (full_model) @@ -381,8 +415,8 @@ class TestDynamicFilter (TestCase): self.__dump_model (filtered_model, "filtered model") self.assertEquals (row_list (filtered_model), random_rows) - ranged_model.set_range (0, 9) - self.__dump_model (ranged_model, "ranged model (0, 9)") + ranged_model.set_range (0, 10) + self.__dump_model (ranged_model, "ranged model (0, 10)") filtered_model.super_model_changed_range () self.assertEquals (row_list (ranged_model), range (0, 10)) self.__dump_model (filtered_model)