@@ -2838,7 +2838,7 @@ do_unlet(char_u *name, int forceit)
28382838 }
28392839 hi = hash_find (ht , varname );
28402840 if (HASHITEM_EMPTY (hi ))
2841- hi = find_hi_in_scoped_ht (name , & varname , & ht );
2841+ hi = find_hi_in_scoped_ht (name , & ht );
28422842 if (hi != NULL && !HASHITEM_EMPTY (hi ))
28432843 {
28442844 di = HI2DI (hi );
@@ -5011,6 +5011,17 @@ get_lit_string_tv(char_u **arg, typval_T *rettv, int evaluate)
50115011 return OK ;
50125012}
50135013
5014+ /*
5015+ * Return the function name of the partial.
5016+ */
5017+ char_u *
5018+ partial_name (partial_T * pt )
5019+ {
5020+ if (pt -> pt_name != NULL )
5021+ return pt -> pt_name ;
5022+ return pt -> pt_func -> uf_name ;
5023+ }
5024+
50145025 static void
50155026partial_free (partial_T * pt )
50165027{
@@ -5020,8 +5031,13 @@ partial_free(partial_T *pt)
50205031 clear_tv (& pt -> pt_argv [i ]);
50215032 vim_free (pt -> pt_argv );
50225033 dict_unref (pt -> pt_dict );
5023- func_unref (pt -> pt_name );
5024- vim_free (pt -> pt_name );
5034+ if (pt -> pt_name != NULL )
5035+ {
5036+ func_unref (pt -> pt_name );
5037+ vim_free (pt -> pt_name );
5038+ }
5039+ else
5040+ func_ptr_unref (pt -> pt_func );
50255041 vim_free (pt );
50265042}
50275043
@@ -5051,11 +5067,11 @@ func_equal(
50515067
50525068 /* empty and NULL function name considered the same */
50535069 s1 = tv1 -> v_type == VAR_FUNC ? tv1 -> vval .v_string
5054- : tv1 -> vval .v_partial -> pt_name ;
5070+ : partial_name ( tv1 -> vval .v_partial ) ;
50555071 if (s1 != NULL && * s1 == NUL )
50565072 s1 = NULL ;
50575073 s2 = tv2 -> v_type == VAR_FUNC ? tv2 -> vval .v_string
5058- : tv2 -> vval .v_partial -> pt_name ;
5074+ : partial_name ( tv2 -> vval .v_partial ) ;
50595075 if (s2 != NULL && * s2 == NUL )
50605076 s2 = NULL ;
50615077 if (s1 == NULL || s2 == NULL )
@@ -5288,6 +5304,9 @@ garbage_collect(int testing)
52885304 /* function-local variables */
52895305 abort = abort || set_ref_in_call_stack (copyID );
52905306
5307+ /* named functions (matters for closures) */
5308+ abort = abort || set_ref_in_functions (copyID );
5309+
52915310 /* function call arguments, if v:testing is set. */
52925311 abort = abort || set_ref_in_func_args (copyID );
52935312
@@ -5550,7 +5569,7 @@ set_ref_in_item(
55505569 }
55515570 else if (tv -> v_type == VAR_FUNC )
55525571 {
5553- abort = set_ref_in_func (tv -> vval .v_string , copyID );
5572+ abort = set_ref_in_func (tv -> vval .v_string , NULL , copyID );
55545573 }
55555574 else if (tv -> v_type == VAR_PARTIAL )
55565575 {
@@ -5561,7 +5580,7 @@ set_ref_in_item(
55615580 */
55625581 if (pt != NULL )
55635582 {
5564- abort = set_ref_in_func (pt -> pt_name , copyID );
5583+ abort = set_ref_in_func (pt -> pt_name , pt -> pt_func , copyID );
55655584
55665585 if (pt -> pt_dict != NULL )
55675586 {
@@ -5735,7 +5754,7 @@ echo_string_core(
57355754 {
57365755 partial_T * pt = tv -> vval .v_partial ;
57375756 char_u * fname = string_quote (pt == NULL ? NULL
5738- : pt -> pt_name , FALSE);
5757+ : partial_name ( pt ) , FALSE);
57395758 garray_T ga ;
57405759 int i ;
57415760 char_u * tf ;
@@ -6871,7 +6890,7 @@ handle_subscript(
68716890 if (functv .v_type == VAR_PARTIAL )
68726891 {
68736892 pt = functv .vval .v_partial ;
6874- s = pt -> pt_name ;
6893+ s = partial_name ( pt ) ;
68756894 }
68766895 else
68776896 s = functv .vval .v_string ;
@@ -7328,8 +7347,7 @@ find_var(char_u *name, hashtab_T **htp, int no_autoload)
73287347 return ret ;
73297348
73307349 /* Search in parent scope for lambda */
7331- return find_var_in_scoped_ht (name , varname ? & varname : NULL ,
7332- no_autoload || htp != NULL );
7350+ return find_var_in_scoped_ht (name , no_autoload || htp != NULL );
73337351}
73347352
73357353/*
@@ -7668,7 +7686,7 @@ set_var(
76687686
76697687 /* Search in parent scope which is possible to reference from lambda */
76707688 if (v == NULL )
7671- v = find_var_in_scoped_ht (name , varname ? & varname : NULL , TRUE);
7689+ v = find_var_in_scoped_ht (name , TRUE);
76727690
76737691 if ((tv -> v_type == VAR_FUNC || tv -> v_type == VAR_PARTIAL )
76747692 && var_check_func_name (name , v == NULL ))
@@ -7813,7 +7831,7 @@ var_check_func_name(
78137831 /* Don't allow hiding a function. When "v" is not NULL we might be
78147832 * assigning another function to the same var, the type is checked
78157833 * below. */
7816- if (new_var && function_exists (name ))
7834+ if (new_var && function_exists (name , FALSE ))
78177835 {
78187836 EMSG2 (_ ("E705: Variable name conflicts with existing function: %s" ),
78197837 name );
@@ -10025,7 +10043,7 @@ filter_map_one(typval_T *tv, typval_T *expr, int map, int *remp)
1002510043 {
1002610044 partial_T * partial = expr -> vval .v_partial ;
1002710045
10028- s = partial -> pt_name ;
10046+ s = partial_name ( partial ) ;
1002910047 if (call_func (s , (int )STRLEN (s ), & rettv , 2 , argv , NULL ,
1003010048 0L , 0L , & dummy , TRUE, partial , NULL ) == FAIL )
1003110049 goto theend ;
0 commit comments