From 2da0edea03166ba0f90d3168aadfbb78659fbe78 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 21 Jun 2016 02:58:55 +0000 Subject: view: remove recursion from expanded thread view This should let us generate HTML for arbitrarily deep threads without blowing the stack. How it renders on the client side is another matter... --- lib/PublicInbox/View.pm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index e09fbd51..bc4a4432 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -177,8 +177,13 @@ sub emit_thread_html { pre_anchor_entry($seen, $_) for (@$msgs); __thread_entry($state, $_, 0) for (@$msgs); } else { - my $th = thread_results($msgs); - thread_entry($state, $_, 0) for $th->rootset; + my @q = map { (0, $_) } thread_results($msgs)->rootset; + while (@q) { + my $level = shift @q; + my $node = shift @q or next; + thread_entry($state, $level, $node); + unshift @q, $level+1, $node->child, $level, $node->next; + } if (my $max = $state->{cur_level}) { $state->{fh}->write( ('' x ($max - 1)) . ''); @@ -618,8 +623,7 @@ sub __ghost_prepare { } sub thread_entry { - my ($state, $node, $level) = @_; - return unless $node; + my ($state, $level, $node) = @_; if (my $mime = $node->message) { unless (__thread_entry($state, $mime, $level)) { __ghost_prepare($state, $node, $level); @@ -627,9 +631,6 @@ sub thread_entry { } else { __ghost_prepare($state, $node, $level); } - - thread_entry($state, $node->child, $level + 1); - thread_entry($state, $node->next, $level); } sub load_results { -- cgit v1.2.3-24-ge0c7