diff options
Diffstat (limited to 'Python/Python-ast.c')
| -rw-r--r-- | Python/Python-ast.c | 1277 | 
1 files changed, 719 insertions, 558 deletions
| diff --git a/Python/Python-ast.c b/Python/Python-ast.c index a276b6c..805f2b8 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -1,13 +1,6 @@  /* File automatically generated by Parser/asdl_c.py. */ - -/* -   __version__ 82163. - -   This module must be committed separately after each AST grammar change; -   The __version__ number is set to the revision number of the commit -   containing the grammar change. -*/ +#include <stddef.h>  #include "Python.h"  #include "Python-ast.h" @@ -16,6 +9,7 @@ static PyTypeObject AST_type;  static PyTypeObject *mod_type;  static PyObject* ast2obj_mod(void*);  static PyTypeObject *Module_type; +_Py_IDENTIFIER(body);  static char *Module_fields[]={          "body",  }; @@ -32,12 +26,18 @@ static char *Suite_fields[]={          "body",  };  static PyTypeObject *stmt_type; +_Py_IDENTIFIER(lineno); +_Py_IDENTIFIER(col_offset);  static char *stmt_attributes[] = {          "lineno",          "col_offset",  };  static PyObject* ast2obj_stmt(void*);  static PyTypeObject *FunctionDef_type; +_Py_IDENTIFIER(name); +_Py_IDENTIFIER(args); +_Py_IDENTIFIER(decorator_list); +_Py_IDENTIFIER(returns);  static char *FunctionDef_fields[]={          "name",          "args", @@ -46,6 +46,10 @@ static char *FunctionDef_fields[]={          "returns",  };  static PyTypeObject *ClassDef_type; +_Py_IDENTIFIER(bases); +_Py_IDENTIFIER(keywords); +_Py_IDENTIFIER(starargs); +_Py_IDENTIFIER(kwargs);  static char *ClassDef_fields[]={          "name",          "bases", @@ -56,10 +60,12 @@ static char *ClassDef_fields[]={          "decorator_list",  };  static PyTypeObject *Return_type; +_Py_IDENTIFIER(value);  static char *Return_fields[]={          "value",  };  static PyTypeObject *Delete_type; +_Py_IDENTIFIER(targets);  static char *Delete_fields[]={          "targets",  }; @@ -69,12 +75,16 @@ static char *Assign_fields[]={          "value",  };  static PyTypeObject *AugAssign_type; +_Py_IDENTIFIER(target); +_Py_IDENTIFIER(op);  static char *AugAssign_fields[]={          "target",          "op",          "value",  };  static PyTypeObject *For_type; +_Py_IDENTIFIER(iter); +_Py_IDENTIFIER(orelse);  static char *For_fields[]={          "target",          "iter", @@ -82,6 +92,7 @@ static char *For_fields[]={          "orelse",  };  static PyTypeObject *While_type; +_Py_IDENTIFIER(test);  static char *While_fields[]={          "test",          "body", @@ -94,37 +105,41 @@ static char *If_fields[]={          "orelse",  };  static PyTypeObject *With_type; +_Py_IDENTIFIER(items);  static char *With_fields[]={ -        "context_expr", -        "optional_vars", +        "items",          "body",  };  static PyTypeObject *Raise_type; +_Py_IDENTIFIER(exc); +_Py_IDENTIFIER(cause);  static char *Raise_fields[]={          "exc",          "cause",  }; -static PyTypeObject *TryExcept_type; -static char *TryExcept_fields[]={ +static PyTypeObject *Try_type; +_Py_IDENTIFIER(handlers); +_Py_IDENTIFIER(finalbody); +static char *Try_fields[]={          "body",          "handlers",          "orelse", -}; -static PyTypeObject *TryFinally_type; -static char *TryFinally_fields[]={ -        "body",          "finalbody",  };  static PyTypeObject *Assert_type; +_Py_IDENTIFIER(msg);  static char *Assert_fields[]={          "test",          "msg",  };  static PyTypeObject *Import_type; +_Py_IDENTIFIER(names);  static char *Import_fields[]={          "names",  };  static PyTypeObject *ImportFrom_type; +_Py_IDENTIFIER(module); +_Py_IDENTIFIER(level);  static char *ImportFrom_fields[]={          "module",          "names", @@ -152,17 +167,21 @@ static char *expr_attributes[] = {  };  static PyObject* ast2obj_expr(void*);  static PyTypeObject *BoolOp_type; +_Py_IDENTIFIER(values);  static char *BoolOp_fields[]={          "op",          "values",  };  static PyTypeObject *BinOp_type; +_Py_IDENTIFIER(left); +_Py_IDENTIFIER(right);  static char *BinOp_fields[]={          "left",          "op",          "right",  };  static PyTypeObject *UnaryOp_type; +_Py_IDENTIFIER(operand);  static char *UnaryOp_fields[]={          "op",          "operand", @@ -179,15 +198,19 @@ static char *IfExp_fields[]={          "orelse",  };  static PyTypeObject *Dict_type; +_Py_IDENTIFIER(keys);  static char *Dict_fields[]={          "keys",          "values",  };  static PyTypeObject *Set_type; +_Py_IDENTIFIER(elts);  static char *Set_fields[]={          "elts",  };  static PyTypeObject *ListComp_type; +_Py_IDENTIFIER(elt); +_Py_IDENTIFIER(generators);  static char *ListComp_fields[]={          "elt",          "generators", @@ -198,6 +221,7 @@ static char *SetComp_fields[]={          "generators",  };  static PyTypeObject *DictComp_type; +_Py_IDENTIFIER(key);  static char *DictComp_fields[]={          "key",          "value", @@ -212,13 +236,20 @@ static PyTypeObject *Yield_type;  static char *Yield_fields[]={          "value",  }; +static PyTypeObject *YieldFrom_type; +static char *YieldFrom_fields[]={ +        "value", +};  static PyTypeObject *Compare_type; +_Py_IDENTIFIER(ops); +_Py_IDENTIFIER(comparators);  static char *Compare_fields[]={          "left",          "ops",          "comparators",  };  static PyTypeObject *Call_type; +_Py_IDENTIFIER(func);  static char *Call_fields[]={          "func",          "args", @@ -227,10 +258,12 @@ static char *Call_fields[]={          "kwargs",  };  static PyTypeObject *Num_type; +_Py_IDENTIFIER(n);  static char *Num_fields[]={          "n",  };  static PyTypeObject *Str_type; +_Py_IDENTIFIER(s);  static char *Str_fields[]={          "s",  }; @@ -240,12 +273,15 @@ static char *Bytes_fields[]={  };  static PyTypeObject *Ellipsis_type;  static PyTypeObject *Attribute_type; +_Py_IDENTIFIER(attr); +_Py_IDENTIFIER(ctx);  static char *Attribute_fields[]={          "value",          "attr",          "ctx",  };  static PyTypeObject *Subscript_type; +_Py_IDENTIFIER(slice);  static char *Subscript_fields[]={          "value",          "slice", @@ -257,6 +293,7 @@ static char *Starred_fields[]={          "ctx",  };  static PyTypeObject *Name_type; +_Py_IDENTIFIER(id);  static char *Name_fields[]={          "id",          "ctx", @@ -284,12 +321,16 @@ static PyTypeObject *Param_type;  static PyTypeObject *slice_type;  static PyObject* ast2obj_slice(void*);  static PyTypeObject *Slice_type; +_Py_IDENTIFIER(lower); +_Py_IDENTIFIER(upper); +_Py_IDENTIFIER(step);  static char *Slice_fields[]={          "lower",          "upper",          "step",  };  static PyTypeObject *ExtSlice_type; +_Py_IDENTIFIER(dims);  static char *ExtSlice_fields[]={          "dims",  }; @@ -345,6 +386,7 @@ static PyTypeObject *In_type;  static PyTypeObject *NotIn_type;  static PyTypeObject *comprehension_type;  static PyObject* ast2obj_comprehension(void*); +_Py_IDENTIFIER(ifs);  static char *comprehension_fields[]={          "target",          "iter", @@ -357,6 +399,7 @@ static char *excepthandler_attributes[] = {  };  static PyObject* ast2obj_excepthandler(void*);  static PyTypeObject *ExceptHandler_type; +_Py_IDENTIFIER(type);  static char *ExceptHandler_fields[]={          "type",          "name", @@ -364,6 +407,13 @@ static char *ExceptHandler_fields[]={  };  static PyTypeObject *arguments_type;  static PyObject* ast2obj_arguments(void*); +_Py_IDENTIFIER(vararg); +_Py_IDENTIFIER(varargannotation); +_Py_IDENTIFIER(kwonlyargs); +_Py_IDENTIFIER(kwarg); +_Py_IDENTIFIER(kwargannotation); +_Py_IDENTIFIER(defaults); +_Py_IDENTIFIER(kw_defaults);  static char *arguments_fields[]={          "args",          "vararg", @@ -376,6 +426,8 @@ static char *arguments_fields[]={  };  static PyTypeObject *arg_type;  static PyObject* ast2obj_arg(void*); +_Py_IDENTIFIER(arg); +_Py_IDENTIFIER(annotation);  static char *arg_fields[]={          "arg",          "annotation", @@ -388,19 +440,54 @@ static char *keyword_fields[]={  };  static PyTypeObject *alias_type;  static PyObject* ast2obj_alias(void*); +_Py_IDENTIFIER(asname);  static char *alias_fields[]={          "name",          "asname",  }; +static PyTypeObject *withitem_type; +static PyObject* ast2obj_withitem(void*); +_Py_IDENTIFIER(context_expr); +_Py_IDENTIFIER(optional_vars); +static char *withitem_fields[]={ +        "context_expr", +        "optional_vars", +}; + + +typedef struct { +    PyObject_HEAD +    PyObject *dict; +} AST_object; +static void +ast_dealloc(AST_object *self) +{ +    Py_CLEAR(self->dict); +    Py_TYPE(self)->tp_free(self); +} + +static int +ast_traverse(AST_object *self, visitproc visit, void *arg) +{ +    Py_VISIT(self->dict); +    return 0; +} + +static void +ast_clear(AST_object *self) +{ +    Py_CLEAR(self->dict); +}  static int  ast_type_init(PyObject *self, PyObject *args, PyObject *kw)  { +    _Py_IDENTIFIER(_fields);      Py_ssize_t i, numfields = 0;      int res = -1;      PyObject *key, *value, *fields; -    fields = PyObject_GetAttrString((PyObject*)Py_TYPE(self), "_fields"); +    fields = _PyObject_GetAttrId((PyObject*)Py_TYPE(self), &PyId__fields);      if (!fields)          PyErr_Clear();      if (fields) { @@ -450,7 +537,8 @@ static PyObject *  ast_type_reduce(PyObject *self, PyObject *unused)  {      PyObject *res; -    PyObject *dict = PyObject_GetAttrString(self, "__dict__"); +    _Py_IDENTIFIER(__dict__); +    PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);      if (dict == NULL) {          if (PyErr_ExceptionMatches(PyExc_AttributeError))              PyErr_Clear(); @@ -470,12 +558,17 @@ static PyMethodDef ast_type_methods[] = {      {NULL}  }; +static PyGetSetDef ast_type_getsets[] = { +    {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict}, +    {NULL} +}; +  static PyTypeObject AST_type = {      PyVarObject_HEAD_INIT(&PyType_Type, 0)      "_ast.AST", -    sizeof(PyObject), +    sizeof(AST_object),      0, -    0,                       /* tp_dealloc */ +    (destructor)ast_dealloc, /* tp_dealloc */      0,                       /* tp_print */      0,                       /* tp_getattr */      0,                       /* tp_setattr */ @@ -490,26 +583,26 @@ static PyTypeObject AST_type = {      PyObject_GenericGetAttr, /* tp_getattro */      PyObject_GenericSetAttr, /* tp_setattro */      0,                       /* tp_as_buffer */ -    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ +    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */      0,                       /* tp_doc */ -    0,                       /* tp_traverse */ -    0,                       /* tp_clear */ +    (traverseproc)ast_traverse, /* tp_traverse */ +    (inquiry)ast_clear,      /* tp_clear */      0,                       /* tp_richcompare */      0,                       /* tp_weaklistoffset */      0,                       /* tp_iter */      0,                       /* tp_iternext */      ast_type_methods,        /* tp_methods */      0,                       /* tp_members */ -    0,                       /* tp_getset */ +    ast_type_getsets,        /* tp_getset */      0,                       /* tp_base */      0,                       /* tp_dict */      0,                       /* tp_descr_get */      0,                       /* tp_descr_set */ -    0,                       /* tp_dictoffset */ +    offsetof(AST_object, dict),/* tp_dictoffset */      (initproc)ast_type_init, /* tp_init */      PyType_GenericAlloc,     /* tp_alloc */      PyType_GenericNew,       /* tp_new */ -    PyObject_Del,            /* tp_free */ +    PyObject_GC_Del,         /* tp_free */  }; @@ -536,6 +629,7 @@ static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int  static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)  {      int i, result; +    _Py_IDENTIFIER(_attributes);      PyObject *s, *l = PyTuple_New(num_fields);      if (!l)          return 0; @@ -547,7 +641,7 @@ static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)          }          PyTuple_SET_ITEM(l, i, s);      } -    result = PyObject_SetAttrString((PyObject*)type, "_attributes", l) >= 0; +    result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;      Py_DECREF(l);      return result;  } @@ -556,7 +650,7 @@ static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)  static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))  { -    int i, n = asdl_seq_LEN(seq); +    Py_ssize_t i, n = asdl_seq_LEN(seq);      PyObject *result = PyList_New(n);      PyObject *value;      if (!result) @@ -581,6 +675,7 @@ static PyObject* ast2obj_object(void *o)  }  #define ast2obj_identifier ast2obj_object  #define ast2obj_string ast2obj_object +#define ast2obj_bytes ast2obj_object  static PyObject* ast2obj_int(long b)  { @@ -618,6 +713,15 @@ static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)      return obj2ast_object(obj, out, arena);  } +static int obj2ast_bytes(PyObject* obj, PyObject** out, PyArena* arena) +{ +    if (!PyBytes_CheckExact(obj)) { +        PyErr_SetString(PyExc_TypeError, "AST bytes must be of type bytes"); +        return 1; +    } +    return obj2ast_object(obj, out, arena); +} +  static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)  {      int i; @@ -691,15 +795,12 @@ static int init_types(void)          if (!While_type) return 0;          If_type = make_type("If", stmt_type, If_fields, 3);          if (!If_type) return 0; -        With_type = make_type("With", stmt_type, With_fields, 3); +        With_type = make_type("With", stmt_type, With_fields, 2);          if (!With_type) return 0;          Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);          if (!Raise_type) return 0; -        TryExcept_type = make_type("TryExcept", stmt_type, TryExcept_fields, 3); -        if (!TryExcept_type) return 0; -        TryFinally_type = make_type("TryFinally", stmt_type, TryFinally_fields, -                                    2); -        if (!TryFinally_type) return 0; +        Try_type = make_type("Try", stmt_type, Try_fields, 4); +        if (!Try_type) return 0;          Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);          if (!Assert_type) return 0;          Import_type = make_type("Import", stmt_type, Import_fields, 1); @@ -747,6 +848,8 @@ static int init_types(void)          if (!GeneratorExp_type) return 0;          Yield_type = make_type("Yield", expr_type, Yield_fields, 1);          if (!Yield_type) return 0; +        YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1); +        if (!YieldFrom_type) return 0;          Compare_type = make_type("Compare", expr_type, Compare_fields, 3);          if (!Compare_type) return 0;          Call_type = make_type("Call", expr_type, Call_fields, 5); @@ -949,6 +1052,8 @@ static int init_types(void)          if (!keyword_type) return 0;          alias_type = make_type("alias", &AST_type, alias_fields, 2);          if (!alias_type) return 0; +        withitem_type = make_type("withitem", &AST_type, withitem_fields, 2); +        if (!withitem_type) return 0;          initialized = 1;          return 1;  } @@ -971,6 +1076,7 @@ static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);  static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);  static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);  static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena); +static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);  mod_ty  Module(asdl_seq * body, PyArena *arena) @@ -1236,21 +1342,15 @@ If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int  }  stmt_ty -With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body, int lineno, -     int col_offset, PyArena *arena) +With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, PyArena +     *arena)  {          stmt_ty p; -        if (!context_expr) { -                PyErr_SetString(PyExc_ValueError, -                                "field context_expr is required for With"); -                return NULL; -        }          p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));          if (!p)                  return NULL;          p->kind = With_kind; -        p->v.With.context_expr = context_expr; -        p->v.With.optional_vars = optional_vars; +        p->v.With.items = items;          p->v.With.body = body;          p->lineno = lineno;          p->col_offset = col_offset; @@ -1273,33 +1373,18 @@ Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, PyArena *arena)  }  stmt_ty -TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno, -          int col_offset, PyArena *arena) -{ -        stmt_ty p; -        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); -        if (!p) -                return NULL; -        p->kind = TryExcept_kind; -        p->v.TryExcept.body = body; -        p->v.TryExcept.handlers = handlers; -        p->v.TryExcept.orelse = orelse; -        p->lineno = lineno; -        p->col_offset = col_offset; -        return p; -} - -stmt_ty -TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int col_offset, -           PyArena *arena) +Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq * +    finalbody, int lineno, int col_offset, PyArena *arena)  {          stmt_ty p;          p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));          if (!p)                  return NULL; -        p->kind = TryFinally_kind; -        p->v.TryFinally.body = body; -        p->v.TryFinally.finalbody = finalbody; +        p->kind = Try_kind; +        p->v.Try.body = body; +        p->v.Try.handlers = handlers; +        p->v.Try.orelse = orelse; +        p->v.Try.finalbody = finalbody;          p->lineno = lineno;          p->col_offset = col_offset;          return p; @@ -1714,6 +1799,20 @@ Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)  }  expr_ty +YieldFrom(expr_ty value, int lineno, int col_offset, PyArena *arena) +{ +        expr_ty p; +        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); +        if (!p) +                return NULL; +        p->kind = YieldFrom_kind; +        p->v.YieldFrom.value = value; +        p->lineno = lineno; +        p->col_offset = col_offset; +        return p; +} + +expr_ty  Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,          int col_offset, PyArena *arena)  { @@ -1798,7 +1897,7 @@ Str(string s, int lineno, int col_offset, PyArena *arena)  }  expr_ty -Bytes(string s, int lineno, int col_offset, PyArena *arena) +Bytes(bytes s, int lineno, int col_offset, PyArena *arena)  {          expr_ty p;          if (!s) { @@ -2146,6 +2245,23 @@ alias(identifier name, identifier asname, PyArena *arena)          return p;  } +withitem_ty +withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena) +{ +        withitem_ty p; +        if (!context_expr) { +                PyErr_SetString(PyExc_ValueError, +                                "field context_expr is required for withitem"); +                return NULL; +        } +        p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p)); +        if (!p) +                return NULL; +        p->context_expr = context_expr; +        p->optional_vars = optional_vars; +        return p; +} +  PyObject*  ast2obj_mod(void* _o) @@ -2163,7 +2279,7 @@ ast2obj_mod(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.Module.body, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2172,7 +2288,7 @@ ast2obj_mod(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2181,7 +2297,7 @@ ast2obj_mod(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Expression.body);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2190,7 +2306,7 @@ ast2obj_mod(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2218,29 +2334,29 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_identifier(o->v.FunctionDef.name);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "name", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_arguments(o->v.FunctionDef.args);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "args", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.FunctionDef.decorator_list,                                       ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "decorator_list", value) == +                if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) ==                      -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.FunctionDef.returns);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "returns", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2249,38 +2365,38 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_identifier(o->v.ClassDef.name);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "name", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "bases", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "keywords", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.ClassDef.starargs);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "starargs", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_starargs, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.ClassDef.kwargs);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "kwargs", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_kwargs, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.ClassDef.decorator_list,                                       ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "decorator_list", value) == +                if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) ==                      -1)                          goto failed;                  Py_DECREF(value); @@ -2290,7 +2406,7 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Return.value);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "value", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2299,7 +2415,7 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "targets", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2308,12 +2424,12 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "targets", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.Assign.value);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "value", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2322,17 +2438,17 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.AugAssign.target);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "target", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_operator(o->v.AugAssign.op);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "op", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.AugAssign.value);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "value", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2341,22 +2457,22 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.For.target);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "target", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.For.iter);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "iter", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.For.body, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "orelse", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2365,17 +2481,17 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.While.test);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "test", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.While.body, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "orelse", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2384,37 +2500,31 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.If.test);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "test", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.If.body, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "orelse", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)                          goto failed;                  Py_DECREF(value);                  break;          case With_kind:                  result = PyType_GenericNew(With_type, NULL, NULL);                  if (!result) goto failed; -                value = ast2obj_expr(o->v.With.context_expr); +                value = ast2obj_list(o->v.With.items, ast2obj_withitem);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "context_expr", value) == -1) -                        goto failed; -                Py_DECREF(value); -                value = ast2obj_expr(o->v.With.optional_vars); -                if (!value) goto failed; -                if (PyObject_SetAttrString(result, "optional_vars", value) == -                    -1) +                if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.With.body, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2423,46 +2533,36 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Raise.exc);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "exc", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.Raise.cause);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "cause", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; -        case TryExcept_kind: -                result = PyType_GenericNew(TryExcept_type, NULL, NULL); +        case Try_kind: +                result = PyType_GenericNew(Try_type, NULL, NULL);                  if (!result) goto failed; -                value = ast2obj_list(o->v.TryExcept.body, ast2obj_stmt); -                if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) -                        goto failed; -                Py_DECREF(value); -                value = ast2obj_list(o->v.TryExcept.handlers, -                                     ast2obj_excepthandler); +                value = ast2obj_list(o->v.Try.body, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "handlers", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value); -                value = ast2obj_list(o->v.TryExcept.orelse, ast2obj_stmt); +                value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "orelse", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)                          goto failed;                  Py_DECREF(value); -                break; -        case TryFinally_kind: -                result = PyType_GenericNew(TryFinally_type, NULL, NULL); -                if (!result) goto failed; -                value = ast2obj_list(o->v.TryFinally.body, ast2obj_stmt); +                value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)                          goto failed;                  Py_DECREF(value); -                value = ast2obj_list(o->v.TryFinally.finalbody, ast2obj_stmt); +                value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "finalbody", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2471,12 +2571,12 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Assert.test);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "test", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.Assert.msg);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "msg", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2485,7 +2585,7 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.Import.names, ast2obj_alias);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "names", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2494,17 +2594,17 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_identifier(o->v.ImportFrom.module);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "module", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "names", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_int(o->v.ImportFrom.level);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "level", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2513,7 +2613,7 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.Global.names, ast2obj_identifier);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "names", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2522,7 +2622,7 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "names", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2531,7 +2631,7 @@ ast2obj_stmt(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Expr.value);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "value", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2550,12 +2650,12 @@ ast2obj_stmt(void* _o)          }          value = ast2obj_int(o->lineno);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "lineno", value) < 0) +        if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)                  goto failed;          Py_DECREF(value);          value = ast2obj_int(o->col_offset);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "col_offset", value) < 0) +        if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)                  goto failed;          Py_DECREF(value);          return result; @@ -2581,12 +2681,12 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_boolop(o->v.BoolOp.op);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "op", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "values", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2595,17 +2695,17 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.BinOp.left);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "left", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_operator(o->v.BinOp.op);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "op", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.BinOp.right);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "right", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2614,12 +2714,12 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_unaryop(o->v.UnaryOp.op);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "op", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.UnaryOp.operand);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "operand", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2628,12 +2728,12 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_arguments(o->v.Lambda.args);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "args", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.Lambda.body);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2642,17 +2742,17 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.IfExp.test);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "test", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.IfExp.body);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.IfExp.orelse);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "orelse", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2661,12 +2761,12 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "keys", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.Dict.values, ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "values", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2675,7 +2775,7 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.Set.elts, ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "elts", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2684,13 +2784,13 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.ListComp.elt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "elt", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.ListComp.generators,                                       ast2obj_comprehension);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "generators", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2699,13 +2799,13 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.SetComp.elt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "elt", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.SetComp.generators,                                       ast2obj_comprehension);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "generators", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2714,18 +2814,18 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.DictComp.key);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "key", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.DictComp.value);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "value", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.DictComp.generators,                                       ast2obj_comprehension);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "generators", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2734,13 +2834,13 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.GeneratorExp.elt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "elt", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.GeneratorExp.generators,                                       ast2obj_comprehension);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "generators", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2749,7 +2849,16 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Yield.value);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "value", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) +                        goto failed; +                Py_DECREF(value); +                break; +        case YieldFrom_kind: +                result = PyType_GenericNew(YieldFrom_type, NULL, NULL); +                if (!result) goto failed; +                value = ast2obj_expr(o->v.YieldFrom.value); +                if (!value) goto failed; +                if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2758,23 +2867,23 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Compare.left);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "left", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)                          goto failed;                  Py_DECREF(value);                  { -                        int i, n = asdl_seq_LEN(o->v.Compare.ops); +                        Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);                          value = PyList_New(n);                          if (!value) goto failed;                          for(i = 0; i < n; i++)                                  PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));                  }                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "ops", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "comparators", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2783,27 +2892,27 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Call.func);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "func", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.Call.args, ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "args", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "keywords", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.Call.starargs);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "starargs", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_starargs, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.Call.kwargs);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "kwargs", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_kwargs, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2812,7 +2921,7 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_object(o->v.Num.n);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "n", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_n, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2821,16 +2930,16 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_string(o->v.Str.s);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "s", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)                          goto failed;                  Py_DECREF(value);                  break;          case Bytes_kind:                  result = PyType_GenericNew(Bytes_type, NULL, NULL);                  if (!result) goto failed; -                value = ast2obj_string(o->v.Bytes.s); +                value = ast2obj_bytes(o->v.Bytes.s);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "s", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2843,17 +2952,17 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Attribute.value);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "value", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_identifier(o->v.Attribute.attr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "attr", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr_context(o->v.Attribute.ctx);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "ctx", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2862,17 +2971,17 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Subscript.value);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "value", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_slice(o->v.Subscript.slice);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "slice", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr_context(o->v.Subscript.ctx);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "ctx", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2881,12 +2990,12 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Starred.value);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "value", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr_context(o->v.Starred.ctx);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "ctx", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2895,12 +3004,12 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_identifier(o->v.Name.id);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "id", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr_context(o->v.Name.ctx);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "ctx", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2909,12 +3018,12 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.List.elts, ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "elts", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr_context(o->v.List.ctx);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "ctx", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -2923,24 +3032,24 @@ ast2obj_expr(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "elts", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr_context(o->v.Tuple.ctx);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "ctx", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)                          goto failed;                  Py_DECREF(value);                  break;          }          value = ast2obj_int(o->lineno);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "lineno", value) < 0) +        if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)                  goto failed;          Py_DECREF(value);          value = ast2obj_int(o->col_offset);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "col_offset", value) < 0) +        if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)                  goto failed;          Py_DECREF(value);          return result; @@ -2993,17 +3102,17 @@ ast2obj_slice(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Slice.lower);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "lower", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.Slice.upper);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "upper", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_expr(o->v.Slice.step);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "step", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -3012,7 +3121,7 @@ ast2obj_slice(void* _o)                  if (!result) goto failed;                  value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "dims", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -3021,7 +3130,7 @@ ast2obj_slice(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.Index.value);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "value", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)                          goto failed;                  Py_DECREF(value);                  break; @@ -3167,17 +3276,17 @@ ast2obj_comprehension(void* _o)          if (!result) return NULL;          value = ast2obj_expr(o->target);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "target", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_expr(o->iter);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "iter", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_list(o->ifs, ast2obj_expr);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "ifs", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)                  goto failed;          Py_DECREF(value);          return result; @@ -3203,29 +3312,29 @@ ast2obj_excepthandler(void* _o)                  if (!result) goto failed;                  value = ast2obj_expr(o->v.ExceptHandler.type);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "type", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_identifier(o->v.ExceptHandler.name);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "name", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)                          goto failed;                  Py_DECREF(value);                  value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);                  if (!value) goto failed; -                if (PyObject_SetAttrString(result, "body", value) == -1) +                if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)                          goto failed;                  Py_DECREF(value);                  break;          }          value = ast2obj_int(o->lineno);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "lineno", value) < 0) +        if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)                  goto failed;          Py_DECREF(value);          value = ast2obj_int(o->col_offset);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "col_offset", value) < 0) +        if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)                  goto failed;          Py_DECREF(value);          return result; @@ -3249,42 +3358,42 @@ ast2obj_arguments(void* _o)          if (!result) return NULL;          value = ast2obj_list(o->args, ast2obj_arg);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "args", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_identifier(o->vararg);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "vararg", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_expr(o->varargannotation);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "varargannotation", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_varargannotation, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_list(o->kwonlyargs, ast2obj_arg);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "kwonlyargs", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_identifier(o->kwarg);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "kwarg", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_expr(o->kwargannotation);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "kwargannotation", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_kwargannotation, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_list(o->defaults, ast2obj_expr);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "defaults", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_list(o->kw_defaults, ast2obj_expr);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "kw_defaults", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)                  goto failed;          Py_DECREF(value);          return result; @@ -3308,12 +3417,12 @@ ast2obj_arg(void* _o)          if (!result) return NULL;          value = ast2obj_identifier(o->arg);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "arg", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_expr(o->annotation);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "annotation", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)                  goto failed;          Py_DECREF(value);          return result; @@ -3337,12 +3446,12 @@ ast2obj_keyword(void* _o)          if (!result) return NULL;          value = ast2obj_identifier(o->arg);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "arg", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_expr(o->value);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "value", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)                  goto failed;          Py_DECREF(value);          return result; @@ -3366,12 +3475,41 @@ ast2obj_alias(void* _o)          if (!result) return NULL;          value = ast2obj_identifier(o->name);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "name", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)                  goto failed;          Py_DECREF(value);          value = ast2obj_identifier(o->asname);          if (!value) goto failed; -        if (PyObject_SetAttrString(result, "asname", value) == -1) +        if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1) +                goto failed; +        Py_DECREF(value); +        return result; +failed: +        Py_XDECREF(value); +        Py_XDECREF(result); +        return NULL; +} + +PyObject* +ast2obj_withitem(void* _o) +{ +        withitem_ty o = (withitem_ty)_o; +        PyObject *result = NULL, *value = NULL; +        if (!o) { +                Py_INCREF(Py_None); +                return Py_None; +        } + +        result = PyType_GenericNew(withitem_type, NULL, NULL); +        if (!result) return NULL; +        value = ast2obj_expr(o->context_expr); +        if (!value) goto failed; +        if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1) +                goto failed; +        Py_DECREF(value); +        value = ast2obj_expr(o->optional_vars); +        if (!value) goto failed; +        if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)                  goto failed;          Py_DECREF(value);          return result; @@ -3400,11 +3538,11 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)          if (isinstance) {                  asdl_seq* body; -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3436,11 +3574,11 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)          if (isinstance) {                  asdl_seq* body; -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3472,9 +3610,9 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)          if (isinstance) {                  expr_ty body; -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &body, arena);                          if (res != 0) goto failed; @@ -3495,11 +3633,11 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)          if (isinstance) {                  asdl_seq* body; -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3544,9 +3682,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  *out = NULL;                  return 0;          } -        if (PyObject_HasAttrString(obj, "lineno")) { +        if (_PyObject_HasAttrId(obj, &PyId_lineno)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "lineno"); +                tmp = _PyObject_GetAttrId(obj, &PyId_lineno);                  if (tmp == NULL) goto failed;                  res = obj2ast_int(tmp, &lineno, arena);                  if (res != 0) goto failed; @@ -3556,9 +3694,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");                  return 1;          } -        if (PyObject_HasAttrString(obj, "col_offset")) { +        if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "col_offset"); +                tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);                  if (tmp == NULL) goto failed;                  res = obj2ast_int(tmp, &col_offset, arena);                  if (res != 0) goto failed; @@ -3579,9 +3717,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  asdl_seq* decorator_list;                  expr_ty returns; -                if (PyObject_HasAttrString(obj, "name")) { +                if (_PyObject_HasAttrId(obj, &PyId_name)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "name"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_name);                          if (tmp == NULL) goto failed;                          res = obj2ast_identifier(tmp, &name, arena);                          if (res != 0) goto failed; @@ -3591,9 +3729,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "args")) { +                if (_PyObject_HasAttrId(obj, &PyId_args)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "args"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_args);                          if (tmp == NULL) goto failed;                          res = obj2ast_arguments(tmp, &args, arena);                          if (res != 0) goto failed; @@ -3603,11 +3741,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3628,11 +3766,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "decorator_list")) { +                if (_PyObject_HasAttrId(obj, &PyId_decorator_list)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "decorator_list"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3653,9 +3791,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "returns")) { +                if (_PyObject_HasAttrId(obj, &PyId_returns)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "returns"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_returns);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &returns, arena);                          if (res != 0) goto failed; @@ -3682,9 +3820,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  asdl_seq* body;                  asdl_seq* decorator_list; -                if (PyObject_HasAttrString(obj, "name")) { +                if (_PyObject_HasAttrId(obj, &PyId_name)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "name"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_name);                          if (tmp == NULL) goto failed;                          res = obj2ast_identifier(tmp, &name, arena);                          if (res != 0) goto failed; @@ -3694,11 +3832,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "bases")) { +                if (_PyObject_HasAttrId(obj, &PyId_bases)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "bases"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_bases);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3719,11 +3857,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "keywords")) { +                if (_PyObject_HasAttrId(obj, &PyId_keywords)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "keywords"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_keywords);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3744,9 +3882,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "starargs")) { +                if (_PyObject_HasAttrId(obj, &PyId_starargs)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "starargs"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_starargs);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &starargs, arena);                          if (res != 0) goto failed; @@ -3755,9 +3893,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  } else {                          starargs = NULL;                  } -                if (PyObject_HasAttrString(obj, "kwargs")) { +                if (_PyObject_HasAttrId(obj, &PyId_kwargs)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "kwargs"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_kwargs);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &kwargs, arena);                          if (res != 0) goto failed; @@ -3766,11 +3904,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  } else {                          kwargs = NULL;                  } -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3791,11 +3929,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "decorator_list")) { +                if (_PyObject_HasAttrId(obj, &PyId_decorator_list)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "decorator_list"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3828,9 +3966,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)          if (isinstance) {                  expr_ty value; -                if (PyObject_HasAttrString(obj, "value")) { +                if (_PyObject_HasAttrId(obj, &PyId_value)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "value"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_value);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &value, arena);                          if (res != 0) goto failed; @@ -3850,11 +3988,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)          if (isinstance) {                  asdl_seq* targets; -                if (PyObject_HasAttrString(obj, "targets")) { +                if (_PyObject_HasAttrId(obj, &PyId_targets)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "targets"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_targets);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3887,11 +4025,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  asdl_seq* targets;                  expr_ty value; -                if (PyObject_HasAttrString(obj, "targets")) { +                if (_PyObject_HasAttrId(obj, &PyId_targets)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "targets"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_targets);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3912,9 +4050,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "value")) { +                if (_PyObject_HasAttrId(obj, &PyId_value)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "value"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_value);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &value, arena);                          if (res != 0) goto failed; @@ -3937,9 +4075,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  operator_ty op;                  expr_ty value; -                if (PyObject_HasAttrString(obj, "target")) { +                if (_PyObject_HasAttrId(obj, &PyId_target)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "target"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_target);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &target, arena);                          if (res != 0) goto failed; @@ -3949,9 +4087,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "op")) { +                if (_PyObject_HasAttrId(obj, &PyId_op)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "op"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_op);                          if (tmp == NULL) goto failed;                          res = obj2ast_operator(tmp, &op, arena);                          if (res != 0) goto failed; @@ -3961,9 +4099,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "value")) { +                if (_PyObject_HasAttrId(obj, &PyId_value)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "value"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_value);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &value, arena);                          if (res != 0) goto failed; @@ -3987,9 +4125,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  asdl_seq* body;                  asdl_seq* orelse; -                if (PyObject_HasAttrString(obj, "target")) { +                if (_PyObject_HasAttrId(obj, &PyId_target)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "target"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_target);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &target, arena);                          if (res != 0) goto failed; @@ -3999,9 +4137,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "iter")) { +                if (_PyObject_HasAttrId(obj, &PyId_iter)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "iter"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_iter);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &iter, arena);                          if (res != 0) goto failed; @@ -4011,11 +4149,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4036,11 +4174,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "orelse")) { +                if (_PyObject_HasAttrId(obj, &PyId_orelse)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "orelse"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_orelse);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4075,9 +4213,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  asdl_seq* body;                  asdl_seq* orelse; -                if (PyObject_HasAttrString(obj, "test")) { +                if (_PyObject_HasAttrId(obj, &PyId_test)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "test"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_test);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &test, arena);                          if (res != 0) goto failed; @@ -4087,11 +4225,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4112,11 +4250,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "orelse")) { +                if (_PyObject_HasAttrId(obj, &PyId_orelse)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "orelse"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_orelse);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4150,9 +4288,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  asdl_seq* body;                  asdl_seq* orelse; -                if (PyObject_HasAttrString(obj, "test")) { +                if (_PyObject_HasAttrId(obj, &PyId_test)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "test"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_test);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &test, arena);                          if (res != 0) goto failed; @@ -4162,11 +4300,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4187,11 +4325,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "orelse")) { +                if (_PyObject_HasAttrId(obj, &PyId_orelse)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "orelse"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_orelse);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4221,38 +4359,39 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  return 1;          }          if (isinstance) { -                expr_ty context_expr; -                expr_ty optional_vars; +                asdl_seq* items;                  asdl_seq* body; -                if (PyObject_HasAttrString(obj, "context_expr")) { +                if (_PyObject_HasAttrId(obj, &PyId_items)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "context_expr"); +                        Py_ssize_t len; +                        Py_ssize_t i; +                        tmp = _PyObject_GetAttrId(obj, &PyId_items);                          if (tmp == NULL) goto failed; -                        res = obj2ast_expr(tmp, &context_expr, arena); -                        if (res != 0) goto failed; +                        if (!PyList_Check(tmp)) { +                                PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name); +                                goto failed; +                        } +                        len = PyList_GET_SIZE(tmp); +                        items = asdl_seq_new(len, arena); +                        if (items == NULL) goto failed; +                        for (i = 0; i < len; i++) { +                                withitem_ty value; +                                res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &value, arena); +                                if (res != 0) goto failed; +                                asdl_seq_SET(items, i, value); +                        }                          Py_XDECREF(tmp);                          tmp = NULL;                  } else { -                        PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from With"); +                        PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "optional_vars")) { -                        int res; -                        tmp = PyObject_GetAttrString(obj, "optional_vars"); -                        if (tmp == NULL) goto failed; -                        res = obj2ast_expr(tmp, &optional_vars, arena); -                        if (res != 0) goto failed; -                        Py_XDECREF(tmp); -                        tmp = NULL; -                } else { -                        optional_vars = NULL; -                } -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4273,8 +4412,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");                          return 1;                  } -                *out = With(context_expr, optional_vars, body, lineno, -                            col_offset, arena); +                *out = With(items, body, lineno, col_offset, arena);                  if (*out == NULL) goto failed;                  return 0;          } @@ -4286,9 +4424,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  expr_ty exc;                  expr_ty cause; -                if (PyObject_HasAttrString(obj, "exc")) { +                if (_PyObject_HasAttrId(obj, &PyId_exc)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "exc"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_exc);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &exc, arena);                          if (res != 0) goto failed; @@ -4297,9 +4435,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  } else {                          exc = NULL;                  } -                if (PyObject_HasAttrString(obj, "cause")) { +                if (_PyObject_HasAttrId(obj, &PyId_cause)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "cause"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_cause);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &cause, arena);                          if (res != 0) goto failed; @@ -4312,7 +4450,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  if (*out == NULL) goto failed;                  return 0;          } -        isinstance = PyObject_IsInstance(obj, (PyObject*)TryExcept_type); +        isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);          if (isinstance == -1) {                  return 1;          } @@ -4320,15 +4458,16 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  asdl_seq* body;                  asdl_seq* handlers;                  asdl_seq* orelse; +                asdl_seq* finalbody; -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) { -                                PyErr_Format(PyExc_TypeError, "TryExcept field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); +                                PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);                                  goto failed;                          }                          len = PyList_GET_SIZE(tmp); @@ -4343,17 +4482,17 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          Py_XDECREF(tmp);                          tmp = NULL;                  } else { -                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryExcept"); +                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "handlers")) { +                if (_PyObject_HasAttrId(obj, &PyId_handlers)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "handlers"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_handlers);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) { -                                PyErr_Format(PyExc_TypeError, "TryExcept field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name); +                                PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);                                  goto failed;                          }                          len = PyList_GET_SIZE(tmp); @@ -4368,17 +4507,17 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          Py_XDECREF(tmp);                          tmp = NULL;                  } else { -                        PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from TryExcept"); +                        PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "orelse")) { +                if (_PyObject_HasAttrId(obj, &PyId_orelse)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "orelse"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_orelse);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) { -                                PyErr_Format(PyExc_TypeError, "TryExcept field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); +                                PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);                                  goto failed;                          }                          len = PyList_GET_SIZE(tmp); @@ -4393,55 +4532,17 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          Py_XDECREF(tmp);                          tmp = NULL;                  } else { -                        PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from TryExcept"); -                        return 1; -                } -                *out = TryExcept(body, handlers, orelse, lineno, col_offset, -                                 arena); -                if (*out == NULL) goto failed; -                return 0; -        } -        isinstance = PyObject_IsInstance(obj, (PyObject*)TryFinally_type); -        if (isinstance == -1) { -                return 1; -        } -        if (isinstance) { -                asdl_seq* body; -                asdl_seq* finalbody; - -                if (PyObject_HasAttrString(obj, "body")) { -                        int res; -                        Py_ssize_t len; -                        Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); -                        if (tmp == NULL) goto failed; -                        if (!PyList_Check(tmp)) { -                                PyErr_Format(PyExc_TypeError, "TryFinally field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); -                                goto failed; -                        } -                        len = PyList_GET_SIZE(tmp); -                        body = asdl_seq_new(len, arena); -                        if (body == NULL) goto failed; -                        for (i = 0; i < len; i++) { -                                stmt_ty value; -                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena); -                                if (res != 0) goto failed; -                                asdl_seq_SET(body, i, value); -                        } -                        Py_XDECREF(tmp); -                        tmp = NULL; -                } else { -                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryFinally"); +                        PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "finalbody")) { +                if (_PyObject_HasAttrId(obj, &PyId_finalbody)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "finalbody"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_finalbody);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) { -                                PyErr_Format(PyExc_TypeError, "TryFinally field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name); +                                PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);                                  goto failed;                          }                          len = PyList_GET_SIZE(tmp); @@ -4456,10 +4557,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          Py_XDECREF(tmp);                          tmp = NULL;                  } else { -                        PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from TryFinally"); +                        PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");                          return 1;                  } -                *out = TryFinally(body, finalbody, lineno, col_offset, arena); +                *out = Try(body, handlers, orelse, finalbody, lineno, +                           col_offset, arena);                  if (*out == NULL) goto failed;                  return 0;          } @@ -4471,9 +4573,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  expr_ty test;                  expr_ty msg; -                if (PyObject_HasAttrString(obj, "test")) { +                if (_PyObject_HasAttrId(obj, &PyId_test)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "test"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_test);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &test, arena);                          if (res != 0) goto failed; @@ -4483,9 +4585,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "msg")) { +                if (_PyObject_HasAttrId(obj, &PyId_msg)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "msg"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_msg);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &msg, arena);                          if (res != 0) goto failed; @@ -4505,11 +4607,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)          if (isinstance) {                  asdl_seq* names; -                if (PyObject_HasAttrString(obj, "names")) { +                if (_PyObject_HasAttrId(obj, &PyId_names)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "names"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_names);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4543,9 +4645,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  asdl_seq* names;                  int level; -                if (PyObject_HasAttrString(obj, "module")) { +                if (_PyObject_HasAttrId(obj, &PyId_module)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "module"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_module);                          if (tmp == NULL) goto failed;                          res = obj2ast_identifier(tmp, &module, arena);                          if (res != 0) goto failed; @@ -4554,11 +4656,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                  } else {                          module = NULL;                  } -                if (PyObject_HasAttrString(obj, "names")) { +                if (_PyObject_HasAttrId(obj, &PyId_names)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "names"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_names);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4579,9 +4681,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "level")) { +                if (_PyObject_HasAttrId(obj, &PyId_level)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "level"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_level);                          if (tmp == NULL) goto failed;                          res = obj2ast_int(tmp, &level, arena);                          if (res != 0) goto failed; @@ -4602,11 +4704,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)          if (isinstance) {                  asdl_seq* names; -                if (PyObject_HasAttrString(obj, "names")) { +                if (_PyObject_HasAttrId(obj, &PyId_names)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "names"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_names);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4638,11 +4740,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)          if (isinstance) {                  asdl_seq* names; -                if (PyObject_HasAttrString(obj, "names")) { +                if (_PyObject_HasAttrId(obj, &PyId_names)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "names"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_names);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4674,9 +4776,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)          if (isinstance) {                  expr_ty value; -                if (PyObject_HasAttrString(obj, "value")) { +                if (_PyObject_HasAttrId(obj, &PyId_value)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "value"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_value);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &value, arena);                          if (res != 0) goto failed; @@ -4740,9 +4842,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  *out = NULL;                  return 0;          } -        if (PyObject_HasAttrString(obj, "lineno")) { +        if (_PyObject_HasAttrId(obj, &PyId_lineno)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "lineno"); +                tmp = _PyObject_GetAttrId(obj, &PyId_lineno);                  if (tmp == NULL) goto failed;                  res = obj2ast_int(tmp, &lineno, arena);                  if (res != 0) goto failed; @@ -4752,9 +4854,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");                  return 1;          } -        if (PyObject_HasAttrString(obj, "col_offset")) { +        if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "col_offset"); +                tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);                  if (tmp == NULL) goto failed;                  res = obj2ast_int(tmp, &col_offset, arena);                  if (res != 0) goto failed; @@ -4772,9 +4874,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  boolop_ty op;                  asdl_seq* values; -                if (PyObject_HasAttrString(obj, "op")) { +                if (_PyObject_HasAttrId(obj, &PyId_op)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "op"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_op);                          if (tmp == NULL) goto failed;                          res = obj2ast_boolop(tmp, &op, arena);                          if (res != 0) goto failed; @@ -4784,11 +4886,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "values")) { +                if (_PyObject_HasAttrId(obj, &PyId_values)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "values"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_values);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4822,9 +4924,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  operator_ty op;                  expr_ty right; -                if (PyObject_HasAttrString(obj, "left")) { +                if (_PyObject_HasAttrId(obj, &PyId_left)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "left"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_left);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &left, arena);                          if (res != 0) goto failed; @@ -4834,9 +4936,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "op")) { +                if (_PyObject_HasAttrId(obj, &PyId_op)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "op"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_op);                          if (tmp == NULL) goto failed;                          res = obj2ast_operator(tmp, &op, arena);                          if (res != 0) goto failed; @@ -4846,9 +4948,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "right")) { +                if (_PyObject_HasAttrId(obj, &PyId_right)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "right"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_right);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &right, arena);                          if (res != 0) goto failed; @@ -4870,9 +4972,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  unaryop_ty op;                  expr_ty operand; -                if (PyObject_HasAttrString(obj, "op")) { +                if (_PyObject_HasAttrId(obj, &PyId_op)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "op"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_op);                          if (tmp == NULL) goto failed;                          res = obj2ast_unaryop(tmp, &op, arena);                          if (res != 0) goto failed; @@ -4882,9 +4984,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "operand")) { +                if (_PyObject_HasAttrId(obj, &PyId_operand)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "operand"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_operand);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &operand, arena);                          if (res != 0) goto failed; @@ -4906,9 +5008,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  arguments_ty args;                  expr_ty body; -                if (PyObject_HasAttrString(obj, "args")) { +                if (_PyObject_HasAttrId(obj, &PyId_args)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "args"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_args);                          if (tmp == NULL) goto failed;                          res = obj2ast_arguments(tmp, &args, arena);                          if (res != 0) goto failed; @@ -4918,9 +5020,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &body, arena);                          if (res != 0) goto failed; @@ -4943,9 +5045,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  expr_ty body;                  expr_ty orelse; -                if (PyObject_HasAttrString(obj, "test")) { +                if (_PyObject_HasAttrId(obj, &PyId_test)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "test"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_test);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &test, arena);                          if (res != 0) goto failed; @@ -4955,9 +5057,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &body, arena);                          if (res != 0) goto failed; @@ -4967,9 +5069,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "orelse")) { +                if (_PyObject_HasAttrId(obj, &PyId_orelse)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "orelse"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_orelse);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &orelse, arena);                          if (res != 0) goto failed; @@ -4991,11 +5093,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  asdl_seq* keys;                  asdl_seq* values; -                if (PyObject_HasAttrString(obj, "keys")) { +                if (_PyObject_HasAttrId(obj, &PyId_keys)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "keys"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_keys);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5016,11 +5118,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "values")) { +                if (_PyObject_HasAttrId(obj, &PyId_values)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "values"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_values);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5052,11 +5154,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)          if (isinstance) {                  asdl_seq* elts; -                if (PyObject_HasAttrString(obj, "elts")) { +                if (_PyObject_HasAttrId(obj, &PyId_elts)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "elts"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_elts);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5089,9 +5191,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  expr_ty elt;                  asdl_seq* generators; -                if (PyObject_HasAttrString(obj, "elt")) { +                if (_PyObject_HasAttrId(obj, &PyId_elt)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "elt"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_elt);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &elt, arena);                          if (res != 0) goto failed; @@ -5101,11 +5203,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "generators")) { +                if (_PyObject_HasAttrId(obj, &PyId_generators)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "generators"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_generators);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5138,9 +5240,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  expr_ty elt;                  asdl_seq* generators; -                if (PyObject_HasAttrString(obj, "elt")) { +                if (_PyObject_HasAttrId(obj, &PyId_elt)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "elt"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_elt);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &elt, arena);                          if (res != 0) goto failed; @@ -5150,11 +5252,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "generators")) { +                if (_PyObject_HasAttrId(obj, &PyId_generators)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "generators"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_generators);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5188,9 +5290,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  expr_ty value;                  asdl_seq* generators; -                if (PyObject_HasAttrString(obj, "key")) { +                if (_PyObject_HasAttrId(obj, &PyId_key)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "key"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_key);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &key, arena);                          if (res != 0) goto failed; @@ -5200,9 +5302,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "value")) { +                if (_PyObject_HasAttrId(obj, &PyId_value)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "value"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_value);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &value, arena);                          if (res != 0) goto failed; @@ -5212,11 +5314,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "generators")) { +                if (_PyObject_HasAttrId(obj, &PyId_generators)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "generators"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_generators);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5250,9 +5352,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  expr_ty elt;                  asdl_seq* generators; -                if (PyObject_HasAttrString(obj, "elt")) { +                if (_PyObject_HasAttrId(obj, &PyId_elt)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "elt"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_elt);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &elt, arena);                          if (res != 0) goto failed; @@ -5262,11 +5364,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "generators")) { +                if (_PyObject_HasAttrId(obj, &PyId_generators)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "generators"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_generators);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5298,9 +5400,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)          if (isinstance) {                  expr_ty value; -                if (PyObject_HasAttrString(obj, "value")) { +                if (_PyObject_HasAttrId(obj, &PyId_value)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "value"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_value);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &value, arena);                          if (res != 0) goto failed; @@ -5313,6 +5415,28 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  if (*out == NULL) goto failed;                  return 0;          } +        isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type); +        if (isinstance == -1) { +                return 1; +        } +        if (isinstance) { +                expr_ty value; + +                if (_PyObject_HasAttrId(obj, &PyId_value)) { +                        int res; +                        tmp = _PyObject_GetAttrId(obj, &PyId_value); +                        if (tmp == NULL) goto failed; +                        res = obj2ast_expr(tmp, &value, arena); +                        if (res != 0) goto failed; +                        Py_XDECREF(tmp); +                        tmp = NULL; +                } else { +                        value = NULL; +                } +                *out = YieldFrom(value, lineno, col_offset, arena); +                if (*out == NULL) goto failed; +                return 0; +        }          isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);          if (isinstance == -1) {                  return 1; @@ -5322,9 +5446,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  asdl_int_seq* ops;                  asdl_seq* comparators; -                if (PyObject_HasAttrString(obj, "left")) { +                if (_PyObject_HasAttrId(obj, &PyId_left)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "left"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_left);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &left, arena);                          if (res != 0) goto failed; @@ -5334,11 +5458,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "ops")) { +                if (_PyObject_HasAttrId(obj, &PyId_ops)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "ops"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_ops);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5359,11 +5483,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "comparators")) { +                if (_PyObject_HasAttrId(obj, &PyId_comparators)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "comparators"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_comparators);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5400,9 +5524,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  expr_ty starargs;                  expr_ty kwargs; -                if (PyObject_HasAttrString(obj, "func")) { +                if (_PyObject_HasAttrId(obj, &PyId_func)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "func"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_func);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &func, arena);                          if (res != 0) goto failed; @@ -5412,11 +5536,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "args")) { +                if (_PyObject_HasAttrId(obj, &PyId_args)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "args"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_args);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5437,11 +5561,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "keywords")) { +                if (_PyObject_HasAttrId(obj, &PyId_keywords)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "keywords"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_keywords);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5462,9 +5586,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "starargs")) { +                if (_PyObject_HasAttrId(obj, &PyId_starargs)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "starargs"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_starargs);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &starargs, arena);                          if (res != 0) goto failed; @@ -5473,9 +5597,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  } else {                          starargs = NULL;                  } -                if (PyObject_HasAttrString(obj, "kwargs")) { +                if (_PyObject_HasAttrId(obj, &PyId_kwargs)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "kwargs"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_kwargs);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &kwargs, arena);                          if (res != 0) goto failed; @@ -5496,9 +5620,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)          if (isinstance) {                  object n; -                if (PyObject_HasAttrString(obj, "n")) { +                if (_PyObject_HasAttrId(obj, &PyId_n)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "n"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_n);                          if (tmp == NULL) goto failed;                          res = obj2ast_object(tmp, &n, arena);                          if (res != 0) goto failed; @@ -5519,9 +5643,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)          if (isinstance) {                  string s; -                if (PyObject_HasAttrString(obj, "s")) { +                if (_PyObject_HasAttrId(obj, &PyId_s)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "s"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_s);                          if (tmp == NULL) goto failed;                          res = obj2ast_string(tmp, &s, arena);                          if (res != 0) goto failed; @@ -5540,13 +5664,13 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  return 1;          }          if (isinstance) { -                string s; +                bytes s; -                if (PyObject_HasAttrString(obj, "s")) { +                if (_PyObject_HasAttrId(obj, &PyId_s)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "s"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_s);                          if (tmp == NULL) goto failed; -                        res = obj2ast_string(tmp, &s, arena); +                        res = obj2ast_bytes(tmp, &s, arena);                          if (res != 0) goto failed;                          Py_XDECREF(tmp);                          tmp = NULL; @@ -5577,9 +5701,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  identifier attr;                  expr_context_ty ctx; -                if (PyObject_HasAttrString(obj, "value")) { +                if (_PyObject_HasAttrId(obj, &PyId_value)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "value"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_value);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &value, arena);                          if (res != 0) goto failed; @@ -5589,9 +5713,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "attr")) { +                if (_PyObject_HasAttrId(obj, &PyId_attr)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "attr"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_attr);                          if (tmp == NULL) goto failed;                          res = obj2ast_identifier(tmp, &attr, arena);                          if (res != 0) goto failed; @@ -5601,9 +5725,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "ctx")) { +                if (_PyObject_HasAttrId(obj, &PyId_ctx)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "ctx"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_ctx);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr_context(tmp, &ctx, arena);                          if (res != 0) goto failed; @@ -5626,9 +5750,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  slice_ty slice;                  expr_context_ty ctx; -                if (PyObject_HasAttrString(obj, "value")) { +                if (_PyObject_HasAttrId(obj, &PyId_value)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "value"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_value);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &value, arena);                          if (res != 0) goto failed; @@ -5638,9 +5762,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "slice")) { +                if (_PyObject_HasAttrId(obj, &PyId_slice)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "slice"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_slice);                          if (tmp == NULL) goto failed;                          res = obj2ast_slice(tmp, &slice, arena);                          if (res != 0) goto failed; @@ -5650,9 +5774,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "ctx")) { +                if (_PyObject_HasAttrId(obj, &PyId_ctx)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "ctx"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_ctx);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr_context(tmp, &ctx, arena);                          if (res != 0) goto failed; @@ -5674,9 +5798,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  expr_ty value;                  expr_context_ty ctx; -                if (PyObject_HasAttrString(obj, "value")) { +                if (_PyObject_HasAttrId(obj, &PyId_value)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "value"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_value);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &value, arena);                          if (res != 0) goto failed; @@ -5686,9 +5810,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "ctx")) { +                if (_PyObject_HasAttrId(obj, &PyId_ctx)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "ctx"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_ctx);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr_context(tmp, &ctx, arena);                          if (res != 0) goto failed; @@ -5710,9 +5834,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  identifier id;                  expr_context_ty ctx; -                if (PyObject_HasAttrString(obj, "id")) { +                if (_PyObject_HasAttrId(obj, &PyId_id)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "id"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_id);                          if (tmp == NULL) goto failed;                          res = obj2ast_identifier(tmp, &id, arena);                          if (res != 0) goto failed; @@ -5722,9 +5846,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "ctx")) { +                if (_PyObject_HasAttrId(obj, &PyId_ctx)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "ctx"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_ctx);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr_context(tmp, &ctx, arena);                          if (res != 0) goto failed; @@ -5746,11 +5870,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  asdl_seq* elts;                  expr_context_ty ctx; -                if (PyObject_HasAttrString(obj, "elts")) { +                if (_PyObject_HasAttrId(obj, &PyId_elts)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "elts"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_elts);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5771,9 +5895,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "ctx")) { +                if (_PyObject_HasAttrId(obj, &PyId_ctx)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "ctx"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_ctx);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr_context(tmp, &ctx, arena);                          if (res != 0) goto failed; @@ -5795,11 +5919,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                  asdl_seq* elts;                  expr_context_ty ctx; -                if (PyObject_HasAttrString(obj, "elts")) { +                if (_PyObject_HasAttrId(obj, &PyId_elts)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "elts"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_elts);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5820,9 +5944,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)                          PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");                          return 1;                  } -                if (PyObject_HasAttrString(obj, "ctx")) { +                if (_PyObject_HasAttrId(obj, &PyId_ctx)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "ctx"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_ctx);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr_context(tmp, &ctx, arena);                          if (res != 0) goto failed; @@ -5921,9 +6045,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)                  expr_ty upper;                  expr_ty step; -                if (PyObject_HasAttrString(obj, "lower")) { +                if (_PyObject_HasAttrId(obj, &PyId_lower)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "lower"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_lower);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &lower, arena);                          if (res != 0) goto failed; @@ -5932,9 +6056,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)                  } else {                          lower = NULL;                  } -                if (PyObject_HasAttrString(obj, "upper")) { +                if (_PyObject_HasAttrId(obj, &PyId_upper)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "upper"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_upper);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &upper, arena);                          if (res != 0) goto failed; @@ -5943,9 +6067,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)                  } else {                          upper = NULL;                  } -                if (PyObject_HasAttrString(obj, "step")) { +                if (_PyObject_HasAttrId(obj, &PyId_step)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "step"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_step);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &step, arena);                          if (res != 0) goto failed; @@ -5965,11 +6089,11 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)          if (isinstance) {                  asdl_seq* dims; -                if (PyObject_HasAttrString(obj, "dims")) { +                if (_PyObject_HasAttrId(obj, &PyId_dims)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "dims"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_dims);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6001,9 +6125,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)          if (isinstance) {                  expr_ty value; -                if (PyObject_HasAttrString(obj, "value")) { +                if (_PyObject_HasAttrId(obj, &PyId_value)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "value"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_value);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &value, arena);                          if (res != 0) goto failed; @@ -6296,9 +6420,9 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)          expr_ty iter;          asdl_seq* ifs; -        if (PyObject_HasAttrString(obj, "target")) { +        if (_PyObject_HasAttrId(obj, &PyId_target)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "target"); +                tmp = _PyObject_GetAttrId(obj, &PyId_target);                  if (tmp == NULL) goto failed;                  res = obj2ast_expr(tmp, &target, arena);                  if (res != 0) goto failed; @@ -6308,9 +6432,9 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)                  PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");                  return 1;          } -        if (PyObject_HasAttrString(obj, "iter")) { +        if (_PyObject_HasAttrId(obj, &PyId_iter)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "iter"); +                tmp = _PyObject_GetAttrId(obj, &PyId_iter);                  if (tmp == NULL) goto failed;                  res = obj2ast_expr(tmp, &iter, arena);                  if (res != 0) goto failed; @@ -6320,11 +6444,11 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)                  PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");                  return 1;          } -        if (PyObject_HasAttrString(obj, "ifs")) { +        if (_PyObject_HasAttrId(obj, &PyId_ifs)) {                  int res;                  Py_ssize_t len;                  Py_ssize_t i; -                tmp = PyObject_GetAttrString(obj, "ifs"); +                tmp = _PyObject_GetAttrId(obj, &PyId_ifs);                  if (tmp == NULL) goto failed;                  if (!PyList_Check(tmp)) {                          PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6365,9 +6489,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)                  *out = NULL;                  return 0;          } -        if (PyObject_HasAttrString(obj, "lineno")) { +        if (_PyObject_HasAttrId(obj, &PyId_lineno)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "lineno"); +                tmp = _PyObject_GetAttrId(obj, &PyId_lineno);                  if (tmp == NULL) goto failed;                  res = obj2ast_int(tmp, &lineno, arena);                  if (res != 0) goto failed; @@ -6377,9 +6501,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)                  PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");                  return 1;          } -        if (PyObject_HasAttrString(obj, "col_offset")) { +        if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "col_offset"); +                tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);                  if (tmp == NULL) goto failed;                  res = obj2ast_int(tmp, &col_offset, arena);                  if (res != 0) goto failed; @@ -6398,9 +6522,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)                  identifier name;                  asdl_seq* body; -                if (PyObject_HasAttrString(obj, "type")) { +                if (_PyObject_HasAttrId(obj, &PyId_type)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "type"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_type);                          if (tmp == NULL) goto failed;                          res = obj2ast_expr(tmp, &type, arena);                          if (res != 0) goto failed; @@ -6409,9 +6533,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)                  } else {                          type = NULL;                  } -                if (PyObject_HasAttrString(obj, "name")) { +                if (_PyObject_HasAttrId(obj, &PyId_name)) {                          int res; -                        tmp = PyObject_GetAttrString(obj, "name"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_name);                          if (tmp == NULL) goto failed;                          res = obj2ast_identifier(tmp, &name, arena);                          if (res != 0) goto failed; @@ -6420,11 +6544,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)                  } else {                          name = NULL;                  } -                if (PyObject_HasAttrString(obj, "body")) { +                if (_PyObject_HasAttrId(obj, &PyId_body)) {                          int res;                          Py_ssize_t len;                          Py_ssize_t i; -                        tmp = PyObject_GetAttrString(obj, "body"); +                        tmp = _PyObject_GetAttrId(obj, &PyId_body);                          if (tmp == NULL) goto failed;                          if (!PyList_Check(tmp)) {                                  PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6470,11 +6594,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)          asdl_seq* defaults;          asdl_seq* kw_defaults; -        if (PyObject_HasAttrString(obj, "args")) { +        if (_PyObject_HasAttrId(obj, &PyId_args)) {                  int res;                  Py_ssize_t len;                  Py_ssize_t i; -                tmp = PyObject_GetAttrString(obj, "args"); +                tmp = _PyObject_GetAttrId(obj, &PyId_args);                  if (tmp == NULL) goto failed;                  if (!PyList_Check(tmp)) {                          PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6495,9 +6619,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)                  PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");                  return 1;          } -        if (PyObject_HasAttrString(obj, "vararg")) { +        if (_PyObject_HasAttrId(obj, &PyId_vararg)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "vararg"); +                tmp = _PyObject_GetAttrId(obj, &PyId_vararg);                  if (tmp == NULL) goto failed;                  res = obj2ast_identifier(tmp, &vararg, arena);                  if (res != 0) goto failed; @@ -6506,9 +6630,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)          } else {                  vararg = NULL;          } -        if (PyObject_HasAttrString(obj, "varargannotation")) { +        if (_PyObject_HasAttrId(obj, &PyId_varargannotation)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "varargannotation"); +                tmp = _PyObject_GetAttrId(obj, &PyId_varargannotation);                  if (tmp == NULL) goto failed;                  res = obj2ast_expr(tmp, &varargannotation, arena);                  if (res != 0) goto failed; @@ -6517,11 +6641,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)          } else {                  varargannotation = NULL;          } -        if (PyObject_HasAttrString(obj, "kwonlyargs")) { +        if (_PyObject_HasAttrId(obj, &PyId_kwonlyargs)) {                  int res;                  Py_ssize_t len;                  Py_ssize_t i; -                tmp = PyObject_GetAttrString(obj, "kwonlyargs"); +                tmp = _PyObject_GetAttrId(obj, &PyId_kwonlyargs);                  if (tmp == NULL) goto failed;                  if (!PyList_Check(tmp)) {                          PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6542,9 +6666,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)                  PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");                  return 1;          } -        if (PyObject_HasAttrString(obj, "kwarg")) { +        if (_PyObject_HasAttrId(obj, &PyId_kwarg)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "kwarg"); +                tmp = _PyObject_GetAttrId(obj, &PyId_kwarg);                  if (tmp == NULL) goto failed;                  res = obj2ast_identifier(tmp, &kwarg, arena);                  if (res != 0) goto failed; @@ -6553,9 +6677,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)          } else {                  kwarg = NULL;          } -        if (PyObject_HasAttrString(obj, "kwargannotation")) { +        if (_PyObject_HasAttrId(obj, &PyId_kwargannotation)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "kwargannotation"); +                tmp = _PyObject_GetAttrId(obj, &PyId_kwargannotation);                  if (tmp == NULL) goto failed;                  res = obj2ast_expr(tmp, &kwargannotation, arena);                  if (res != 0) goto failed; @@ -6564,11 +6688,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)          } else {                  kwargannotation = NULL;          } -        if (PyObject_HasAttrString(obj, "defaults")) { +        if (_PyObject_HasAttrId(obj, &PyId_defaults)) {                  int res;                  Py_ssize_t len;                  Py_ssize_t i; -                tmp = PyObject_GetAttrString(obj, "defaults"); +                tmp = _PyObject_GetAttrId(obj, &PyId_defaults);                  if (tmp == NULL) goto failed;                  if (!PyList_Check(tmp)) {                          PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6589,11 +6713,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)                  PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");                  return 1;          } -        if (PyObject_HasAttrString(obj, "kw_defaults")) { +        if (_PyObject_HasAttrId(obj, &PyId_kw_defaults)) {                  int res;                  Py_ssize_t len;                  Py_ssize_t i; -                tmp = PyObject_GetAttrString(obj, "kw_defaults"); +                tmp = _PyObject_GetAttrId(obj, &PyId_kw_defaults);                  if (tmp == NULL) goto failed;                  if (!PyList_Check(tmp)) {                          PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6629,9 +6753,9 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)          identifier arg;          expr_ty annotation; -        if (PyObject_HasAttrString(obj, "arg")) { +        if (_PyObject_HasAttrId(obj, &PyId_arg)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "arg"); +                tmp = _PyObject_GetAttrId(obj, &PyId_arg);                  if (tmp == NULL) goto failed;                  res = obj2ast_identifier(tmp, &arg, arena);                  if (res != 0) goto failed; @@ -6641,9 +6765,9 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)                  PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");                  return 1;          } -        if (PyObject_HasAttrString(obj, "annotation")) { +        if (_PyObject_HasAttrId(obj, &PyId_annotation)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "annotation"); +                tmp = _PyObject_GetAttrId(obj, &PyId_annotation);                  if (tmp == NULL) goto failed;                  res = obj2ast_expr(tmp, &annotation, arena);                  if (res != 0) goto failed; @@ -6666,9 +6790,9 @@ obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)          identifier arg;          expr_ty value; -        if (PyObject_HasAttrString(obj, "arg")) { +        if (_PyObject_HasAttrId(obj, &PyId_arg)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "arg"); +                tmp = _PyObject_GetAttrId(obj, &PyId_arg);                  if (tmp == NULL) goto failed;                  res = obj2ast_identifier(tmp, &arg, arena);                  if (res != 0) goto failed; @@ -6678,9 +6802,9 @@ obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)                  PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from keyword");                  return 1;          } -        if (PyObject_HasAttrString(obj, "value")) { +        if (_PyObject_HasAttrId(obj, &PyId_value)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "value"); +                tmp = _PyObject_GetAttrId(obj, &PyId_value);                  if (tmp == NULL) goto failed;                  res = obj2ast_expr(tmp, &value, arena);                  if (res != 0) goto failed; @@ -6704,9 +6828,9 @@ obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)          identifier name;          identifier asname; -        if (PyObject_HasAttrString(obj, "name")) { +        if (_PyObject_HasAttrId(obj, &PyId_name)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "name"); +                tmp = _PyObject_GetAttrId(obj, &PyId_name);                  if (tmp == NULL) goto failed;                  res = obj2ast_identifier(tmp, &name, arena);                  if (res != 0) goto failed; @@ -6716,9 +6840,9 @@ obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)                  PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");                  return 1;          } -        if (PyObject_HasAttrString(obj, "asname")) { +        if (_PyObject_HasAttrId(obj, &PyId_asname)) {                  int res; -                tmp = PyObject_GetAttrString(obj, "asname"); +                tmp = _PyObject_GetAttrId(obj, &PyId_asname);                  if (tmp == NULL) goto failed;                  res = obj2ast_identifier(tmp, &asname, arena);                  if (res != 0) goto failed; @@ -6734,6 +6858,43 @@ failed:          return 1;  } +int +obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena) +{ +        PyObject* tmp = NULL; +        expr_ty context_expr; +        expr_ty optional_vars; + +        if (_PyObject_HasAttrId(obj, &PyId_context_expr)) { +                int res; +                tmp = _PyObject_GetAttrId(obj, &PyId_context_expr); +                if (tmp == NULL) goto failed; +                res = obj2ast_expr(tmp, &context_expr, arena); +                if (res != 0) goto failed; +                Py_XDECREF(tmp); +                tmp = NULL; +        } else { +                PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem"); +                return 1; +        } +        if (_PyObject_HasAttrId(obj, &PyId_optional_vars)) { +                int res; +                tmp = _PyObject_GetAttrId(obj, &PyId_optional_vars); +                if (tmp == NULL) goto failed; +                res = obj2ast_expr(tmp, &optional_vars, arena); +                if (res != 0) goto failed; +                Py_XDECREF(tmp); +                tmp = NULL; +        } else { +                optional_vars = NULL; +        } +        *out = withitem(context_expr, optional_vars, arena); +        return 0; +failed: +        Py_XDECREF(tmp); +        return 1; +} +  static struct PyModuleDef _astmodule = {    PyModuleDef_HEAD_INIT, "_ast" @@ -6750,8 +6911,6 @@ PyInit__ast(void)              NULL;          if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)                  return NULL; -        if (PyModule_AddStringConstant(m, "__version__", "82163") < 0) -                return NULL;          if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return              NULL;          if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) @@ -6785,10 +6944,8 @@ PyInit__ast(void)              NULL;          if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return              NULL; -        if (PyDict_SetItemString(d, "TryExcept", (PyObject*)TryExcept_type) < -            0) return NULL; -        if (PyDict_SetItemString(d, "TryFinally", (PyObject*)TryFinally_type) < -            0) return NULL; +        if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return +            NULL;          if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0)              return NULL;          if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) @@ -6833,6 +6990,8 @@ PyInit__ast(void)              (PyObject*)GeneratorExp_type) < 0) return NULL;          if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return              NULL; +        if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < +            0) return NULL;          if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0)              return NULL;          if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return @@ -6951,6 +7110,8 @@ PyInit__ast(void)              return NULL;          if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return              NULL; +        if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0) +            return NULL;          return m;  } | 
