@@ -188,7 +188,11 @@ init_tv(typval_T *varp)
188188}
189189
190190 static varnumber_T
191- tv_get_bool_or_number_chk (typval_T * varp , int * denote , int want_bool )
191+ tv_get_bool_or_number_chk (
192+ typval_T * varp ,
193+ int * denote ,
194+ int want_bool ,
195+ int vim9_string_error ) // in Vim9 using a string is an error
192196{
193197 varnumber_T n = 0L ;
194198
@@ -210,7 +214,7 @@ tv_get_bool_or_number_chk(typval_T *varp, int *denote, int want_bool)
210214 emsg (_ (e_using_funcref_as_number ));
211215 break ;
212216 case VAR_STRING :
213- if (in_vim9script ())
217+ if (vim9_string_error && in_vim9script ())
214218 {
215219 emsg_using_string_as (varp , !want_bool );
216220 break ;
@@ -287,10 +291,22 @@ tv_get_number(typval_T *varp)
287291 return tv_get_number_chk (varp , & error ); // return 0L on error
288292}
289293
294+ /*
295+ * Like tv_get_numbe() but in Vim9 script do convert a number in a string to a
296+ * number without giving an error.
297+ */
298+ varnumber_T
299+ tv_to_number (typval_T * varp )
300+ {
301+ int error = FALSE;
302+
303+ return tv_get_bool_or_number_chk (varp , & error , FALSE, FALSE);
304+ }
305+
290306 varnumber_T
291307tv_get_number_chk (typval_T * varp , int * denote )
292308{
293- return tv_get_bool_or_number_chk (varp , denote , FALSE);
309+ return tv_get_bool_or_number_chk (varp , denote , FALSE, TRUE );
294310}
295311
296312/*
@@ -300,7 +316,7 @@ tv_get_number_chk(typval_T *varp, int *denote)
300316 varnumber_T
301317tv_get_bool (typval_T * varp )
302318{
303- return tv_get_bool_or_number_chk (varp , NULL , TRUE);
319+ return tv_get_bool_or_number_chk (varp , NULL , TRUE, TRUE );
304320}
305321
306322/*
@@ -310,7 +326,7 @@ tv_get_bool(typval_T *varp)
310326 varnumber_T
311327tv_get_bool_chk (typval_T * varp , int * denote )
312328{
313- return tv_get_bool_or_number_chk (varp , denote , TRUE);
329+ return tv_get_bool_or_number_chk (varp , denote , TRUE, TRUE );
314330}
315331
316332 static float_T
0 commit comments