about summary refs log tree commit homepage
path: root/lib/PublicInbox/SearchView.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-06-21 02:58:56 +0000
committerEric Wong <e@80x24.org>2016-06-21 03:06:56 +0000
commit377e75d7a2e9eaa9fdd77dfea9dc202b3bdbefc4 (patch)
tree6cdd22b36a4f2aaefe52c61056a06d96d10e4a11 /lib/PublicInbox/SearchView.pm
parent2da0edea03166ba0f90d3168aadfbb78659fbe78 (diff)
downloadpublic-inbox-377e75d7a2e9eaa9fdd77dfea9dc202b3bdbefc4.tar.gz
As before, recursion can cause problems sooner than unshifting
objects into the head of a queue.
Diffstat (limited to 'lib/PublicInbox/SearchView.pm')
-rw-r--r--lib/PublicInbox/SearchView.pm15
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm
index 6f67a37e..ba258270 100644
--- a/lib/PublicInbox/SearchView.pm
+++ b/lib/PublicInbox/SearchView.pm
@@ -151,7 +151,6 @@ sub tdump {
                 $m;
         } ($mset->items);
 
-        my @rootset;
         my $th = PublicInbox::Thread->new(@m);
         $th->thread;
         if ($q->{r}) { # order by relevance
@@ -164,7 +163,6 @@ sub tdump {
         } else { # order by time (default for threaded view)
                 $th->order(*PublicInbox::View::sort_ts);
         }
-        @rootset = $th->rootset;
         my $state = {
                 ctx => $ctx,
                 anchor_idx => 0,
@@ -174,7 +172,13 @@ sub tdump {
                 fh => $fh,
         };
         $ctx->{searchview} = 1;
-        tdump_ent($state, $_, 0) for @rootset;
+        my @q = map { (0, $_) } $th->rootset;
+        while (@q) {
+                my $level = shift @q;
+                my $node = shift @q or next;
+                tdump_ent($state, $level, $node);
+                unshift @q, $level+1, $node->child, $level, $node->next;
+        }
         PublicInbox::View::thread_adj_level($state, 0);
 
         $fh->write(search_nav_bot($mset, $q). "\n\n" .
@@ -184,8 +188,7 @@ sub tdump {
 }
 
 sub tdump_ent {
-        my ($state, $node, $level) = @_;
-        return unless $node;
+        my ($state, $level, $node) = @_;
         my $mime = $node->message;
 
         if ($mime) {
@@ -202,8 +205,6 @@ sub tdump_ent {
                 my $mid = $node->messageid;
                 PublicInbox::View::ghost_flush($state, '', $mid, $level);
         }
-        tdump_ent($state, $node->child, $level + 1);
-        tdump_ent($state, $node->next, $level);
 }
 
 sub foot {