Dominique Pelle wrote:
> On Sun, Mar 30, 2008 at 7:17 PM, Dominique Pelle > <[EMAIL PROTECTED]> wrote: > > > > On Sun, Mar 30, 2008 at 2:17 PM, Bram Moolenaar <[EMAIL PROTECTED]> wrote: > > > > > Andy Wokula wrote: > > > > > > > Strange bug and crash with :echo and lists, > > > > observed on gVim 7.1.283 (also gVim 7.0): > > > > > > > > > > > > let list = [] > > > > call add(list, "abc") > > > > call add(list, "def") > > > > echo list[0] > > > > " ^ important > > > > let list = reverse(list) > > > > call add(list, "ghi") > > > > let left = list[: 1] > > > > let right = [] > > > > > > > > " echo list[0] list[1] list[2] > > > > " " ^ crash, when uncommented! > > > > > > > > echo left list[2] right > > > > " ['abc', 'ghi'] ghi [] wrong > > > > > > > > let left = list[: 1] > > > > > > > > echo left list[2] right > > > > " ['def', 'abc'] ghi [] ok > > > > > > I can reproduce it. Also when it's shorter: > > > > > > let list = [] > > > call add(list, "abc") > > > call add(list, "def") > > > echo list[0] > > > let list = reverse(list) > > > call add(list, "ghi") > > > echo list[0] list[1] list[2] > > > > > > I suspect the reference counter is wrong somewhere, possibly for the > > > first "echo" line. > > > > > > I found the root cause of that bug. The list contains a > > cache (index in list + value) and that cache should be > > invalidated when doing some operations on the list > > such as: > > - sorting the list > > - inserting element in list > > - removing element from list. > > > > Also, when reversing the list, the cache index needed > > to be updated. > > > > Appending to the list does not need to invalidate cache. > > > > Attached patch fixes all this. > > > > Possible improvement: inserting or deleting element from > > the list could get away with not invalidating the cache when > > cached entry is before inserted/deleted element. But it's > > simpler and less risky to invalidate cache unconditionally > > I think. > > > > Cheers > > -- Dominique > > > Ooop. There were 2 places where my patch invalidated the > cache and it was not needed. Also, my cache index update > in f_reverse() was incorrect. > > So I attach my patch again with updates. Thanks for fixing this! -- Spam seems to be something useful to novices. Later you realize that it's a bunch of indigestable junk that only clogs your system. Applies to both the food and the e-mail! /// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org /// --~--~---------~--~----~------------~-------~--~----~ You received this message from the "vim_dev" maillist. For more information, visit http://www.vim.org/maillist.php -~----------~----~----~----~------~----~------~--~---
