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 }