Mercurial > vim
comparison src/eval.c @ 8698:13b0ed12a78a v7.4.1638
commit https://github.com/vim/vim/commit/e4eb6ff089e79e659acf33c17dd0fda7177de526
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Mar 22 21:00:09 2016 +0100
patch 7.4.1638
Problem: When binding a function to a dict the reference count is wrong.
Solution: Decrement dict reference count, only reference the function when
actually making a copy. (Ken Takata)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 22 Mar 2016 21:15:11 +0100 |
parents | 06848fe9c816 |
children | 077706f01e80 |
comparison
equal
deleted
inserted
replaced
8697:e3a81776a94c | 8698:13b0ed12a78a |
---|---|
12017 int i; | 12017 int i; |
12018 | 12018 |
12019 for (i = 0; i < pt->pt_argc; ++i) | 12019 for (i = 0; i < pt->pt_argc; ++i) |
12020 clear_tv(&pt->pt_argv[i]); | 12020 clear_tv(&pt->pt_argv[i]); |
12021 vim_free(pt->pt_argv); | 12021 vim_free(pt->pt_argv); |
12022 dict_unref(pt->pt_dict); | |
12022 func_unref(pt->pt_name); | 12023 func_unref(pt->pt_name); |
12023 vim_free(pt->pt_name); | 12024 vim_free(pt->pt_name); |
12024 vim_free(pt); | 12025 vim_free(pt); |
12025 } | 12026 } |
12026 | 12027 |
21795 pt->pt_refcount = 1; | 21796 pt->pt_refcount = 1; |
21796 pt->pt_dict = selfdict; | 21797 pt->pt_dict = selfdict; |
21797 selfdict = NULL; | 21798 selfdict = NULL; |
21798 if (rettv->v_type == VAR_FUNC) | 21799 if (rettv->v_type == VAR_FUNC) |
21799 { | 21800 { |
21800 /* just a function: use selfdict */ | 21801 /* Just a function: Take over the function name and use |
21802 * selfdict. */ | |
21801 pt->pt_name = rettv->vval.v_string; | 21803 pt->pt_name = rettv->vval.v_string; |
21802 } | 21804 } |
21803 else | 21805 else |
21804 { | 21806 { |
21805 partial_T *ret_pt = rettv->vval.v_partial; | 21807 partial_T *ret_pt = rettv->vval.v_partial; |
21806 int i; | 21808 int i; |
21807 | 21809 |
21808 /* partial: use selfdict and copy args */ | 21810 /* Partial: copy the function name, use selfdict and copy |
21811 * args. Can't take over name or args, the partial might | |
21812 * be referenced elsewhere. */ | |
21809 pt->pt_name = vim_strsave(ret_pt->pt_name); | 21813 pt->pt_name = vim_strsave(ret_pt->pt_name); |
21814 func_ref(pt->pt_name); | |
21810 if (ret_pt->pt_argc > 0) | 21815 if (ret_pt->pt_argc > 0) |
21811 { | 21816 { |
21812 pt->pt_argv = (typval_T *)alloc( | 21817 pt->pt_argv = (typval_T *)alloc( |
21813 sizeof(typval_T) * ret_pt->pt_argc); | 21818 sizeof(typval_T) * ret_pt->pt_argc); |
21814 if (pt->pt_argv == NULL) | 21819 if (pt->pt_argv == NULL) |
21821 copy_tv(&ret_pt->pt_argv[i], &pt->pt_argv[i]); | 21826 copy_tv(&ret_pt->pt_argv[i], &pt->pt_argv[i]); |
21822 } | 21827 } |
21823 } | 21828 } |
21824 partial_unref(ret_pt); | 21829 partial_unref(ret_pt); |
21825 } | 21830 } |
21826 func_ref(pt->pt_name); | |
21827 rettv->v_type = VAR_PARTIAL; | 21831 rettv->v_type = VAR_PARTIAL; |
21828 rettv->vval.v_partial = pt; | 21832 rettv->vval.v_partial = pt; |
21829 } | 21833 } |
21830 } | 21834 } |
21831 } | 21835 } |