summaryrefslogtreecommitdiffstats
path: root/Modules/parsermodule.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2013-07-11 23:35:10 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2013-07-11 23:35:10 (GMT)
commitdf4572cc71e6a29588a430ebbb4d25796724b02d (patch)
treeeabd9f3fe311e47fb3a9e3894e9fb6248f017ad5 /Modules/parsermodule.c
parent3bd6abd1294263f88ee4c0dbff3d1dfb618ec7ab (diff)
downloadcpython-df4572cc71e6a29588a430ebbb4d25796724b02d.zip
cpython-df4572cc71e6a29588a430ebbb4d25796724b02d.tar.gz
cpython-df4572cc71e6a29588a430ebbb4d25796724b02d.tar.bz2
Issue #18408: parser module: fix error handling in node2tuple()
Handle PyLong_FromLong() and PyUnicode_FromString() failures
Diffstat (limited to 'Modules/parsermodule.c')
-rw-r--r--Modules/parsermodule.c80
1 files changed, 52 insertions, 28 deletions
diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c
index d2693e3..e7fd839 100644
--- a/Modules/parsermodule.c
+++ b/Modules/parsermodule.c
@@ -83,54 +83,78 @@ node2tuple(node *n, /* node to convert */
int lineno, /* include line numbers? */
int col_offset) /* include column offsets? */
{
+ PyObject *result = NULL, *w;
+
if (n == NULL) {
Py_INCREF(Py_None);
- return (Py_None);
+ return Py_None;
}
+
if (ISNONTERMINAL(TYPE(n))) {
int i;
- PyObject *v;
- PyObject *w;
- v = mkseq(1 + NCH(n) + (TYPE(n) == encoding_decl));
- if (v == NULL)
- return (v);
+ result = mkseq(1 + NCH(n) + (TYPE(n) == encoding_decl));
+ if (result == NULL)
+ goto error;
+
w = PyLong_FromLong(TYPE(n));
- if (w == NULL) {
- Py_DECREF(v);
- return ((PyObject*) NULL);
- }
- (void) addelem(v, 0, w);
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, 0, w);
+
for (i = 0; i < NCH(n); i++) {
w = node2tuple(CHILD(n, i), mkseq, addelem, lineno, col_offset);
- if (w == NULL) {
- Py_DECREF(v);
- return ((PyObject*) NULL);
- }
- (void) addelem(v, i+1, w);
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, i+1, w);
}
- if (TYPE(n) == encoding_decl)
- (void) addelem(v, i+1, PyUnicode_FromString(STR(n)));
- return (v);
+ if (TYPE(n) == encoding_decl) {
+ w = PyUnicode_FromString(STR(n));
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, i+1, w);
+ }
}
else if (ISTERMINAL(TYPE(n))) {
- PyObject *result = mkseq(2 + lineno + col_offset);
- if (result != NULL) {
- (void) addelem(result, 0, PyLong_FromLong(TYPE(n)));
- (void) addelem(result, 1, PyUnicode_FromString(STR(n)));
- if (lineno == 1)
- (void) addelem(result, 2, PyLong_FromLong(n->n_lineno));
- if (col_offset == 1)
- (void) addelem(result, 3, PyLong_FromLong(n->n_col_offset));
+ result = mkseq(2 + lineno + col_offset);
+ if (result == NULL)
+ goto error;
+
+ w = PyLong_FromLong(TYPE(n));
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, 0, w);
+
+ w = PyUnicode_FromString(STR(n));
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, 1, w);
+
+ if (lineno == 1) {
+ w = PyLong_FromLong(n->n_lineno);
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, 2, w);
+ }
+
+ if (col_offset == 1) {
+ w = PyLong_FromLong(n->n_col_offset);
+ if (w == NULL)
+ goto error;
+ (void) addelem(result, 3, w);
}
- return (result);
}
else {
PyErr_SetString(PyExc_SystemError,
"unrecognized parse tree node type");
return ((PyObject*) NULL);
}
+ return result;
+
+error:
+ Py_XDECREF(result);
+ return NULL;
}
/*
* End of material copyrighted by Stichting Mathematisch Centrum.