Fix crash with unparsable files

This commit is contained in:
René Stadler 2008-01-22 12:59:37 +02:00 committed by Stefan Sauer
parent 9e3ebe40cd
commit 154a630c9b
2 changed files with 80 additions and 39 deletions

View file

@ -581,8 +581,10 @@ class FilteredLogModel (FilteredLogModelBase):
def super_model_changed_range (self): def super_model_changed_range (self):
range_model = self.super_model range_model = self.super_model
old_start, old_end = self.__old_super_model_range old_start, old_stop = self.__old_super_model_range
super_start, super_end = range_model.line_index_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 super_start_offset = super_start - old_start
if super_start_offset < 0: if super_start_offset < 0:
@ -630,7 +632,7 @@ class FilteredLogModel (FilteredLogModelBase):
for i in range (len (self.super_index)): for i in range (len (self.super_index)):
self.super_index[i] -= super_start_offset 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): def __remove_range (self, start, end):
@ -674,14 +676,16 @@ class CategoryFilter (Filter):
class SubRange (object): class SubRange (object):
def __init__ (self, l, start, end): __slots__ = ("l", "start", "stop",)
if start > end: def __init__ (self, l, start, stop):
raise ValueError ("need start <= end")
if start > stop:
raise ValueError ("need start <= stop (got %r, %r)" % (start, stop,))
self.l = l self.l = l
self.start = start self.start = start
self.end = end self.stop = stop
def __getitem__ (self, i): def __getitem__ (self, i):
@ -689,14 +693,14 @@ class SubRange (object):
def __len__ (self): def __len__ (self):
return self.end - self.start + 1 return self.stop - self.start
def __iter__ (self): def __iter__ (self):
# FIXME: Use itertools, should be faster! # FIXME: Use itertools, should be faster!
l = self.l l = self.l
i = self.start i = self.start
while i <= self.end: while i < self.stop:
yield l[i] yield l[i]
i += 1 i += 1
@ -710,25 +714,25 @@ class RangeFilteredLogModel (FilteredLogModelBase):
self.line_index_range = None 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", self.logger.debug ("setting range to start = %i, stop = %i",
start_index, last_index) 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, 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, self.line_levels = SubRange (self.super_model.line_levels,
start_index, last_index) start_index, stop_index)
def reset (self): def reset (self):
self.logger.debug ("reset") self.logger.debug ("reset")
first_index = 0 start_index = 0
last_index = len (self.super_model) - 1 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): def line_index_to_super (self, line_index):
@ -738,9 +742,9 @@ class RangeFilteredLogModel (FilteredLogModelBase):
def line_index_from_super (self, li): 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") raise IndexError ("not in range")
return li - start return li - start
@ -1494,6 +1498,10 @@ class LineView (object):
def handle_log_view_selection_changed (self, selection): 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 () model, tree_iter = selection.get_selected ()
if tree_iter is None: if tree_iter is None:
@ -1502,9 +1510,6 @@ class LineView (object):
path = model.get_path (tree_iter) path = model.get_path (tree_iter)
line_index = model.line_index_to_super (path[0]) 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: if len (line_model) == 0:
line_model.insert_line (0, line_index) line_model.insert_line (0, line_index)
else: else:
@ -1872,7 +1877,9 @@ class Window (object):
last_index) last_index)
self.push_view_state () 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: if self.log_filter:
self.log_filter.super_model_changed_range () self.log_filter.super_model_changed_range ()
self.update_model () self.update_model ()

View file

