#endif
#include "Python.h"
+#include "pycore_pyatomic_ft_wrappers.h"
#include <stddef.h> // offsetof()
#include <stdbool.h>
PyTypeObject *dialect_type;
PyTypeObject *reader_type;
PyTypeObject *writer_type;
- long field_limit; /* max parsed field size */
+ Py_ssize_t field_limit; /* max parsed field size */
PyObject *str_write;
} _csvstate;
static int
parse_add_char(ReaderObj *self, _csvstate *module_state, Py_UCS4 c)
{
- if (self->field_len >= module_state->field_limit) {
+ Py_ssize_t field_limit = FT_ATOMIC_LOAD_SSIZE_RELAXED(module_state->field_limit);
+ if (self->field_len >= field_limit) {
PyErr_Format(module_state->error_obj,
- "field larger than field limit (%ld)",
- module_state->field_limit);
+ "field larger than field limit (%zd)",
+ field_limit);
return -1;
}
if (self->field_len == self->field_size && !parse_grow_buff(self))
/*[clinic end generated code: output=f2799ecd908e250b input=cec70e9226406435]*/
{
_csvstate *module_state = get_csv_state(module);
- long old_limit = module_state->field_limit;
+ Py_ssize_t old_limit = FT_ATOMIC_LOAD_SSIZE_RELAXED(module_state->field_limit);
if (new_limit != NULL) {
if (!PyLong_CheckExact(new_limit)) {
PyErr_Format(PyExc_TypeError,
"limit must be an integer");
return NULL;
}
- module_state->field_limit = PyLong_AsLong(new_limit);
- if (module_state->field_limit == -1 && PyErr_Occurred()) {
- module_state->field_limit = old_limit;
+ Py_ssize_t new_limit_value = PyLong_AsSsize_t(new_limit);
+ if (new_limit_value == -1 && PyErr_Occurred()) {
return NULL;
}
+ FT_ATOMIC_STORE_SSIZE_RELAXED(module_state->field_limit, new_limit_value);
}
- return PyLong_FromLong(old_limit);
+ return PyLong_FromSsize_t(old_limit);
}
static PyType_Slot error_slots[] = {