Issue #25555: Fix parser and AST: fill lineno and col_offset of "arg" node when

compiling AST from Python objects.
This commit is contained in:
Victor Stinner 2015-11-06 17:01:48 +01:00
parent 82639816df
commit f9827ea618
5 changed files with 48 additions and 12 deletions

View file

@ -2372,7 +2372,8 @@ arguments(asdl_seq * args, arg_ty vararg, asdl_seq * kwonlyargs, asdl_seq *
}
arg_ty
arg(identifier arg, expr_ty annotation, PyArena *arena)
arg(identifier arg, expr_ty annotation, int lineno, int col_offset, PyArena
*arena)
{
arg_ty p;
if (!arg) {
@ -2385,6 +2386,8 @@ arg(identifier arg, expr_ty annotation, PyArena *arena)
return NULL;
p->arg = arg;
p->annotation = annotation;
p->lineno = lineno;
p->col_offset = col_offset;
return p;
}
@ -7086,6 +7089,8 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
PyObject* tmp = NULL;
identifier arg;
expr_ty annotation;
int lineno;
int col_offset;
if (_PyObject_HasAttrId(obj, &PyId_arg)) {
int res;
@ -7108,7 +7113,29 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
} else {
annotation = NULL;
}
*out = arg(arg, annotation, arena);
if (_PyObject_HasAttrId(obj, &PyId_lineno)) {
int res;
tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &lineno, arena);
if (res != 0) goto failed;
Py_CLEAR(tmp);
} else {
PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from arg");
return 1;
}
if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {
int res;
tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &col_offset, arena);
if (res != 0) goto failed;
Py_CLEAR(tmp);
} else {
PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from arg");
return 1;
}
*out = arg(arg, annotation, lineno, col_offset, arena);
return 0;
failed:
Py_XDECREF(tmp);

View file

@ -1173,11 +1173,9 @@ ast_for_arg(struct compiling *c, const node *n)
return NULL;
}
ret = arg(name, annotation, c->c_arena);
ret = arg(name, annotation, LINENO(n), n->n_col_offset, c->c_arena);
if (!ret)
return NULL;
ret->lineno = LINENO(n);
ret->col_offset = n->n_col_offset;
return ret;
}
@ -1233,11 +1231,10 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,
goto error;
if (forbidden_name(c, argname, ch, 0))
goto error;
arg = arg(argname, annotation, c->c_arena);
arg = arg(argname, annotation, LINENO(ch), ch->n_col_offset,
c->c_arena);
if (!arg)
goto error;
arg->lineno = LINENO(ch);
arg->col_offset = ch->n_col_offset;
asdl_seq_SET(kwonlyargs, j++, arg);
i += 2; /* the name and the comma */
break;