Issue #18408: parser module: fix error handling in node2tuple()

Handle PyLong_FromLong() and PyUnicode_FromString() failures
This commit is contained in:
Victor Stinner 2013-07-12 01:35:10 +02:00
parent 3bd6abd129
commit df4572cc71

View file

@ -83,54 +83,78 @@ node2tuple(node *n, /* node to convert */
int lineno, /* include line numbers? */ int lineno, /* include line numbers? */
int col_offset) /* include column offsets? */ int col_offset) /* include column offsets? */
{ {
PyObject *result = NULL, *w;
if (n == NULL) { if (n == NULL) {
Py_INCREF(Py_None); Py_INCREF(Py_None);
return (Py_None); return Py_None;
} }
if (ISNONTERMINAL(TYPE(n))) { if (ISNONTERMINAL(TYPE(n))) {
int i; int i;
PyObject *v;
PyObject *w;
v = mkseq(1 + NCH(n) + (TYPE(n) == encoding_decl)); result = mkseq(1 + NCH(n) + (TYPE(n) == encoding_decl));
if (v == NULL) if (result == NULL)
return (v); goto error;
w = PyLong_FromLong(TYPE(n)); w = PyLong_FromLong(TYPE(n));
if (w == NULL) { if (w == NULL)
Py_DECREF(v); goto error;
return ((PyObject*) NULL); (void) addelem(result, 0, w);
}
(void) addelem(v, 0, w);
for (i = 0; i < NCH(n); i++) { for (i = 0; i < NCH(n); i++) {
w = node2tuple(CHILD(n, i), mkseq, addelem, lineno, col_offset); w = node2tuple(CHILD(n, i), mkseq, addelem, lineno, col_offset);
if (w == NULL) { if (w == NULL)
Py_DECREF(v); goto error;
return ((PyObject*) NULL); (void) addelem(result, i+1, w);
}
(void) addelem(v, i+1, w);
} }
if (TYPE(n) == encoding_decl) if (TYPE(n) == encoding_decl) {
(void) addelem(v, i+1, PyUnicode_FromString(STR(n))); w = PyUnicode_FromString(STR(n));
return (v); if (w == NULL)
goto error;
(void) addelem(result, i+1, w);
}
} }
else if (ISTERMINAL(TYPE(n))) { else if (ISTERMINAL(TYPE(n))) {
PyObject *result = mkseq(2 + lineno + col_offset); result = mkseq(2 + lineno + col_offset);
if (result != NULL) { if (result == NULL)
(void) addelem(result, 0, PyLong_FromLong(TYPE(n))); goto error;
(void) addelem(result, 1, PyUnicode_FromString(STR(n)));
if (lineno == 1) w = PyLong_FromLong(TYPE(n));
(void) addelem(result, 2, PyLong_FromLong(n->n_lineno)); if (w == NULL)
if (col_offset == 1) goto error;
(void) addelem(result, 3, PyLong_FromLong(n->n_col_offset)); (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 { else {
PyErr_SetString(PyExc_SystemError, PyErr_SetString(PyExc_SystemError,
"unrecognized parse tree node type"); "unrecognized parse tree node type");
return ((PyObject*) NULL); return ((PyObject*) NULL);
} }
return result;
error:
Py_XDECREF(result);
return NULL;
} }
/* /*
* End of material copyrighted by Stichting Mathematisch Centrum. * End of material copyrighted by Stichting Mathematisch Centrum.