To: vim_dev@googlegroups.com Subject: Patch 8.2.0920 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0920 Problem: Writing viminfo fails with a circular reference. Solution: Use copyID to detect the cycle. (closes #6217) Files: src/testdir/test_viminfo.vim, src/viminfo.c *** ../vim-8.2.0919/src/testdir/test_viminfo.vim 2020-04-06 21:35:02.464237765 +0200 --- src/testdir/test_viminfo.vim 2020-06-07 15:58:32.383569743 +0200 *************** *** 91,96 **** --- 91,118 ---- set viminfo-=! endfunc + func Test_global_vars_with_circular_reference() + let g:MY_GLOBAL_LIST = [] + call add(g:MY_GLOBAL_LIST, g:MY_GLOBAL_LIST) + let g:MY_GLOBAL_DICT = {} + let g:MY_GLOBAL_DICT['self'] = g:MY_GLOBAL_DICT + + set viminfo='100,<50,s10,h,!,nviminfo + wv! Xviminfo + call assert_equal(v:errmsg, '') + + unlet g:MY_GLOBAL_LIST + unlet g:MY_GLOBAL_DICT + + rv! Xviminfo + call assert_equal(v:errmsg, '') + call assert_true(!exists('g:MY_GLOBAL_LIST')) + call assert_true(!exists('g:MY_GLOBAL_DICT')) + + call delete('Xviminfo') + set viminfo-=! + endfunc + func Test_cmdline_history() call histdel(':') call test_settime(11) *** ../vim-8.2.0919/src/viminfo.c 2020-04-05 21:38:11.637962358 +0200 --- src/viminfo.c 2020-06-07 16:06:58.317229870 +0200 *************** *** 1337,1344 **** case VAR_STRING: s = "STR"; break; case VAR_NUMBER: s = "NUM"; break; case VAR_FLOAT: s = "FLO"; break; ! case VAR_DICT: s = "DIC"; break; ! case VAR_LIST: s = "LIS"; break; case VAR_BLOB: s = "BLO"; break; case VAR_BOOL: s = "XPL"; break; // backwards compat. case VAR_SPECIAL: s = "XPL"; break; --- 1337,1370 ---- case VAR_STRING: s = "STR"; break; case VAR_NUMBER: s = "NUM"; break; case VAR_FLOAT: s = "FLO"; break; ! case VAR_DICT: ! { ! dict_T *di = this_var->di_tv.vval.v_dict; ! int copyID = get_copyID(); ! ! s = "DIC"; ! if (di != NULL && !set_ref_in_ht( ! &di->dv_hashtab, copyID, NULL) ! && di->dv_copyID == copyID) ! // has a circular reference, can't turn the ! // value into a string ! continue; ! break; ! } ! case VAR_LIST: ! { ! list_T *l = this_var->di_tv.vval.v_list; ! int copyID = get_copyID(); ! ! s = "LIS"; ! if (l != NULL && !set_ref_in_list_items( ! l, copyID, NULL) ! && l->lv_copyID == copyID) ! // has a circular reference, can't turn the ! // value into a string ! continue; ! break; ! } case VAR_BLOB: s = "BLO"; break; case VAR_BOOL: s = "XPL"; break; // backwards compat. case VAR_SPECIAL: s = "XPL"; break; *** ../vim-8.2.0919/src/version.c 2020-06-07 15:46:08.314414830 +0200 --- src/version.c 2020-06-07 15:59:39.003348763 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 920, /**/ -- A successful man is one who makes more money than his wife can spend. A successful woman is one who can find such a man. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///