mirror of
https://github.com/python/cpython.git
synced 2025-07-19 01:05:26 +00:00
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:
parent
82639816df
commit
f9827ea618
5 changed files with 48 additions and 12 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue