To: vim_dev@googlegroups.com Subject: Patch 8.0.1498 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1498 (after 8.0.1497) Problem: Getjumplist() returns duplicate entries. (lacygoill) Solution: Call cleanup_jumplist(). (Yegappan Lakshmanan) Files: src/evalfunc.c, src/mark.c, src/proto/mark.pro, src/testdir/test_jumplist.vim *** ../vim-8.0.1497/src/evalfunc.c 2018-02-10 21:05:52.642858209 +0100 --- src/evalfunc.c 2018-02-11 14:25:08.693827009 +0100 *************** *** 4871,4878 **** --- 4871,4883 ---- return; list_append_number(rettv->vval.v_list, (varnumber_T)wp->w_jumplistidx); + cleanup_jumplist(wp); for (i = 0; i < wp->w_jumplistlen; ++i) { + if (wp->w_jumplist[i].fmark.mark.lnum == 0) + continue; + if (wp->w_jumplist[i].fmark.fnum == 0) + fname2fnum(&wp->w_jumplist[i]); if ((d = dict_alloc()) == NULL) return; if (list_append_dict(l, d) == FAIL) *************** *** 4886,4892 **** NULL); # endif dict_add_nr_str(d, "bufnr", (long)wp->w_jumplist[i].fmark.fnum, NULL); ! if (wp->w_jumplist[i].fmark.fnum == 0) dict_add_nr_str(d, "filename", 0L, wp->w_jumplist[i].fname); } #endif --- 4891,4897 ---- NULL); # endif dict_add_nr_str(d, "bufnr", (long)wp->w_jumplist[i].fmark.fnum, NULL); ! if (wp->w_jumplist[i].fname != NULL) dict_add_nr_str(d, "filename", 0L, wp->w_jumplist[i].fname); } #endif *** ../vim-8.0.1497/src/mark.c 2018-02-10 18:45:21.064822187 +0100 --- src/mark.c 2018-02-11 14:28:04.456896564 +0100 *************** *** 27,39 **** #define EXTRA_MARKS 10 /* marks 0-9 */ static xfmark_T namedfm[NMARKS + EXTRA_MARKS]; /* marks with file nr */ - static void fname2fnum(xfmark_T *fm); static void fmarks_check_one(xfmark_T *fm, char_u *name, buf_T *buf); static char_u *mark_line(pos_T *mp, int lead_len); static void show_one_mark(int, char_u *, pos_T *, char_u *, int current); - #ifdef FEAT_JUMPLIST - static void cleanup_jumplist(void); - #endif #ifdef FEAT_VIMINFO static void write_one_filemark(FILE *fp, xfmark_T *fm, int c1, int c2); #endif --- 27,35 ---- *************** *** 225,231 **** pos_T *pos; xfmark_T *jmp; ! cleanup_jumplist(); if (curwin->w_jumplistlen == 0) /* nothing to jump to */ return (pos_T *)NULL; --- 221,227 ---- pos_T *pos; xfmark_T *jmp; ! cleanup_jumplist(curwin); if (curwin->w_jumplistlen == 0) /* nothing to jump to */ return (pos_T *)NULL; *************** *** 519,525 **** * This is used for marks obtained from the .viminfo file. It's postponed * until the mark is used to avoid a long startup delay. */ ! static void fname2fnum(xfmark_T *fm) { char_u *p; --- 515,521 ---- * This is used for marks obtained from the .viminfo file. It's postponed * until the mark is used to avoid a long startup delay. */ ! void fname2fnum(xfmark_T *fm) { char_u *p; *************** *** 895,901 **** int i; char_u *name; ! cleanup_jumplist(); /* Highlight title */ MSG_PUTS_TITLE(_("\n jump line col file/text")); for (i = 0; i < curwin->w_jumplistlen && !got_int; ++i) --- 891,898 ---- int i; char_u *name; ! cleanup_jumplist(curwin); ! /* Highlight title */ MSG_PUTS_TITLE(_("\n jump line col file/text")); for (i = 0; i < curwin->w_jumplistlen && !got_int; ++i) *************** *** 1305,1338 **** #ifdef FEAT_JUMPLIST /* * When deleting lines, this may create duplicate marks in the ! * jumplist. They will be removed here for the current window. */ ! static void ! cleanup_jumplist(void) { int i; int from, to; to = 0; ! for (from = 0; from < curwin->w_jumplistlen; ++from) { ! if (curwin->w_jumplistidx == from) ! curwin->w_jumplistidx = to; ! for (i = from + 1; i < curwin->w_jumplistlen; ++i) ! if (curwin->w_jumplist[i].fmark.fnum ! == curwin->w_jumplist[from].fmark.fnum ! && curwin->w_jumplist[from].fmark.fnum != 0 ! && curwin->w_jumplist[i].fmark.mark.lnum ! == curwin->w_jumplist[from].fmark.mark.lnum) break; ! if (i >= curwin->w_jumplistlen) /* no duplicate */ ! curwin->w_jumplist[to++] = curwin->w_jumplist[from]; else ! vim_free(curwin->w_jumplist[from].fname); } ! if (curwin->w_jumplistidx == curwin->w_jumplistlen) ! curwin->w_jumplistidx = to; ! curwin->w_jumplistlen = to; } /* --- 1302,1335 ---- #ifdef FEAT_JUMPLIST /* * When deleting lines, this may create duplicate marks in the ! * jumplist. They will be removed here for the specified window. */ ! void ! cleanup_jumplist(win_T *wp) { int i; int from, to; to = 0; ! for (from = 0; from < wp->w_jumplistlen; ++from) { ! if (wp->w_jumplistidx == from) ! wp->w_jumplistidx = to; ! for (i = from + 1; i < wp->w_jumplistlen; ++i) ! if (wp->w_jumplist[i].fmark.fnum ! == wp->w_jumplist[from].fmark.fnum ! && wp->w_jumplist[from].fmark.fnum != 0 ! && wp->w_jumplist[i].fmark.mark.lnum ! == wp->w_jumplist[from].fmark.mark.lnum) break; ! if (i >= wp->w_jumplistlen) /* no duplicate */ ! wp->w_jumplist[to++] = wp->w_jumplist[from]; else ! vim_free(wp->w_jumplist[from].fname); } ! if (wp->w_jumplistidx == wp->w_jumplistlen) ! wp->w_jumplistidx = to; ! wp->w_jumplistlen = to; } /* *************** *** 1741,1747 **** /* Write the jumplist with -' */ fputs(_("\n# Jumplist (newest first):\n"), fp); setpcmark(); /* add current cursor position */ ! cleanup_jumplist(); vi_idx = 0; idx = curwin->w_jumplistlen - 1; for (i = 0; i < JUMPLISTSIZE; ++i) --- 1738,1744 ---- /* Write the jumplist with -' */ fputs(_("\n# Jumplist (newest first):\n"), fp); setpcmark(); /* add current cursor position */ ! cleanup_jumplist(curwin); vi_idx = 0; idx = curwin->w_jumplistlen - 1; for (i = 0; i < JUMPLISTSIZE; ++i) *** ../vim-8.0.1497/src/proto/mark.pro 2017-03-14 21:53:54.114075276 +0100 --- src/proto/mark.pro 2018-02-11 14:25:08.697826988 +0100 *************** *** 9,14 **** --- 9,15 ---- pos_T *getmark(int c, int changefile); pos_T *getmark_buf_fnum(buf_T *buf, int c, int changefile, int *fnum); pos_T *getnextmark(pos_T *startpos, int dir, int begin_line); + void fname2fnum(xfmark_T *fm); void fmarks_check_names(buf_T *buf); int check_mark(pos_T *pos); void clrallmarks(buf_T *buf); *************** *** 23,28 **** --- 24,30 ---- void mark_col_adjust(linenr_T lnum, colnr_T mincol, long lnum_amount, long col_amount); void copy_jumplist(win_T *from, win_T *to); void free_jumplist(win_T *wp); + void cleanup_jumplist(win_T *wp); void set_last_cursor(win_T *win); void free_all_marks(void); int read_viminfo_filemark(vir_T *virp, int force); *** ../vim-8.0.1497/src/testdir/test_jumplist.vim 2018-02-10 21:05:52.642858209 +0100 --- src/testdir/test_jumplist.vim 2018-02-11 14:25:08.697826988 +0100 *************** *** 30,36 **** call assert_equal([[ \ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0}, - \ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 50, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}], 4], \ getjumplist()) --- 30,35 ---- *************** *** 48,64 **** call assert_equal([[ \ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 50, 'bufnr': bnr, 'col': 0, 'coladd': 0}, - \ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 5, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}], 5], \ getjumplist()) let l = getjumplist() call test_garbagecollect_now() ! call assert_equal(5, l[1]) clearjumps call test_garbagecollect_now() ! call assert_equal(5, l[1]) call delete("Xtest") endfunc --- 47,62 ---- call assert_equal([[ \ {'lnum': 1, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 50, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 5, 'bufnr': bnr, 'col': 0, 'coladd': 0}, \ {'lnum': 100, 'bufnr': bnr, 'col': 0, 'coladd': 0}], 5], \ getjumplist()) let l = getjumplist() call test_garbagecollect_now() ! call assert_equal(4, l[1]) clearjumps call test_garbagecollect_now() ! call assert_equal(4, l[1]) call delete("Xtest") endfunc *** ../vim-8.0.1497/src/version.c 2018-02-10 21:05:52.642858209 +0100 --- src/version.c 2018-02-11 14:26:30.177399760 +0100 *************** *** 773,774 **** --- 773,776 ---- { /* Add new patch number below this line */ + /**/ + 1498, /**/ -- WOMAN: Dennis, there's some lovely filth down here. Oh -- how d'you do? ARTHUR: How do you do, good lady. I am Arthur, King of the Britons. Who's castle is that? WOMAN: King of the who? The Quest for the Holy Grail (Monty Python) /// 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 ///