mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-29852: Argument Clinic Py_ssize_t converter now supports None (#716)
if pass `accept={int, NoneType}`.
			
			
This commit is contained in:
		
							parent
							
								
									ea720fe7e9
								
							
						
					
					
						commit
						762bf40438
					
				
					 20 changed files with 98 additions and 200 deletions
				
			
		|  | @ -1097,6 +1097,9 @@ PyAPI_FUNC(void) _Py_add_one_to_index_F(int nd, Py_ssize_t *index, | ||||||
|                                         const Py_ssize_t *shape); |                                         const Py_ssize_t *shape); | ||||||
| PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index, | PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index, | ||||||
|                                         const Py_ssize_t *shape); |                                         const Py_ssize_t *shape); | ||||||
|  | 
 | ||||||
|  | /* Convert Python int to Py_ssize_t. Do nothing if the argument is None. */ | ||||||
|  | PyAPI_FUNC(int) _Py_convert_optional_to_ssize_t(PyObject *, void *); | ||||||
| #endif /* !Py_LIMITED_API */ | #endif /* !Py_LIMITED_API */ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -541,30 +541,6 @@ PyNumber_AsOff_t(PyObject *item, PyObject *err) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Basically the "n" format code with the ability to turn None into -1. */ |  | ||||||
| int |  | ||||||
| _PyIO_ConvertSsize_t(PyObject *obj, void *result) { |  | ||||||
|     Py_ssize_t limit; |  | ||||||
|     if (obj == Py_None) { |  | ||||||
|         limit = -1; |  | ||||||
|     } |  | ||||||
|     else if (PyIndex_Check(obj)) { |  | ||||||
|         limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError); |  | ||||||
|         if (limit == -1 && PyErr_Occurred()) { |  | ||||||
|             return 0; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         PyErr_Format(PyExc_TypeError, |  | ||||||
|                      "argument should be integer or None, not '%.200s'", |  | ||||||
|                      Py_TYPE(obj)->tp_name); |  | ||||||
|         return 0; |  | ||||||
|     } |  | ||||||
|     *((Py_ssize_t *)result) = limit; |  | ||||||
|     return 1; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| _PyIO_State * | _PyIO_State * | ||||||
| _PyIO_get_module_state(void) | _PyIO_get_module_state(void) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -27,8 +27,6 @@ PyAPI_DATA(PyObject *) _PyWindowsConsoleIO_Type; | ||||||
| #endif /* MS_WINDOWS */ | #endif /* MS_WINDOWS */ | ||||||
| #endif /* Py_LIMITED_API */ | #endif /* Py_LIMITED_API */ | ||||||
| 
 | 
 | ||||||
| extern int _PyIO_ConvertSsize_t(PyObject *, void *); |  | ||||||
| 
 |  | ||||||
| /* These functions are used as METH_NOARGS methods, are normally called
 | /* These functions are used as METH_NOARGS methods, are normally called
 | ||||||
|  * with args=NULL, and return a new reference. |  * with args=NULL, and return a new reference. | ||||||
|  * BUT when args=Py_True is passed, they return a borrowed reference. |  * BUT when args=Py_True is passed, they return a borrowed reference. | ||||||
|  |  | ||||||
|  | @ -24,13 +24,6 @@ class _io.BufferedRandom "buffered *" "&PyBufferedRandom_Type" | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=59460b9c5639984d]*/ | /*[clinic end generated code: output=da39a3ee5e6b4b0d input=59460b9c5639984d]*/ | ||||||
| 
 | 
 | ||||||
| /*[python input]
 |  | ||||||
| class io_ssize_t_converter(CConverter): |  | ||||||
|     type = 'Py_ssize_t' |  | ||||||
|     converter = '_PyIO_ConvertSsize_t' |  | ||||||
| [python start generated code]*/ |  | ||||||
| /*[python end generated code: output=da39a3ee5e6b4b0d input=d0a811d3cbfd1b33]*/ |  | ||||||
| 
 |  | ||||||
| _Py_IDENTIFIER(close); | _Py_IDENTIFIER(close); | ||||||
| _Py_IDENTIFIER(_dealloc_warn); | _Py_IDENTIFIER(_dealloc_warn); | ||||||
| _Py_IDENTIFIER(flush); | _Py_IDENTIFIER(flush); | ||||||
|  | @ -892,13 +885,13 @@ _io__Buffered_peek_impl(buffered *self, Py_ssize_t size) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io._Buffered.read | _io._Buffered.read | ||||||
|     size as n: io_ssize_t = -1 |     size as n: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io__Buffered_read_impl(buffered *self, Py_ssize_t n) | _io__Buffered_read_impl(buffered *self, Py_ssize_t n) | ||||||
| /*[clinic end generated code: output=f41c78bb15b9bbe9 input=c0939ec7f9e9354f]*/ | /*[clinic end generated code: output=f41c78bb15b9bbe9 input=7df81e82e08a68a2]*/ | ||||||
| { | { | ||||||
|     PyObject *res; |     PyObject *res; | ||||||
| 
 | 
 | ||||||
|  | @ -1206,13 +1199,13 @@ _buffered_readline(buffered *self, Py_ssize_t limit) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io._Buffered.readline | _io._Buffered.readline | ||||||
|     size: io_ssize_t = -1 |     size: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io__Buffered_readline_impl(buffered *self, Py_ssize_t size) | _io__Buffered_readline_impl(buffered *self, Py_ssize_t size) | ||||||
| /*[clinic end generated code: output=24dd2aa6e33be83c input=ff1e0df821cb4e5c]*/ | /*[clinic end generated code: output=24dd2aa6e33be83c input=673b6240e315ef8a]*/ | ||||||
| { | { | ||||||
|     CHECK_INITIALIZED(self) |     CHECK_INITIALIZED(self) | ||||||
|     return _buffered_readline(self, size); |     return _buffered_readline(self, size); | ||||||
|  |  | ||||||
|  | @ -8,13 +8,6 @@ class _io.BytesIO "bytesio *" "&PyBytesIO_Type" | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=7f50ec034f5c0b26]*/ | /*[clinic end generated code: output=da39a3ee5e6b4b0d input=7f50ec034f5c0b26]*/ | ||||||
| 
 | 
 | ||||||
| /*[python input]
 |  | ||||||
| class io_ssize_t_converter(CConverter): |  | ||||||
|     type = 'Py_ssize_t' |  | ||||||
|     converter = '_PyIO_ConvertSsize_t' |  | ||||||
| [python start generated code]*/ |  | ||||||
| /*[python end generated code: output=da39a3ee5e6b4b0d input=d0a811d3cbfd1b33]*/ |  | ||||||
| 
 |  | ||||||
| typedef struct { | typedef struct { | ||||||
|     PyObject_HEAD |     PyObject_HEAD | ||||||
|     PyObject *buf; |     PyObject *buf; | ||||||
|  | @ -381,7 +374,7 @@ read_bytes(bytesio *self, Py_ssize_t size) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io.BytesIO.read | _io.BytesIO.read | ||||||
|     size: io_ssize_t = -1 |     size: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| 
 | 
 | ||||||
| Read at most size bytes, returned as a bytes object. | Read at most size bytes, returned as a bytes object. | ||||||
|  | @ -392,7 +385,7 @@ Return an empty bytes object at EOF. | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_BytesIO_read_impl(bytesio *self, Py_ssize_t size) | _io_BytesIO_read_impl(bytesio *self, Py_ssize_t size) | ||||||
| /*[clinic end generated code: output=9cc025f21c75bdd2 input=c81ec53b8f2cc3cf]*/ | /*[clinic end generated code: output=9cc025f21c75bdd2 input=74344a39f431c3d7]*/ | ||||||
| { | { | ||||||
|     Py_ssize_t n; |     Py_ssize_t n; | ||||||
| 
 | 
 | ||||||
|  | @ -412,7 +405,7 @@ _io_BytesIO_read_impl(bytesio *self, Py_ssize_t size) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io.BytesIO.read1 | _io.BytesIO.read1 | ||||||
|     size: io_ssize_t = -1 |     size: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| 
 | 
 | ||||||
| Read at most size bytes, returned as a bytes object. | Read at most size bytes, returned as a bytes object. | ||||||
|  | @ -423,14 +416,14 @@ Return an empty bytes object at EOF. | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_BytesIO_read1_impl(bytesio *self, Py_ssize_t size) | _io_BytesIO_read1_impl(bytesio *self, Py_ssize_t size) | ||||||
| /*[clinic end generated code: output=d0f843285aa95f1c input=67cf18b142111664]*/ | /*[clinic end generated code: output=d0f843285aa95f1c input=440a395bf9129ef5]*/ | ||||||
| { | { | ||||||
|     return _io_BytesIO_read_impl(self, size); |     return _io_BytesIO_read_impl(self, size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io.BytesIO.readline | _io.BytesIO.readline | ||||||
|     size: io_ssize_t = -1 |     size: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| 
 | 
 | ||||||
| Next line from the file, as a bytes object. | Next line from the file, as a bytes object. | ||||||
|  | @ -442,7 +435,7 @@ Return an empty bytes object at EOF. | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_BytesIO_readline_impl(bytesio *self, Py_ssize_t size) | _io_BytesIO_readline_impl(bytesio *self, Py_ssize_t size) | ||||||
| /*[clinic end generated code: output=4bff3c251df8ffcd input=7c95bd3f9e9d1646]*/ | /*[clinic end generated code: output=4bff3c251df8ffcd input=e7c3fbd1744e2783]*/ | ||||||
| { | { | ||||||
|     Py_ssize_t n; |     Py_ssize_t n; | ||||||
| 
 | 
 | ||||||
|  | @ -556,7 +549,7 @@ _io_BytesIO_readinto_impl(bytesio *self, Py_buffer *buffer) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io.BytesIO.truncate | _io.BytesIO.truncate | ||||||
|     size as arg: object = None |     size: Py_ssize_t(accept={int, NoneType}, c_default="self->pos") = None | ||||||
|     / |     / | ||||||
| 
 | 
 | ||||||
| Truncate the file to at most size bytes. | Truncate the file to at most size bytes. | ||||||
|  | @ -566,31 +559,12 @@ The current file position is unchanged.  Returns the new size. | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_BytesIO_truncate_impl(bytesio *self, PyObject *arg) | _io_BytesIO_truncate_impl(bytesio *self, Py_ssize_t size) | ||||||
| /*[clinic end generated code: output=81e6be60e67ddd66 input=11ed1966835462ba]*/ | /*[clinic end generated code: output=9ad17650c15fa09b input=423759dd42d2f7c1]*/ | ||||||
| { | { | ||||||
|     Py_ssize_t size; |  | ||||||
| 
 |  | ||||||
|     CHECK_CLOSED(self); |     CHECK_CLOSED(self); | ||||||
|     CHECK_EXPORTS(self); |     CHECK_EXPORTS(self); | ||||||
| 
 | 
 | ||||||
|     if (arg == Py_None) { |  | ||||||
|         /* Truncate to current position if no argument is passed. */ |  | ||||||
|         size = self->pos; |  | ||||||
|     } |  | ||||||
|     else if (PyIndex_Check(arg)) { |  | ||||||
|         size = PyNumber_AsSsize_t(arg, PyExc_OverflowError); |  | ||||||
|         if (size == -1 && PyErr_Occurred()) { |  | ||||||
|             return NULL; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         PyErr_Format(PyExc_TypeError, |  | ||||||
|                      "argument should be integer or None, not '%.200s'", |  | ||||||
|                      Py_TYPE(arg)->tp_name); |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (size < 0) { |     if (size < 0) { | ||||||
|         PyErr_Format(PyExc_ValueError, |         PyErr_Format(PyExc_ValueError, | ||||||
|                      "negative size value %zd", size); |                      "negative size value %zd", size); | ||||||
|  |  | ||||||
|  | @ -134,7 +134,7 @@ _io__Buffered_read(buffered *self, PyObject **args, Py_ssize_t nargs, PyObject * | ||||||
|     Py_ssize_t n = -1; |     Py_ssize_t n = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:read", |     if (!_PyArg_ParseStack(args, nargs, "|O&:read", | ||||||
|         _PyIO_ConvertSsize_t, &n)) { |         _Py_convert_optional_to_ssize_t, &n)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -258,7 +258,7 @@ _io__Buffered_readline(buffered *self, PyObject **args, Py_ssize_t nargs, PyObje | ||||||
|     Py_ssize_t size = -1; |     Py_ssize_t size = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:readline", |     if (!_PyArg_ParseStack(args, nargs, "|O&:readline", | ||||||
|         _PyIO_ConvertSsize_t, &size)) { |         _Py_convert_optional_to_ssize_t, &size)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -500,4 +500,4 @@ _io_BufferedRandom___init__(PyObject *self, PyObject *args, PyObject *kwargs) | ||||||
| exit: | exit: | ||||||
|     return return_value; |     return return_value; | ||||||
| } | } | ||||||
| /*[clinic end generated code: output=e37b969b1acaa09c input=a9049054013a1b77]*/ | /*[clinic end generated code: output=3cf3262c9b157dc1 input=a9049054013a1b77]*/ | ||||||
|  |  | ||||||
|  | @ -170,7 +170,7 @@ _io_BytesIO_read(bytesio *self, PyObject **args, Py_ssize_t nargs, PyObject *kwn | ||||||
|     Py_ssize_t size = -1; |     Py_ssize_t size = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:read", |     if (!_PyArg_ParseStack(args, nargs, "|O&:read", | ||||||
|         _PyIO_ConvertSsize_t, &size)) { |         _Py_convert_optional_to_ssize_t, &size)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -205,7 +205,7 @@ _io_BytesIO_read1(bytesio *self, PyObject **args, Py_ssize_t nargs, PyObject *kw | ||||||
|     Py_ssize_t size = -1; |     Py_ssize_t size = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:read1", |     if (!_PyArg_ParseStack(args, nargs, "|O&:read1", | ||||||
|         _PyIO_ConvertSsize_t, &size)) { |         _Py_convert_optional_to_ssize_t, &size)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -241,7 +241,7 @@ _io_BytesIO_readline(bytesio *self, PyObject **args, Py_ssize_t nargs, PyObject | ||||||
|     Py_ssize_t size = -1; |     Py_ssize_t size = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:readline", |     if (!_PyArg_ParseStack(args, nargs, "|O&:readline", | ||||||
|         _PyIO_ConvertSsize_t, &size)) { |         _Py_convert_optional_to_ssize_t, &size)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -339,24 +339,23 @@ PyDoc_STRVAR(_io_BytesIO_truncate__doc__, | ||||||
|     {"truncate", (PyCFunction)_io_BytesIO_truncate, METH_FASTCALL, _io_BytesIO_truncate__doc__}, |     {"truncate", (PyCFunction)_io_BytesIO_truncate, METH_FASTCALL, _io_BytesIO_truncate__doc__}, | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_BytesIO_truncate_impl(bytesio *self, PyObject *arg); | _io_BytesIO_truncate_impl(bytesio *self, Py_ssize_t size); | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_BytesIO_truncate(bytesio *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) | _io_BytesIO_truncate(bytesio *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) | ||||||
| { | { | ||||||
|     PyObject *return_value = NULL; |     PyObject *return_value = NULL; | ||||||
|     PyObject *arg = Py_None; |     Py_ssize_t size = self->pos; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_UnpackStack(args, nargs, "truncate", |     if (!_PyArg_ParseStack(args, nargs, "|O&:truncate", | ||||||
|         0, 1, |         _Py_convert_optional_to_ssize_t, &size)) { | ||||||
|         &arg)) { |  | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_NoStackKeywords("truncate", kwnames)) { |     if (!_PyArg_NoStackKeywords("truncate", kwnames)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
|     return_value = _io_BytesIO_truncate_impl(self, arg); |     return_value = _io_BytesIO_truncate_impl(self, size); | ||||||
| 
 | 
 | ||||||
| exit: | exit: | ||||||
|     return return_value; |     return return_value; | ||||||
|  | @ -469,4 +468,4 @@ _io_BytesIO___init__(PyObject *self, PyObject *args, PyObject *kwargs) | ||||||
| exit: | exit: | ||||||
|     return return_value; |     return return_value; | ||||||
| } | } | ||||||
| /*[clinic end generated code: output=74a856733a5d55b0 input=a9049054013a1b77]*/ | /*[clinic end generated code: output=733795434f838b71 input=a9049054013a1b77]*/ | ||||||
|  |  | ||||||
|  | @ -214,7 +214,7 @@ _io_FileIO_read(fileio *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnam | ||||||
|     Py_ssize_t size = -1; |     Py_ssize_t size = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:read", |     if (!_PyArg_ParseStack(args, nargs, "|O&:read", | ||||||
|         _PyIO_ConvertSsize_t, &size)) { |         _Py_convert_optional_to_ssize_t, &size)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -385,4 +385,4 @@ _io_FileIO_isatty(fileio *self, PyObject *Py_UNUSED(ignored)) | ||||||
| #ifndef _IO_FILEIO_TRUNCATE_METHODDEF | #ifndef _IO_FILEIO_TRUNCATE_METHODDEF | ||||||
|     #define _IO_FILEIO_TRUNCATE_METHODDEF |     #define _IO_FILEIO_TRUNCATE_METHODDEF | ||||||
| #endif /* !defined(_IO_FILEIO_TRUNCATE_METHODDEF) */ | #endif /* !defined(_IO_FILEIO_TRUNCATE_METHODDEF) */ | ||||||
| /*[clinic end generated code: output=034d782a0daa82bd input=a9049054013a1b77]*/ | /*[clinic end generated code: output=a4044e2d878248d0 input=a9049054013a1b77]*/ | ||||||
|  |  | ||||||
|  | @ -186,7 +186,7 @@ _io__IOBase_readline(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject | ||||||
|     Py_ssize_t limit = -1; |     Py_ssize_t limit = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:readline", |     if (!_PyArg_ParseStack(args, nargs, "|O&:readline", | ||||||
|         _PyIO_ConvertSsize_t, &limit)) { |         _Py_convert_optional_to_ssize_t, &limit)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -222,7 +222,7 @@ _io__IOBase_readlines(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObjec | ||||||
|     Py_ssize_t hint = -1; |     Py_ssize_t hint = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:readlines", |     if (!_PyArg_ParseStack(args, nargs, "|O&:readlines", | ||||||
|         _PyIO_ConvertSsize_t, &hint)) { |         _Py_convert_optional_to_ssize_t, &hint)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -291,4 +291,4 @@ _io__RawIOBase_readall(PyObject *self, PyObject *Py_UNUSED(ignored)) | ||||||
| { | { | ||||||
|     return _io__RawIOBase_readall_impl(self); |     return _io__RawIOBase_readall_impl(self); | ||||||
| } | } | ||||||
| /*[clinic end generated code: output=1bcece367fc7b0cd input=a9049054013a1b77]*/ | /*[clinic end generated code: output=d3f59c135231baae input=a9049054013a1b77]*/ | ||||||
|  |  | ||||||
|  | @ -60,7 +60,7 @@ _io_StringIO_read(stringio *self, PyObject **args, Py_ssize_t nargs, PyObject *k | ||||||
|     Py_ssize_t size = -1; |     Py_ssize_t size = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:read", |     if (!_PyArg_ParseStack(args, nargs, "|O&:read", | ||||||
|         _PyIO_ConvertSsize_t, &size)) { |         _Py_convert_optional_to_ssize_t, &size)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -94,7 +94,7 @@ _io_StringIO_readline(stringio *self, PyObject **args, Py_ssize_t nargs, PyObjec | ||||||
|     Py_ssize_t size = -1; |     Py_ssize_t size = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:readline", |     if (!_PyArg_ParseStack(args, nargs, "|O&:readline", | ||||||
|         _PyIO_ConvertSsize_t, &size)) { |         _Py_convert_optional_to_ssize_t, &size)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -121,24 +121,23 @@ PyDoc_STRVAR(_io_StringIO_truncate__doc__, | ||||||
|     {"truncate", (PyCFunction)_io_StringIO_truncate, METH_FASTCALL, _io_StringIO_truncate__doc__}, |     {"truncate", (PyCFunction)_io_StringIO_truncate, METH_FASTCALL, _io_StringIO_truncate__doc__}, | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_StringIO_truncate_impl(stringio *self, PyObject *arg); | _io_StringIO_truncate_impl(stringio *self, Py_ssize_t size); | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_StringIO_truncate(stringio *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) | _io_StringIO_truncate(stringio *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) | ||||||
| { | { | ||||||
|     PyObject *return_value = NULL; |     PyObject *return_value = NULL; | ||||||
|     PyObject *arg = Py_None; |     Py_ssize_t size = self->pos; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_UnpackStack(args, nargs, "truncate", |     if (!_PyArg_ParseStack(args, nargs, "|O&:truncate", | ||||||
|         0, 1, |         _Py_convert_optional_to_ssize_t, &size)) { | ||||||
|         &arg)) { |  | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_NoStackKeywords("truncate", kwnames)) { |     if (!_PyArg_NoStackKeywords("truncate", kwnames)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
|     return_value = _io_StringIO_truncate_impl(self, arg); |     return_value = _io_StringIO_truncate_impl(self, size); | ||||||
| 
 | 
 | ||||||
| exit: | exit: | ||||||
|     return return_value; |     return return_value; | ||||||
|  | @ -303,4 +302,4 @@ _io_StringIO_seekable(stringio *self, PyObject *Py_UNUSED(ignored)) | ||||||
| { | { | ||||||
|     return _io_StringIO_seekable_impl(self); |     return _io_StringIO_seekable_impl(self); | ||||||
| } | } | ||||||
| /*[clinic end generated code: output=965fe9cb0d11511a input=a9049054013a1b77]*/ | /*[clinic end generated code: output=03429d95ed7cd92f input=a9049054013a1b77]*/ | ||||||
|  |  | ||||||
|  | @ -237,7 +237,7 @@ _io_TextIOWrapper_read(textio *self, PyObject **args, Py_ssize_t nargs, PyObject | ||||||
|     Py_ssize_t n = -1; |     Py_ssize_t n = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:read", |     if (!_PyArg_ParseStack(args, nargs, "|O&:read", | ||||||
|         _PyIO_ConvertSsize_t, &n)) { |         _Py_convert_optional_to_ssize_t, &n)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -480,4 +480,4 @@ _io_TextIOWrapper_close(textio *self, PyObject *Py_UNUSED(ignored)) | ||||||
| { | { | ||||||
|     return _io_TextIOWrapper_close_impl(self); |     return _io_TextIOWrapper_close_impl(self); | ||||||
| } | } | ||||||
| /*[clinic end generated code: output=67eba50449900a96 input=a9049054013a1b77]*/ | /*[clinic end generated code: output=8e5c21c88c7c70bc input=a9049054013a1b77]*/ | ||||||
|  |  | ||||||
|  | @ -221,7 +221,7 @@ _io__WindowsConsoleIO_read(winconsoleio *self, PyObject **args, Py_ssize_t nargs | ||||||
|     Py_ssize_t size = -1; |     Py_ssize_t size = -1; | ||||||
| 
 | 
 | ||||||
|     if (!_PyArg_ParseStack(args, nargs, "|O&:read", |     if (!_PyArg_ParseStack(args, nargs, "|O&:read", | ||||||
|         _PyIO_ConvertSsize_t, &size)) { |         _Py_convert_optional_to_ssize_t, &size)) { | ||||||
|         goto exit; |         goto exit; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -332,4 +332,4 @@ _io__WindowsConsoleIO_isatty(winconsoleio *self, PyObject *Py_UNUSED(ignored)) | ||||||
| #ifndef _IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF | #ifndef _IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF | ||||||
|     #define _IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF |     #define _IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF | ||||||
| #endif /* !defined(_IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF) */ | #endif /* !defined(_IO__WINDOWSCONSOLEIO_ISATTY_METHODDEF) */ | ||||||
| /*[clinic end generated code: output=04dab03363f5e304 input=a9049054013a1b77]*/ | /*[clinic end generated code: output=f2a240ec6af12a20 input=a9049054013a1b77]*/ | ||||||
|  |  | ||||||
|  | @ -52,13 +52,6 @@ class _io.FileIO "fileio *" "&PyFileIO_Type" | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=1c77708b41fda70c]*/ | /*[clinic end generated code: output=da39a3ee5e6b4b0d input=1c77708b41fda70c]*/ | ||||||
| 
 | 
 | ||||||
| /*[python input]
 |  | ||||||
| class io_ssize_t_converter(CConverter): |  | ||||||
|     type = 'Py_ssize_t' |  | ||||||
|     converter = '_PyIO_ConvertSsize_t' |  | ||||||
| [python start generated code]*/ |  | ||||||
| /*[python end generated code: output=da39a3ee5e6b4b0d input=d0a811d3cbfd1b33]*/ |  | ||||||
| 
 |  | ||||||
| typedef struct { | typedef struct { | ||||||
|     PyObject_HEAD |     PyObject_HEAD | ||||||
|     int fd; |     int fd; | ||||||
|  | @ -770,7 +763,7 @@ _io_FileIO_readall_impl(fileio *self) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io.FileIO.read | _io.FileIO.read | ||||||
|     size: io_ssize_t = -1 |     size: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| 
 | 
 | ||||||
| Read at most size bytes, returned as bytes. | Read at most size bytes, returned as bytes. | ||||||
|  | @ -782,7 +775,7 @@ Return an empty bytes object at EOF. | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_FileIO_read_impl(fileio *self, Py_ssize_t size) | _io_FileIO_read_impl(fileio *self, Py_ssize_t size) | ||||||
| /*[clinic end generated code: output=42528d39dd0ca641 input=5c6caa5490c13a9b]*/ | /*[clinic end generated code: output=42528d39dd0ca641 input=bec9a2c704ddcbc9]*/ | ||||||
| { | { | ||||||
|     char *ptr; |     char *ptr; | ||||||
|     Py_ssize_t n; |     Py_ssize_t n; | ||||||
|  |  | ||||||
|  | @ -20,13 +20,6 @@ class _io._RawIOBase "PyObject *" "&PyRawIOBase_Type" | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=d29a4d076c2b211c]*/ | /*[clinic end generated code: output=da39a3ee5e6b4b0d input=d29a4d076c2b211c]*/ | ||||||
| 
 | 
 | ||||||
| /*[python input]
 |  | ||||||
| class io_ssize_t_converter(CConverter): |  | ||||||
|     type = 'Py_ssize_t' |  | ||||||
|     converter = '_PyIO_ConvertSsize_t' |  | ||||||
| [python start generated code]*/ |  | ||||||
| /*[python end generated code: output=da39a3ee5e6b4b0d input=d0a811d3cbfd1b33]*/ |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|  * IOBase class, an abstract class |  * IOBase class, an abstract class | ||||||
|  */ |  */ | ||||||
|  | @ -488,7 +481,7 @@ _io__IOBase_isatty_impl(PyObject *self) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io._IOBase.readline | _io._IOBase.readline | ||||||
|     size as limit: io_ssize_t = -1 |     size as limit: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| 
 | 
 | ||||||
| Read and return a line from the stream. | Read and return a line from the stream. | ||||||
|  | @ -502,7 +495,7 @@ terminator(s) recognized. | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io__IOBase_readline_impl(PyObject *self, Py_ssize_t limit) | _io__IOBase_readline_impl(PyObject *self, Py_ssize_t limit) | ||||||
| /*[clinic end generated code: output=4479f79b58187840 input=df4cc8884f553cab]*/ | /*[clinic end generated code: output=4479f79b58187840 input=d0c596794e877bff]*/ | ||||||
| { | { | ||||||
|     /* For backwards compatibility, a (slowish) readline(). */ |     /* For backwards compatibility, a (slowish) readline(). */ | ||||||
| 
 | 
 | ||||||
|  | @ -635,7 +628,7 @@ iobase_iternext(PyObject *self) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io._IOBase.readlines | _io._IOBase.readlines | ||||||
|     hint: io_ssize_t = -1 |     hint: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| 
 | 
 | ||||||
| Return a list of lines from the stream. | Return a list of lines from the stream. | ||||||
|  | @ -647,7 +640,7 @@ lines so far exceeds hint. | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) | _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) | ||||||
| /*[clinic end generated code: output=2f50421677fa3dea input=1961c4a95e96e661]*/ | /*[clinic end generated code: output=2f50421677fa3dea input=9400c786ea9dc416]*/ | ||||||
| { | { | ||||||
|     Py_ssize_t length = 0; |     Py_ssize_t length = 0; | ||||||
|     PyObject *result; |     PyObject *result; | ||||||
|  |  | ||||||
|  | @ -17,13 +17,6 @@ class _io.StringIO "stringio *" "&PyStringIO_Type" | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=c17bc0f42165cd7d]*/ | /*[clinic end generated code: output=da39a3ee5e6b4b0d input=c17bc0f42165cd7d]*/ | ||||||
| 
 | 
 | ||||||
| /*[python input]
 |  | ||||||
| class io_ssize_t_converter(CConverter): |  | ||||||
|     type = 'Py_ssize_t' |  | ||||||
|     converter = '_PyIO_ConvertSsize_t' |  | ||||||
| [python start generated code]*/ |  | ||||||
| /*[python end generated code: output=da39a3ee5e6b4b0d input=d0a811d3cbfd1b33]*/ |  | ||||||
| 
 |  | ||||||
| typedef struct { | typedef struct { | ||||||
|     PyObject_HEAD |     PyObject_HEAD | ||||||
|     Py_UCS4 *buf; |     Py_UCS4 *buf; | ||||||
|  | @ -308,7 +301,7 @@ _io_StringIO_tell_impl(stringio *self) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io.StringIO.read | _io.StringIO.read | ||||||
|     size: io_ssize_t = -1 |     size: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| 
 | 
 | ||||||
| Read at most size characters, returned as a string. | Read at most size characters, returned as a string. | ||||||
|  | @ -319,7 +312,7 @@ is reached. Return an empty string at EOF. | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_StringIO_read_impl(stringio *self, Py_ssize_t size) | _io_StringIO_read_impl(stringio *self, Py_ssize_t size) | ||||||
| /*[clinic end generated code: output=ae8cf6002f71626c input=bbd84248eb4ab957]*/ | /*[clinic end generated code: output=ae8cf6002f71626c input=0921093383dfb92d]*/ | ||||||
| { | { | ||||||
|     Py_ssize_t n; |     Py_ssize_t n; | ||||||
|     Py_UCS4 *output; |     Py_UCS4 *output; | ||||||
|  | @ -380,7 +373,7 @@ _stringio_readline(stringio *self, Py_ssize_t limit) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io.StringIO.readline | _io.StringIO.readline | ||||||
|     size: io_ssize_t = -1 |     size: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| 
 | 
 | ||||||
| Read until newline or EOF. | Read until newline or EOF. | ||||||
|  | @ -390,7 +383,7 @@ Returns an empty string if EOF is hit immediately. | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_StringIO_readline_impl(stringio *self, Py_ssize_t size) | _io_StringIO_readline_impl(stringio *self, Py_ssize_t size) | ||||||
| /*[clinic end generated code: output=cabd6452f1b7e85d input=04de7535f732cb3d]*/ | /*[clinic end generated code: output=cabd6452f1b7e85d input=a5bd70bf682aa276]*/ | ||||||
| { | { | ||||||
|     CHECK_INITIALIZED(self); |     CHECK_INITIALIZED(self); | ||||||
|     CHECK_CLOSED(self); |     CHECK_CLOSED(self); | ||||||
|  | @ -439,7 +432,7 @@ stringio_iternext(stringio *self) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io.StringIO.truncate | _io.StringIO.truncate | ||||||
|     pos as arg: object = None |     pos as size: Py_ssize_t(accept={int, NoneType}, c_default="self->pos") = None | ||||||
|     / |     / | ||||||
| 
 | 
 | ||||||
| Truncate size to pos. | Truncate size to pos. | ||||||
|  | @ -450,31 +443,12 @@ Returns the new absolute position. | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_StringIO_truncate_impl(stringio *self, PyObject *arg) | _io_StringIO_truncate_impl(stringio *self, Py_ssize_t size) | ||||||
| /*[clinic end generated code: output=6072439c2b01d306 input=748619a494ba53ad]*/ | /*[clinic end generated code: output=eb3aef8e06701365 input=5505cff90ca48b96]*/ | ||||||
| { | { | ||||||
|     Py_ssize_t size; |  | ||||||
| 
 |  | ||||||
|     CHECK_INITIALIZED(self); |     CHECK_INITIALIZED(self); | ||||||
|     CHECK_CLOSED(self); |     CHECK_CLOSED(self); | ||||||
| 
 | 
 | ||||||
|     if (PyIndex_Check(arg)) { |  | ||||||
|         size = PyNumber_AsSsize_t(arg, PyExc_OverflowError); |  | ||||||
|         if (size == -1 && PyErr_Occurred()) { |  | ||||||
|             return NULL; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else if (arg == Py_None) { |  | ||||||
|         /* Truncate to current position if no argument is passed. */ |  | ||||||
|         size = self->pos; |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         PyErr_Format(PyExc_TypeError, |  | ||||||
|                      "argument should be integer or None, not '%.200s'", |  | ||||||
|                      Py_TYPE(arg)->tp_name); |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (size < 0) { |     if (size < 0) { | ||||||
|         PyErr_Format(PyExc_ValueError, |         PyErr_Format(PyExc_ValueError, | ||||||
|                      "Negative size value %zd", size); |                      "Negative size value %zd", size); | ||||||
|  |  | ||||||
|  | @ -18,13 +18,6 @@ class _io.TextIOWrapper "textio *" "&TextIOWrapper_TYpe" | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=2097a4fc85670c26]*/ | /*[clinic end generated code: output=da39a3ee5e6b4b0d input=2097a4fc85670c26]*/ | ||||||
| 
 | 
 | ||||||
| /*[python input]
 |  | ||||||
| class io_ssize_t_converter(CConverter): |  | ||||||
|     type = 'Py_ssize_t' |  | ||||||
|     converter = '_PyIO_ConvertSsize_t' |  | ||||||
| [python start generated code]*/ |  | ||||||
| /*[python end generated code: output=da39a3ee5e6b4b0d input=d0a811d3cbfd1b33]*/ |  | ||||||
| 
 |  | ||||||
| _Py_IDENTIFIER(close); | _Py_IDENTIFIER(close); | ||||||
| _Py_IDENTIFIER(_dealloc_warn); | _Py_IDENTIFIER(_dealloc_warn); | ||||||
| _Py_IDENTIFIER(decode); | _Py_IDENTIFIER(decode); | ||||||
|  | @ -1529,13 +1522,13 @@ textiowrapper_read_chunk(textio *self, Py_ssize_t size_hint) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io.TextIOWrapper.read | _io.TextIOWrapper.read | ||||||
|     size as n: io_ssize_t = -1 |     size as n: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io_TextIOWrapper_read_impl(textio *self, Py_ssize_t n) | _io_TextIOWrapper_read_impl(textio *self, Py_ssize_t n) | ||||||
| /*[clinic end generated code: output=7e651ce6cc6a25a6 input=8c09398424085cca]*/ | /*[clinic end generated code: output=7e651ce6cc6a25a6 input=123eecbfe214aeb8]*/ | ||||||
| { | { | ||||||
|     PyObject *result = NULL, *chunks = NULL; |     PyObject *result = NULL, *chunks = NULL; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -140,13 +140,6 @@ class _io._WindowsConsoleIO "winconsoleio *" "&PyWindowsConsoleIO_Type" | ||||||
| [clinic start generated code]*/ | [clinic start generated code]*/ | ||||||
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=e897fdc1fba4e131]*/ | /*[clinic end generated code: output=da39a3ee5e6b4b0d input=e897fdc1fba4e131]*/ | ||||||
| 
 | 
 | ||||||
| /*[python input]
 |  | ||||||
| class io_ssize_t_converter(CConverter): |  | ||||||
|     type = 'Py_ssize_t' |  | ||||||
|     converter = '_PyIO_ConvertSsize_t' |  | ||||||
| [python start generated code]*/ |  | ||||||
| /*[python end generated code: output=da39a3ee5e6b4b0d input=d0a811d3cbfd1b33]*/ |  | ||||||
| 
 |  | ||||||
| typedef struct { | typedef struct { | ||||||
|     PyObject_HEAD |     PyObject_HEAD | ||||||
|     HANDLE handle; |     HANDLE handle; | ||||||
|  | @ -906,7 +899,7 @@ _io__WindowsConsoleIO_readall_impl(winconsoleio *self) | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _io._WindowsConsoleIO.read | _io._WindowsConsoleIO.read | ||||||
|     size: io_ssize_t = -1 |     size: Py_ssize_t(accept={int, NoneType}) = -1 | ||||||
|     / |     / | ||||||
| 
 | 
 | ||||||
| Read at most size bytes, returned as bytes. | Read at most size bytes, returned as bytes. | ||||||
|  | @ -918,7 +911,7 @@ Return an empty bytes object at EOF. | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| _io__WindowsConsoleIO_read_impl(winconsoleio *self, Py_ssize_t size) | _io__WindowsConsoleIO_read_impl(winconsoleio *self, Py_ssize_t size) | ||||||
| /*[clinic end generated code: output=57df68af9f4b22d0 input=6c56fceec460f1dd]*/ | /*[clinic end generated code: output=57df68af9f4b22d0 input=8bc73bc15d0fa072]*/ | ||||||
| { | { | ||||||
|     PyObject *bytes; |     PyObject *bytes; | ||||||
|     Py_ssize_t bytes_size; |     Py_ssize_t bytes_size; | ||||||
|  |  | ||||||
|  | @ -240,29 +240,6 @@ mmap_read_line_method(mmap_object *self, | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Basically the "n" format code with the ability to turn None into -1. */ |  | ||||||
| static int |  | ||||||
| mmap_convert_ssize_t(PyObject *obj, void *result) { |  | ||||||
|     Py_ssize_t limit; |  | ||||||
|     if (obj == Py_None) { |  | ||||||
|         limit = -1; |  | ||||||
|     } |  | ||||||
|     else if (PyIndex_Check(obj)) { |  | ||||||
|         limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError); |  | ||||||
|         if (limit == -1 && PyErr_Occurred()) { |  | ||||||
|             return 0; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         PyErr_Format(PyExc_TypeError, |  | ||||||
|                      "argument should be integer or None, not '%.200s'", |  | ||||||
|                      Py_TYPE(obj)->tp_name); |  | ||||||
|         return 0; |  | ||||||
|     } |  | ||||||
|     *((Py_ssize_t *)result) = limit; |  | ||||||
|     return 1; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static PyObject * | static PyObject * | ||||||
| mmap_read_method(mmap_object *self, | mmap_read_method(mmap_object *self, | ||||||
|                  PyObject *args) |                  PyObject *args) | ||||||
|  | @ -271,7 +248,7 @@ mmap_read_method(mmap_object *self, | ||||||
|     PyObject *result; |     PyObject *result; | ||||||
| 
 | 
 | ||||||
|     CHECK_VALID(NULL); |     CHECK_VALID(NULL); | ||||||
|     if (!PyArg_ParseTuple(args, "|O&:read", mmap_convert_ssize_t, &num_bytes)) |     if (!PyArg_ParseTuple(args, "|O&:read", _Py_convert_optional_to_ssize_t, &num_bytes)) | ||||||
|         return(NULL); |         return(NULL); | ||||||
| 
 | 
 | ||||||
|     /* silently 'adjust' out-of-range requests */ |     /* silently 'adjust' out-of-range requests */ | ||||||
|  |  | ||||||
|  | @ -12,6 +12,31 @@ static PyObject **va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_ | ||||||
| /* Package context -- the full module name for package imports */ | /* Package context -- the full module name for package imports */ | ||||||
| const char *_Py_PackageContext = NULL; | const char *_Py_PackageContext = NULL; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | _Py_convert_optional_to_ssize_t(PyObject *obj, void *result) | ||||||
|  | { | ||||||
|  |     Py_ssize_t limit; | ||||||
|  |     if (obj == Py_None) { | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  |     else if (PyIndex_Check(obj)) { | ||||||
|  |         limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError); | ||||||
|  |         if (limit == -1 && PyErr_Occurred()) { | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         PyErr_Format(PyExc_TypeError, | ||||||
|  |                      "argument should be integer or None, not '%.200s'", | ||||||
|  |                      Py_TYPE(obj)->tp_name); | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |     *((Py_ssize_t *)result) = limit; | ||||||
|  |     return 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| /* Helper for mkvalue() to scan the length of a format */ | /* Helper for mkvalue() to scan the length of a format */ | ||||||
| 
 | 
 | ||||||
| static Py_ssize_t | static Py_ssize_t | ||||||
|  |  | ||||||
|  | @ -2650,12 +2650,20 @@ def converter_init(self, *, bitwise=False): | ||||||
|         if not bitwise: |         if not bitwise: | ||||||
|             fail("Unsigned long long must be bitwise (for now).") |             fail("Unsigned long long must be bitwise (for now).") | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class Py_ssize_t_converter(CConverter): | class Py_ssize_t_converter(CConverter): | ||||||
|     type = 'Py_ssize_t' |     type = 'Py_ssize_t' | ||||||
|     default_type = int |  | ||||||
|     format_unit = 'n' |  | ||||||
|     c_ignored_default = "0" |     c_ignored_default = "0" | ||||||
| 
 | 
 | ||||||
|  |     def converter_init(self, *, accept={int}): | ||||||
|  |         if accept == {int}: | ||||||
|  |             self.format_unit = 'n' | ||||||
|  |             self.default_type = int | ||||||
|  |         elif accept == {int, NoneType}: | ||||||
|  |             self.converter = '_Py_convert_optional_to_ssize_t' | ||||||
|  |         else: | ||||||
|  |             fail("Py_ssize_t_converter: illegal 'accept' argument " + repr(accept)) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class slice_index_converter(CConverter): | class slice_index_converter(CConverter): | ||||||
|     type = 'Py_ssize_t' |     type = 'Py_ssize_t' | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka