From c1f7f17f9caa70ffc4857f64db59ff41741b0caf Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Fri, 24 Nov 2023 19:19:29 -0800 Subject: [PATCH] bugfix: infinite loop inside a very narrow window I'm not sure this can trigger everywhere (I've only been able to exercise it in Lua Carousel), but it seems like a safety net worth having against future modifications by anybody. --- source_text.lua | 4 +++- text.lua | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/source_text.lua b/source_text.lua index f93e859..f60123e 100644 --- a/source_text.lua +++ b/source_text.lua @@ -128,7 +128,9 @@ function Text.populate_screen_line_starting_pos(State, line_index) -- long word; chop it at some letter -- We're not going to reimplement TeX here. local bpos = Text.nearest_pos_less_than(frag, State.width - x) - -- everything works if bpos == 0, but is a little inefficient + if x == 0 and bpos == 0 then + assert(false, ("Infinite loop while line-wrapping. Editor is %dpx wide; window is %dpx wide"):format(State.width, App.screen.width)) + end pos = pos + bpos local boffset = Text.offset(frag, bpos+1) -- byte _after_ bpos frag = string.sub(frag, boffset) diff --git a/text.lua b/text.lua index db51ac4..2383137 100644 --- a/text.lua +++ b/text.lua @@ -103,7 +103,9 @@ function Text.populate_screen_line_starting_pos(State, line_index) -- long word; chop it at some letter -- We're not going to reimplement TeX here. local bpos = Text.nearest_pos_less_than(frag, State.width - x) - -- everything works if bpos == 0, but is a little inefficient + if x == 0 and bpos == 0 then + assert(false, ("Infinite loop while line-wrapping. Editor is %dpx wide; window is %dpx wide"):format(State.width, App.screen.width)) + end pos = pos + bpos local boffset = Text.offset(frag, bpos+1) -- byte _after_ bpos frag = string.sub(frag, boffset)