@@ -2875,47 +2875,47 @@ unicode_fromformat_arg(_PyUnicodeWriter *writer,
2875
2875
static int
2876
2876
unicode_from_format (_PyUnicodeWriter * writer , const char * format , va_list vargs )
2877
2877
{
2878
- writer -> min_length += strlen (format ) + 100 ;
2878
+ Py_ssize_t len = strlen (format );
2879
+ writer -> min_length += len + 100 ;
2879
2880
writer -> overallocate = 1 ;
2880
2881
2881
- va_list vargs2 ;
2882
- const char * f ;
2883
-
2884
2882
// Copy varags to be able to pass a reference to a subfunction.
2883
+ va_list vargs2 ;
2885
2884
va_copy (vargs2 , vargs );
2886
2885
2887
- for (f = format ; * f ; ) {
2886
+ // _PyUnicodeWriter_WriteASCIIString() below requires the format string
2887
+ // to be encoded to ASCII.
2888
+ int is_ascii = (ucs1lib_find_max_char ((Py_UCS1 * )format , (Py_UCS1 * )format + len ) < 128 );
2889
+ if (!is_ascii ) {
2890
+ Py_ssize_t i ;
2891
+ for (i = 0 ; i < len && (unsigned char )format [i ] <= 127 ; i ++ );
2892
+ PyErr_Format (PyExc_ValueError ,
2893
+ "PyUnicode_FromFormatV() expects an ASCII-encoded format "
2894
+ "string, got a non-ASCII byte: 0x%02x" ,
2895
+ (unsigned char )format [i ]);
2896
+ goto fail ;
2897
+ }
2898
+
2899
+ for (const char * f = format ; * f ; ) {
2888
2900
if (* f == '%' ) {
2889
2901
f = unicode_fromformat_arg (writer , f , & vargs2 );
2890
2902
if (f == NULL )
2891
2903
goto fail ;
2892
2904
}
2893
2905
else {
2894
- const char * p ;
2895
- Py_ssize_t len ;
2896
-
2897
- p = f ;
2898
- do
2899
- {
2900
- if ((unsigned char )* p > 127 ) {
2901
- PyErr_Format (PyExc_ValueError ,
2902
- "PyUnicode_FromFormatV() expects an ASCII-encoded format "
2903
- "string, got a non-ASCII byte: 0x%02x" ,
2904
- (unsigned char )* p );
2905
- goto fail ;
2906
- }
2907
- p ++ ;
2906
+ const char * p = strchr (f , '%' );
2907
+ if (p != NULL ) {
2908
+ len = p - f ;
2908
2909
}
2909
- while (* p != '\0' && * p != '%' );
2910
- len = p - f ;
2911
-
2912
- if (* p == '\0' )
2910
+ else {
2911
+ len = strlen (f );
2913
2912
writer -> overallocate = 0 ;
2913
+ }
2914
2914
2915
- if (_PyUnicodeWriter_WriteASCIIString (writer , f , len ) < 0 )
2915
+ if (_PyUnicodeWriter_WriteASCIIString (writer , f , len ) < 0 ) {
2916
2916
goto fail ;
2917
-
2918
- f = p ;
2917
+ }
2918
+ f += len ;
2919
2919
}
2920
2920
}
2921
2921
va_end (vargs2 );
0 commit comments