From 5927da00783dc8e5a20e059ba2762cdcff1fd3b6 Mon Sep 17 00:00:00 2001 From: James Clark Date: Tue, 6 Oct 2026 14:03:31 +0100 Subject: [PATCH] perf timechart: Fix task row type narrowing in goto_task() Mypy cannot narrow Row to TaskRow or IoRow when the class passed to isinstance() comes from a loop variable, causing the perf build to fail with: python/ttimechart.py:1686: error: "Row" has no attribute "task" [attr-defined] Check against TaskRow and IoRow explicitly so mypy can verify access to the task attribute. The tasks and I/O views contain TaskRow and IoRow instances respectively, so task navigation behaves as before. Fixes: e7a72d6919804e5e ("perf timechart: Add an interactive --tui mode") Reviewed-by: Ian Rogers Assisted-by: Codex:GPT-6.1-Sol Signed-off-by: James Clark Cc: Alice Rogers Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/python/ttimechart.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/perf/python/ttimechart.py b/tools/perf/python/ttimechart.py index 34ecf84e68c1..d7ba0276a9fb 100755 --- a/tools/perf/python/ttimechart.py +++ b/tools/perf/python/ttimechart.py @@ -1676,14 +1676,13 @@ class TimechartApp(App): def goto_task(self, tid: int, time: Optional[float]) -> None: """Select the task in the tasks or I/O view, optionally moving the cursor.""" - for tab_id, view_id, row_type in (("tasks", "#tasks_view", TaskRow), - ("io", "#io_view", IoRow)): + for tab_id, view_id in (("tasks", "#tasks_view"), ("io", "#io_view")): views = self.query(view_id) if not views: continue view = views.first(TimelineView) for idx, row in enumerate(view.rows): - if isinstance(row, row_type) and row.task.tid == tid: + if isinstance(row, (TaskRow, IoRow)) and row.task.tid == tid: self.query_one(TabbedContent).active = tab_id if time is not None: self.window = self.window.with_cursor(time)