NULL
};
-static int
-dialect_init(DialectObj * self, PyObject * args, PyObject * kwargs)
+static PyObject *
+dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
- int ret = -1;
- PyObject *dialect = NULL;
+ DialectObj *self;
+ PyObject *ret = NULL;
+ PyObject *dialect = NULL;
PyObject *delimiter = NULL;
PyObject *doublequote = NULL;
PyObject *escapechar = NULL;
"ing,
&skipinitialspace,
&strict))
- return -1;
+ return NULL;
+
+ if (dialect != NULL) {
+ if (IS_BASESTRING(dialect)) {
+ dialect = get_dialect_from_registry(dialect);
+ if (dialect == NULL)
+ return NULL;
+ }
+ else
+ Py_INCREF(dialect);
+ /* Can we reuse this instance? */
+ if (PyObject_TypeCheck(dialect, &Dialect_Type) &&
+ delimiter == 0 &&
+ doublequote == 0 &&
+ escapechar == 0 &&
+ lineterminator == 0 &&
+ quotechar == 0 &&
+ quoting == 0 &&
+ skipinitialspace == 0 &&
+ strict == 0)
+ return dialect;
+ }
+
+ self = (DialectObj *)type->tp_alloc(type, 0);
+ if (self == NULL) {
+ Py_XDECREF(dialect);
+ return NULL;
+ }
+ self->lineterminator = NULL;
Py_XINCREF(delimiter);
Py_XINCREF(doublequote);
Py_XINCREF(skipinitialspace);
Py_XINCREF(strict);
if (dialect != NULL) {
- if (IS_BASESTRING(dialect)) {
- dialect = get_dialect_from_registry(dialect);
- if (dialect == NULL)
- goto err;
- } else
- Py_INCREF(dialect);
#define DIALECT_GETATTR(v, n) \
if (v == NULL) \
v = PyObject_GetAttrString(dialect, n)
-
DIALECT_GETATTR(delimiter, "delimiter");
DIALECT_GETATTR(doublequote, "doublequote");
DIALECT_GETATTR(escapechar, "escapechar");
DIALECT_GETATTR(skipinitialspace, "skipinitialspace");
DIALECT_GETATTR(strict, "strict");
PyErr_Clear();
- Py_DECREF(dialect);
}
/* check types and convert to C values */
goto err;
}
if (self->lineterminator == 0) {
- PyErr_SetString(PyExc_TypeError, "lineterminator must be set");
+ PyErr_SetString(PyExc_TypeError, "lineterminator must be set");
goto err;
}
- ret = 0;
+ ret = (PyObject *)self;
err:
+ Py_XDECREF(dialect);
Py_XDECREF(delimiter);
Py_XDECREF(doublequote);
Py_XDECREF(escapechar);
Py_XDECREF(quoting);
Py_XDECREF(skipinitialspace);
Py_XDECREF(strict);
- return ret;
-}
-
-static PyObject *
-dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
-{
- DialectObj *self;
- self = (DialectObj *)type->tp_alloc(type, 0);
- if (self != NULL) {
- self->lineterminator = NULL;
- }
- return (PyObject *)self;
+ return ret;
}
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
- (initproc)dialect_init, /* tp_init */
- PyType_GenericAlloc, /* tp_alloc */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
dialect_new, /* tp_new */
0, /* tp_free */
};