summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/pyexpat.c34
1 files changed, 12 insertions, 22 deletions
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c
index ae98ef7..ee59baf 100644
--- a/Modules/pyexpat.c
+++ b/Modules/pyexpat.c
@@ -797,25 +797,13 @@ xmlparse_Parse(xmlparseobject *self, PyObject *args)
static int
readinst(char *buf, int buf_size, PyObject *meth)
{
- PyObject *arg = NULL;
- PyObject *bytes = NULL;
- PyObject *str = NULL;
- Py_ssize_t len = -1;
+ PyObject *str;
+ Py_ssize_t len;
char *ptr;
- if ((bytes = PyLong_FromLong(buf_size)) == NULL)
- goto finally;
-
- if ((arg = PyTuple_New(1)) == NULL) {
- Py_DECREF(bytes);
- goto finally;
- }
-
- PyTuple_SET_ITEM(arg, 0, bytes);
-
- str = PyObject_Call(meth, arg, NULL);
+ str = PyObject_CallFunction(meth, "n", buf_size);
if (str == NULL)
- goto finally;
+ goto error;
if (PyBytes_Check(str))
ptr = PyBytes_AS_STRING(str);
@@ -825,7 +813,7 @@ readinst(char *buf, int buf_size, PyObject *meth)
PyErr_Format(PyExc_TypeError,
"read() did not return a bytes object (type=%.400s)",
Py_TYPE(str)->tp_name);
- goto finally;
+ goto error;
}
len = Py_SIZE(str);
if (len > buf_size) {
@@ -833,14 +821,16 @@ readinst(char *buf, int buf_size, PyObject *meth)
"read() returned too much data: "
"%i bytes requested, %zd returned",
buf_size, len);
- goto finally;
+ goto error;
}
memcpy(buf, ptr, len);
-finally:
- Py_XDECREF(arg);
- Py_XDECREF(str);
- /* len <= buf_size <= INT_MAX (see above) */
+ Py_DECREF(str);
+ /* len <= buf_size <= INT_MAX */
return (int)len;
+
+error:
+ Py_XDECREF(str);
+ return -1;
}
PyDoc_STRVAR(xmlparse_ParseFile__doc__,