@ -31,6 +31,40 @@ from unittest import TestCase, main as test_main
from GstDebugViewer import Common, Data, GUI 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): class Model (GUI.LogModelBase):
def __init__ (self): def __init__ (self):
@ -93,7 +127,7 @@ class TestDynamicFilter (TestCase):
self.assertEquals (row_list (ranged_model), range (20)) self.assertEquals (row_list (ranged_model), range (20))
self.assertEquals (row_list (filtered_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 () filtered_model.super_model_changed_range ()
self.assertEquals (row_list (ranged_model), range (5, 16)) self.assertEquals (row_list (ranged_model), range (5, 16))
@ -127,7 +161,7 @@ class TestDynamicFilter (TestCase):
filtered_model.add_filter (IdentityFilter (), filtered_model.add_filter (IdentityFilter (),
Common.Data.DefaultDispatcher ()) Common.Data.DefaultDispatcher ())
ranged_model.set_range (5, 15) ranged_model.set_range (5, 16)
filtered_model.super_model_changed_range () filtered_model.super_model_changed_range ()
self.assertEquals (row_list (ranged_model), range (5, 16)) self.assertEquals (row_list (ranged_model), range (5, 16))
@ -174,8 +208,8 @@ class TestDynamicFilter (TestCase):
for i in range (10)], for i in range (10)],
range (1, 20, 2)) range (1, 20, 2))
ranged_model.set_range (1, 19) ranged_model.set_range (1, 20)
self.__dump_model (ranged_model, "ranged (1, 19)") self.__dump_model (ranged_model, "ranged (1, 20)")
filtered_model.super_model_changed_range () filtered_model.super_model_changed_range ()
self.__dump_model (filtered_model, "filtered range") self.__dump_model (filtered_model, "filtered range")
@ -192,8 +226,8 @@ class TestDynamicFilter (TestCase):
for i in range (10)], for i in range (10)],
range (1, 20, 2)) range (1, 20, 2))
ranged_model.set_range (2, 19) ranged_model.set_range (2, 20)
self.__dump_model (ranged_model, "ranged (2, 19)") self.__dump_model (ranged_model, "ranged (2, 20)")
filtered_model.super_model_changed_range () filtered_model.super_model_changed_range ()
self.__dump_model (filtered_model, "filtered range") self.__dump_model (filtered_model, "filtered range")
@ -257,8 +291,8 @@ class TestDynamicFilter (TestCase):
for i in range (20)], for i in range (20)],
range (20)) range (20))
ranged_model.set_range (5, 15) ranged_model.set_range (5, 16)
self.__dump_model (ranged_model, "ranged model (5, 15)") self.__dump_model (ranged_model, "ranged model (5, 16)")
filtered_model.super_model_changed_range () filtered_model.super_model_changed_range ()
rows_ranged = row_list (ranged_model) rows_ranged = row_list (ranged_model)
@ -309,8 +343,8 @@ class TestDynamicFilter (TestCase):
for i in range (5, 16, 2)], for i in range (5, 16, 2)],
range (6)) range (6))
ranged_model.set_range (7, 12) ranged_model.set_range (7, 13)
self.__dump_model (ranged_model, "ranged model (7, 12)") self.__dump_model (ranged_model, "ranged model (7, 13)")
filtered_model.super_model_changed_range () filtered_model.super_model_changed_range ()
self.assertEquals (row_list (ranged_model), range (7, 13)) self.assertEquals (row_list (ranged_model), range (7, 13))
@ -362,14 +396,14 @@ class TestDynamicFilter (TestCase):
random_rows = row_list (filtered_model) random_rows = row_list (filtered_model)
self.__dump_model (filtered_model) self.__dump_model (filtered_model)
ranged_model.set_range (10, 19) ranged_model.set_range (10, 20)
self.__dump_model (ranged_model, "ranged_model (10, 19)") self.__dump_model (ranged_model, "ranged_model (10, 20)")
self.assertEquals (row_list (ranged_model), range (10, 20)) self.assertEquals (row_list (ranged_model), range (10, 20))
filtered_model.super_model_changed_range () filtered_model.super_model_changed_range ()
self.__dump_model (filtered_model) self.__dump_model (filtered_model)
self.assertEquals (row_list (filtered_model), [x for x in range (10, 20) if x in random_rows]) 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)) self.assertEquals (row_list (ranged_model), range (0, 20))
ranged_model = GUI.RangeFilteredLogModel (full_model) ranged_model = GUI.RangeFilteredLogModel (full_model)
@ -381,8 +415,8 @@ class TestDynamicFilter (TestCase):
self.__dump_model (filtered_model, "filtered model") self.__dump_model (filtered_model, "filtered model")
self.assertEquals (row_list (filtered_model), random_rows) self.assertEquals (row_list (filtered_model), random_rows)
ranged_model.set_range (0, 9) ranged_model.set_range (0, 10)
self.__dump_model (ranged_model, "ranged model (0, 9)") self.__dump_model (ranged_model, "ranged model (0, 10)")
filtered_model.super_model_changed_range () filtered_model.super_model_changed_range ()
self.assertEquals (row_list (ranged_model), range (0, 10)) self.assertEquals (row_list (ranged_model), range (0, 10))
self.__dump_model (filtered_model) self.__dump_model (filtered_model)