mirror of
https://github.com/python/cpython.git
synced 2025-11-13 15:40:05 +00:00
Issue #18408: parser module: fix error handling in node2tuple()
Handle PyLong_FromLong() and PyUnicode_FromString() failures
This commit is contained in:
parent
3bd6abd129
commit
df4572cc71
1 changed files with 52 additions and 28 deletions
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue