To: vim-dev@vim.org Subject: Patch 7.2.192 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.2.192 (after 7.2.188) Problem: Still a crash in the garbage collector for a very rare situation. Solution: Make sure current_copyID is always incremented correctly. (Kent Sibilev) Files: src/eval.c *** ../vim-7.2.191/src/eval.c 2009-05-26 22:58:43.000000000 +0200 --- src/eval.c 2009-05-29 21:13:47.000000000 +0200 *************** *** 6526,6532 **** /* Don't free variables in the previous_funccal list unless they are only * referenced through previous_funccal. This must be first, because if ! * the item is referenced elsewhere it must not be freed. */ for (fc = previous_funccal; fc != NULL; fc = fc->caller) { set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID + 1); --- 6526,6532 ---- /* Don't free variables in the previous_funccal list unless they are only * referenced through previous_funccal. This must be first, because if ! * the item is referenced elsewhere the funccal must not be freed. */ for (fc = previous_funccal; fc != NULL; fc = fc->caller) { set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID + 1); *************** *** 6564,6573 **** /* v: vars */ set_ref_in_ht(&vimvarht, copyID); ! /* Free lists and dictionaries that are not referenced. */ did_free = free_unref_items(copyID); ! /* check if any funccal can be freed now */ for (pfc = &previous_funccal; *pfc != NULL; ) { if (can_free_funccal(*pfc, copyID)) --- 6564,6577 ---- /* v: vars */ set_ref_in_ht(&vimvarht, copyID); ! /* ! * 2. Free lists and dictionaries that are not referenced. ! */ did_free = free_unref_items(copyID); ! /* ! * 3. Check if any funccal can be freed now. ! */ for (pfc = &previous_funccal; *pfc != NULL; ) { if (can_free_funccal(*pfc, copyID)) *************** *** 9286,9292 **** if (noref < 0 || noref > 1) EMSG(_(e_invarg)); else ! item_copy(&argvars[0], rettv, TRUE, noref == 0 ? ++current_copyID : 0); } /* --- 9290,9299 ---- if (noref < 0 || noref > 1) EMSG(_(e_invarg)); else ! { ! current_copyID += COPYID_INC; ! item_copy(&argvars[0], rettv, TRUE, noref == 0 ? current_copyID : 0); ! } } /* *************** *** 18966,18972 **** char_u *s; char_u numbuf[NUMBUFLEN]; ! s = echo_string(&v->di_tv, &tofree, numbuf, ++current_copyID); list_one_var_a(prefix, v->di_key, v->di_tv.v_type, s == NULL ? (char_u *)"" : s, first); vim_free(tofree); --- 18973,18980 ---- char_u *s; char_u numbuf[NUMBUFLEN]; ! current_copyID += COPYID_INC; ! s = echo_string(&v->di_tv, &tofree, numbuf, current_copyID); list_one_var_a(prefix, v->di_key, v->di_tv.v_type, s == NULL ? (char_u *)"" : s, first); vim_free(tofree); *************** *** 19401,19407 **** } else if (eap->cmdidx == CMD_echo) msg_puts_attr((char_u *)" ", echo_attr); ! p = echo_string(&rettv, &tofree, numbuf, ++current_copyID); if (p != NULL) for ( ; *p != NUL && !got_int; ++p) { --- 19409,19416 ---- } else if (eap->cmdidx == CMD_echo) msg_puts_attr((char_u *)" ", echo_attr); ! current_copyID += COPYID_INC; ! p = echo_string(&rettv, &tofree, numbuf, current_copyID); if (p != NULL) for ( ; *p != NUL && !got_int; ++p) { *** ../vim-7.2.191/src/version.c 2009-05-26 22:58:43.000000000 +0200 --- src/version.c 2009-06-03 13:21:20.000000000 +0200 *************** *** 678,679 **** --- 678,681 ---- { /* Add new patch number below this line */ + /**/ + 192, /**/ -- Imagine a world without hypothetical situations. /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 ///