@@ -41,6 +41,8 @@ typedef struct
4141 list_T * fi_list ; // list being used
4242 int fi_bi ; // index of blob
4343 blob_T * fi_blob ; // blob being used
44+ char_u * fi_string ; // copy of string being used
45+ int fi_byte_idx ; // byte index in fi_string
4446} forinfo_T ;
4547
4648static int tv_op (typval_T * tv1 , typval_T * tv2 , char_u * op );
@@ -1738,6 +1740,14 @@ eval_for_line(
17381740 }
17391741 clear_tv (& tv );
17401742 }
1743+ else if (tv .v_type == VAR_STRING )
1744+ {
1745+ fi -> fi_byte_idx = 0 ;
1746+ fi -> fi_string = tv .vval .v_string ;
1747+ tv .vval .v_string = NULL ;
1748+ if (fi -> fi_string == NULL )
1749+ fi -> fi_string = vim_strsave ((char_u * )"" );
1750+ }
17411751 else
17421752 {
17431753 emsg (_ (e_listreq ));
@@ -1790,7 +1800,25 @@ next_for_item(void *fi_void, char_u *arg)
17901800 tv .vval .v_number = blob_get (fi -> fi_blob , fi -> fi_bi );
17911801 ++ fi -> fi_bi ;
17921802 return ex_let_vars (arg , & tv , TRUE, fi -> fi_semicolon ,
1793- fi -> fi_varcount , flag , NULL ) == OK ;
1803+ fi -> fi_varcount , flag , NULL ) == OK ;
1804+ }
1805+
1806+ if (fi -> fi_string != NULL )
1807+ {
1808+ typval_T tv ;
1809+ int len ;
1810+
1811+ len = mb_ptr2len (fi -> fi_string + fi -> fi_byte_idx );
1812+ if (len == 0 )
1813+ return FALSE;
1814+ tv .v_type = VAR_STRING ;
1815+ tv .v_lock = VAR_FIXED ;
1816+ tv .vval .v_string = vim_strnsave (fi -> fi_string + fi -> fi_byte_idx , len );
1817+ fi -> fi_byte_idx += len ;
1818+ result = ex_let_vars (arg , & tv , TRUE, fi -> fi_semicolon ,
1819+ fi -> fi_varcount , flag , NULL ) == OK ;
1820+ vim_free (tv .vval .v_string );
1821+ return result ;
17941822 }
17951823
17961824 item = fi -> fi_lw .lw_item ;
@@ -1800,7 +1828,7 @@ next_for_item(void *fi_void, char_u *arg)
18001828 {
18011829 fi -> fi_lw .lw_item = item -> li_next ;
18021830 result = (ex_let_vars (arg , & item -> li_tv , TRUE, fi -> fi_semicolon ,
1803- fi -> fi_varcount , flag , NULL ) == OK );
1831+ fi -> fi_varcount , flag , NULL ) == OK );
18041832 }
18051833 return result ;
18061834}
@@ -1813,13 +1841,17 @@ free_for_info(void *fi_void)
18131841{
18141842 forinfo_T * fi = (forinfo_T * )fi_void ;
18151843
1816- if (fi != NULL && fi -> fi_list != NULL )
1844+ if (fi == NULL )
1845+ return ;
1846+ if (fi -> fi_list != NULL )
18171847 {
18181848 list_rem_watch (fi -> fi_list , & fi -> fi_lw );
18191849 list_unref (fi -> fi_list );
18201850 }
1821- if (fi != NULL && fi -> fi_blob != NULL )
1851+ else if (fi -> fi_blob != NULL )
18221852 blob_unref (fi -> fi_blob );
1853+ else
1854+ vim_free (fi -> fi_string );
18231855 vim_free (fi );
18241856}
18251857
@@ -5266,6 +5298,9 @@ var2fpos(
52665298 return & pos ;
52675299 }
52685300
5301+ if (in_vim9script () && check_for_string_arg (varp , 0 ) == FAIL )
5302+ return NULL ;
5303+
52695304 name = tv_get_string_chk (varp );
52705305 if (name == NULL )
52715306 return NULL ;
0 commit comments