self.assertEqual(decoder.decode(b"\r\r\n"), "\r\r\n")
class CIncrementalNewlineDecoderTest(IncrementalNewlineDecoderTest):
- pass
+ @support.cpython_only
+ def test_uninitialized(self):
+ uninitialized = self.IncrementalNewlineDecoder.__new__(
+ self.IncrementalNewlineDecoder)
+ self.assertRaises(ValueError, uninitialized.decode, b'bar')
+ self.assertRaises(ValueError, uninitialized.getstate)
+ self.assertRaises(ValueError, uninitialized.setstate, (b'foo', 0))
+ self.assertRaises(ValueError, uninitialized.reset)
+
class PyIncrementalNewlineDecoderTest(IncrementalNewlineDecoderTest):
pass
PyObject *errors)
/*[clinic end generated code: output=fbd04d443e764ec2 input=89db6b19c6b126bf]*/
{
- self->decoder = decoder;
- Py_INCREF(decoder);
if (errors == NULL) {
- self->errors = &_Py_ID(strict);
+ errors = Py_NewRef(&_Py_ID(strict));
}
else {
- self->errors = errors;
+ errors = Py_NewRef(errors);
}
- Py_INCREF(self->errors);
+ Py_XSETREF(self->errors, errors);
+ Py_XSETREF(self->decoder, Py_NewRef(decoder));
self->translate = translate ? 1 : 0;
self->seennl = 0;
self->pendingcr = 0;
return 0;
}
+#define CHECK_INITIALIZED_DECODER(self) \
+ if (self->errors == NULL) { \
+ PyErr_SetString(PyExc_ValueError, \
+ "IncrementalNewlineDecoder.__init__() not called"); \
+ return NULL; \
+ }
+
#define SEEN_CR 1
#define SEEN_LF 2
#define SEEN_CRLF 4
Py_ssize_t output_len;
nldecoder_object *self = (nldecoder_object *) myself;
- if (self->decoder == NULL) {
- PyErr_SetString(PyExc_ValueError,
- "IncrementalNewlineDecoder.__init__ not called");
- return NULL;
- }
+ CHECK_INITIALIZED_DECODER(self);
/* decode input (with the eventual \r from a previous pass) */
if (self->decoder != Py_None) {
PyObject *buffer;
unsigned long long flag;
+ CHECK_INITIALIZED_DECODER(self);
+
if (self->decoder != Py_None) {
PyObject *state = PyObject_CallMethodNoArgs(self->decoder,
&_Py_ID(getstate));
PyObject *buffer;
unsigned long long flag;
+ CHECK_INITIALIZED_DECODER(self);
+
if (!PyTuple_Check(state)) {
PyErr_SetString(PyExc_TypeError, "state argument must be a tuple");
return NULL;
_io_IncrementalNewlineDecoder_reset_impl(nldecoder_object *self)
/*[clinic end generated code: output=32fa40c7462aa8ff input=728678ddaea776df]*/
{
+ CHECK_INITIALIZED_DECODER(self);
+
self->seennl = 0;
self->pendingcr = 0;
if (self->decoder != Py_None)
static PyObject *
incrementalnewlinedecoder_newlines_get(nldecoder_object *self, void *context)
{
+ CHECK_INITIALIZED_DECODER(self);
+
switch (self->seennl) {
case SEEN_CR:
return PyUnicode_FromString("\r");