@@ -92,57 +92,6 @@ _Py_bytes_isalnum(const char *cptr, Py_ssize_t len)
9292}
9393
9494
95- PyDoc_STRVAR_shared (_Py_isascii__doc__ ,
96- "B.isascii() -> bool\n\ 
97- \n\ 
98- Return True if B is empty or all characters in B are ASCII,\n\ 
99- False otherwise." );
100- 
101- // Optimization is copied from ascii_decode in unicodeobject.c 
102- /* Mask to quickly check whether a C 'size_t' contains a 
103-    non-ASCII, UTF8-encoded char. */ 
104- #if  (SIZEOF_SIZE_T  ==  8 )
105- # define  ASCII_CHAR_MASK  0x8080808080808080ULL
106- #elif  (SIZEOF_SIZE_T  ==  4 )
107- # define  ASCII_CHAR_MASK  0x80808080U
108- #else 
109- # error  C 'size_t' size should be either 4 or 8!
110- #endif 
111- 
112- PyObject * 
113- _Py_bytes_isascii (const  char  * cptr , Py_ssize_t  len )
114- {
115-     const  char  * p  =  cptr ;
116-     const  char  * end  =  p  +  len ;
117- 
118-     while  (p  <  end ) {
119-         /* Fast path, see in STRINGLIB(utf8_decode) in stringlib/codecs.h 
120-            for an explanation. */ 
121-         if  (_Py_IS_ALIGNED (p , ALIGNOF_SIZE_T )) {
122-             /* Help allocation */ 
123-             const  char  * _p  =  p ;
124-             while  (_p  +  SIZEOF_SIZE_T  <= end ) {
125-                 size_t  value  =  * (const  size_t  * ) _p ;
126-                 if  (value  &  ASCII_CHAR_MASK ) {
127-                     Py_RETURN_FALSE ;
128-                 }
129-                 _p  +=  SIZEOF_SIZE_T ;
130-             }
131-             p  =  _p ;
132-             if  (_p  ==  end )
133-                 break ;
134-         }
135-         if  ((unsigned char  )* p  &  0x80 ) {
136-             Py_RETURN_FALSE ;
137-         }
138-         p ++ ;
139-     }
140-     Py_RETURN_TRUE ;
141- }
142- 
143- #undef  ASCII_CHAR_MASK
144- 
145- 
14695PyDoc_STRVAR_shared (_Py_isdigit__doc__ ,
14796"B.isdigit() -> bool\n\ 
14897\n\ 
@@ -438,6 +387,7 @@ _Py_bytes_maketrans(Py_buffer *frm, Py_buffer *to)
438387#include  "stringlib/fastsearch.h" 
439388#include  "stringlib/count.h" 
440389#include  "stringlib/find.h" 
390+ #include  "stringlib/find_max_char.h" 
441391
442392/* 
443393Wraps stringlib_parse_args_finds() and additionally checks the first 
@@ -765,3 +715,21 @@ _Py_bytes_endswith(const char *str, Py_ssize_t len, PyObject *subobj,
765715{
766716    return  _Py_bytes_tailmatch (str , len , "endswith" , subobj , start , end , +1 );
767717}
718+ 
719+ PyDoc_STRVAR_shared (_Py_isascii__doc__ ,
720+ "B.isascii() -> bool\n\ 
721+ \n\ 
722+ Return True if B is empty or all characters in B are ASCII,\n\ 
723+ False otherwise." );
724+ 
725+ PyObject * 
726+ _Py_bytes_isascii (const  char  * cptr , Py_ssize_t  len )
727+ {
728+     const  char  * p  =  cptr ;
729+     const  char  * end  =  p  +  len ;
730+     Py_ssize_t  max_char  =  stringlib_find_max_char (cptr , end );
731+     if  (max_char  >  127 ) {
732+         Py_RETURN_FALSE ;
733+     }
734+     Py_RETURN_TRUE ;
735+ }
0 commit comments