diff options
Diffstat (limited to 'Python')
52 files changed, 11478 insertions, 6168 deletions
diff --git a/Python/Python-ast.c b/Python/Python-ast.c index a276b6cf21..805f2b8af1 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;  } diff --git a/Python/_warnings.c b/Python/_warnings.c index c12db44d19..f33e477ad7 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -18,11 +18,12 @@ static int  check_matched(PyObject *obj, PyObject *arg)  {      PyObject *result; +    _Py_IDENTIFIER(match);      int rc;      if (obj == Py_None)          return 1; -    result = PyObject_CallMethod(obj, "match", "O", arg); +    result = _PyObject_CallMethodId(obj, &PyId_match, "O", arg);      if (result == NULL)          return -1; @@ -202,13 +203,13 @@ normalize_module(PyObject *filename)      mod_str = _PyUnicode_AsString(filename);      if (mod_str == NULL) -            return NULL; -    len = PyUnicode_GetSize(filename); +        return NULL; +    len = PyUnicode_GetLength(filename);      if (len < 0)          return NULL;      if (len >= 3 &&          strncmp(mod_str + (len - 3), ".py", 3) == 0) { -        module = PyUnicode_FromStringAndSize(mod_str, len-3); +        module = PyUnicode_Substring(filename, 0, len-3);      }      else {          module = filename; @@ -246,10 +247,11 @@ show_warning(PyObject *filename, int lineno, PyObject *text, PyObject      PyObject *f_stderr;      PyObject *name;      char lineno_str[128]; +    _Py_IDENTIFIER(__name__);      PyOS_snprintf(lineno_str, sizeof(lineno_str), ":%d: ", lineno); -    name = PyObject_GetAttrString(category, "__name__"); +    name = _PyObject_GetAttrId(category, &PyId___name__);      if (name == NULL)  /* XXX Can an object lack a '__name__' attribute? */          return; @@ -409,10 +411,10 @@ warn_explicit(PyObject *category, PyObject *message,          else {              PyObject *res; -            if (!PyMethod_Check(show_fxn) && !PyFunction_Check(show_fxn)) { +            if (!PyCallable_Check(show_fxn)) {                  PyErr_SetString(PyExc_TypeError,                                  "warnings.showwarning() must be set to a " -                                "function or method"); +                                "callable");                  Py_DECREF(show_fxn);                  goto cleanup;              } @@ -497,18 +499,28 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno,      /* Setup filename. */      *filename = PyDict_GetItemString(globals, "__file__");      if (*filename != NULL && PyUnicode_Check(*filename)) { -        Py_ssize_t len = PyUnicode_GetSize(*filename); -        Py_UNICODE *unicode = PyUnicode_AS_UNICODE(*filename); +        Py_ssize_t len; +        int kind; +        void *data; + +        if (PyUnicode_READY(*filename)) +            goto handle_error; + +        len = PyUnicode_GetLength(*filename); +        kind = PyUnicode_KIND(*filename); +        data = PyUnicode_DATA(*filename); +#define ascii_lower(c) ((c <= 127) ? Py_TOLOWER(c) : 0)          /* if filename.lower().endswith((".pyc", ".pyo")): */          if (len >= 4 && -            unicode[len-4] == '.' && -            Py_UNICODE_TOLOWER(unicode[len-3]) == 'p' && -            Py_UNICODE_TOLOWER(unicode[len-2]) == 'y' && -            (Py_UNICODE_TOLOWER(unicode[len-1]) == 'c' || -                Py_UNICODE_TOLOWER(unicode[len-1]) == 'o')) +            PyUnicode_READ(kind, data, len-4) == '.' && +            ascii_lower(PyUnicode_READ(kind, data, len-3)) == 'p' && +            ascii_lower(PyUnicode_READ(kind, data, len-2)) == 'y' && +            (ascii_lower(PyUnicode_READ(kind, data, len-1)) == 'c' || +                ascii_lower(PyUnicode_READ(kind, data, len-1)) == 'o'))          { -            *filename = PyUnicode_FromUnicode(unicode, len-1); +            *filename = PyUnicode_Substring(*filename, 0, +                                            PyUnicode_GET_LENGTH(*filename)-1);              if (*filename == NULL)                  goto handle_error;          } @@ -643,8 +655,9 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)          return NULL;      if (module_globals) { -        static PyObject *get_source_name = NULL; -        static PyObject *splitlines_name = NULL; +        _Py_IDENTIFIER(get_source); +        _Py_IDENTIFIER(splitlines); +        PyObject *tmp;          PyObject *loader;          PyObject *module_name;          PyObject *source; @@ -652,16 +665,10 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)          PyObject *source_line;          PyObject *returned; -        if (get_source_name == NULL) { -            get_source_name = PyUnicode_InternFromString("get_source"); -            if (!get_source_name) -                return NULL; -        } -        if (splitlines_name == NULL) { -            splitlines_name = PyUnicode_InternFromString("splitlines"); -            if (!splitlines_name) -                return NULL; -        } +        if ((tmp = _PyUnicode_FromId(&PyId_get_source)) == NULL) +            return NULL; +        if ((tmp = _PyUnicode_FromId(&PyId_splitlines)) == NULL) +            return NULL;          /* Check/get the requisite pieces needed for the loader. */          loader = PyDict_GetItemString(module_globals, "__loader__"); @@ -671,11 +678,11 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)              goto standard_call;          /* Make sure the loader implements the optional get_source() method. */ -        if (!PyObject_HasAttrString(loader, "get_source")) +        if (!_PyObject_HasAttrId(loader, &PyId_get_source))                  goto standard_call;          /* Call get_source() to get the source code. */ -        source = PyObject_CallMethodObjArgs(loader, get_source_name, -                                                module_name, NULL); +        source = PyObject_CallMethodObjArgs(loader, PyId_get_source.object, +                                            module_name, NULL);          if (!source)              return NULL;          else if (source == Py_None) { @@ -684,8 +691,9 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)          }          /* Split the source into lines. */ -        source_list = PyObject_CallMethodObjArgs(source, splitlines_name, -                                                    NULL); +        source_list = PyObject_CallMethodObjArgs(source, +                                                 PyId_splitlines.object, +                                                 NULL);          Py_DECREF(source);          if (!source_list)              return NULL; @@ -950,23 +958,30 @@ _PyWarnings_Init(void)      if (m == NULL)          return NULL; -    _filters = init_filters(); -    if (_filters == NULL) -        return NULL; +    if (_filters == NULL) { +        _filters = init_filters(); +        if (_filters == NULL) +            return NULL; +    }      Py_INCREF(_filters);      if (PyModule_AddObject(m, "filters", _filters) < 0)          return NULL; -    _once_registry = PyDict_New(); -    if (_once_registry == NULL) -        return NULL; +    if (_once_registry == NULL) { +        _once_registry = PyDict_New(); +        if (_once_registry == NULL) +            return NULL; +    }      Py_INCREF(_once_registry);      if (PyModule_AddObject(m, "_onceregistry", _once_registry) < 0)          return NULL; -    _default_action = PyUnicode_FromString("default"); -    if (_default_action == NULL) -        return NULL; +    if (_default_action == NULL) { +        _default_action = PyUnicode_FromString("default"); +        if (_default_action == NULL) +            return NULL; +    } +    Py_INCREF(_default_action);      if (PyModule_AddObject(m, "_defaultaction", _default_action) < 0)          return NULL;      return m; diff --git a/Python/asdl.c b/Python/asdl.c index c30d7d2059..e7e3280678 100644 --- a/Python/asdl.c +++ b/Python/asdl.c @@ -2,7 +2,7 @@  #include "asdl.h"  asdl_seq * -asdl_seq_new(int size, PyArena *arena) +asdl_seq_new(Py_ssize_t size, PyArena *arena)  {      asdl_seq *seq = NULL;      size_t n = (size ? (sizeof(void *) * (size - 1)) : 0); @@ -33,7 +33,7 @@ asdl_seq_new(int size, PyArena *arena)  }  asdl_int_seq * -asdl_int_seq_new(int size, PyArena *arena) +asdl_int_seq_new(Py_ssize_t size, PyArena *arena)  {      asdl_int_seq *seq = NULL;      size_t n = (size ? (sizeof(void *) * (size - 1)) : 0); diff --git a/Python/ast.c b/Python/ast.c index 4ae9d75d03..43c18f4aa7 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1,24 +1,507 @@  /*   * This file includes functions to transform a concrete syntax tree (CST) to - * an abstract syntax tree (AST).  The main function is PyAST_FromNode(). + * an abstract syntax tree (AST). The main function is PyAST_FromNode().   *   */  #include "Python.h"  #include "Python-ast.h" -#include "grammar.h"  #include "node.h"  #include "ast.h"  #include "token.h" -#include "parsetok.h" -#include "graminit.h"  #include <assert.h> +static int validate_stmts(asdl_seq *); +static int validate_exprs(asdl_seq *, expr_context_ty, int); +static int validate_nonempty_seq(asdl_seq *, const char *, const char *); +static int validate_stmt(stmt_ty); +static int validate_expr(expr_ty, expr_context_ty); + +static int +validate_comprehension(asdl_seq *gens) +{ +    int i; +    if (!asdl_seq_LEN(gens)) { +        PyErr_SetString(PyExc_ValueError, "comprehension with no generators"); +        return 0; +    } +    for (i = 0; i < asdl_seq_LEN(gens); i++) { +        comprehension_ty comp = asdl_seq_GET(gens, i); +        if (!validate_expr(comp->target, Store) || +            !validate_expr(comp->iter, Load) || +            !validate_exprs(comp->ifs, Load, 0)) +            return 0; +    } +    return 1; +} + +static int +validate_slice(slice_ty slice) +{ +    switch (slice->kind) { +    case Slice_kind: +        return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) && +            (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) && +            (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load)); +    case ExtSlice_kind: { +        int i; +        if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice")) +            return 0; +        for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++) +            if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i))) +                return 0; +        return 1; +    } +    case Index_kind: +        return validate_expr(slice->v.Index.value, Load); +    default: +        PyErr_SetString(PyExc_SystemError, "unknown slice node"); +        return 0; +    } +} + +static int +validate_keywords(asdl_seq *keywords) +{ +    int i; +    for (i = 0; i < asdl_seq_LEN(keywords); i++) +        if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load)) +            return 0; +    return 1; +} + +static int +validate_args(asdl_seq *args) +{ +    int i; +    for (i = 0; i < asdl_seq_LEN(args); i++) { +        arg_ty arg = asdl_seq_GET(args, i); +        if (arg->annotation && !validate_expr(arg->annotation, Load)) +            return 0; +    } +    return 1; +} + +static const char * +expr_context_name(expr_context_ty ctx) +{ +    switch (ctx) { +    case Load: +        return "Load"; +    case Store: +        return "Store"; +    case Del: +        return "Del"; +    case AugLoad: +        return "AugLoad"; +    case AugStore: +        return "AugStore"; +    case Param: +        return "Param"; +    default: +        assert(0); +        return "(unknown)"; +    } +} + +static int +validate_arguments(arguments_ty args) +{ +    if (!validate_args(args->args)) +        return 0; +    if (args->varargannotation) { +        if (!args->vararg) { +            PyErr_SetString(PyExc_ValueError, "varargannotation but no vararg on arguments"); +            return 0; +        } +        if (!validate_expr(args->varargannotation, Load)) +            return 0; +    } +    if (!validate_args(args->kwonlyargs)) +        return 0; +    if (args->kwargannotation) { +        if (!args->kwarg) { +            PyErr_SetString(PyExc_ValueError, "kwargannotation but no kwarg on arguments"); +            return 0; +        } +        if (!validate_expr(args->kwargannotation, Load)) +            return 0; +    } +    if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) { +        PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments"); +        return 0; +    } +    if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) { +        PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as " +                        "kw_defaults on arguments"); +        return 0; +    } +    return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1); +} + +static int +validate_expr(expr_ty exp, expr_context_ty ctx) +{ +    int check_ctx = 1; +    expr_context_ty actual_ctx; + +    /* First check expression context. */ +    switch (exp->kind) { +    case Attribute_kind: +        actual_ctx = exp->v.Attribute.ctx; +        break; +    case Subscript_kind: +        actual_ctx = exp->v.Subscript.ctx; +        break; +    case Starred_kind: +        actual_ctx = exp->v.Starred.ctx; +        break; +    case Name_kind: +        actual_ctx = exp->v.Name.ctx; +        break; +    case List_kind: +        actual_ctx = exp->v.List.ctx; +        break; +    case Tuple_kind: +        actual_ctx = exp->v.Tuple.ctx; +        break; +    default: +        if (ctx != Load) { +            PyErr_Format(PyExc_ValueError, "expression which can't be " +                         "assigned to in %s context", expr_context_name(ctx)); +            return 0; +        } +        check_ctx = 0; +    } +    if (check_ctx && actual_ctx != ctx) { +        PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead", +                     expr_context_name(ctx), expr_context_name(actual_ctx)); +        return 0; +    } + +    /* Now validate expression. */ +    switch (exp->kind) { +    case BoolOp_kind: +        if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) { +            PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values"); +            return 0; +        } +        return validate_exprs(exp->v.BoolOp.values, Load, 0); +    case BinOp_kind: +        return validate_expr(exp->v.BinOp.left, Load) && +            validate_expr(exp->v.BinOp.right, Load); +    case UnaryOp_kind: +        return validate_expr(exp->v.UnaryOp.operand, Load); +    case Lambda_kind: +        return validate_arguments(exp->v.Lambda.args) && +            validate_expr(exp->v.Lambda.body, Load); +    case IfExp_kind: +        return validate_expr(exp->v.IfExp.test, Load) && +            validate_expr(exp->v.IfExp.body, Load) && +            validate_expr(exp->v.IfExp.orelse, Load); +    case Dict_kind: +        if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) { +            PyErr_SetString(PyExc_ValueError, +                            "Dict doesn't have the same number of keys as values"); +            return 0; +        } +        return validate_exprs(exp->v.Dict.keys, Load, 0) && +            validate_exprs(exp->v.Dict.values, Load, 0); +    case Set_kind: +        return validate_exprs(exp->v.Set.elts, Load, 0); +#define COMP(NAME) \ +        case NAME ## _kind: \ +            return validate_comprehension(exp->v.NAME.generators) && \ +                validate_expr(exp->v.NAME.elt, Load); +    COMP(ListComp) +    COMP(SetComp) +    COMP(GeneratorExp) +#undef COMP +    case DictComp_kind: +        return validate_comprehension(exp->v.DictComp.generators) && +            validate_expr(exp->v.DictComp.key, Load) && +            validate_expr(exp->v.DictComp.value, Load); +    case Yield_kind: +        return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load); +    case YieldFrom_kind: +        return !exp->v.YieldFrom.value || +            validate_expr(exp->v.YieldFrom.value, Load); +    case Compare_kind: +        if (!asdl_seq_LEN(exp->v.Compare.comparators)) { +            PyErr_SetString(PyExc_ValueError, "Compare with no comparators"); +            return 0; +        } +        if (asdl_seq_LEN(exp->v.Compare.comparators) != +            asdl_seq_LEN(exp->v.Compare.ops)) { +            PyErr_SetString(PyExc_ValueError, "Compare has a different number " +                            "of comparators and operands"); +            return 0; +        } +        return validate_exprs(exp->v.Compare.comparators, Load, 0) && +            validate_expr(exp->v.Compare.left, Load); +    case Call_kind: +        return validate_expr(exp->v.Call.func, Load) && +            validate_exprs(exp->v.Call.args, Load, 0) && +            validate_keywords(exp->v.Call.keywords) && +            (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) && +            (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load)); +    case Num_kind: { +        PyObject *n = exp->v.Num.n; +        if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) && +            !PyComplex_CheckExact(n)) { +            PyErr_SetString(PyExc_TypeError, "non-numeric type in Num"); +            return 0; +        } +        return 1; +    } +    case Str_kind: { +        PyObject *s = exp->v.Str.s; +        if (!PyUnicode_CheckExact(s)) { +            PyErr_SetString(PyExc_TypeError, "non-string type in Str"); +            return 0; +        } +        return 1; +    } +    case Bytes_kind: { +        PyObject *b = exp->v.Bytes.s; +        if (!PyBytes_CheckExact(b)) { +            PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes"); +            return 0; +        } +        return 1; +    } +    case Attribute_kind: +        return validate_expr(exp->v.Attribute.value, Load); +    case Subscript_kind: +        return validate_slice(exp->v.Subscript.slice) && +            validate_expr(exp->v.Subscript.value, Load); +    case Starred_kind: +        return validate_expr(exp->v.Starred.value, ctx); +    case List_kind: +        return validate_exprs(exp->v.List.elts, ctx, 0); +    case Tuple_kind: +        return validate_exprs(exp->v.Tuple.elts, ctx, 0); +    /* These last cases don't have any checking. */ +    case Name_kind: +    case Ellipsis_kind: +        return 1; +    default: +        PyErr_SetString(PyExc_SystemError, "unexpected expression"); +        return 0; +    } +} + +static int +validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner) +{ +    if (asdl_seq_LEN(seq)) +        return 1; +    PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner); +    return 0; +} + +static int +validate_assignlist(asdl_seq *targets, expr_context_ty ctx) +{ +    return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") && +        validate_exprs(targets, ctx, 0); +} + +static int +validate_body(asdl_seq *body, const char *owner) +{ +    return validate_nonempty_seq(body, "body", owner) && validate_stmts(body); +} + +static int +validate_stmt(stmt_ty stmt) +{ +    int i; +    switch (stmt->kind) { +    case FunctionDef_kind: +        return validate_body(stmt->v.FunctionDef.body, "FunctionDef") && +            validate_arguments(stmt->v.FunctionDef.args) && +            validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) && +            (!stmt->v.FunctionDef.returns || +             validate_expr(stmt->v.FunctionDef.returns, Load)); +    case ClassDef_kind: +        return validate_body(stmt->v.ClassDef.body, "ClassDef") && +            validate_exprs(stmt->v.ClassDef.bases, Load, 0) && +            validate_keywords(stmt->v.ClassDef.keywords) && +            validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) && +            (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) && +            (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load)); +    case Return_kind: +        return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load); +    case Delete_kind: +        return validate_assignlist(stmt->v.Delete.targets, Del); +    case Assign_kind: +        return validate_assignlist(stmt->v.Assign.targets, Store) && +            validate_expr(stmt->v.Assign.value, Load); +    case AugAssign_kind: +        return validate_expr(stmt->v.AugAssign.target, Store) && +            validate_expr(stmt->v.AugAssign.value, Load); +    case For_kind: +        return validate_expr(stmt->v.For.target, Store) && +            validate_expr(stmt->v.For.iter, Load) && +            validate_body(stmt->v.For.body, "For") && +            validate_stmts(stmt->v.For.orelse); +    case While_kind: +        return validate_expr(stmt->v.While.test, Load) && +            validate_body(stmt->v.While.body, "While") && +            validate_stmts(stmt->v.While.orelse); +    case If_kind: +        return validate_expr(stmt->v.If.test, Load) && +            validate_body(stmt->v.If.body, "If") && +            validate_stmts(stmt->v.If.orelse); +    case With_kind: +        if (!validate_nonempty_seq(stmt->v.With.items, "items", "With")) +            return 0; +        for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) { +            withitem_ty item = asdl_seq_GET(stmt->v.With.items, i); +            if (!validate_expr(item->context_expr, Load) || +                (item->optional_vars && !validate_expr(item->optional_vars, Store))) +                return 0; +        } +        return validate_body(stmt->v.With.body, "With"); +    case Raise_kind: +        if (stmt->v.Raise.exc) { +            return validate_expr(stmt->v.Raise.exc, Load) && +                (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load)); +        } +        if (stmt->v.Raise.cause) { +            PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception"); +            return 0; +        } +        return 1; +    case Try_kind: +        if (!validate_body(stmt->v.Try.body, "Try")) +            return 0; +        if (!asdl_seq_LEN(stmt->v.Try.handlers) && +            !asdl_seq_LEN(stmt->v.Try.finalbody)) { +            PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody"); +            return 0; +        } +        if (!asdl_seq_LEN(stmt->v.Try.handlers) && +            asdl_seq_LEN(stmt->v.Try.orelse)) { +            PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers"); +            return 0; +        } +        for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) { +            excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i); +            if ((handler->v.ExceptHandler.type && +                 !validate_expr(handler->v.ExceptHandler.type, Load)) || +                !validate_body(handler->v.ExceptHandler.body, "ExceptHandler")) +                return 0; +        } +        return (!asdl_seq_LEN(stmt->v.Try.finalbody) || +                validate_stmts(stmt->v.Try.finalbody)) && +            (!asdl_seq_LEN(stmt->v.Try.orelse) || +             validate_stmts(stmt->v.Try.orelse)); +    case Assert_kind: +        return validate_expr(stmt->v.Assert.test, Load) && +            (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load)); +    case Import_kind: +        return validate_nonempty_seq(stmt->v.Import.names, "names", "Import"); +    case ImportFrom_kind: +        if (stmt->v.ImportFrom.level < -1) { +            PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1"); +            return 0; +        } +        return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom"); +    case Global_kind: +        return validate_nonempty_seq(stmt->v.Global.names, "names", "Global"); +    case Nonlocal_kind: +        return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal"); +    case Expr_kind: +        return validate_expr(stmt->v.Expr.value, Load); +    case Pass_kind: +    case Break_kind: +    case Continue_kind: +        return 1; +    default: +        PyErr_SetString(PyExc_SystemError, "unexpected statement"); +        return 0; +    } +} + +static int +validate_stmts(asdl_seq *seq) +{ +    int i; +    for (i = 0; i < asdl_seq_LEN(seq); i++) { +        stmt_ty stmt = asdl_seq_GET(seq, i); +        if (stmt) { +            if (!validate_stmt(stmt)) +                return 0; +        } +        else { +            PyErr_SetString(PyExc_ValueError, +                            "None disallowed in statement list"); +            return 0; +        } +    } +    return 1; +} + +static int +validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok) +{ +    int i; +    for (i = 0; i < asdl_seq_LEN(exprs); i++) { +        expr_ty expr = asdl_seq_GET(exprs, i); +        if (expr) { +            if (!validate_expr(expr, ctx)) +                return 0; +        } +        else if (!null_ok) { +            PyErr_SetString(PyExc_ValueError, +                            "None disallowed in expression list"); +            return 0; +        } +             +    } +    return 1; +} + +int +PyAST_Validate(mod_ty mod) +{ +    int res = 0; + +    switch (mod->kind) { +    case Module_kind: +        res = validate_stmts(mod->v.Module.body); +        break; +    case Interactive_kind: +        res = validate_stmts(mod->v.Interactive.body); +        break; +    case Expression_kind: +        res = validate_expr(mod->v.Expression.body, Load); +        break; +    case Suite_kind: +        PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler"); +        break; +    default: +        PyErr_SetString(PyExc_SystemError, "impossible module node"); +        res = 0; +        break; +    } +    return res; +} + +/* This is done here, so defines like "test" don't interfere with AST use above. */ +#include "grammar.h" +#include "parsetok.h" +#include "graminit.h" +  /* Data structure used internally */  struct compiling {      char *c_encoding; /* source encoding */      PyArena *c_arena; /* arena for allocating memeory */      const char *c_filename; /* filename */ +    PyObject *c_normalize; /* Normalization function from unicodedata. */ +    PyObject *c_normalize_args; /* Normalization argument tuple. */  };  static asdl_seq *seq_for_testlist(struct compiling *, const node *); @@ -38,127 +521,96 @@ static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);  static PyObject *parsestrplus(struct compiling *, const node *n,                                int *bytesmode); -#ifndef LINENO -#define LINENO(n)       ((n)->n_lineno) -#endif -  #define COMP_GENEXP   0  #define COMP_LISTCOMP 1  #define COMP_SETCOMP  2 +static int +init_normalization(struct compiling *c) +{ +    PyObject *m = PyImport_ImportModuleNoBlock("unicodedata"); +    if (!m) +        return 0; +    c->c_normalize = PyObject_GetAttrString(m, "normalize"); +    Py_DECREF(m); +    if (!c->c_normalize) +        return 0; +    c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None); +    PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL); +    if (!c->c_normalize_args) { +        Py_CLEAR(c->c_normalize); +        return 0; +    } +    return 1; +} +  static identifier -new_identifier(const char *n, PyArena *arena) +new_identifier(const char *n, struct compiling *c)  {      PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL); -    Py_UNICODE *u;      if (!id)          return NULL; -    u = PyUnicode_AS_UNICODE(id); +    /* PyUnicode_DecodeUTF8 should always return a ready string. */ +    assert(PyUnicode_IS_READY(id));      /* Check whether there are non-ASCII characters in the         identifier; if so, normalize to NFKC. */ -    for (; *u; u++) { -        if (*u >= 128) { -            PyObject *m = PyImport_ImportModuleNoBlock("unicodedata"); -            PyObject *id2; -            if (!m) -                return NULL; -            id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id); -            Py_DECREF(m); -            if (!id2) -                return NULL; +    if (!PyUnicode_IS_ASCII(id)) { +        PyObject *id2; +        if (!c->c_normalize && !init_normalization(c)) {              Py_DECREF(id); -            id = id2; -            break; +            return NULL;          } +        PyTuple_SET_ITEM(c->c_normalize_args, 1, id); +        id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL); +        Py_DECREF(id); +        if (!id2) +            return NULL; +        id = id2;      }      PyUnicode_InternInPlace(&id); -    PyArena_AddPyObject(arena, id); +    PyArena_AddPyObject(c->c_arena, id);      return id;  } -#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena) - -/* This routine provides an invalid object for the syntax error. -   The outermost routine must unpack this error and create the -   proper object.  We do this so that we don't have to pass -   the filename to everything function. - -   XXX Maybe we should just pass the filename... -*/ +#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)  static int -ast_error(const node *n, const char *errstr) +ast_error(struct compiling *c, const node *n, const char *errmsg)  { -    PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset), *save; -    if (!u) -        return 0; -    /* -     * Prevent the error from being chained. PyErr_SetObject will normalize the -     * exception in order to chain it. ast_error_finish, however, requires the -     * error not to be normalized. -     */ -    save = PyThreadState_GET()->exc_value; -    PyThreadState_GET()->exc_value = NULL; -    PyErr_SetObject(PyExc_SyntaxError, u); -    PyThreadState_GET()->exc_value = save; -    Py_DECREF(u); -    return 0; -} - -static void -ast_error_finish(const char *filename) -{ -    PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp; +    PyObject *value, *errstr, *loc, *tmp;      PyObject *filename_obj; -    long lineno; - -    assert(PyErr_Occurred()); -    if (!PyErr_ExceptionMatches(PyExc_SyntaxError)) -        return; - -    PyErr_Fetch(&type, &value, &tback); -    errstr = PyTuple_GetItem(value, 0); -    if (!errstr) -        return; -    Py_INCREF(errstr); -    lineno = PyLong_AsLong(PyTuple_GetItem(value, 1)); -    if (lineno == -1) { -        Py_DECREF(errstr); -        return; -    } -    offset = PyTuple_GetItem(value, 2); -    if (!offset) { -        Py_DECREF(errstr); -        return; -    } -    Py_DECREF(value); - -    loc = PyErr_ProgramText(filename, lineno); + +    loc = PyErr_ProgramText(c->c_filename, LINENO(n));      if (!loc) {          Py_INCREF(Py_None);          loc = Py_None;      } -    if (filename != NULL) -        filename_obj = PyUnicode_DecodeFSDefault(filename); -    else { +    if (c->c_filename) { +        filename_obj = PyUnicode_DecodeFSDefault(c->c_filename); +        if (!filename_obj) { +            Py_DECREF(loc); +            return 0; +        } +    } else {          Py_INCREF(Py_None);          filename_obj = Py_None;      } -    if (filename_obj != NULL) -        tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc); -    else -        tmp = NULL; -    Py_DECREF(loc); -    if (!tmp) { -        Py_DECREF(errstr); -        return; +    tmp = Py_BuildValue("(NiiN)", filename_obj, LINENO(n), n->n_col_offset, loc); +    if (!tmp) +        return 0; +    errstr = PyUnicode_FromString(errmsg); +    if (!errstr) { +        Py_DECREF(tmp); +        return 0;      }      value = PyTuple_Pack(2, errstr, tmp);      Py_DECREF(errstr);      Py_DECREF(tmp); -    if (!value) -        return; -    PyErr_Restore(type, value, tback); +    if (value) { +        PyErr_SetObject(PyExc_SyntaxError, value); +        Py_DECREF(value); +    } +    return 0;  }  /* num_stmts() returns number of contained statements. @@ -234,13 +686,17 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,      stmt_ty s;      node *ch;      struct compiling c; +    mod_ty res = NULL; +    c.c_arena = arena; +    c.c_filename = filename; +    c.c_normalize = c.c_normalize_args = NULL;      if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {          c.c_encoding = "utf-8";          if (TYPE(n) == encoding_decl) {  #if 0 -            ast_error(n, "encoding declaration in Unicode string"); -            goto error; +            ast_error(c, n, "encoding declaration in Unicode string"); +            goto out;  #endif              n = CHILD(n, 0);          } @@ -251,15 +707,13 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,          /* PEP 3120 */          c.c_encoding = "utf-8";      } -    c.c_arena = arena; -    c.c_filename = filename;      k = 0;      switch (TYPE(n)) {          case file_input:              stmts = asdl_seq_new(num_stmts(n), arena);              if (!stmts) -                return NULL; +                goto out;              for (i = 0; i < NCH(n) - 1; i++) {                  ch = CHILD(n, i);                  if (TYPE(ch) == NEWLINE) @@ -269,7 +723,7 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,                  if (num == 1) {                      s = ast_for_stmt(&c, ch);                      if (!s) -                        goto error; +                        goto out;                      asdl_seq_SET(stmts, k++, s);                  }                  else { @@ -278,42 +732,44 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,                      for (j = 0; j < num; j++) {                          s = ast_for_stmt(&c, CHILD(ch, j * 2));                          if (!s) -                            goto error; +                            goto out;                          asdl_seq_SET(stmts, k++, s);                      }                  }              } -            return Module(stmts, arena); +            res = Module(stmts, arena); +            break;          case eval_input: {              expr_ty testlist_ast;              /* XXX Why not comp_for here? */              testlist_ast = ast_for_testlist(&c, CHILD(n, 0));              if (!testlist_ast) -                goto error; -            return Expression(testlist_ast, arena); +                goto out; +            res = Expression(testlist_ast, arena); +            break;          }          case single_input:              if (TYPE(CHILD(n, 0)) == NEWLINE) {                  stmts = asdl_seq_new(1, arena);                  if (!stmts) -                    goto error; +                    goto out;                  asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,                                              arena));                  if (!asdl_seq_GET(stmts, 0)) -                    goto error; -                return Interactive(stmts, arena); +                    goto out; +                res = Interactive(stmts, arena);              }              else {                  n = CHILD(n, 0);                  num = num_stmts(n);                  stmts = asdl_seq_new(num, arena);                  if (!stmts) -                    goto error; +                    goto out;                  if (num == 1) {                      s = ast_for_stmt(&c, n);                      if (!s) -                        goto error; +                        goto out;                      asdl_seq_SET(stmts, 0, s);                  }                  else { @@ -324,21 +780,26 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,                              break;                          s = ast_for_stmt(&c, CHILD(n, i));                          if (!s) -                            goto error; +                            goto out;                          asdl_seq_SET(stmts, i / 2, s);                      }                  } -                return Interactive(stmts, arena); +                res = Interactive(stmts, arena);              } +            break;          default:              PyErr_Format(PyExc_SystemError,                           "invalid node %d for PyAST_FromNode", TYPE(n)); -            goto error; +            goto out;      } - error: -    ast_error_finish(filename); -    return NULL; + out: +    if (c.c_normalize) { +        Py_DECREF(c.c_normalize); +        PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL); +        Py_DECREF(c.c_normalize_args); +    } +    return res;  }  /* Return the AST repr. of the operator represented as syntax (|, ^, etc.) @@ -383,18 +844,18 @@ static const char* FORBIDDEN[] = {  };  static int -forbidden_name(identifier name, const node *n, int full_checks) +forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks)  {      assert(PyUnicode_Check(name));      if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) { -        ast_error(n, "assignment to keyword"); +        ast_error(c, n, "assignment to keyword");          return 1;      }      if (full_checks) {          const char **p;          for (p = FORBIDDEN; *p; p++) {              if (PyUnicode_CompareWithASCIIString(name, *p) == 0) { -                ast_error(n, "assignment to keyword"); +                ast_error(c, n, "assignment to keyword");                  return 1;              }          } @@ -430,7 +891,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)      switch (e->kind) {          case Attribute_kind:              e->v.Attribute.ctx = ctx; -            if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1)) +            if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))                  return 0;              break;          case Subscript_kind: @@ -443,7 +904,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)              break;          case Name_kind:              if (ctx == Store) { -                if (forbidden_name(e->v.Name.id, n, 1)) +                if (forbidden_name(c, e->v.Name.id, n, 1))                      return 0; /* forbidden_name() calls ast_error() */              }              e->v.Name.ctx = ctx; @@ -476,6 +937,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)              expr_name = "generator expression";              break;          case Yield_kind: +        case YieldFrom_kind:              expr_name = "yield expression";              break;          case ListComp_kind: @@ -516,7 +978,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)                        "can't %s %s",                        ctx == Store ? "assign to" : "delete",                        expr_name); -        return ast_error(n, buf); +        return ast_error(c, n, buf);      }      /* If the LHS is a list or tuple, we need to set the assignment @@ -664,7 +1126,7 @@ ast_for_arg(struct compiling *c, const node *n)      name = NEW_IDENTIFIER(ch);      if (!name)          return NULL; -    if (forbidden_name(name, ch, 0)) +    if (forbidden_name(c, name, ch, 0))          return NULL;      if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) { @@ -694,7 +1156,7 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,      int j = 0; /* index for kwdefaults and kwonlyargs */      if (kwonlyargs == NULL) { -        ast_error(CHILD(n, start), "named arguments must follow bare *"); +        ast_error(c, CHILD(n, start), "named arguments must follow bare *");          return -1;      }      assert(kwdefaults != NULL); @@ -726,7 +1188,7 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,                  argname = NEW_IDENTIFIER(ch);                  if (!argname)                      goto error; -                if (forbidden_name(argname, ch, 0)) +                if (forbidden_name(c, argname, ch, 0))                      goto error;                  arg = arg(argname, annotation, c->c_arena);                  if (!arg) @@ -737,7 +1199,7 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,              case DOUBLESTAR:                  return i;              default: -                ast_error(ch, "unexpected node"); +                ast_error(c, ch, "unexpected node");                  goto error;          }      } @@ -829,7 +1291,7 @@ ast_for_arguments(struct compiling *c, const node *n)          return NULL;      if (nposargs + nkwonlyargs > 255) { -        ast_error(n, "more than 255 arguments"); +        ast_error(c, n, "more than 255 arguments");          return NULL;      } @@ -857,7 +1319,7 @@ ast_for_arguments(struct compiling *c, const node *n)                      found_default = 1;                  }                  else if (found_default) { -                    ast_error(n, +                    ast_error(c, n,                               "non-default argument follows default argument");                      return NULL;                  } @@ -869,7 +1331,7 @@ ast_for_arguments(struct compiling *c, const node *n)                  break;              case STAR:                  if (i+1 >= NCH(n)) { -                    ast_error(CHILD(n, i), +                    ast_error(c, CHILD(n, i),                          "named arguments must follow bare *");                      return NULL;                  } @@ -886,7 +1348,7 @@ ast_for_arguments(struct compiling *c, const node *n)                      vararg = NEW_IDENTIFIER(CHILD(ch, 0));                      if (!vararg)                          return NULL; -                    if (forbidden_name(vararg, CHILD(ch, 0), 0)) +                    if (forbidden_name(c, vararg, CHILD(ch, 0), 0))                          return NULL;                      if (NCH(ch) > 1) {                          /* there is an annotation on the vararg */ @@ -917,7 +1379,7 @@ ast_for_arguments(struct compiling *c, const node *n)                      if (!kwargannotation)                          return NULL;                  } -                if (forbidden_name(kwarg, CHILD(ch, 0), 0)) +                if (forbidden_name(c, kwarg, CHILD(ch, 0), 0))                      return NULL;                  i += 3;                  break; @@ -1036,7 +1498,7 @@ ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)      name = NEW_IDENTIFIER(CHILD(n, name_i));      if (!name)          return NULL; -    if (forbidden_name(name, CHILD(n, name_i), 0)) +    if (forbidden_name(c, name, CHILD(n, name_i), 0))          return NULL;      args = ast_for_arguments(c, CHILD(n, name_i + 1));      if (!args) @@ -1377,10 +1839,10 @@ ast_for_atom(struct compiling *c, const node *n)                      char buf[128];                      s = _PyUnicode_AsString(errstr);                      PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s); -                    ast_error(n, buf); +                    ast_error(c, n, buf);                      Py_DECREF(errstr);                  } else { -                    ast_error(n, "(unicode error) unknown error"); +                    ast_error(c, n, "(unicode error) unknown error");                  }                  Py_DECREF(type);                  Py_DECREF(value); @@ -1897,12 +2359,25 @@ ast_for_expr(struct compiling *c, const node *n)              }              return ast_for_binop(c, n);          case yield_expr: { +            node *an = NULL; +            node *en = NULL; +            int is_from = 0;              expr_ty exp = NULL; -            if (NCH(n) == 2) { -                exp = ast_for_testlist(c, CHILD(n, 1)); +            if (NCH(n) > 1) +                an = CHILD(n, 1); /* yield_arg */ +            if (an) { +                en = CHILD(an, NCH(an) - 1); +                if (NCH(an) == 2) { +                    is_from = 1; +                    exp = ast_for_expr(c, en); +                } +                else +                    exp = ast_for_testlist(c, en);                  if (!exp)                      return NULL;              } +            if (is_from) +                return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);              return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);          }          case factor: @@ -1927,7 +2402,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)      /*        arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]                 | '**' test) -      argument: [test '='] test [comp_for]        # Really [keyword '='] test +      argument: [test '='] (test) [comp_for]        # Really [keyword '='] test      */      int i, nargs, nkeywords, ngens; @@ -1952,14 +2427,14 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)          }      }      if (ngens > 1 || (ngens && (nargs || nkeywords))) { -        ast_error(n, "Generator expression must be parenthesized " +        ast_error(c, n, "Generator expression must be parenthesized "                    "if not sole argument");          return NULL;      }      if (nargs + nkeywords + ngens > 255) { -      ast_error(n, "more than 255 arguments"); -      return NULL; +        ast_error(c, n, "more than 255 arguments"); +        return NULL;      }      args = asdl_seq_new(nargs + ngens, c->c_arena); @@ -1976,12 +2451,12 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)              expr_ty e;              if (NCH(ch) == 1) {                  if (nkeywords) { -                    ast_error(CHILD(ch, 0), +                    ast_error(c, CHILD(ch, 0),                                "non-keyword arg after keyword arg");                      return NULL;                  }                  if (vararg) { -                    ast_error(CHILD(ch, 0), +                    ast_error(c, CHILD(ch, 0),                                "only named arguments may follow *expression");                      return NULL;                  } @@ -2011,19 +2486,19 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)                   * then is very confusing.                   */                  if (e->kind == Lambda_kind) { -                  ast_error(CHILD(ch, 0), "lambda cannot contain assignment"); -                  return NULL; +                    ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment"); +                    return NULL;                  } else if (e->kind != Name_kind) { -                  ast_error(CHILD(ch, 0), "keyword can't be an expression"); -                  return NULL; -                } else if (forbidden_name(e->v.Name.id, ch, 1)) { -                  return NULL; +                    ast_error(c, CHILD(ch, 0), "keyword can't be an expression"); +                    return NULL; +                } else if (forbidden_name(c, e->v.Name.id, ch, 1)) { +                    return NULL;                  }                  key = e->v.Name.id;                  for (k = 0; k < nkeywords; k++) {                      tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;                      if (!PyUnicode_Compare(tmp, key)) { -                        ast_error(CHILD(ch, 0), "keyword argument repeated"); +                        ast_error(c, CHILD(ch, 0), "keyword argument repeated");                          return NULL;                      }                  } @@ -2116,7 +2591,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n)              case Subscript_kind:                  break;              default: -                ast_error(ch, "illegal expression for augmented assignment"); +                ast_error(c, ch, "illegal expression for augmented assignment");                  return NULL;          } @@ -2149,7 +2624,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n)              expr_ty e;              node *ch = CHILD(n, i);              if (TYPE(ch) == yield_expr) { -                ast_error(ch, "assignment to yield expression not possible"); +                ast_error(c, ch, "assignment to yield expression not possible");                  return NULL;              }              e = ast_for_testlist(c, ch); @@ -2221,7 +2696,7 @@ ast_for_flow_stmt(struct compiling *c, const node *n)        continue_stmt: 'continue'        return_stmt: 'return' [testlist]        yield_stmt: yield_expr -      yield_expr: 'yield' testlist +      yield_expr: 'yield' testlist | 'yield' 'from' test        raise_stmt: 'raise' [test [',' test [',' test]]]      */      node *ch; @@ -2296,11 +2771,11 @@ alias_for_import_name(struct compiling *c, const node *n, int store)                  str = NEW_IDENTIFIER(str_node);                  if (!str)                      return NULL; -                if (store && forbidden_name(str, str_node, 0)) +                if (store && forbidden_name(c, str, str_node, 0))                      return NULL;              }              else { -                if (forbidden_name(name, name_node, 0)) +                if (forbidden_name(c, name, name_node, 0))                      return NULL;              }              return alias(name, str, c->c_arena); @@ -2319,7 +2794,7 @@ alias_for_import_name(struct compiling *c, const node *n, int store)                  a->asname = NEW_IDENTIFIER(asname_node);                  if (!a->asname)                      return NULL; -                if (forbidden_name(a->asname, asname_node, 0)) +                if (forbidden_name(c, a->asname, asname_node, 0))                      return NULL;                  return a;              } @@ -2330,7 +2805,7 @@ alias_for_import_name(struct compiling *c, const node *n, int store)                  name = NEW_IDENTIFIER(name_node);                  if (!name)                      return NULL; -                if (store && forbidden_name(name, name_node, 0)) +                if (store && forbidden_name(c, name, name_node, 0))                      return NULL;                  return alias(name, NULL, c->c_arena);              } @@ -2459,13 +2934,13 @@ ast_for_import_stmt(struct compiling *c, const node *n)              n = CHILD(n, idx);              n_children = NCH(n);              if (n_children % 2 == 0) { -                ast_error(n, "trailing comma not allowed without" +                ast_error(c, n, "trailing comma not allowed without"                               " surrounding parentheses");                  return NULL;              }              break;          default: -            ast_error(n, "Unexpected node-type in from-import"); +            ast_error(c, n, "Unexpected node-type in from-import");              return NULL;          } @@ -2871,7 +3346,7 @@ ast_for_except_clause(struct compiling *c, const node *exc, node *body)          identifier e = NEW_IDENTIFIER(CHILD(exc, 3));          if (!e)              return NULL; -        if (forbidden_name(e, CHILD(exc, 3), 0)) +        if (forbidden_name(c, e, CHILD(exc, 3), 0))              return NULL;          expression = ast_for_expr(c, CHILD(exc, 1));          if (!expression) @@ -2895,7 +3370,7 @@ ast_for_try_stmt(struct compiling *c, const node *n)  {      const int nch = NCH(n);      int n_except = (nch - 3)/3; -    asdl_seq *body, *orelse = NULL, *finally = NULL; +    asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;      REQ(n, try_stmt); @@ -2930,15 +3405,14 @@ ast_for_try_stmt(struct compiling *c, const node *n)          }      }      else if (TYPE(CHILD(n, nch - 3)) != except_clause) { -        ast_error(n, "malformed 'try' statement"); +        ast_error(c, n, "malformed 'try' statement");          return NULL;      }      if (n_except > 0) {          int i; -        stmt_ty except_st;          /* process except statements to create a try ... except */ -        asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena); +        handlers = asdl_seq_new(n_except, c->c_arena);          if (handlers == NULL)              return NULL; @@ -2949,28 +3423,15 @@ ast_for_try_stmt(struct compiling *c, const node *n)                  return NULL;              asdl_seq_SET(handlers, i, e);          } - -        except_st = TryExcept(body, handlers, orelse, LINENO(n), -                              n->n_col_offset, c->c_arena); -        if (!finally) -            return except_st; - -        /* if a 'finally' is present too, we nest the TryExcept within a -           TryFinally to emulate try ... except ... finally */ -        body = asdl_seq_new(1, c->c_arena); -        if (body == NULL) -            return NULL; -        asdl_seq_SET(body, 0, except_st);      } -    /* must be a try ... finally (except clauses are in body, if any exist) */ -    assert(finally != NULL); -    return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena); +    assert(finally != NULL || asdl_seq_LEN(handlers)); +    return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);  }  /* with_item: test ['as' expr] */ -static stmt_ty -ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content) +static withitem_ty +ast_for_with_item(struct compiling *c, const node *n)  {      expr_ty context_expr, optional_vars = NULL; @@ -2989,43 +3450,34 @@ ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)          }      } -    return With(context_expr, optional_vars, content, LINENO(n), -                n->n_col_offset, c->c_arena); +    return withitem(context_expr, optional_vars, c->c_arena);  }  /* with_stmt: 'with' with_item (',' with_item)* ':' suite */  static stmt_ty  ast_for_with_stmt(struct compiling *c, const node *n)  { -    int i; -    stmt_ty ret; -    asdl_seq *inner; +    int i, n_items; +    asdl_seq *items, *body;      REQ(n, with_stmt); -    /* process the with items inside-out */ -    i = NCH(n) - 1; -    /* the suite of the innermost with item is the suite of the with stmt */ -    inner = ast_for_suite(c, CHILD(n, i)); -    if (!inner) +    n_items = (NCH(n) - 2) / 2; +    items = asdl_seq_new(n_items, c->c_arena); +    if (!items)          return NULL; - -    for (;;) { -        i -= 2; -        ret = ast_for_with_item(c, CHILD(n, i), inner); -        if (!ret) -            return NULL; -        /* was this the last item? */ -        if (i == 1) -            break; -        /* if not, wrap the result so far in a new sequence */ -        inner = asdl_seq_new(1, c->c_arena); -        if (!inner) +    for (i = 1; i < NCH(n) - 2; i += 2) { +        withitem_ty item = ast_for_with_item(c, CHILD(n, i)); +        if (!item)              return NULL; -        asdl_seq_SET(inner, 0, ret); +        asdl_seq_SET(items, (i - 1) / 2, item);      } -    return ret; +    body = ast_for_suite(c, CHILD(n, NCH(n) - 1)); +    if (!body) +        return NULL; + +    return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);  }  static stmt_ty @@ -3045,7 +3497,7 @@ ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)          classname = NEW_IDENTIFIER(CHILD(n, 1));          if (!classname)              return NULL; -        if (forbidden_name(classname, CHILD(n, 3), 0)) +        if (forbidden_name(c, classname, CHILD(n, 3), 0))              return NULL;          return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,                          LINENO(n), n->n_col_offset, c->c_arena); @@ -3058,7 +3510,7 @@ ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)          classname = NEW_IDENTIFIER(CHILD(n, 1));          if (!classname)              return NULL; -        if (forbidden_name(classname, CHILD(n, 3), 0)) +        if (forbidden_name(c, classname, CHILD(n, 3), 0))              return NULL;          return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,                          LINENO(n), n->n_col_offset, c->c_arena); @@ -3083,7 +3535,7 @@ ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)      classname = NEW_IDENTIFIER(CHILD(n, 1));      if (!classname)          return NULL; -    if (forbidden_name(classname, CHILD(n, 1), 0)) +    if (forbidden_name(c, classname, CHILD(n, 1), 0))          return NULL;      return ClassDef(classname, call->v.Call.args, call->v.Call.keywords, @@ -3209,20 +3661,14 @@ parsenumber(struct compiling *c, const char *s)  }  static PyObject * -decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding) +decode_utf8(struct compiling *c, const char **sPtr, const char *end)  { -    PyObject *u, *v;      char *s, *t;      t = s = (char *)*sPtr;      /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */      while (s < end && (*s & 0x80)) s++;      *sPtr = s; -    u = PyUnicode_DecodeUTF8(t, s - t, NULL); -    if (u == NULL) -        return NULL; -    v = PyUnicode_AsEncodedString(u, encoding, NULL); -    Py_DECREF(u); -    return v; +    return PyUnicode_DecodeUTF8(t, s - t, NULL);  }  static PyObject * @@ -3234,7 +3680,6 @@ decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, cons      const char *end;      if (encoding == NULL) { -        buf = (char *)s;          u = NULL;      } else {          /* check for integer overflow */ @@ -3257,22 +3702,20 @@ decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, cons              }              if (*s & 0x80) { /* XXX inefficient */                  PyObject *w; -                char *r; -                Py_ssize_t rn, i; -                w = decode_utf8(c, &s, end, "utf-32-be"); +                int kind; +                void *data; +                Py_ssize_t len, i; +                w = decode_utf8(c, &s, end);                  if (w == NULL) {                      Py_DECREF(u);                      return NULL;                  } -                r = PyBytes_AS_STRING(w); -                rn = Py_SIZE(w); -                assert(rn % 4 == 0); -                for (i = 0; i < rn; i += 4) { -                    sprintf(p, "\\U%02x%02x%02x%02x", -                            r[i + 0] & 0xFF, -                            r[i + 1] & 0xFF, -                            r[i + 2] & 0xFF, -                            r[i + 3] & 0xFF); +                kind = PyUnicode_KIND(w); +                data = PyUnicode_DATA(w); +                len = PyUnicode_GET_LENGTH(w); +                for (i = 0; i < len; i++) { +                    Py_UCS4 chr = PyUnicode_READ(kind, data, i); +                    sprintf(p, "\\U%08x", chr);                      p += 10;                  }                  /* Should be impossible to overflow */ @@ -3306,13 +3749,21 @@ parsestr(struct compiling *c, const node *n, int *bytesmode)      int rawmode = 0;      int need_encoding;      if (isalpha(quote)) { -        if (quote == 'b' || quote == 'B') { -            quote = *++s; -            *bytesmode = 1; -        } -        if (quote == 'r' || quote == 'R') { -            quote = *++s; -            rawmode = 1; +        while (!*bytesmode || !rawmode) { +            if (quote == 'b' || quote == 'B') { +                quote = *++s; +                *bytesmode = 1; +            } +            else if (quote == 'u' || quote == 'U') { +                quote = *++s; +            } +            else if (quote == 'r' || quote == 'R') { +                quote = *++s; +                rawmode = 1; +            } +            else { +                break; +            }          }      }      if (quote != '\'' && quote != '\"') { @@ -3343,10 +3794,10 @@ parsestr(struct compiling *c, const node *n, int *bytesmode)      }      if (*bytesmode) {          /* Disallow non-ascii characters (but not escapes) */ -        const char *c; -        for (c = s; *c; c++) { -            if (Py_CHARMASK(*c) >= 0x80) { -                ast_error(n, "bytes can only contain ASCII " +        const char *ch; +        for (ch = s; *ch; ch++) { +            if (Py_CHARMASK(*ch) >= 0x80) { +                ast_error(c, n, "bytes can only contain ASCII "                            "literal characters.");                  return NULL;              } @@ -3394,7 +3845,7 @@ parsestrplus(struct compiling *c, const node *n, int *bytesmode)              if (s == NULL)                  goto onError;              if (*bytesmode != subbm) { -                ast_error(n, "cannot mix bytes and nonbytes literals"); +                ast_error(c, n, "cannot mix bytes and nonbytes literals");                  goto onError;              }              if (PyBytes_Check(v) && PyBytes_Check(s)) { diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index b85e37bc29..0e6e6ff9ff 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -6,6 +6,9 @@  #include "node.h"  #include "code.h" +#include "asdl.h" +#include "ast.h" +  #include <ctype.h>  #ifdef HAVE_LANGINFO_H @@ -18,20 +21,20 @@     Don't forget to modify PyUnicode_DecodeFSDefault() if you touch any of the     values for Py_FileSystemDefaultEncoding!  */ -#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T) +#ifdef HAVE_MBCS  const char *Py_FileSystemDefaultEncoding = "mbcs";  int Py_HasFileSystemDefaultEncoding = 1;  #elif defined(__APPLE__)  const char *Py_FileSystemDefaultEncoding = "utf-8";  int Py_HasFileSystemDefaultEncoding = 1; -#elif defined(HAVE_LANGINFO_H) && defined(CODESET) +#else  const char *Py_FileSystemDefaultEncoding = NULL; /* set by initfsencoding() */  int Py_HasFileSystemDefaultEncoding = 0; -#else -const char *Py_FileSystemDefaultEncoding = "utf-8"; -int Py_HasFileSystemDefaultEncoding = 1;  #endif +_Py_IDENTIFIER(fileno); +_Py_IDENTIFIER(flush); +  static PyObject *  builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)  { @@ -39,6 +42,7 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)      PyObject *cls = NULL;      Py_ssize_t nargs;      int isclass; +    _Py_IDENTIFIER(__prepare__);      assert(args != NULL);      if (!PyTuple_Check(args)) { @@ -99,6 +103,7 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)          Py_INCREF(meta);          isclass = 1;  /* meta is really a class */      } +      if (isclass) {          /* meta is really a class, so check for a more derived             metaclass, or possible metaclass conflicts: */ @@ -118,7 +123,7 @@ builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds)      }      /* else: meta is not a class, so we cannot do the metaclass         calculation, so we will use the explicitly given object as it is */ -    prep = PyObject_GetAttrString(meta, "__prepare__"); +    prep = _PyObject_GetAttrId(meta, &PyId___prepare__);      if (prep == NULL) {          if (PyErr_ExceptionMatches(PyExc_AttributeError)) {              PyErr_Clear(); @@ -179,21 +184,18 @@ builtin___import__(PyObject *self, PyObject *args, PyObject *kwds)  {      static char *kwlist[] = {"name", "globals", "locals", "fromlist",                               "level", 0}; -    char *name; -    PyObject *globals = NULL; -    PyObject *locals = NULL; -    PyObject *fromlist = NULL; -    int level = -1; +    PyObject *name, *globals = NULL, *locals = NULL, *fromlist = NULL; +    int level = 0; -    if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|OOOi:__import__", +    if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|OOOi:__import__",                      kwlist, &name, &globals, &locals, &fromlist, &level))          return NULL; -    return PyImport_ImportModuleLevel(name, globals, locals, -                                      fromlist, level); +    return PyImport_ImportModuleLevelObject(name, globals, locals, +                                            fromlist, level);  }  PyDoc_STRVAR(import_doc, -"__import__(name, globals={}, locals={}, fromlist=[], level=-1) -> module\n\ +"__import__(name, globals=None, locals=None, fromlist=(), level=0) -> module\n\  \n\  Import a module. Because this function is meant for use by the Python\n\  interpreter and not for general use it is better to use\n\ @@ -206,8 +208,7 @@ empty list to emulate ``import name''.\n\  When importing a module from a package, note that __import__('A.B', ...)\n\  returns package A when fromlist is empty, but its submodule B when\n\  fromlist is not empty.  Level is used to determine whether to perform \n\ -absolute or relative imports.  -1 is the original strategy of attempting\n\ -both absolute and relative imports, 0 is absolute, a positive number\n\ +absolute or relative imports. 0 is absolute while a positive number\n\  is the number of parent directories to search relative to the current module."); @@ -436,6 +437,19 @@ filter_next(filterobject *lz)      }  } +static PyObject * +filter_reduce(filterobject *lz) +{ +    return Py_BuildValue("O(OO)", Py_TYPE(lz), lz->func, lz->it); +} + +PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); + +static PyMethodDef filter_methods[] = { +    {"__reduce__",   (PyCFunction)filter_reduce,   METH_NOARGS, reduce_doc}, +    {NULL,           NULL}           /* sentinel */ +}; +  PyDoc_STRVAR(filter_doc,  "filter(function or None, iterable) --> filter object\n\  \n\ @@ -472,7 +486,7 @@ PyTypeObject PyFilter_Type = {      0,                                  /* tp_weaklistoffset */      PyObject_SelfIter,                  /* tp_iter */      (iternextfunc)filter_next,          /* tp_iternext */ -    0,                                  /* tp_methods */ +    filter_methods,                     /* tp_methods */      0,                                  /* tp_members */      0,                                  /* tp_getset */      0,                                  /* tp_base */ @@ -516,17 +530,10 @@ builtin_chr(PyObject *self, PyObject *args)      return PyUnicode_FromOrdinal(x);  } -PyDoc_VAR(chr_doc) = PyDoc_STR( +PyDoc_STRVAR(chr_doc,  "chr(i) -> Unicode character\n\  \n\ -Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff." -) -#ifndef Py_UNICODE_WIDE -PyDoc_STR( -"\nIf 0x10000 <= i, a surrogate pair is returned." -) -#endif -; +Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.");  static char * @@ -537,8 +544,8 @@ source_as_string(PyObject *cmd, char *funcname, char *what, PyCompilerFlags *cf)      if (PyUnicode_Check(cmd)) {          cf->cf_flags |= PyCF_IGNORE_COOKIE; -        cmd = _PyUnicode_AsDefaultEncodedString(cmd, NULL); -        if (cmd == NULL) +        str = PyUnicode_AsUTF8AndSize(cmd, &size); +        if (str == NULL)              return NULL;      }      else if (!PyObject_CheckReadBuffer(cmd)) { @@ -547,9 +554,10 @@ source_as_string(PyObject *cmd, char *funcname, char *what, PyCompilerFlags *cf)            funcname, what);          return NULL;      } -    if (PyObject_AsReadBuffer(cmd, (const void **)&str, &size) < 0) { +    else if (PyObject_AsReadBuffer(cmd, (const void **)&str, &size) < 0) {          return NULL;      } +      if (strlen(str) != size) {          PyErr_SetString(PyExc_TypeError,                          "source code string cannot contain null bytes"); @@ -638,6 +646,10 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)                  PyArena_Free(arena);                  goto error;              } +            if (!PyAST_Validate(mod)) { +                PyArena_Free(arena); +                goto error; +            }              result = (PyObject*)PyAST_CompileEx(mod, filename,                                                  &cf, optimize, arena);              PyArena_Free(arena); @@ -793,7 +805,6 @@ builtin_exec(PyObject *self, PyObject *args)  {      PyObject *v;      PyObject *prog, *globals = Py_None, *locals = Py_None; -    int plain = 0;      if (!PyArg_UnpackTuple(args, "exec", 1, 3, &prog, &globals, &locals))          return NULL; @@ -802,7 +813,6 @@ builtin_exec(PyObject *self, PyObject *args)          globals = PyEval_GetGlobals();          if (locals == Py_None) {              locals = PyEval_GetLocals(); -            plain = 1;          }          if (!globals || !locals) {              PyErr_SetString(PyExc_SystemError, @@ -1058,6 +1068,31 @@ map_next(mapobject *lz)      return result;  } +static PyObject * +map_reduce(mapobject *lz) +{ +    Py_ssize_t numargs = PyTuple_GET_SIZE(lz->iters); +    PyObject *args = PyTuple_New(numargs+1); +    Py_ssize_t i; +    if (args == NULL) +        return NULL; +    Py_INCREF(lz->func); +    PyTuple_SET_ITEM(args, 0, lz->func); +    for (i = 0; i<numargs; i++){ +        PyObject *it = PyTuple_GET_ITEM(lz->iters, i); +        Py_INCREF(it); +        PyTuple_SET_ITEM(args, i+1, it); +    } + +    return Py_BuildValue("ON", Py_TYPE(lz), args); +} + +static PyMethodDef map_methods[] = { +    {"__reduce__",   (PyCFunction)map_reduce,   METH_NOARGS, reduce_doc}, +    {NULL,           NULL}           /* sentinel */ +}; + +  PyDoc_STRVAR(map_doc,  "map(func, *iterables) --> map object\n\  \n\ @@ -1094,7 +1129,7 @@ PyTypeObject PyMap_Type = {      0,                                  /* tp_weaklistoffset */      PyObject_SelfIter,                  /* tp_iter */      (iternextfunc)map_next,     /* tp_iternext */ -    0,                                  /* tp_methods */ +    map_methods,                        /* tp_methods */      0,                                  /* tp_members */      0,                                  /* tp_getset */      0,                                  /* tp_base */ @@ -1118,7 +1153,7 @@ builtin_next(PyObject *self, PyObject *args)          return NULL;      if (!PyIter_Check(it)) {          PyErr_Format(PyExc_TypeError, -            "%.200s object is not an iterator", +            "'%.200s' object is not an iterator",              it->ob_type->tp_name);          return NULL;      } @@ -1424,24 +1459,13 @@ builtin_ord(PyObject *self, PyObject* obj)          }      }      else if (PyUnicode_Check(obj)) { -        size = PyUnicode_GET_SIZE(obj); +        if (PyUnicode_READY(obj) == -1) +            return NULL; +        size = PyUnicode_GET_LENGTH(obj);          if (size == 1) { -            ord = (long)*PyUnicode_AS_UNICODE(obj); +            ord = (long)PyUnicode_READ_CHAR(obj, 0);              return PyLong_FromLong(ord);          } -#ifndef Py_UNICODE_WIDE -        if (size == 2) { -            /* Decode a valid surrogate pair */ -            int c0 = PyUnicode_AS_UNICODE(obj)[0]; -            int c1 = PyUnicode_AS_UNICODE(obj)[1]; -            if (0xD800 <= c0 && c0 <= 0xDBFF && -                0xDC00 <= c1 && c1 <= 0xDFFF) { -                ord = ((((c0 & 0x03FF) << 10) | (c1 & 0x03FF)) + -                       0x00010000); -                return PyLong_FromLong(ord); -            } -        } -#endif      }      else if (PyByteArray_Check(obj)) {          /* XXX Hopefully this is temporary */ @@ -1469,13 +1493,7 @@ PyDoc_VAR(ord_doc) = PyDoc_STR(  "ord(c) -> integer\n\  \n\  Return the integer ordinal of a one-character string." -) -#ifndef Py_UNICODE_WIDE -PyDoc_STR( -"\nA valid surrogate pair is also accepted." -) -#endif -; +);  static PyObject * @@ -1499,15 +1517,15 @@ equivalent to (x**y) % z, but may be more efficient (e.g. for longs).");  static PyObject *  builtin_print(PyObject *self, PyObject *args, PyObject *kwds)  { -    static char *kwlist[] = {"sep", "end", "file", 0}; +    static char *kwlist[] = {"sep", "end", "file", "flush", 0};      static PyObject *dummy_args; -    PyObject *sep = NULL, *end = NULL, *file = NULL; +    PyObject *sep = NULL, *end = NULL, *file = NULL, *flush = NULL;      int i, err;      if (dummy_args == NULL && !(dummy_args = PyTuple_New(0))) -            return NULL; -    if (!PyArg_ParseTupleAndKeywords(dummy_args, kwds, "|OOO:print", -                                     kwlist, &sep, &end, &file)) +        return NULL; +    if (!PyArg_ParseTupleAndKeywords(dummy_args, kwds, "|OOOO:print", +                                     kwlist, &sep, &end, &file, &flush))          return NULL;      if (file == NULL || file == Py_None) {          file = PySys_GetObject("stdout"); @@ -1558,17 +1576,32 @@ builtin_print(PyObject *self, PyObject *args, PyObject *kwds)      if (err)          return NULL; +    if (flush != NULL) { +        PyObject *tmp; +        int do_flush = PyObject_IsTrue(flush); +        if (do_flush == -1) +            return NULL; +        else if (do_flush) { +            tmp = PyObject_CallMethod(file, "flush", ""); +            if (tmp == NULL) +                return NULL; +            else +                Py_DECREF(tmp); +        } +    } +      Py_RETURN_NONE;  }  PyDoc_STRVAR(print_doc, -"print(value, ..., sep=' ', end='\\n', file=sys.stdout)\n\ +"print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n\  \n\  Prints the values to a stream, or to sys.stdout by default.\n\  Optional keyword arguments:\n\ -file: a file-like object (stream); defaults to the current sys.stdout.\n\ -sep:  string inserted between values, default a space.\n\ -end:  string appended after the last value, default a newline."); +file:  a file-like object (stream); defaults to the current sys.stdout.\n\ +sep:   string inserted between values, default a space.\n\ +end:   string appended after the last value, default a newline.\n\ +flush: whether to forcibly flush the stream.");  static PyObject * @@ -1604,7 +1637,7 @@ builtin_input(PyObject *self, PyObject *args)      }      /* First of all, flush stderr */ -    tmp = PyObject_CallMethod(ferr, "flush", ""); +    tmp = _PyObject_CallMethodId(ferr, &PyId_flush, "");      if (tmp == NULL)          PyErr_Clear();      else @@ -1613,7 +1646,7 @@ builtin_input(PyObject *self, PyObject *args)      /* We should only use (GNU) readline if Python's sys.stdin and         sys.stdout are the same as C's stdin and stdout, because we         need to pass it those. */ -    tmp = PyObject_CallMethod(fin, "fileno", ""); +    tmp = _PyObject_CallMethodId(fin, &PyId_fileno, "");      if (tmp == NULL) {          PyErr_Clear();          tty = 0; @@ -1626,7 +1659,7 @@ builtin_input(PyObject *self, PyObject *args)          tty = fd == fileno(stdin) && isatty(fd);      }      if (tty) { -        tmp = PyObject_CallMethod(fout, "fileno", ""); +        tmp = _PyObject_CallMethodId(fout, &PyId_fileno, "");          if (tmp == NULL)              PyErr_Clear();          else { @@ -1648,9 +1681,11 @@ builtin_input(PyObject *self, PyObject *args)          char *stdin_encoding_str, *stdin_errors_str;          PyObject *result;          size_t len; +        _Py_IDENTIFIER(encoding); +        _Py_IDENTIFIER(errors); -        stdin_encoding = PyObject_GetAttrString(fin, "encoding"); -        stdin_errors = PyObject_GetAttrString(fin, "errors"); +        stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding); +        stdin_errors = _PyObject_GetAttrId(fin, &PyId_errors);          if (!stdin_encoding || !stdin_errors)              /* stdin is a text stream, so it must have an                 encoding. */ @@ -1659,7 +1694,7 @@ builtin_input(PyObject *self, PyObject *args)          stdin_errors_str = _PyUnicode_AsString(stdin_errors);          if (!stdin_encoding_str || !stdin_errors_str)              goto _readline_errors; -        tmp = PyObject_CallMethod(fout, "flush", ""); +        tmp = _PyObject_CallMethodId(fout, &PyId_flush, "");          if (tmp == NULL)              PyErr_Clear();          else @@ -1668,8 +1703,8 @@ builtin_input(PyObject *self, PyObject *args)              /* We have a prompt, encode it as stdout would */              char *stdout_encoding_str, *stdout_errors_str;              PyObject *stringpo; -            stdout_encoding = PyObject_GetAttrString(fout, "encoding"); -            stdout_errors = PyObject_GetAttrString(fout, "errors"); +            stdout_encoding = _PyObject_GetAttrId(fout, &PyId_encoding); +            stdout_errors = _PyObject_GetAttrId(fout, &PyId_errors);              if (!stdout_encoding || !stdout_errors)                  goto _readline_errors;              stdout_encoding_str = _PyUnicode_AsString(stdout_encoding); @@ -1739,7 +1774,7 @@ builtin_input(PyObject *self, PyObject *args)          if (PyFile_WriteObject(promptarg, fout, Py_PRINT_RAW) != 0)              return NULL;      } -    tmp = PyObject_CallMethod(fout, "flush", ""); +    tmp = _PyObject_CallMethodId(fout, &PyId_flush, "");      if (tmp == NULL)          PyErr_Clear();      else @@ -1821,6 +1856,7 @@ builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds)      PyObject *callable;      static char *kwlist[] = {"iterable", "key", "reverse", 0};      int reverse; +    _Py_IDENTIFIER(sort);      /* args 1-3 should match listsort in Objects/listobject.c */      if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oi:sorted", @@ -1831,7 +1867,7 @@ builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds)      if (newlist == NULL)          return NULL; -    callable = PyObject_GetAttrString(newlist, "sort"); +    callable = _PyObject_GetAttrId(newlist, &PyId_sort);      if (callable == NULL) {          Py_DECREF(newlist);          return NULL; @@ -1877,7 +1913,8 @@ builtin_vars(PyObject *self, PyObject *args)              Py_INCREF(d);      }      else { -        d = PyObject_GetAttrString(v, "__dict__"); +        _Py_IDENTIFIER(__dict__); +        d = _PyObject_GetAttrId(v, &PyId___dict__);          if (d == NULL) {              PyErr_SetString(PyExc_TypeError,                  "vars() argument must have __dict__ attribute"); @@ -1921,12 +1958,18 @@ builtin_sum(PyObject *self, PyObject *args)              Py_DECREF(iter);              return NULL;          } -        if (PyByteArray_Check(result)) { +        if (PyBytes_Check(result)) {              PyErr_SetString(PyExc_TypeError,                  "sum() can't sum bytes [use b''.join(seq) instead]");              Py_DECREF(iter);              return NULL;          } +        if (PyByteArray_Check(result)) { +            PyErr_SetString(PyExc_TypeError, +                "sum() can't sum bytearray [use b''.join(seq) instead]"); +            Py_DECREF(iter); +            return NULL; +        }          Py_INCREF(result);      } @@ -2229,6 +2272,18 @@ zip_next(zipobject *lz)      return result;  } +static PyObject * +zip_reduce(zipobject *lz) +{ +    /* Just recreate the zip with the internal iterator tuple */ +    return Py_BuildValue("OO", Py_TYPE(lz), lz->ittuple); +} + +static PyMethodDef zip_methods[] = { +    {"__reduce__",   (PyCFunction)zip_reduce,   METH_NOARGS, reduce_doc}, +    {NULL,           NULL}           /* sentinel */ +}; +  PyDoc_STRVAR(zip_doc,  "zip(iter1 [,iter2 [...]]) --> zip object\n\  \n\ @@ -2267,7 +2322,7 @@ PyTypeObject PyZip_Type = {      0,                                  /* tp_weaklistoffset */      PyObject_SelfIter,                  /* tp_iter */      (iternextfunc)zip_next,     /* tp_iternext */ -    0,                                  /* tp_methods */ +    zip_methods,                        /* tp_methods */      0,                                  /* tp_members */      0,                                  /* tp_getset */      0,                                  /* tp_base */ diff --git a/Python/ceval.c b/Python/ceval.c index f0ea7c90dc..82bfcc6128 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -138,7 +138,7 @@ static void format_exc_check_arg(PyObject *, const char *, PyObject *);  static void format_exc_unbound(PyCodeObject *co, int oparg);  static PyObject * unicode_concatenate(PyObject *, PyObject *,                                        PyFrameObject *, unsigned char *); -static PyObject * special_lookup(PyObject *, char *, PyObject **); +static PyObject * special_lookup(PyObject *, _Py_Identifier *);  #define NAME_ERROR_MSG \      "name '%.200s' is not defined" @@ -372,6 +372,7 @@ PyEval_ReleaseThread(PyThreadState *tstate)  void  PyEval_ReInitThreads(void)  { +    _Py_IDENTIFIER(_after_fork);      PyObject *threading, *result;      PyThreadState *tstate = PyThreadState_GET(); @@ -392,7 +393,7 @@ PyEval_ReInitThreads(void)          PyErr_Clear();          return;      } -    result = PyObject_CallMethod(threading, "_after_fork", NULL); +    result = _PyObject_CallMethodId(threading, &PyId__after_fork, NULL);      if (result == NULL)          PyErr_WriteUnraisable(threading);      else @@ -491,7 +492,6 @@ static struct {  } pendingcalls[NPENDINGCALLS];  static int pendingfirst = 0;  static int pendinglast = 0; -static char pendingbusy = 0;  int  Py_AddPendingCall(int (*func)(void *), void *arg) @@ -538,6 +538,7 @@ Py_AddPendingCall(int (*func)(void *), void *arg)  int  Py_MakePendingCalls(void)  { +    static int busy = 0;      int i;      int r = 0; @@ -552,9 +553,9 @@ Py_MakePendingCalls(void)      if (main_thread && PyThread_get_thread_ident() != main_thread)          return 0;      /* don't perform recursive pending calls */ -    if (pendingbusy) +    if (busy)          return 0; -    pendingbusy = 1; +    busy = 1;      /* perform a bounded number of calls, in case of recursion */      for (i=0; i<NPENDINGCALLS; i++) {          int j; @@ -583,7 +584,7 @@ Py_MakePendingCalls(void)          if (r)              break;      } -    pendingbusy = 0; +    busy = 0;      return r;  } @@ -749,6 +750,9 @@ enum why_code {          WHY_SILENCED =  0x0080  /* Exception silenced by 'with' */  }; +static void save_exc_state(PyThreadState *, PyFrameObject *); +static void swap_exc_state(PyThreadState *, PyFrameObject *); +static void restore_and_clear_exc_state(PyThreadState *, PyFrameObject *);  static enum why_code do_raise(PyObject *, PyObject *);  static int unpack_iterable(PyObject *, int, int, PyObject **); @@ -817,9 +821,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)      unsigned char *first_instr;      PyObject *names;      PyObject *consts; -#if defined(Py_DEBUG) || defined(LLTRACE) -    /* Make it easier to find out where we are with a debugger */ -    char *filename; + +#ifdef LLTRACE +    _Py_IDENTIFIER(__ltrace__);  #endif  /* Computed GOTOs, or @@ -1114,59 +1118,8 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)          Py_XDECREF(traceback); \      } -#define SAVE_EXC_STATE() \ -    { \ -        PyObject *type, *value, *traceback; \ -        Py_XINCREF(tstate->exc_type); \ -        Py_XINCREF(tstate->exc_value); \ -        Py_XINCREF(tstate->exc_traceback); \ -        type = f->f_exc_type; \ -        value = f->f_exc_value; \ -        traceback = f->f_exc_traceback; \ -        f->f_exc_type = tstate->exc_type; \ -        f->f_exc_value = tstate->exc_value; \ -        f->f_exc_traceback = tstate->exc_traceback; \ -        Py_XDECREF(type); \ -        Py_XDECREF(value); \ -        Py_XDECREF(traceback); \ -    } - -#define SWAP_EXC_STATE() \ -    { \ -        PyObject *tmp; \ -        tmp = tstate->exc_type; \ -        tstate->exc_type = f->f_exc_type; \ -        f->f_exc_type = tmp; \ -        tmp = tstate->exc_value; \ -        tstate->exc_value = f->f_exc_value; \ -        f->f_exc_value = tmp; \ -        tmp = tstate->exc_traceback; \ -        tstate->exc_traceback = f->f_exc_traceback; \ -        f->f_exc_traceback = tmp; \ -    } - -#define RESTORE_AND_CLEAR_EXC_STATE() \ -    { \ -        PyObject *type, *value, *tb; \ -        type = tstate->exc_type; \ -        value = tstate->exc_value; \ -        tb = tstate->exc_traceback; \ -        tstate->exc_type = f->f_exc_type; \ -        tstate->exc_value = f->f_exc_value; \ -        tstate->exc_traceback = f->f_exc_traceback; \ -        f->f_exc_type = NULL; \ -        f->f_exc_value = NULL; \ -        f->f_exc_traceback = NULL; \ -        Py_XDECREF(type); \ -        Py_XDECREF(value); \ -        Py_XDECREF(tb); \ -    } -  /* Start of code */ -    if (f == NULL) -        return NULL; -      /* push frame */      if (Py_EnterRecursiveCall(""))          return NULL; @@ -1221,6 +1174,8 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)         f->f_lasti to -1 (i.e. the index *before* the first instruction)         and YIELD_VALUE doesn't fiddle with f_lasti any more.  So this         does work.  Promise. +       YIELD_FROM sets f_lasti to itself, in order to repeated yield +       multiple values.         When the PREDICT() macros are enabled, some opcode pairs follow in         direct succession without updating f->f_lasti.  A successful @@ -1240,27 +1195,14 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)              /* We were in an except handler when we left,                 restore the exception state which was put aside                 (see YIELD_VALUE). */ -            SWAP_EXC_STATE(); -        } -        else { -            SAVE_EXC_STATE(); +            swap_exc_state(tstate, f);          } +        else +            save_exc_state(tstate, f);      }  #ifdef LLTRACE -    lltrace = PyDict_GetItemString(f->f_globals, "__lltrace__") != NULL; -#endif -#if defined(Py_DEBUG) || defined(LLTRACE) -    { -        PyObject *error_type, *error_value, *error_traceback; -        PyErr_Fetch(&error_type, &error_value, &error_traceback); -        filename = _PyUnicode_AsString(co->co_filename); -        if (filename == NULL && tstate->overflowed) { -            /* maximum recursion depth exceeded */ -            goto exit_eval_frame; -        } -        PyErr_Restore(error_type, error_value, error_traceback); -    } +    lltrace = _PyDict_GetItemId(f->f_globals, &PyId___ltrace__) != NULL;  #endif      why = WHY_NOT; @@ -1412,8 +1354,6 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)             x to NULL, err to nonzero, or why to anything but WHY_NOT,             and that no operation that succeeds does this! */ -        /* case STOP_CODE: this is an error! */ -          TARGET(NOP)              FAST_DISPATCH(); @@ -1894,6 +1834,40 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)              why = WHY_RETURN;              goto fast_block_end; +        TARGET(YIELD_FROM) +            u = POP(); +            x = TOP(); +            /* send u to x */ +            if (PyGen_CheckExact(x)) { +                retval = _PyGen_Send((PyGenObject *)x, u); +            } else { +                _Py_IDENTIFIER(send); +                if (u == Py_None) +                    retval = Py_TYPE(x)->tp_iternext(x); +                else +                    retval = _PyObject_CallMethodId(x, &PyId_send, "O", u); +            } +            Py_DECREF(u); +            if (!retval) { +                PyObject *val; +                x = POP(); /* Remove iter from stack */ +                Py_DECREF(x); +                err = _PyGen_FetchStopIterationValue(&val); +                if (err < 0) { +                    x = NULL; +                    break; +                } +                x = val; +                PUSH(x); +                continue; +            } +            /* x remains on stack, retval is value to be yielded */ +            f->f_stacktop = stack_pointer; +            why = WHY_YIELD; +            /* and repeat... */ +            f->f_lasti--; +            goto fast_yield; +          TARGET(YIELD_VALUE)              retval = POP();              f->f_stacktop = stack_pointer; @@ -1956,16 +1930,33 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)              break;          TARGET(LOAD_BUILD_CLASS) -            x = PyDict_GetItemString(f->f_builtins, -                                     "__build_class__"); -            if (x == NULL) { -                PyErr_SetString(PyExc_ImportError, -                                "__build_class__ not found"); -                break; +        { +            _Py_IDENTIFIER(__build_class__); + +            if (PyDict_CheckExact(f->f_builtins)) { +                x = _PyDict_GetItemId(f->f_builtins, &PyId___build_class__); +                if (x == NULL) { +                    PyErr_SetString(PyExc_NameError, +                                    "__build_class__ not found"); +                    break; +                } +                Py_INCREF(x); +            } +            else { +                PyObject *build_class_str = _PyUnicode_FromId(&PyId___build_class__); +                if (build_class_str == NULL) +                    break; +                x = PyObject_GetItem(f->f_builtins, build_class_str); +                if (x == NULL) { +                    if (PyErr_ExceptionMatches(PyExc_KeyError)) +                        PyErr_SetString(PyExc_NameError, +                                        "__build_class__ not found"); +                    break; +                }              } -            Py_INCREF(x);              PUSH(x);              break; +        }          TARGET(STORE_NAME)              w = GETITEM(names, oparg); @@ -2101,70 +2092,62 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)              }              if (x == NULL) {                  x = PyDict_GetItem(f->f_globals, w); +                Py_XINCREF(x);                  if (x == NULL) { -                    x = PyDict_GetItem(f->f_builtins, w); -                    if (x == NULL) { -                        format_exc_check_arg( -                                    PyExc_NameError, -                                    NAME_ERROR_MSG, w); -                        break; +                    if (PyDict_CheckExact(f->f_builtins)) { +                        x = PyDict_GetItem(f->f_builtins, w); +                        if (x == NULL) { +                            format_exc_check_arg( +                                        PyExc_NameError, +                                        NAME_ERROR_MSG, w); +                            break; +                        } +                        Py_INCREF(x); +                    } +                    else { +                        x = PyObject_GetItem(f->f_builtins, w); +                        if (x == NULL) { +                            if (PyErr_ExceptionMatches(PyExc_KeyError)) +                                format_exc_check_arg( +                                            PyExc_NameError, +                                            NAME_ERROR_MSG, w); +                            break; +                        }                      }                  } -                Py_INCREF(x);              }              PUSH(x);              DISPATCH();          TARGET(LOAD_GLOBAL)              w = GETITEM(names, oparg); -            if (PyUnicode_CheckExact(w)) { -                /* Inline the PyDict_GetItem() calls. -                   WARNING: this is an extreme speed hack. -                   Do not try this at home. */ -                Py_hash_t hash = ((PyUnicodeObject *)w)->hash; -                if (hash != -1) { -                    PyDictObject *d; -                    PyDictEntry *e; -                    d = (PyDictObject *)(f->f_globals); -                    e = d->ma_lookup(d, w, hash); -                    if (e == NULL) { -                        x = NULL; -                        break; -                    } -                    x = e->me_value; -                    if (x != NULL) { -                        Py_INCREF(x); -                        PUSH(x); -                        DISPATCH(); -                    } -                    d = (PyDictObject *)(f->f_builtins); -                    e = d->ma_lookup(d, w, hash); -                    if (e == NULL) { -                        x = NULL; -                        break; -                    } -                    x = e->me_value; -                    if (x != NULL) { -                        Py_INCREF(x); -                        PUSH(x); -                        DISPATCH(); -                    } -                    goto load_global_error; +            if (PyDict_CheckExact(f->f_globals) +                && PyDict_CheckExact(f->f_builtins)) { +                x = _PyDict_LoadGlobal((PyDictObject *)f->f_globals, +                                       (PyDictObject *)f->f_builtins, +                                       w); +                if (x == NULL) { +                    if (!PyErr_Occurred()) +                        format_exc_check_arg(PyExc_NameError, +                                             GLOBAL_NAME_ERROR_MSG, w); +                    break;                  } +                Py_INCREF(x);              } -            /* This is the un-inlined version of the code above */ -            x = PyDict_GetItem(f->f_globals, w); -            if (x == NULL) { -                x = PyDict_GetItem(f->f_builtins, w); +            else { +                /* Slow-path if globals or builtins is not a dict */ +                x = PyObject_GetItem(f->f_globals, w);                  if (x == NULL) { -                  load_global_error: -                    format_exc_check_arg( -                                PyExc_NameError, -                                GLOBAL_NAME_ERROR_MSG, w); -                    break; +                    x = PyObject_GetItem(f->f_builtins, w); +                    if (x == NULL) { +                        if (PyErr_ExceptionMatches(PyExc_KeyError)) +                            format_exc_check_arg( +                                        PyExc_NameError, +                                        GLOBAL_NAME_ERROR_MSG, w); +                        break; +                    }                  }              } -            Py_INCREF(x);              PUSH(x);              DISPATCH(); @@ -2313,8 +2296,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)              DISPATCH();          TARGET(IMPORT_NAME) +        { +            _Py_IDENTIFIER(__import__);              w = GETITEM(names, oparg); -            x = PyDict_GetItemString(f->f_builtins, "__import__"); +            x = _PyDict_GetItemId(f->f_builtins, &PyId___import__);              if (x == NULL) {                  PyErr_SetString(PyExc_ImportError,                                  "__import__ not found"); @@ -2355,6 +2340,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)              SET_TOP(x);              if (x != NULL) DISPATCH();              break; +        }          TARGET(IMPORT_STAR)              v = POP(); @@ -2559,13 +2545,14 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)          TARGET(SETUP_WITH)          { -            static PyObject *exit, *enter; +            _Py_IDENTIFIER(__exit__); +            _Py_IDENTIFIER(__enter__);              w = TOP(); -            x = special_lookup(w, "__exit__", &exit); +            x = special_lookup(w, &PyId___exit__);              if (!x)                  break;              SET_TOP(x); -            u = special_lookup(w, "__enter__", &enter); +            u = special_lookup(w, &PyId___enter__);              Py_DECREF(w);              if (!u) {                  x = NULL; @@ -2725,7 +2712,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)                  Py_DECREF(*pfunc);                  *pfunc = self;                  na++; -                n++; +                /* n++; */              } else                  Py_INCREF(func);              sp = stack_pointer; @@ -2753,9 +2740,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)              int kwdefaults = (oparg>>8) & 0xff;              int num_annotations = (oparg >> 16) & 0x7fff; +            w = POP(); /* qualname */              v = POP(); /* code object */ -            x = PyFunction_New(v, f->f_globals); +            x = PyFunction_NewWithQualName(v, f->f_globals, w);              Py_DECREF(v); +            Py_DECREF(w);              if (x != NULL && opcode == MAKE_CLOSURE) {                  v = POP(); @@ -3049,9 +3038,9 @@ fast_yield:                  break;          if (i == f->f_iblock)              /* We did not create this exception. */ -            RESTORE_AND_CLEAR_EXC_STATE() +            restore_and_clear_exc_state(tstate, f);          else -            SWAP_EXC_STATE() +            swap_exc_state(tstate, f);      }      if (tstate->use_tracing) { @@ -3081,7 +3070,7 @@ fast_yield:                                  PyTrace_RETURN, retval)) {                  Py_XDECREF(retval);                  retval = NULL; -                why = WHY_EXCEPTION; +                /* why = WHY_EXCEPTION; */              }          }      } @@ -3094,6 +3083,156 @@ exit_eval_frame:      return retval;  } +static void +format_missing(const char *kind, PyCodeObject *co, PyObject *names) +{ +    int err; +    Py_ssize_t len = PyList_GET_SIZE(names); +    PyObject *name_str, *comma, *tail, *tmp; + +    assert(PyList_CheckExact(names)); +    assert(len >= 1); +    /* Deal with the joys of natural language. */ +    switch (len) { +    case 1: +        name_str = PyList_GET_ITEM(names, 0); +        Py_INCREF(name_str); +        break; +    case 2: +        name_str = PyUnicode_FromFormat("%U and %U", +                                        PyList_GET_ITEM(names, len - 2), +                                        PyList_GET_ITEM(names, len - 1)); +        break; +    default: +        tail = PyUnicode_FromFormat(", %U, and %U", +                                    PyList_GET_ITEM(names, len - 2), +                                    PyList_GET_ITEM(names, len - 1)); +        if (tail == NULL) +            return; +        /* Chop off the last two objects in the list. This shouldn't actually +           fail, but we can't be too careful. */ +        err = PyList_SetSlice(names, len - 2, len, NULL); +        if (err == -1) { +            Py_DECREF(tail); +            return; +        } +        /* Stitch everything up into a nice comma-separated list. */ +        comma = PyUnicode_FromString(", "); +        if (comma == NULL) { +            Py_DECREF(tail); +            return; +        } +        tmp = PyUnicode_Join(comma, names); +        Py_DECREF(comma); +        if (tmp == NULL) { +            Py_DECREF(tail); +            return; +        } +        name_str = PyUnicode_Concat(tmp, tail); +        Py_DECREF(tmp); +        Py_DECREF(tail); +        break; +    } +    if (name_str == NULL) +        return; +    PyErr_Format(PyExc_TypeError, +                 "%U() missing %i required %s argument%s: %U", +                 co->co_name, +                 len, +                 kind, +                 len == 1 ? "" : "s", +                 name_str); +    Py_DECREF(name_str); +} + +static void +missing_arguments(PyCodeObject *co, int missing, int defcount, +                  PyObject **fastlocals) +{ +    int i, j = 0; +    int start, end; +    int positional = defcount != -1; +    const char *kind = positional ? "positional" : "keyword-only"; +    PyObject *missing_names; + +    /* Compute the names of the arguments that are missing. */ +    missing_names = PyList_New(missing); +    if (missing_names == NULL) +        return; +    if (positional) { +        start = 0; +        end = co->co_argcount - defcount; +    } +    else { +        start = co->co_argcount; +        end = start + co->co_kwonlyargcount; +    } +    for (i = start; i < end; i++) { +        if (GETLOCAL(i) == NULL) { +            PyObject *raw = PyTuple_GET_ITEM(co->co_varnames, i); +            PyObject *name = PyObject_Repr(raw); +            if (name == NULL) { +                Py_DECREF(missing_names); +                return; +            } +            PyList_SET_ITEM(missing_names, j++, name); +        } +    } +    assert(j == missing); +    format_missing(kind, co, missing_names); +    Py_DECREF(missing_names); +} + +static void +too_many_positional(PyCodeObject *co, int given, int defcount, PyObject **fastlocals) +{ +    int plural; +    int kwonly_given = 0; +    int i; +    PyObject *sig, *kwonly_sig; + +    assert((co->co_flags & CO_VARARGS) == 0); +    /* Count missing keyword-only args. */ +    for (i = co->co_argcount; i < co->co_argcount + co->co_kwonlyargcount; i++) +        if (GETLOCAL(i) != NULL) +            kwonly_given++; +    if (defcount) { +        int atleast = co->co_argcount - defcount; +        plural = 1; +        sig = PyUnicode_FromFormat("from %d to %d", atleast, co->co_argcount); +    } +    else { +        plural = co->co_argcount != 1; +        sig = PyUnicode_FromFormat("%d", co->co_argcount); +    } +    if (sig == NULL) +        return; +    if (kwonly_given) { +        const char *format = " positional argument%s (and %d keyword-only argument%s)"; +        kwonly_sig = PyUnicode_FromFormat(format, given != 1 ? "s" : "", kwonly_given, +                                              kwonly_given != 1 ? "s" : ""); +        if (kwonly_sig == NULL) { +            Py_DECREF(sig); +            return; +        } +    } +    else { +        /* This will not fail. */ +        kwonly_sig = PyUnicode_FromString(""); +        assert(kwonly_sig != NULL); +    } +    PyErr_Format(PyExc_TypeError, +                 "%U() takes %U positional argument%s but %d%U %s given", +                 co->co_name, +                 sig, +                 plural ? "s" : "", +                 given, +                 kwonly_sig, +                 given == 1 && !kwonly_given ? "was" : "were"); +    Py_DECREF(sig); +    Py_DECREF(kwonly_sig); +} +  /* This is gonna seem *real weird*, but if you put some other code between     PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust     the test in the if statements in Misc/gdbinit (pystack and pystackv). */ @@ -3110,6 +3249,9 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,      PyThreadState *tstate = PyThreadState_GET();      PyObject *x, *u;      int total_args = co->co_argcount + co->co_kwonlyargcount; +    int i; +    int n = argcount; +    PyObject *kwdict = NULL;      if (globals == NULL) {          PyErr_SetString(PyExc_SystemError, @@ -3126,212 +3268,153 @@ PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals,      fastlocals = f->f_localsplus;      freevars = f->f_localsplus + co->co_nlocals; -    if (total_args || co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) { -        int i; -        int n = argcount; -        PyObject *kwdict = NULL; -        if (co->co_flags & CO_VARKEYWORDS) { -            kwdict = PyDict_New(); -            if (kwdict == NULL) -                goto fail; -            i = total_args; -            if (co->co_flags & CO_VARARGS) -                i++; -            SETLOCAL(i, kwdict); -        } -        if (argcount > co->co_argcount) { -            if (!(co->co_flags & CO_VARARGS)) { -                PyErr_Format(PyExc_TypeError, -                    "%U() takes %s %d " -                    "positional argument%s (%d given)", -                    co->co_name, -                    defcount ? "at most" : "exactly", -                    co->co_argcount, -                    co->co_argcount == 1 ? "" : "s", -                    argcount + kwcount); -                goto fail; -            } -            n = co->co_argcount; -        } -        for (i = 0; i < n; i++) { +    /* Parse arguments. */ +    if (co->co_flags & CO_VARKEYWORDS) { +        kwdict = PyDict_New(); +        if (kwdict == NULL) +            goto fail; +        i = total_args; +        if (co->co_flags & CO_VARARGS) +            i++; +        SETLOCAL(i, kwdict); +    } +    if (argcount > co->co_argcount) +        n = co->co_argcount; +    for (i = 0; i < n; i++) { +        x = args[i]; +        Py_INCREF(x); +        SETLOCAL(i, x); +    } +    if (co->co_flags & CO_VARARGS) { +        u = PyTuple_New(argcount - n); +        if (u == NULL) +            goto fail; +        SETLOCAL(total_args, u); +        for (i = n; i < argcount; i++) {              x = args[i];              Py_INCREF(x); -            SETLOCAL(i, x); +            PyTuple_SET_ITEM(u, i-n, x);          } -        if (co->co_flags & CO_VARARGS) { -            u = PyTuple_New(argcount - n); -            if (u == NULL) -                goto fail; -            SETLOCAL(total_args, u); -            for (i = n; i < argcount; i++) { -                x = args[i]; -                Py_INCREF(x); -                PyTuple_SET_ITEM(u, i-n, x); -            } +    } +    for (i = 0; i < kwcount; i++) { +        PyObject **co_varnames; +        PyObject *keyword = kws[2*i]; +        PyObject *value = kws[2*i + 1]; +        int j; +        if (keyword == NULL || !PyUnicode_Check(keyword)) { +            PyErr_Format(PyExc_TypeError, +                         "%U() keywords must be strings", +                         co->co_name); +            goto fail;          } -        for (i = 0; i < kwcount; i++) { -            PyObject **co_varnames; -            PyObject *keyword = kws[2*i]; -            PyObject *value = kws[2*i + 1]; -            int j; -            if (keyword == NULL || !PyUnicode_Check(keyword)) { -                PyErr_Format(PyExc_TypeError, -                    "%U() keywords must be strings", -                    co->co_name); -                goto fail; -            } -            /* Speed hack: do raw pointer compares. As names are -               normally interned this should almost always hit. */ -            co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item; -            for (j = 0; j < total_args; j++) { -                PyObject *nm = co_varnames[j]; -                if (nm == keyword) -                    goto kw_found; -            } -            /* Slow fallback, just in case */ -            for (j = 0; j < total_args; j++) { -                PyObject *nm = co_varnames[j]; -                int cmp = PyObject_RichCompareBool( -                    keyword, nm, Py_EQ); -                if (cmp > 0) -                    goto kw_found; -                else if (cmp < 0) -                    goto fail; -            } -            if (j >= total_args && kwdict == NULL) { -                PyErr_Format(PyExc_TypeError, -                             "%U() got an unexpected " -                             "keyword argument '%S'", -                             co->co_name, -                             keyword); +        /* Speed hack: do raw pointer compares. As names are +           normally interned this should almost always hit. */ +        co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item; +        for (j = 0; j < total_args; j++) { +            PyObject *nm = co_varnames[j]; +            if (nm == keyword) +                goto kw_found; +        } +        /* Slow fallback, just in case */ +        for (j = 0; j < total_args; j++) { +            PyObject *nm = co_varnames[j]; +            int cmp = PyObject_RichCompareBool( +                keyword, nm, Py_EQ); +            if (cmp > 0) +                goto kw_found; +            else if (cmp < 0)                  goto fail; -            } -            PyDict_SetItem(kwdict, keyword, value); -            continue; -          kw_found: -            if (GETLOCAL(j) != NULL) { -                PyErr_Format(PyExc_TypeError, +        } +        if (j >= total_args && kwdict == NULL) { +            PyErr_Format(PyExc_TypeError, +                         "%U() got an unexpected " +                         "keyword argument '%S'", +                         co->co_name, +                         keyword); +            goto fail; +        } +        PyDict_SetItem(kwdict, keyword, value); +        continue; +      kw_found: +        if (GETLOCAL(j) != NULL) { +            PyErr_Format(PyExc_TypeError,                           "%U() got multiple " -                         "values for keyword " -                         "argument '%S'", +                         "values for argument '%S'",                           co->co_name,                           keyword); -                goto fail; -            } -            Py_INCREF(value); -            SETLOCAL(j, value); +            goto fail;          } -        if (co->co_kwonlyargcount > 0) { -            for (i = co->co_argcount; i < total_args; i++) { -                PyObject *name; -                if (GETLOCAL(i) != NULL) -                    continue; -                name = PyTuple_GET_ITEM(co->co_varnames, i); -                if (kwdefs != NULL) { -                    PyObject *def = PyDict_GetItem(kwdefs, name); -                    if (def) { -                        Py_INCREF(def); -                        SETLOCAL(i, def); -                        continue; -                    } -                } -                PyErr_Format(PyExc_TypeError, -                    "%U() needs keyword-only argument %S", -                    co->co_name, name); -                goto fail; -            } +        Py_INCREF(value); +        SETLOCAL(j, value); +    } +    if (argcount > co->co_argcount && !(co->co_flags & CO_VARARGS)) { +        too_many_positional(co, argcount, defcount, fastlocals); +        goto fail; +    } +    if (argcount < co->co_argcount) { +        int m = co->co_argcount - defcount; +        int missing = 0; +        for (i = argcount; i < m; i++) +            if (GETLOCAL(i) == NULL) +                missing++; +        if (missing) { +            missing_arguments(co, missing, defcount, fastlocals); +            goto fail;          } -        if (argcount < co->co_argcount) { -            int m = co->co_argcount - defcount; -            for (i = argcount; i < m; i++) { -                if (GETLOCAL(i) == NULL) { -                    int j, given = 0; -                    for (j = 0; j < co->co_argcount; j++) -                        if (GETLOCAL(j)) -                            given++; -                    PyErr_Format(PyExc_TypeError, -                        "%U() takes %s %d " -                        "argument%s " -                        "(%d given)", -                        co->co_name, -                        ((co->co_flags & CO_VARARGS) || -                         defcount) ? "at least" -                                   : "exactly", -                             m, m == 1 ? "" : "s", given); -                    goto fail; -                } +        if (n > m) +            i = n - m; +        else +            i = 0; +        for (; i < defcount; i++) { +            if (GETLOCAL(m+i) == NULL) { +                PyObject *def = defs[i]; +                Py_INCREF(def); +                SETLOCAL(m+i, def);              } -            if (n > m) -                i = n - m; -            else -                i = 0; -            for (; i < defcount; i++) { -                if (GETLOCAL(m+i) == NULL) { -                    PyObject *def = defs[i]; +        } +    } +    if (co->co_kwonlyargcount > 0) { +        int missing = 0; +        for (i = co->co_argcount; i < total_args; i++) { +            PyObject *name; +            if (GETLOCAL(i) != NULL) +                continue; +            name = PyTuple_GET_ITEM(co->co_varnames, i); +            if (kwdefs != NULL) { +                PyObject *def = PyDict_GetItem(kwdefs, name); +                if (def) {                      Py_INCREF(def); -                    SETLOCAL(m+i, def); +                    SETLOCAL(i, def); +                    continue;                  }              } +            missing++; +        } +        if (missing) { +            missing_arguments(co, missing, -1, fastlocals); +            goto fail;          }      } -    else if (argcount > 0 || kwcount > 0) { -        PyErr_Format(PyExc_TypeError, -                     "%U() takes no arguments (%d given)", -                     co->co_name, -                     argcount + kwcount); -        goto fail; -    } +      /* Allocate and initialize storage for cell vars, and copy free -       vars into frame.  This isn't too efficient right now. */ -    if (PyTuple_GET_SIZE(co->co_cellvars)) { -        int i, j, nargs, found; -        Py_UNICODE *cellname, *argname; +       vars into frame. */ +    for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) {          PyObject *c; - -        nargs = total_args; -        if (co->co_flags & CO_VARARGS) -            nargs++; -        if (co->co_flags & CO_VARKEYWORDS) -            nargs++; - -        /* Initialize each cell var, taking into account -           cell vars that are initialized from arguments. - -           Should arrange for the compiler to put cellvars -           that are arguments at the beginning of the cellvars -           list so that we can march over it more efficiently? -        */ -        for (i = 0; i < PyTuple_GET_SIZE(co->co_cellvars); ++i) { -            cellname = PyUnicode_AS_UNICODE( -                PyTuple_GET_ITEM(co->co_cellvars, i)); -            found = 0; -            for (j = 0; j < nargs; j++) { -                argname = PyUnicode_AS_UNICODE( -                    PyTuple_GET_ITEM(co->co_varnames, j)); -                if (Py_UNICODE_strcmp(cellname, argname) == 0) { -                    c = PyCell_New(GETLOCAL(j)); -                    if (c == NULL) -                        goto fail; -                    GETLOCAL(co->co_nlocals + i) = c; -                    found = 1; -                    break; -                } -            } -            if (found == 0) { -                c = PyCell_New(NULL); -                if (c == NULL) -                    goto fail; -                SETLOCAL(co->co_nlocals + i, c); -            } -        } +        int arg; +        /* Possibly account for the cell variable being an argument. */ +        if (co->co_cell2arg != NULL && +            (arg = co->co_cell2arg[i]) != CO_CELL_NOT_AN_ARG) +            c = PyCell_New(GETLOCAL(arg)); +        else +            c = PyCell_New(NULL); +        if (c == NULL) +            goto fail; +        SETLOCAL(co->co_nlocals + i, c);      } -    if (PyTuple_GET_SIZE(co->co_freevars)) { -        int i; -        for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) { -            PyObject *o = PyTuple_GET_ITEM(closure, i); -            Py_INCREF(o); -            freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o; -        } +    for (i = 0; i < PyTuple_GET_SIZE(co->co_freevars); ++i) { +        PyObject *o = PyTuple_GET_ITEM(closure, i); +        Py_INCREF(o); +        freevars[PyTuple_GET_SIZE(co->co_cellvars) + i] = o;      }      if (co->co_flags & CO_GENERATOR) { @@ -3365,18 +3448,72 @@ fail: /* Jump here from prelude on failure */  static PyObject * -special_lookup(PyObject *o, char *meth, PyObject **cache) +special_lookup(PyObject *o, _Py_Identifier *id)  {      PyObject *res; -    res = _PyObject_LookupSpecial(o, meth, cache); +    res = _PyObject_LookupSpecial(o, id);      if (res == NULL && !PyErr_Occurred()) { -        PyErr_SetObject(PyExc_AttributeError, *cache); +        PyErr_SetObject(PyExc_AttributeError, id->object);          return NULL;      }      return res;  } +/* These 3 functions deal with the exception state of generators. */ + +static void +save_exc_state(PyThreadState *tstate, PyFrameObject *f) +{ +    PyObject *type, *value, *traceback; +    Py_XINCREF(tstate->exc_type); +    Py_XINCREF(tstate->exc_value); +    Py_XINCREF(tstate->exc_traceback); +    type = f->f_exc_type; +    value = f->f_exc_value; +    traceback = f->f_exc_traceback; +    f->f_exc_type = tstate->exc_type; +    f->f_exc_value = tstate->exc_value; +    f->f_exc_traceback = tstate->exc_traceback; +    Py_XDECREF(type); +    Py_XDECREF(value); +    Py_XDECREF(traceback); +} + +static void +swap_exc_state(PyThreadState *tstate, PyFrameObject *f) +{ +    PyObject *tmp; +    tmp = tstate->exc_type; +    tstate->exc_type = f->f_exc_type; +    f->f_exc_type = tmp; +    tmp = tstate->exc_value; +    tstate->exc_value = f->f_exc_value; +    f->f_exc_value = tmp; +    tmp = tstate->exc_traceback; +    tstate->exc_traceback = f->f_exc_traceback; +    f->f_exc_traceback = tmp; +} + +static void +restore_and_clear_exc_state(PyThreadState *tstate, PyFrameObject *f) +{ +    PyObject *type, *value, *tb; +    type = tstate->exc_type; +    value = tstate->exc_value; +    tb = tstate->exc_traceback; +    tstate->exc_type = f->f_exc_type; +    tstate->exc_value = f->f_exc_value; +    tstate->exc_traceback = f->f_exc_traceback; +    f->f_exc_type = NULL; +    f->f_exc_value = NULL; +    f->f_exc_traceback = NULL; +    Py_XDECREF(type); +    Py_XDECREF(value); +    Py_XDECREF(tb); +} + +  /* Logic for the raise statement (too complicated for inlining).     This *consumes* a reference count to each of its arguments. */  static enum why_code @@ -3446,6 +3583,10 @@ do_raise(PyObject *exc, PyObject *cause)          else if (PyExceptionInstance_Check(cause)) {              fixed_cause = cause;          } +        else if (cause == Py_None) { +            Py_DECREF(cause); +            fixed_cause = NULL; +        }          else {              PyErr_SetString(PyExc_TypeError,                              "exception causes must derive from " @@ -4192,7 +4333,7 @@ ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)                  if (PyErr_ExceptionMatches(PyExc_TypeError)) {                      PyErr_Format(PyExc_TypeError,                                   "%.200s%.200s argument after * " -                                 "must be a sequence, not %200s", +                                 "must be a sequence, not %.200s",                                   PyEval_GetFuncName(func),                                   PyEval_GetFuncDesc(func),                                   stararg->ob_type->tp_name); @@ -4342,7 +4483,9 @@ import_from(PyObject *v, PyObject *name)  static int  import_all_from(PyObject *locals, PyObject *v)  { -    PyObject *all = PyObject_GetAttrString(v, "__all__"); +    _Py_IDENTIFIER(__all__); +    _Py_IDENTIFIER(__dict__); +    PyObject *all = _PyObject_GetAttrId(v, &PyId___all__);      PyObject *dict, *name, *value;      int skip_leading_underscores = 0;      int pos, err; @@ -4351,7 +4494,7 @@ import_all_from(PyObject *locals, PyObject *v)          if (!PyErr_ExceptionMatches(PyExc_AttributeError))              return -1; /* Unexpected error */          PyErr_Clear(); -        dict = PyObject_GetAttrString(v, "__dict__"); +        dict = _PyObject_GetAttrId(v, &PyId___dict__);          if (dict == NULL) {              if (!PyErr_ExceptionMatches(PyExc_AttributeError))                  return -1; @@ -4377,7 +4520,8 @@ import_all_from(PyObject *locals, PyObject *v)          }          if (skip_leading_underscores &&              PyUnicode_Check(name) && -            PyUnicode_AS_UNICODE(name)[0] == '_') +            PyUnicode_READY(name) != -1 && +            PyUnicode_READ_CHAR(name, 0) == '_')          {              Py_DECREF(name);              continue; @@ -4437,19 +4581,9 @@ format_exc_unbound(PyCodeObject *co, int oparg)  static PyObject *  unicode_concatenate(PyObject *v, PyObject *w, -                   PyFrameObject *f, unsigned char *next_instr) +                    PyFrameObject *f, unsigned char *next_instr)  { -    /* This function implements 'variable += expr' when both arguments -       are (Unicode) strings. */ -    Py_ssize_t v_len = PyUnicode_GET_SIZE(v); -    Py_ssize_t w_len = PyUnicode_GET_SIZE(w); -    Py_ssize_t new_len = v_len + w_len; -    if (new_len < 0) { -        PyErr_SetString(PyExc_OverflowError, -                        "strings are too large to concat"); -        return NULL; -    } - +    PyObject *res;      if (Py_REFCNT(v) == 2) {          /* In the common case, there are 2 references to the value           * stored in 'variable' when the += is performed: one on the @@ -4490,31 +4624,9 @@ unicode_concatenate(PyObject *v, PyObject *w,          }          }      } - -    if (Py_REFCNT(v) == 1 && !PyUnicode_CHECK_INTERNED(v)) { -        /* Now we own the last reference to 'v', so we can resize it -         * in-place. -         */ -        if (PyUnicode_Resize(&v, new_len) != 0) { -            /* XXX if PyUnicode_Resize() fails, 'v' has been -             * deallocated so it cannot be put back into -             * 'variable'.  The MemoryError is raised when there -             * is no value in 'variable', which might (very -             * remotely) be a cause of incompatibilities. -             */ -            return NULL; -        } -        /* copy 'w' into the newly allocated area of 'v' */ -        memcpy(PyUnicode_AS_UNICODE(v) + v_len, -               PyUnicode_AS_UNICODE(w), w_len*sizeof(Py_UNICODE)); -        return v; -    } -    else { -        /* When in-place resizing is not an option. */ -        w = PyUnicode_Concat(v, w); -        Py_DECREF(v); -        return w; -    } +    res = v; +    PyUnicode_Append(&res, w); +    return res;  }  #ifdef DYNAMIC_EXECUTION_PROFILE diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index bf7a350791..2702d5cbdd 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -59,213 +59,49 @@ static unsigned long gil_interval = DEFAULT_INTERVAL;       (Note: this mechanism is enabled with FORCE_SWITCHING above)  */ -#ifndef _POSIX_THREADS -/* This means pthreads are not implemented in libc headers, hence the macro -   not present in unistd.h. But they still can be implemented as an external -   library (e.g. gnu pth in pthread emulation) */ -# ifdef HAVE_PTHREAD_H -#  include <pthread.h> /* _POSIX_THREADS */ -# endif -#endif - - -#ifdef _POSIX_THREADS - -/* - * POSIX support - */ - -#include <pthread.h> - -#define ADD_MICROSECONDS(tv, interval) \ -do { \ -    tv.tv_usec += (long) interval; \ -    tv.tv_sec += tv.tv_usec / 1000000; \ -    tv.tv_usec %= 1000000; \ -} while (0) - -/* We assume all modern POSIX systems have gettimeofday() */ -#ifdef GETTIMEOFDAY_NO_TZ -#define GETTIMEOFDAY(ptv) gettimeofday(ptv) -#else -#define GETTIMEOFDAY(ptv) gettimeofday(ptv, (struct timezone *)NULL) +#include "condvar.h" +#ifndef Py_HAVE_CONDVAR +#error You need either a POSIX-compatible or a Windows system!  #endif -#define MUTEX_T pthread_mutex_t +#define MUTEX_T PyMUTEX_T  #define MUTEX_INIT(mut) \ -    if (pthread_mutex_init(&mut, NULL)) { \ -        Py_FatalError("pthread_mutex_init(" #mut ") failed"); }; +    if (PyMUTEX_INIT(&(mut))) { \ +        Py_FatalError("PyMUTEX_INIT(" #mut ") failed"); };  #define MUTEX_FINI(mut) \ -    if (pthread_mutex_destroy(&mut)) { \ -        Py_FatalError("pthread_mutex_destroy(" #mut ") failed"); }; +    if (PyMUTEX_FINI(&(mut))) { \ +        Py_FatalError("PyMUTEX_FINI(" #mut ") failed"); };  #define MUTEX_LOCK(mut) \ -    if (pthread_mutex_lock(&mut)) { \ -        Py_FatalError("pthread_mutex_lock(" #mut ") failed"); }; +    if (PyMUTEX_LOCK(&(mut))) { \ +        Py_FatalError("PyMUTEX_LOCK(" #mut ") failed"); };  #define MUTEX_UNLOCK(mut) \ -    if (pthread_mutex_unlock(&mut)) { \ -        Py_FatalError("pthread_mutex_unlock(" #mut ") failed"); }; +    if (PyMUTEX_UNLOCK(&(mut))) { \ +        Py_FatalError("PyMUTEX_UNLOCK(" #mut ") failed"); }; -#define COND_T pthread_cond_t +#define COND_T PyCOND_T  #define COND_INIT(cond) \ -    if (pthread_cond_init(&cond, NULL)) { \ -        Py_FatalError("pthread_cond_init(" #cond ") failed"); }; +    if (PyCOND_INIT(&(cond))) { \ +        Py_FatalError("PyCOND_INIT(" #cond ") failed"); };  #define COND_FINI(cond) \ -    if (pthread_cond_destroy(&cond)) { \ -        Py_FatalError("pthread_cond_destroy(" #cond ") failed"); }; +    if (PyCOND_FINI(&(cond))) { \ +        Py_FatalError("PyCOND_FINI(" #cond ") failed"); };  #define COND_SIGNAL(cond) \ -    if (pthread_cond_signal(&cond)) { \ -        Py_FatalError("pthread_cond_signal(" #cond ") failed"); }; +    if (PyCOND_SIGNAL(&(cond))) { \ +        Py_FatalError("PyCOND_SIGNAL(" #cond ") failed"); };  #define COND_WAIT(cond, mut) \ -    if (pthread_cond_wait(&cond, &mut)) { \ -        Py_FatalError("pthread_cond_wait(" #cond ") failed"); }; +    if (PyCOND_WAIT(&(cond), &(mut))) { \ +        Py_FatalError("PyCOND_WAIT(" #cond ") failed"); };  #define COND_TIMED_WAIT(cond, mut, microseconds, timeout_result) \      { \ -        int r; \ -        struct timespec ts; \ -        struct timeval deadline; \ -        \ -        GETTIMEOFDAY(&deadline); \ -        ADD_MICROSECONDS(deadline, microseconds); \ -        ts.tv_sec = deadline.tv_sec; \ -        ts.tv_nsec = deadline.tv_usec * 1000; \ -        \ -        r = pthread_cond_timedwait(&cond, &mut, &ts); \ -        if (r == ETIMEDOUT) \ +        int r = PyCOND_TIMEDWAIT(&(cond), &(mut), (microseconds)); \ +        if (r < 0) \ +            Py_FatalError("PyCOND_WAIT(" #cond ") failed"); \ +        if (r) /* 1 == timeout, 2 == impl. can't say, so assume timeout */ \              timeout_result = 1; \ -        else if (r) \ -            Py_FatalError("pthread_cond_timedwait(" #cond ") failed"); \          else \              timeout_result = 0; \      } \ -#elif defined(NT_THREADS) - -/* - * Windows (2000 and later, as well as (hopefully) CE) support - */ - -#include <windows.h> - -#define MUTEX_T CRITICAL_SECTION -#define MUTEX_INIT(mut) do { \ -    if (!(InitializeCriticalSectionAndSpinCount(&(mut), 4000))) \ -        Py_FatalError("CreateMutex(" #mut ") failed"); \ -} while (0) -#define MUTEX_FINI(mut) \ -    DeleteCriticalSection(&(mut)) -#define MUTEX_LOCK(mut) \ -    EnterCriticalSection(&(mut)) -#define MUTEX_UNLOCK(mut) \ -    LeaveCriticalSection(&(mut)) - -/* We emulate condition variables with a semaphore. -   We use a Semaphore rather than an auto-reset event, because although -   an auto-resent event might appear to solve the lost-wakeup bug (race -   condition between releasing the outer lock and waiting) because it -   maintains state even though a wait hasn't happened, there is still -   a lost wakeup problem if more than one thread are interrupted in the -   critical place.  A semaphore solves that. -   Because it is ok to signal a condition variable with no one -   waiting, we need to keep track of the number of -   waiting threads.  Otherwise, the semaphore's state could rise -   without bound. - -   Generic emulations of the pthread_cond_* API using -   Win32 functions can be found on the Web. -   The following read can be edificating (or not): -   http://www.cse.wustl.edu/~schmidt/win32-cv-1.html -*/ -typedef struct COND_T -{ -    HANDLE sem;    /* the semaphore */ -    int n_waiting; /* how many are unreleased */ -} COND_T; - -__inline static void _cond_init(COND_T *cond) -{ -    /* A semaphore with a large max value,  The positive value -     * is only needed to catch those "lost wakeup" events and -     * race conditions when a timed wait elapses. -     */ -    if (!(cond->sem = CreateSemaphore(NULL, 0, 1000, NULL))) -        Py_FatalError("CreateSemaphore() failed"); -    cond->n_waiting = 0; -} - -__inline static void _cond_fini(COND_T *cond) -{ -    BOOL ok = CloseHandle(cond->sem); -    if (!ok) -        Py_FatalError("CloseHandle() failed"); -} - -__inline static void _cond_wait(COND_T *cond, MUTEX_T *mut) -{ -    ++cond->n_waiting; -    MUTEX_UNLOCK(*mut); -    /* "lost wakeup bug" would occur if the caller were interrupted here, -     * but we are safe because we are using a semaphore wich has an internal -     * count. -     */ -    if (WaitForSingleObject(cond->sem, INFINITE) == WAIT_FAILED) -        Py_FatalError("WaitForSingleObject() failed"); -    MUTEX_LOCK(*mut); -} - -__inline static int _cond_timed_wait(COND_T *cond, MUTEX_T *mut, -                              int us) -{ -    DWORD r; -    ++cond->n_waiting; -    MUTEX_UNLOCK(*mut); -    r = WaitForSingleObject(cond->sem, us / 1000); -    if (r == WAIT_FAILED) -        Py_FatalError("WaitForSingleObject() failed"); -    MUTEX_LOCK(*mut); -    if (r == WAIT_TIMEOUT) -        --cond->n_waiting; -        /* Here we have a benign race condition with _cond_signal.  If the -         * wait operation has timed out, but before we can acquire the -         * mutex again to decrement n_waiting, a thread holding the mutex -         * still sees a positive n_waiting value and may call -         * ReleaseSemaphore and decrement n_waiting. -         * This will cause n_waiting to be decremented twice. -         * This is benign, though, because ReleaseSemaphore will also have -         * been called, leaving the semaphore state positive.  We may -         * thus end up with semaphore in state 1, and n_waiting == -1, and -         * the next time someone calls _cond_wait(), that thread will -         * pass right through, decrementing the semaphore state and -         * incrementing n_waiting, thus correcting the extra _cond_signal. -         */ -    return r == WAIT_TIMEOUT; -} - -__inline static void _cond_signal(COND_T  *cond) { -    /* NOTE: This must be called with the mutex held */ -    if (cond->n_waiting > 0) { -        if (!ReleaseSemaphore(cond->sem, 1, NULL)) -            Py_FatalError("ReleaseSemaphore() failed"); -        --cond->n_waiting; -    } -} - -#define COND_INIT(cond) \ -    _cond_init(&(cond)) -#define COND_FINI(cond) \ -    _cond_fini(&(cond)) -#define COND_SIGNAL(cond) \ -    _cond_signal(&(cond)) -#define COND_WAIT(cond, mut) \ -    _cond_wait(&(cond), &(mut)) -#define COND_TIMED_WAIT(cond, mut, us, timeout_result) do { \ -    (timeout_result) = _cond_timed_wait(&(cond), &(mut), us); \ -} while (0) - -#else - -#error You need either a POSIX-compatible or a Windows system! - -#endif /* _POSIX_THREADS, NT_THREADS */  /* Whether the GIL is already taken (-1 if uninitialized). This is atomic @@ -313,13 +149,14 @@ static void create_gil(void)  static void destroy_gil(void)  { -    MUTEX_FINI(gil_mutex); -#ifdef FORCE_SWITCHING -    MUTEX_FINI(switch_mutex); -#endif +    /* some pthread-like implementations tie the mutex to the cond +     * and must have the cond destroyed first. +     */      COND_FINI(gil_cond); +    MUTEX_FINI(gil_mutex);  #ifdef FORCE_SWITCHING      COND_FINI(switch_cond); +    MUTEX_FINI(switch_mutex);  #endif      _Py_atomic_store_explicit(&gil_locked, -1, _Py_memory_order_release);      _Py_ANNOTATE_RWLOCK_DESTROY(&gil_locked); @@ -355,13 +192,13 @@ static void drop_gil(PyThreadState *tstate)          MUTEX_LOCK(switch_mutex);          /* Not switched yet => wait */          if (_Py_atomic_load_relaxed(&gil_last_holder) == tstate) { -	    RESET_GIL_DROP_REQUEST(); +        RESET_GIL_DROP_REQUEST();              /* NOTE: if COND_WAIT does not atomically start waiting when                 releasing the mutex, another thread can run through, take                 the GIL and drop it again, and reset the condition                 before we even had a chance to wait for it. */              COND_WAIT(switch_cond, switch_mutex); -	} +    }          MUTEX_UNLOCK(switch_mutex);      }  #endif diff --git a/Python/codecs.c b/Python/codecs.c index c7f4a9cbc1..797a45f5a1 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -11,6 +11,8 @@ Copyright (c) Corporation for National Research Initiatives.  #include "Python.h"  #include <ctype.h> +const char *Py_hexdigits = "0123456789abcdef"; +  /* --- Codec Registry ----------------------------------------------------- */  /* Import the standard encodings package which will register the first @@ -465,9 +467,11 @@ PyObject *PyCodec_LookupError(const char *name)  static void wrong_exception_type(PyObject *exc)  { -    PyObject *type = PyObject_GetAttrString(exc, "__class__"); +    _Py_IDENTIFIER(__class__); +    _Py_IDENTIFIER(__name__); +    PyObject *type = _PyObject_GetAttrId(exc, &PyId___class__);      if (type != NULL) { -        PyObject *name = PyObject_GetAttrString(type, "__name__"); +        PyObject *name = _PyObject_GetAttrId(type, &PyId___name__);          Py_DECREF(type);          if (name != NULL) {              PyErr_Format(PyExc_TypeError, @@ -506,57 +510,58 @@ PyObject *PyCodec_IgnoreErrors(PyObject *exc)          wrong_exception_type(exc);          return NULL;      } -    /* ouch: passing NULL, 0, pos gives None instead of u'' */ -    return Py_BuildValue("(u#n)", &end, 0, end); +    return Py_BuildValue("(Nn)", PyUnicode_New(0, 0), end);  }  PyObject *PyCodec_ReplaceErrors(PyObject *exc)  { -    PyObject *restuple; -    Py_ssize_t start; -    Py_ssize_t end; -    Py_ssize_t i; +    Py_ssize_t start, end, i, len;      if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {          PyObject *res; -        Py_UNICODE *p; +        int kind; +        void *data;          if (PyUnicodeEncodeError_GetStart(exc, &start))              return NULL;          if (PyUnicodeEncodeError_GetEnd(exc, &end))              return NULL; -        res = PyUnicode_FromUnicode(NULL, end-start); +        len = end - start; +        res = PyUnicode_New(len, '?');          if (res == NULL)              return NULL; -        for (p = PyUnicode_AS_UNICODE(res), i = start; -            i<end; ++p, ++i) -            *p = '?'; -        restuple = Py_BuildValue("(On)", res, end); -        Py_DECREF(res); -        return restuple; +        kind = PyUnicode_KIND(res); +        data = PyUnicode_DATA(res); +        for (i = 0; i < len; ++i) +            PyUnicode_WRITE(kind, data, i, '?'); +        assert(_PyUnicode_CheckConsistency(res, 1)); +        return Py_BuildValue("(Nn)", res, end);      }      else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) { -        Py_UNICODE res = Py_UNICODE_REPLACEMENT_CHARACTER;          if (PyUnicodeDecodeError_GetEnd(exc, &end))              return NULL; -        return Py_BuildValue("(u#n)", &res, 1, end); +        return Py_BuildValue("(Cn)", +                             (int)Py_UNICODE_REPLACEMENT_CHARACTER, +                             end);      }      else if (PyObject_IsInstance(exc, PyExc_UnicodeTranslateError)) {          PyObject *res; -        Py_UNICODE *p; +        int kind; +        void *data;          if (PyUnicodeTranslateError_GetStart(exc, &start))              return NULL;          if (PyUnicodeTranslateError_GetEnd(exc, &end))              return NULL; -        res = PyUnicode_FromUnicode(NULL, end-start); +        len = end - start; +        res = PyUnicode_New(len, Py_UNICODE_REPLACEMENT_CHARACTER);          if (res == NULL)              return NULL; -        for (p = PyUnicode_AS_UNICODE(res), i = start; -            i<end; ++p, ++i) -            *p = Py_UNICODE_REPLACEMENT_CHARACTER; -        restuple = Py_BuildValue("(On)", res, end); -        Py_DECREF(res); -        return restuple; +        kind = PyUnicode_KIND(res); +        data = PyUnicode_DATA(res); +        for (i=0; i < len; i++) +            PyUnicode_WRITE(kind, data, i, Py_UNICODE_REPLACEMENT_CHARACTER); +        assert(_PyUnicode_CheckConsistency(res, 1)); +        return Py_BuildValue("(Nn)", res, end);      }      else {          wrong_exception_type(exc); @@ -569,82 +574,72 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)      if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {          PyObject *restuple;          PyObject *object; +        Py_ssize_t i;          Py_ssize_t start;          Py_ssize_t end;          PyObject *res; -        Py_UNICODE *p; -        Py_UNICODE *startp; -        Py_UNICODE *outp; +        unsigned char *outp;          int ressize; +        Py_UCS4 ch;          if (PyUnicodeEncodeError_GetStart(exc, &start))              return NULL;          if (PyUnicodeEncodeError_GetEnd(exc, &end))              return NULL;          if (!(object = PyUnicodeEncodeError_GetObject(exc)))              return NULL; -        startp = PyUnicode_AS_UNICODE(object); -        for (p = startp+start, ressize = 0; p < startp+end; ++p) { -            if (*p<10) +        for (i = start, ressize = 0; i < end; ++i) { +            /* object is guaranteed to be "ready" */ +            ch = PyUnicode_READ_CHAR(object, i); +            if (ch<10)                  ressize += 2+1+1; -            else if (*p<100) +            else if (ch<100)                  ressize += 2+2+1; -            else if (*p<1000) +            else if (ch<1000)                  ressize += 2+3+1; -            else if (*p<10000) +            else if (ch<10000)                  ressize += 2+4+1; -#ifndef Py_UNICODE_WIDE -            else +            else if (ch<100000)                  ressize += 2+5+1; -#else -            else if (*p<100000) -                ressize += 2+5+1; -            else if (*p<1000000) +            else if (ch<1000000)                  ressize += 2+6+1;              else                  ressize += 2+7+1; -#endif          }          /* allocate replacement */ -        res = PyUnicode_FromUnicode(NULL, ressize); +        res = PyUnicode_New(ressize, 127);          if (res == NULL) {              Py_DECREF(object);              return NULL;          } +        outp = PyUnicode_1BYTE_DATA(res);          /* generate replacement */ -        for (p = startp+start, outp = PyUnicode_AS_UNICODE(res); -            p < startp+end; ++p) { -            Py_UNICODE c = *p; +        for (i = start; i < end; ++i) {              int digits;              int base; +            ch = PyUnicode_READ_CHAR(object, i);              *outp++ = '&';              *outp++ = '#'; -            if (*p<10) { +            if (ch<10) {                  digits = 1;                  base = 1;              } -            else if (*p<100) { +            else if (ch<100) {                  digits = 2;                  base = 10;              } -            else if (*p<1000) { +            else if (ch<1000) {                  digits = 3;                  base = 100;              } -            else if (*p<10000) { +            else if (ch<10000) {                  digits = 4;                  base = 1000;              } -#ifndef Py_UNICODE_WIDE -            else { +            else if (ch<100000) {                  digits = 5;                  base = 10000;              } -#else -            else if (*p<100000) { -                digits = 5; -                base = 10000; -            } -            else if (*p<1000000) { +            else if (ch<1000000) {                  digits = 6;                  base = 100000;              } @@ -652,16 +647,15 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)                  digits = 7;                  base = 1000000;              } -#endif              while (digits-->0) { -                *outp++ = '0' + c/base; -                c %= base; +                *outp++ = '0' + ch/base; +                ch %= base;                  base /= 10;              }              *outp++ = ';';          } -        restuple = Py_BuildValue("(On)", res, end); -        Py_DECREF(res); +        assert(_PyUnicode_CheckConsistency(res, 1)); +        restuple = Py_BuildValue("(Nn)", res, end);          Py_DECREF(object);          return restuple;      } @@ -671,87 +665,65 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)      }  } -static Py_UNICODE hexdigits[] = { -    '0', '1', '2', '3', '4', '5', '6', '7', -    '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' -}; -  PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)  { -#ifndef Py_UNICODE_WIDE -#define IS_SURROGATE_PAIR(p, end) \ -    (*p >= 0xD800 && *p <= 0xDBFF && (p + 1) < end && \ -     *(p + 1) >= 0xDC00 && *(p + 1) <= 0xDFFF) -#else -#define IS_SURROGATE_PAIR(p, end) 0 -#endif      if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {          PyObject *restuple;          PyObject *object; +        Py_ssize_t i;          Py_ssize_t start;          Py_ssize_t end;          PyObject *res; -        Py_UNICODE *p; -        Py_UNICODE *startp; -        Py_UNICODE *outp; +        unsigned char *outp;          int ressize; +        Py_UCS4 c;          if (PyUnicodeEncodeError_GetStart(exc, &start))              return NULL;          if (PyUnicodeEncodeError_GetEnd(exc, &end))              return NULL;          if (!(object = PyUnicodeEncodeError_GetObject(exc)))              return NULL; -        startp = PyUnicode_AS_UNICODE(object); -        for (p = startp+start, ressize = 0; p < startp+end; ++p) { -#ifdef Py_UNICODE_WIDE -            if (*p >= 0x00010000) +        for (i = start, ressize = 0; i < end; ++i) { +            /* object is guaranteed to be "ready" */ +            c = PyUnicode_READ_CHAR(object, i); +            if (c >= 0x10000) {                  ressize += 1+1+8; -            else -#endif -            if (*p >= 0x100) { -                if (IS_SURROGATE_PAIR(p, startp+end)) { -                    ressize += 1+1+8; -                    ++p; -                } -                else -                    ressize += 1+1+4; +            } +            else if (c >= 0x100) { +                ressize += 1+1+4;              }              else                  ressize += 1+1+2;          } -        res = PyUnicode_FromUnicode(NULL, ressize); +        res = PyUnicode_New(ressize, 127);          if (res==NULL)              return NULL; -        for (p = startp+start, outp = PyUnicode_AS_UNICODE(res); -            p < startp+end; ++p) { -            Py_UCS4 c = (Py_UCS4) *p; +        for (i = start, outp = PyUnicode_1BYTE_DATA(res); +            i < end; ++i) { +            c = PyUnicode_READ_CHAR(object, i);              *outp++ = '\\'; -            if (IS_SURROGATE_PAIR(p, startp+end)) { -                c = ((*p & 0x3FF) << 10) + (*(p + 1) & 0x3FF) + 0x10000; -                ++p; -            }              if (c >= 0x00010000) {                  *outp++ = 'U'; -                *outp++ = hexdigits[(c>>28)&0xf]; -                *outp++ = hexdigits[(c>>24)&0xf]; -                *outp++ = hexdigits[(c>>20)&0xf]; -                *outp++ = hexdigits[(c>>16)&0xf]; -                *outp++ = hexdigits[(c>>12)&0xf]; -                *outp++ = hexdigits[(c>>8)&0xf]; +                *outp++ = Py_hexdigits[(c>>28)&0xf]; +                *outp++ = Py_hexdigits[(c>>24)&0xf]; +                *outp++ = Py_hexdigits[(c>>20)&0xf]; +                *outp++ = Py_hexdigits[(c>>16)&0xf]; +                *outp++ = Py_hexdigits[(c>>12)&0xf]; +                *outp++ = Py_hexdigits[(c>>8)&0xf];              }              else if (c >= 0x100) {                  *outp++ = 'u'; -                *outp++ = hexdigits[(c>>12)&0xf]; -                *outp++ = hexdigits[(c>>8)&0xf]; +                *outp++ = Py_hexdigits[(c>>12)&0xf]; +                *outp++ = Py_hexdigits[(c>>8)&0xf];              }              else                  *outp++ = 'x'; -            *outp++ = hexdigits[(c>>4)&0xf]; -            *outp++ = hexdigits[c&0xf]; +            *outp++ = Py_hexdigits[(c>>4)&0xf]; +            *outp++ = Py_hexdigits[c&0xf];          } -        restuple = Py_BuildValue("(On)", res, end); -        Py_DECREF(res); +        assert(_PyUnicode_CheckConsistency(res, 1)); +        restuple = Py_BuildValue("(Nn)", res, end);          Py_DECREF(object);          return restuple;      } @@ -759,7 +731,6 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)          wrong_exception_type(exc);          return NULL;      } -#undef IS_SURROGATE_PAIR  }  /* This handler is declared static until someone demonstrates @@ -769,12 +740,11 @@ PyCodec_SurrogatePassErrors(PyObject *exc)  {      PyObject *restuple;      PyObject *object; +    Py_ssize_t i;      Py_ssize_t start;      Py_ssize_t end;      PyObject *res;      if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { -        Py_UNICODE *p; -        Py_UNICODE *startp;          char *outp;          if (PyUnicodeEncodeError_GetStart(exc, &start))              return NULL; @@ -782,15 +752,15 @@ PyCodec_SurrogatePassErrors(PyObject *exc)              return NULL;          if (!(object = PyUnicodeEncodeError_GetObject(exc)))              return NULL; -        startp = PyUnicode_AS_UNICODE(object);          res = PyBytes_FromStringAndSize(NULL, 3*(end-start));          if (!res) {              Py_DECREF(object);              return NULL;          }          outp = PyBytes_AsString(res); -        for (p = startp+start; p < startp+end; p++) { -            Py_UNICODE ch = *p; +        for (i = start; i < end; i++) { +            /* object is guaranteed to be "ready" */ +            Py_UCS4 ch = PyUnicode_READ_CHAR(object, i);              if (ch < 0xd800 || ch > 0xdfff) {                  /* Not a surrogate, fail with original exception */                  PyErr_SetObject(PyExceptionInstance_Class(exc), exc); @@ -809,7 +779,7 @@ PyCodec_SurrogatePassErrors(PyObject *exc)      }      else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) {          unsigned char *p; -        Py_UNICODE ch = 0; +        Py_UCS4 ch = 0;          if (PyUnicodeDecodeError_GetStart(exc, &start))              return NULL;          if (!(object = PyUnicodeDecodeError_GetObject(exc))) @@ -835,7 +805,10 @@ PyCodec_SurrogatePassErrors(PyObject *exc)              PyErr_SetObject(PyExceptionInstance_Class(exc), exc);              return NULL;          } -        return Py_BuildValue("(u#n)", &ch, 1, start+3); +        res = PyUnicode_FromOrdinal(ch); +        if (res == NULL) +            return NULL; +        return Py_BuildValue("(Nn)", res, start+3);      }      else {          wrong_exception_type(exc); @@ -848,12 +821,11 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)  {      PyObject *restuple;      PyObject *object; +    Py_ssize_t i;      Py_ssize_t start;      Py_ssize_t end;      PyObject *res;      if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) { -        Py_UNICODE *p; -        Py_UNICODE *startp;          char *outp;          if (PyUnicodeEncodeError_GetStart(exc, &start))              return NULL; @@ -861,15 +833,15 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)              return NULL;          if (!(object = PyUnicodeEncodeError_GetObject(exc)))              return NULL; -        startp = PyUnicode_AS_UNICODE(object);          res = PyBytes_FromStringAndSize(NULL, end-start);          if (!res) {              Py_DECREF(object);              return NULL;          }          outp = PyBytes_AsString(res); -        for (p = startp+start; p < startp+end; p++) { -            Py_UNICODE ch = *p; +        for (i = start; i < end; i++) { +            /* object is guaranteed to be "ready" */ +            Py_UCS4 ch = PyUnicode_READ_CHAR(object, i);              if (ch < 0xdc80 || ch > 0xdcff) {                  /* Not a UTF-8b surrogate, fail with original exception */                  PyErr_SetObject(PyExceptionInstance_Class(exc), exc); @@ -885,8 +857,9 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)          return restuple;      }      else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) { +        PyObject *str;          unsigned char *p; -        Py_UNICODE ch[4]; /* decode up to 4 bad bytes. */ +        Py_UCS2 ch[4]; /* decode up to 4 bad bytes. */          int consumed = 0;          if (PyUnicodeDecodeError_GetStart(exc, &start))              return NULL; @@ -911,7 +884,10 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)              PyErr_SetObject(PyExceptionInstance_Class(exc), exc);              return NULL;          } -        return Py_BuildValue("(u#n)", ch, consumed, start+consumed); +        str = PyUnicode_FromKindAndData(PyUnicode_2BYTE_KIND, ch, consumed); +        if (str == NULL) +            return NULL; +        return Py_BuildValue("(Nn)", str, start+consumed);      }      else {          wrong_exception_type(exc); @@ -1048,7 +1024,7 @@ static int _PyCodecRegistry_Init(void)      interp->codec_error_registry = PyDict_New();      if (interp->codec_error_registry) { -        for (i = 0; i < sizeof(methods)/sizeof(methods[0]); ++i) { +        for (i = 0; i < Py_ARRAY_LENGTH(methods); ++i) {              PyObject *func = PyCFunction_New(&methods[i].def, NULL);              int res;              if (!func) diff --git a/Python/compile.c b/Python/compile.c index d6f640fabb..ff55220443 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -90,6 +90,13 @@ struct fblockinfo {      basicblock *fb_block;  }; +enum { +    COMPILER_SCOPE_MODULE, +    COMPILER_SCOPE_CLASS, +    COMPILER_SCOPE_FUNCTION, +    COMPILER_SCOPE_COMPREHENSION, +}; +  /* The following items change on entry and exit of code blocks.     They must be saved and restored when returning to a block.  */ @@ -97,6 +104,9 @@ struct compiler_unit {      PySTEntryObject *u_ste;      PyObject *u_name; +    PyObject *u_qualname;  /* dot-separated qualified name (lazy) */ +    int u_scope_type; +      /* The following fields are dicts that map objects to         the index of them in co_XXX.      The index is used as         the argument for opcodes that refer to those collections. @@ -135,6 +145,7 @@ managed by compiler_enter_scope() and compiler_exit_scope().  struct compiler {      const char *c_filename; +    PyObject *c_filename_obj;      struct symtable *c_st;      PyFutureFeatures *c_future; /* pointer to module's __future__ */      PyCompilerFlags *c_flags; @@ -148,7 +159,7 @@ struct compiler {      PyArena *c_arena;            /* pointer to memory allocation arena */  }; -static int compiler_enter_scope(struct compiler *, identifier, void *, int); +static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);  static void compiler_free(struct compiler *);  static basicblock *compiler_new_block(struct compiler *);  static int compiler_next_instr(struct compiler *, basicblock *); @@ -178,12 +189,13 @@ static int compiler_in_loop(struct compiler *);  static int inplace_binop(struct compiler *, operator_ty);  static int expr_constant(struct compiler *, expr_ty); -static int compiler_with(struct compiler *, stmt_ty); +static int compiler_with(struct compiler *, stmt_ty, int);  static int compiler_call_helper(struct compiler *c, int n,                                  asdl_seq *args,                                  asdl_seq *keywords,                                  expr_ty starargs,                                  expr_ty kwargs); +static int compiler_try_except(struct compiler *, stmt_ty);  static PyCodeObject *assemble(struct compiler *, int addNone);  static PyObject *__doc__; @@ -195,16 +207,17 @@ _Py_Mangle(PyObject *privateobj, PyObject *ident)  {      /* Name mangling: __private becomes _classname__private.         This is independent from how the name is used. */ -    const Py_UNICODE *p, *name = PyUnicode_AS_UNICODE(ident); -    Py_UNICODE *buffer; -    size_t nlen, plen; +    PyObject *result; +    size_t nlen, plen, ipriv; +    Py_UCS4 maxchar;      if (privateobj == NULL || !PyUnicode_Check(privateobj) || -        name == NULL || name[0] != '_' || name[1] != '_') { +        PyUnicode_READ_CHAR(ident, 0) != '_' || +        PyUnicode_READ_CHAR(ident, 1) != '_') {          Py_INCREF(ident);          return ident;      } -    p = PyUnicode_AS_UNICODE(privateobj); -    nlen = Py_UNICODE_strlen(name); +    nlen = PyUnicode_GET_LENGTH(ident); +    plen = PyUnicode_GET_LENGTH(privateobj);      /* Don't mangle __id__ or names with dots.         The only time a name with a dot can occur is when @@ -214,32 +227,44 @@ _Py_Mangle(PyObject *privateobj, PyObject *ident)         TODO(jhylton): Decide whether we want to support         mangling of the module name, e.g. __M.X.      */ -    if ((name[nlen-1] == '_' && name[nlen-2] == '_') -        || Py_UNICODE_strchr(name, '.')) { +    if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' && +         PyUnicode_READ_CHAR(ident, nlen-2) == '_') || +        PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {          Py_INCREF(ident);          return ident; /* Don't mangle __whatever__ */      }      /* Strip leading underscores from class name */ -    while (*p == '_') -        p++; -    if (*p == 0) { +    ipriv = 0; +    while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_') +        ipriv++; +    if (ipriv == plen) {          Py_INCREF(ident);          return ident; /* Don't mangle if class is just underscores */      } -    plen = Py_UNICODE_strlen(p); +    plen -= ipriv;      assert(1 <= PY_SSIZE_T_MAX - nlen);      assert(1 + nlen <= PY_SSIZE_T_MAX - plen); -    ident = PyUnicode_FromStringAndSize(NULL, 1 + nlen + plen); -    if (!ident) +    maxchar = PyUnicode_MAX_CHAR_VALUE(ident); +    if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar) +        maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj); + +    result = PyUnicode_New(1 + nlen + plen, maxchar); +    if (!result)          return 0; -    /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */ -    buffer = PyUnicode_AS_UNICODE(ident); -    buffer[0] = '_'; -    Py_UNICODE_strncpy(buffer+1, p, plen); -    Py_UNICODE_strcpy(buffer+1+plen, name); -    return ident; +    /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */ +    PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_'); +    if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) { +        Py_DECREF(result); +        return NULL; +    } +    if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) { +        Py_DECREF(result); +        return NULL; +    } +    assert(_PyUnicode_CheckConsistency(result, 1)); +    return result;  }  static int @@ -272,6 +297,9 @@ PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags,      if (!compiler_init(&c))          return NULL;      c.c_filename = filename; +    c.c_filename_obj = PyUnicode_DecodeFSDefault(filename); +    if (!c.c_filename_obj) +        goto finally;      c.c_arena = arena;      c.c_future = PyFuture_FromAST(mod, filename);      if (c.c_future == NULL) @@ -324,6 +352,8 @@ compiler_free(struct compiler *c)          PySymtable_Free(c->c_st);      if (c->c_future)          PyObject_Free(c->c_future); +    if (c->c_filename_obj) +        Py_DECREF(c->c_filename_obj);      Py_DECREF(c->c_stack);  } @@ -458,6 +488,7 @@ compiler_unit_free(struct compiler_unit *u)      }      Py_CLEAR(u->u_ste);      Py_CLEAR(u->u_name); +    Py_CLEAR(u->u_qualname);      Py_CLEAR(u->u_consts);      Py_CLEAR(u->u_names);      Py_CLEAR(u->u_varnames); @@ -468,8 +499,8 @@ compiler_unit_free(struct compiler_unit *u)  }  static int -compiler_enter_scope(struct compiler *c, identifier name, void *key, -                     int lineno) +compiler_enter_scope(struct compiler *c, identifier name, +                     int scope_type, void *key, int lineno)  {      struct compiler_unit *u; @@ -480,6 +511,7 @@ compiler_enter_scope(struct compiler *c, identifier name, void *key,          return 0;      }      memset(u, 0, sizeof(struct compiler_unit)); +    u->u_scope_type = scope_type;      u->u_argcount = 0;      u->u_kwonlyargcount = 0;      u->u_ste = PySymtable_Lookup(c->c_st, key); @@ -567,6 +599,59 @@ compiler_exit_scope(struct compiler *c)  } +static PyObject * +compiler_scope_qualname(struct compiler *c) +{ +    Py_ssize_t stack_size, i; +    _Py_static_string(dot, "."); +    _Py_static_string(locals, "<locals>"); +    struct compiler_unit *u; +    PyObject *capsule, *name, *seq, *dot_str, *locals_str; + +    u = c->u; +    if (u->u_qualname != NULL) { +        Py_INCREF(u->u_qualname); +        return u->u_qualname; +    } + +    seq = PyList_New(0); +    if (seq == NULL) +        return NULL; + +    stack_size = PyList_GET_SIZE(c->c_stack); +    for (i = 0; i < stack_size; i++) { +        capsule = PyList_GET_ITEM(c->c_stack, i); +        u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); +        assert(u); +        if (u->u_scope_type == COMPILER_SCOPE_MODULE) +            continue; +        if (PyList_Append(seq, u->u_name)) +            goto _error; +        if (u->u_scope_type == COMPILER_SCOPE_FUNCTION) { +            locals_str = _PyUnicode_FromId(&locals); +            if (locals_str == NULL) +                goto _error; +            if (PyList_Append(seq, locals_str)) +                goto _error; +        } +    } +    u = c->u; +    if (PyList_Append(seq, u->u_name)) +        goto _error; +    dot_str = _PyUnicode_FromId(&dot); +    if (dot_str == NULL) +        goto _error; +    name = PyUnicode_Join(dot_str, seq); +    Py_DECREF(seq); +    u->u_qualname = name; +    Py_XINCREF(name); +    return name; + +_error: +    Py_XDECREF(seq); +    return NULL; +} +  /* Allocate a new block and return a pointer to it.     Returns NULL on error.  */ @@ -777,7 +862,8 @@ opcode_stack_effect(int opcode, int oparg)              return -1;          case YIELD_VALUE:              return 0; - +        case YIELD_FROM: +            return -1;          case POP_BLOCK:              return 0;          case POP_EXCEPT: @@ -863,9 +949,9 @@ opcode_stack_effect(int opcode, int oparg)          case CALL_FUNCTION_VAR_KW:              return -NARGS(oparg)-2;          case MAKE_FUNCTION: -            return -NARGS(oparg) - ((oparg >> 16) & 0xffff); +            return -1 -NARGS(oparg) - ((oparg >> 16) & 0xffff);          case MAKE_CLOSURE: -            return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff); +            return -2 - NARGS(oparg) - ((oparg >> 16) & 0xffff);  #undef NARGS          case BUILD_SLICE:              if (oparg == 3) @@ -1195,7 +1281,7 @@ compiler_mod(struct compiler *c, mod_ty mod)              return NULL;      }      /* Use 0 for firstlineno initially, will fixup in assemble(). */ -    if (!compiler_enter_scope(c, module, mod, 0)) +    if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))          return NULL;      switch (mod->kind) {      case Module_kind: @@ -1271,11 +1357,15 @@ compiler_lookup_arg(PyObject *dict, PyObject *name)  }  static int -compiler_make_closure(struct compiler *c, PyCodeObject *co, int args) +compiler_make_closure(struct compiler *c, PyCodeObject *co, int args, PyObject *qualname)  {      int i, free = PyCode_GetNumFree(co); +    if (qualname == NULL) +        qualname = co->co_name; +      if (free == 0) {          ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); +        ADDOP_O(c, LOAD_CONST, qualname, consts);          ADDOP_I(c, MAKE_FUNCTION, args);          return 1;      } @@ -1312,6 +1402,7 @@ compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)      }      ADDOP_I(c, BUILD_TUPLE, free);      ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); +    ADDOP_O(c, LOAD_CONST, qualname, consts);      ADDOP_I(c, MAKE_CLOSURE, args);      return 1;  } @@ -1457,7 +1548,7 @@ static int  compiler_function(struct compiler *c, stmt_ty s)  {      PyCodeObject *co; -    PyObject *first_const = Py_None; +    PyObject *qualname, *first_const = Py_None;      arguments_ty args = s->v.FunctionDef.args;      expr_ty returns = s->v.FunctionDef.returns;      asdl_seq* decos = s->v.FunctionDef.decorator_list; @@ -1483,7 +1574,8 @@ compiler_function(struct compiler *c, stmt_ty s)          return 0;      assert((num_annotations & 0xFFFF) == num_annotations); -    if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s, +    if (!compiler_enter_scope(c, s->v.FunctionDef.name, +                              COMPILER_SCOPE_FUNCTION, (void *)s,                                s->lineno))          return 0; @@ -1505,14 +1597,19 @@ compiler_function(struct compiler *c, stmt_ty s)          VISIT_IN_SCOPE(c, stmt, st);      }      co = assemble(c, 1); +    qualname = compiler_scope_qualname(c);      compiler_exit_scope(c); -    if (co == NULL) +    if (qualname == NULL || co == NULL) { +        Py_XDECREF(qualname); +        Py_XDECREF(co);          return 0; +    }      arglength = asdl_seq_LEN(args->defaults);      arglength |= kw_default_count << 8;      arglength |= num_annotations << 16; -    compiler_make_closure(c, co, arglength); +    compiler_make_closure(c, co, arglength, qualname); +    Py_DECREF(qualname);      Py_DECREF(co);      /* decorators */ @@ -1547,7 +1644,8 @@ compiler_class(struct compiler *c, stmt_ty s)      */      /* 1. compile the class body into a code object */ -    if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno)) +    if (!compiler_enter_scope(c, s->v.ClassDef.name, +                              COMPILER_SCOPE_CLASS, (void *)s, s->lineno))          return 0;      /* this block represents what we do in the new scope */      { @@ -1577,6 +1675,21 @@ compiler_class(struct compiler *c, stmt_ty s)              return 0;          }          Py_DECREF(str); +        /* store the __qualname__ */ +        str = compiler_scope_qualname(c); +        if (!str) { +            compiler_exit_scope(c); +            return 0; +        } +        ADDOP_O(c, LOAD_CONST, str, consts); +        Py_DECREF(str); +        str = PyUnicode_InternFromString("__qualname__"); +        if (!str || !compiler_nameop(c, str, Store)) { +            Py_XDECREF(str); +            compiler_exit_scope(c); +            return 0; +        } +        Py_DECREF(str);          /* compile the body proper */          if (!compiler_body(c, s->v.ClassDef.body)) {              compiler_exit_scope(c); @@ -1613,7 +1726,7 @@ compiler_class(struct compiler *c, stmt_ty s)      ADDOP(c, LOAD_BUILD_CLASS);      /* 3. load a function (or closure) made from the code object */ -    compiler_make_closure(c, co, 0); +    compiler_make_closure(c, co, 0, NULL);      Py_DECREF(co);      /* 4. load class name */ @@ -1664,6 +1777,7 @@ static int  compiler_lambda(struct compiler *c, expr_ty e)  {      PyCodeObject *co; +    PyObject *qualname;      static identifier name;      int kw_default_count = 0, arglength;      arguments_ty args = e->v.Lambda.args; @@ -1683,7 +1797,8 @@ compiler_lambda(struct compiler *c, expr_ty e)      }      if (args->defaults)          VISIT_SEQ(c, expr, args->defaults); -    if (!compiler_enter_scope(c, name, (void *)e, e->lineno)) +    if (!compiler_enter_scope(c, name, COMPILER_SCOPE_FUNCTION, +                              (void *)e, e->lineno))          return 0;      /* Make None the first constant, so the lambda can't have a @@ -1701,13 +1816,15 @@ compiler_lambda(struct compiler *c, expr_ty e)          ADDOP_IN_SCOPE(c, RETURN_VALUE);      }      co = assemble(c, 1); +    qualname = compiler_scope_qualname(c);      compiler_exit_scope(c); -    if (co == NULL) +    if (qualname == NULL || co == NULL)          return 0;      arglength = asdl_seq_LEN(args->defaults);      arglength |= kw_default_count << 8; -    compiler_make_closure(c, co, arglength); +    compiler_make_closure(c, co, arglength, qualname); +    Py_DECREF(qualname);      Py_DECREF(co);      return 1; @@ -1916,7 +2033,13 @@ compiler_try_finally(struct compiler *c, stmt_ty s)      compiler_use_next_block(c, body);      if (!compiler_push_fblock(c, FINALLY_TRY, body))          return 0; -    VISIT_SEQ(c, stmt, s->v.TryFinally.body); +    if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) { +        if (!compiler_try_except(c, s)) +            return 0; +    } +    else { +        VISIT_SEQ(c, stmt, s->v.Try.body); +    }      ADDOP(c, POP_BLOCK);      compiler_pop_fblock(c, FINALLY_TRY, body); @@ -1924,7 +2047,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s)      compiler_use_next_block(c, end);      if (!compiler_push_fblock(c, FINALLY_END, end))          return 0; -    VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody); +    VISIT_SEQ(c, stmt, s->v.Try.finalbody);      ADDOP(c, END_FINALLY);      compiler_pop_fblock(c, FINALLY_END, end); @@ -1978,15 +2101,15 @@ compiler_try_except(struct compiler *c, stmt_ty s)      compiler_use_next_block(c, body);      if (!compiler_push_fblock(c, EXCEPT, body))          return 0; -    VISIT_SEQ(c, stmt, s->v.TryExcept.body); +    VISIT_SEQ(c, stmt, s->v.Try.body);      ADDOP(c, POP_BLOCK);      compiler_pop_fblock(c, EXCEPT, body);      ADDOP_JREL(c, JUMP_FORWARD, orelse); -    n = asdl_seq_LEN(s->v.TryExcept.handlers); +    n = asdl_seq_LEN(s->v.Try.handlers);      compiler_use_next_block(c, except);      for (i = 0; i < n; i++) {          excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET( -            s->v.TryExcept.handlers, i); +            s->v.Try.handlers, i);          if (!handler->v.ExceptHandler.type && i < n-1)              return compiler_error(c, "default 'except:' must be last");          c->u->u_lineno_set = 0; @@ -2073,12 +2196,21 @@ compiler_try_except(struct compiler *c, stmt_ty s)      }      ADDOP(c, END_FINALLY);      compiler_use_next_block(c, orelse); -    VISIT_SEQ(c, stmt, s->v.TryExcept.orelse); +    VISIT_SEQ(c, stmt, s->v.Try.orelse);      compiler_use_next_block(c, end);      return 1;  }  static int +compiler_try(struct compiler *c, stmt_ty s) { +    if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody)) +        return compiler_try_finally(c, s); +    else +        return compiler_try_except(c, s); +} + + +static int  compiler_import_as(struct compiler *c, identifier name, identifier asname)  {      /* The IMPORT_NAME opcode was already generated.  This function @@ -2087,22 +2219,27 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)         If there is a dot in name, we need to split it and emit a         LOAD_ATTR for each name.      */ -    const Py_UNICODE *src = PyUnicode_AS_UNICODE(name); -    const Py_UNICODE *dot = Py_UNICODE_strchr(src, '.'); -    if (dot) { +    Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, +                                        PyUnicode_GET_LENGTH(name), 1); +    if (dot == -2) +        return -1; +    if (dot != -1) {          /* Consume the base module name to get the first attribute */ -        src = dot + 1; -        while (dot) { -            /* NB src is only defined when dot != NULL */ +        Py_ssize_t pos = dot + 1; +        while (dot != -1) {              PyObject *attr; -            dot = Py_UNICODE_strchr(src, '.'); -            attr = PyUnicode_FromUnicode(src, -                                dot ? dot - src : Py_UNICODE_strlen(src)); +            dot = PyUnicode_FindChar(name, '.', pos, +                                     PyUnicode_GET_LENGTH(name), 1); +            if (dot == -2) +                return -1; +            attr = PyUnicode_Substring(name, pos, +                                       (dot != -1) ? dot : +                                       PyUnicode_GET_LENGTH(name));              if (!attr)                  return -1;              ADDOP_O(c, LOAD_ATTR, attr, names);              Py_DECREF(attr); -            src = dot + 1; +            pos = dot + 1;          }      }      return compiler_nameop(c, asname, Store); @@ -2141,13 +2278,12 @@ compiler_import(struct compiler *c, stmt_ty s)          }          else {              identifier tmp = alias->name; -            const Py_UNICODE *base = PyUnicode_AS_UNICODE(alias->name); -            Py_UNICODE *dot = Py_UNICODE_strchr(base, '.'); -            if (dot) -                tmp = PyUnicode_FromUnicode(base, -                                            dot - base); +            Py_ssize_t dot = PyUnicode_FindChar( +                alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1); +            if (dot != -1) +                tmp = PyUnicode_Substring(alias->name, 0, dot);              r = compiler_nameop(c, tmp, Store); -            if (dot) { +            if (dot != -1) {                  Py_DECREF(tmp);              }              if (!r) @@ -2210,7 +2346,7 @@ compiler_from_import(struct compiler *c, stmt_ty s)          alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);          identifier store_name; -        if (i == 0 && *PyUnicode_AS_UNICODE(alias->name) == '*') { +        if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {              assert(n == 1);              ADDOP(c, IMPORT_STAR);              return 1; @@ -2325,10 +2461,8 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s)          }          ADDOP_I(c, RAISE_VARARGS, n);          break; -    case TryExcept_kind: -        return compiler_try_except(c, s); -    case TryFinally_kind: -        return compiler_try_finally(c, s); +    case Try_kind: +        return compiler_try(c, s);      case Assert_kind:          return compiler_assert(c, s);      case Import_kind: @@ -2359,7 +2493,7 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s)      case Continue_kind:          return compiler_continue(c);      case With_kind: -        return compiler_with(c, s); +        return compiler_with(c, s, 0);      }      return 1;  } @@ -2526,7 +2660,7 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)      }      /* XXX Leave assert here, but handle __doc__ and the like better */ -    assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_'); +    assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');      switch (optype) {      case OP_DEREF: @@ -2904,11 +3038,13 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,  {      PyCodeObject *co = NULL;      expr_ty outermost_iter; +    PyObject *qualname = NULL;      outermost_iter = ((comprehension_ty)                        asdl_seq_GET(generators, 0))->iter; -    if (!compiler_enter_scope(c, name, (void *)e, e->lineno)) +    if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION, +                              (void *)e, e->lineno))          goto error;      if (type != COMP_GENEXP) { @@ -2941,12 +3077,14 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,      }      co = assemble(c, 1); +    qualname = compiler_scope_qualname(c);      compiler_exit_scope(c); -    if (co == NULL) +    if (qualname == NULL || co == NULL)          goto error; -    if (!compiler_make_closure(c, co, 0)) +    if (!compiler_make_closure(c, co, 0, qualname))          goto error; +    Py_DECREF(qualname);      Py_DECREF(co);      VISIT(c, expr, outermost_iter); @@ -2956,6 +3094,7 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,  error_in_scope:      compiler_exit_scope(c);  error: +    Py_XDECREF(qualname);      Py_XDECREF(co);      return 0;  } @@ -3049,8 +3188,7 @@ expr_constant(struct compiler *c, expr_ty e)          return PyObject_IsTrue(e->v.Str.s);      case Name_kind:          /* optimize away names that can't be reassigned */ -        id = PyBytes_AS_STRING( -            _PyUnicode_AsDefaultEncodedString(e->v.Name.id, NULL)); +        id = PyUnicode_AsUTF8(e->v.Name.id);          if (strcmp(id, "True") == 0) return 1;          if (strcmp(id, "False") == 0) return 0;          if (strcmp(id, "None") == 0) return 0; @@ -3086,9 +3224,10 @@ expr_constant(struct compiler *c, expr_ty e)         exit(*exc)   */  static int -compiler_with(struct compiler *c, stmt_ty s) +compiler_with(struct compiler *c, stmt_ty s, int pos)  {      basicblock *block, *finally; +    withitem_ty item = asdl_seq_GET(s->v.With.items, pos);      assert(s->kind == With_kind); @@ -3098,7 +3237,7 @@ compiler_with(struct compiler *c, stmt_ty s)          return 0;      /* Evaluate EXPR */ -    VISIT(c, expr, s->v.With.context_expr); +    VISIT(c, expr, item->context_expr);      ADDOP_JREL(c, SETUP_WITH, finally);      /* SETUP_WITH pushes a finally block. */ @@ -3107,16 +3246,20 @@ compiler_with(struct compiler *c, stmt_ty s)          return 0;      } -    if (s->v.With.optional_vars) { -        VISIT(c, expr, s->v.With.optional_vars); +    if (item->optional_vars) { +        VISIT(c, expr, item->optional_vars);      }      else {      /* Discard result from context.__enter__() */          ADDOP(c, POP_TOP);      } -    /* BLOCK code */ -    VISIT_SEQ(c, stmt, s->v.With.body); +    pos++; +    if (pos == asdl_seq_LEN(s->v.With.items)) +        /* BLOCK code */ +        VISIT_SEQ(c, stmt, s->v.With.body) +    else if (!compiler_with(c, s, pos)) +            return 0;      /* End of try block; start the finally block */      ADDOP(c, POP_BLOCK); @@ -3193,16 +3336,27 @@ compiler_visit_expr(struct compiler *c, expr_ty e)      case DictComp_kind:          return compiler_dictcomp(c, e);      case Yield_kind: +    case YieldFrom_kind: { +        expr_ty value;          if (c->u->u_ste->ste_type != FunctionBlock)              return compiler_error(c, "'yield' outside function"); -        if (e->v.Yield.value) { -            VISIT(c, expr, e->v.Yield.value); +        value = (e->kind == YieldFrom_kind) ? e->v.YieldFrom.value : e->v.Yield.value; +        if (value) { +            VISIT(c, expr, value);          }          else {              ADDOP_O(c, LOAD_CONST, Py_None, consts);          } -        ADDOP(c, YIELD_VALUE); +        if (e->kind == YieldFrom_kind) { +            ADDOP(c, GET_ITER); +            ADDOP_O(c, LOAD_CONST, Py_None, consts); +            ADDOP(c, YIELD_FROM); +        } +        else { +            ADDOP(c, YIELD_VALUE); +        }          break; +    }      case Compare_kind:          return compiler_compare(c, e);      case Call_kind: @@ -3385,7 +3539,7 @@ compiler_in_loop(struct compiler *c) {  static int  compiler_error(struct compiler *c, const char *errstr)  { -    PyObject *loc, *filename; +    PyObject *loc;      PyObject *u = NULL, *v = NULL;      loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno); @@ -3393,16 +3547,7 @@ compiler_error(struct compiler *c, const char *errstr)          Py_INCREF(Py_None);          loc = Py_None;      } -    if (c->c_filename != NULL) { -        filename = PyUnicode_DecodeFSDefault(c->c_filename); -        if (!filename) -            goto exit; -    } -    else { -        Py_INCREF(Py_None); -        filename = Py_None; -    } -    u = Py_BuildValue("(NiiO)", filename, c->u->u_lineno, +    u = Py_BuildValue("(OiiO)", c->c_filename_obj, c->u->u_lineno,                        c->u->u_col_offset, loc);      if (!u)          goto exit; @@ -3951,7 +4096,6 @@ makecode(struct compiler *c, struct assembler *a)      PyObject *consts = NULL;      PyObject *names = NULL;      PyObject *varnames = NULL; -    PyObject *filename = NULL;      PyObject *name = NULL;      PyObject *freevars = NULL;      PyObject *cellvars = NULL; @@ -3975,10 +4119,6 @@ makecode(struct compiler *c, struct assembler *a)      freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));      if (!freevars)          goto error; -    filename = PyUnicode_DecodeFSDefault(c->c_filename); -    if (!filename) -        goto error; -      nlocals = PyDict_Size(c->u->u_varnames);      flags = compute_code_flags(c);      if (flags < 0) @@ -3998,14 +4138,13 @@ makecode(struct compiler *c, struct assembler *a)                      nlocals, stackdepth(c), flags,                      bytecode, consts, names, varnames,                      freevars, cellvars, -                    filename, c->u->u_name, +                    c->c_filename_obj, c->u->u_name,                      c->u->u_firstlineno,                      a->a_lnotab);   error:      Py_XDECREF(consts);      Py_XDECREF(names);      Py_XDECREF(varnames); -    Py_XDECREF(filename);      Py_XDECREF(name);      Py_XDECREF(freevars);      Py_XDECREF(cellvars); diff --git a/Python/condvar.h b/Python/condvar.h new file mode 100644 index 0000000000..fe6bd74da8 --- /dev/null +++ b/Python/condvar.h @@ -0,0 +1,390 @@ +/*  + * Portable condition variable support for windows and pthreads. + * Everything is inline, this header can be included where needed. + * + * APIs generally return 0 on success and non-zero on error, + * and the caller needs to use its platform's error mechanism to + * discover the error (errno, or GetLastError()) + * + * Note that some implementations cannot distinguish between a + * condition variable wait time-out and successful wait. Most often + * the difference is moot anyway since the wait condition must be + * re-checked. + * PyCOND_TIMEDWAIT, in addition to returning negative on error, + * thus returns 0 on regular success, 1 on timeout + * or 2 if it can't tell. + * + * There are at least two caveats with using these condition variables, + * due to the fact that they may be emulated with Semaphores on + * Windows: + * 1) While PyCOND_SIGNAL() will wake up at least one thread, we + *    cannot currently guarantee that it will be one of the threads + *    already waiting in a PyCOND_WAIT() call.  It _could_ cause + *    the wakeup of a subsequent thread to try a PyCOND_WAIT(), + *    including the thread doing the PyCOND_SIGNAL() itself. + *    The same applies to PyCOND_BROADCAST(), if N threads are waiting + *    then at least N threads will be woken up, but not necessarily + *    those already waiting. + *    For this reason, don't make the scheduling assumption that a + *    specific other thread will get the wakeup signal + * 2) The _mutex_ must be held when calling PyCOND_SIGNAL() and + *    PyCOND_BROADCAST(). + *    While e.g. the posix standard strongly recommends that the mutex + *    associated with the condition variable is held when a + *    pthread_cond_signal() call is made, this is not a hard requirement, + *    although scheduling will not be "reliable" if it isn't.  Here + *    the mutex is used for internal synchronization of the emulated + *    Condition Variable. + */ + +#ifndef _CONDVAR_H_ +#define _CONDVAR_H_ + +#include "Python.h" + +#ifndef _POSIX_THREADS +/* This means pthreads are not implemented in libc headers, hence the macro +   not present in unistd.h. But they still can be implemented as an external +   library (e.g. gnu pth in pthread emulation) */ +# ifdef HAVE_PTHREAD_H +#  include <pthread.h> /* _POSIX_THREADS */ +# endif +#endif + +#ifdef _POSIX_THREADS +/* + * POSIX support + */ +#define Py_HAVE_CONDVAR + +#include <pthread.h> + +#define PyCOND_ADD_MICROSECONDS(tv, interval) \ +do { \ +    tv.tv_usec += (long) interval; \ +    tv.tv_sec += tv.tv_usec / 1000000; \ +    tv.tv_usec %= 1000000; \ +} while (0) + +/* We assume all modern POSIX systems have gettimeofday() */ +#ifdef GETTIMEOFDAY_NO_TZ +#define PyCOND_GETTIMEOFDAY(ptv) gettimeofday(ptv) +#else +#define PyCOND_GETTIMEOFDAY(ptv) gettimeofday(ptv, (struct timezone *)NULL) +#endif + +/* The following functions return 0 on success, nonzero on error */ +#define PyMUTEX_T pthread_mutex_t +#define PyMUTEX_INIT(mut)       pthread_mutex_init((mut), NULL) +#define PyMUTEX_FINI(mut)       pthread_mutex_destroy(mut) +#define PyMUTEX_LOCK(mut)       pthread_mutex_lock(mut) +#define PyMUTEX_UNLOCK(mut)     pthread_mutex_unlock(mut) + +#define PyCOND_T pthread_cond_t +#define PyCOND_INIT(cond)       pthread_cond_init((cond), NULL) +#define PyCOND_FINI(cond)       pthread_cond_destroy(cond) +#define PyCOND_SIGNAL(cond)     pthread_cond_signal(cond) +#define PyCOND_BROADCAST(cond)  pthread_cond_broadcast(cond) +#define PyCOND_WAIT(cond, mut)  pthread_cond_wait((cond), (mut)) + +/* return 0 for success, 1 on timeout, -1 on error */ +Py_LOCAL_INLINE(int) +PyCOND_TIMEDWAIT(PyCOND_T *cond, PyMUTEX_T *mut, long us) +{ +    int r; +    struct timespec ts; +    struct timeval deadline; + +    PyCOND_GETTIMEOFDAY(&deadline); +    PyCOND_ADD_MICROSECONDS(deadline, us); +    ts.tv_sec = deadline.tv_sec; +    ts.tv_nsec = deadline.tv_usec * 1000; + +    r = pthread_cond_timedwait((cond), (mut), &ts); +    if (r == ETIMEDOUT) +        return 1; +    else if (r) +        return -1; +    else  +        return 0; +} + +#elif defined(NT_THREADS) +/* + * Windows (XP, 2003 server and later, as well as (hopefully) CE) support + * + * Emulated condition variables ones that work with XP and later, plus + * example native support on VISTA and onwards. + */ +#define Py_HAVE_CONDVAR + + +/* include windows if it hasn't been done before */ +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +/* options */ +/* non-emulated condition variables are provided for those that want + * to target Windows Vista.  Modify this macro to enable them. + */ +#ifndef _PY_EMULATED_WIN_CV +#define _PY_EMULATED_WIN_CV 1  /* use emulated condition variables */ +#endif + +/* fall back to emulation if not targeting Vista */ +#if !defined NTDDI_VISTA || NTDDI_VERSION < NTDDI_VISTA +#undef _PY_EMULATED_WIN_CV +#define _PY_EMULATED_WIN_CV 1 +#endif + + +#if _PY_EMULATED_WIN_CV + +/* The mutex is a CriticalSection object and +   The condition variables is emulated with the help of a semaphore. +   Semaphores are available on Windows XP (2003 server) and later. +   We use a Semaphore rather than an auto-reset event, because although +   an auto-resent event might appear to solve the lost-wakeup bug (race +   condition between releasing the outer lock and waiting) because it +   maintains state even though a wait hasn't happened, there is still +   a lost wakeup problem if more than one thread are interrupted in the +   critical place.  A semaphore solves that, because its state is counted, +   not Boolean. +   Because it is ok to signal a condition variable with no one +   waiting, we need to keep track of the number of +   waiting threads.  Otherwise, the semaphore's state could rise +   without bound.  This also helps reduce the number of "spurious wakeups" +   that would otherwise happen. + +   This implementation still has the problem that the threads woken +   with a "signal" aren't necessarily those that are already +   waiting.  It corresponds to listing 2 in: +   http://birrell.org/andrew/papers/ImplementingCVs.pdf + +   Generic emulations of the pthread_cond_* API using +   earlier Win32 functions can be found on the Web. +   The following read can be edificating (or not): +   http://www.cse.wustl.edu/~schmidt/win32-cv-1.html + +   See also  +*/ + +typedef CRITICAL_SECTION PyMUTEX_T; + +Py_LOCAL_INLINE(int) +PyMUTEX_INIT(PyMUTEX_T *cs) +{ +    InitializeCriticalSection(cs); +    return 0; +} + +Py_LOCAL_INLINE(int) +PyMUTEX_FINI(PyMUTEX_T *cs) +{ +    DeleteCriticalSection(cs); +    return 0; +} + +Py_LOCAL_INLINE(int) +PyMUTEX_LOCK(PyMUTEX_T *cs) +{ +    EnterCriticalSection(cs); +    return 0; +} + +Py_LOCAL_INLINE(int) +PyMUTEX_UNLOCK(PyMUTEX_T *cs) +{ +    LeaveCriticalSection(cs); +    return 0; +} + +/* The ConditionVariable object.  From XP onwards it is easily emulated with + * a Semaphore + */ + +typedef struct _PyCOND_T +{ +    HANDLE sem; +    int waiting; /* to allow PyCOND_SIGNAL to be a no-op */ +} PyCOND_T; + +Py_LOCAL_INLINE(int) +PyCOND_INIT(PyCOND_T *cv) +{ +    /* A semaphore with a "large" max value,  The positive value +     * is only needed to catch those "lost wakeup" events and +     * race conditions when a timed wait elapses. +     */ +    cv->sem = CreateSemaphore(NULL, 0, 100000, NULL); +    if (cv->sem==NULL) +        return -1; +    cv->waiting = 0; +    return 0; +} + +Py_LOCAL_INLINE(int) +PyCOND_FINI(PyCOND_T *cv) +{ +    return CloseHandle(cv->sem) ? 0 : -1; +} + +/* this implementation can detect a timeout.  Returns 1 on timeout, + * 0 otherwise (and -1 on error) + */ +Py_LOCAL_INLINE(int) +_PyCOND_WAIT_MS(PyCOND_T *cv, PyMUTEX_T *cs, DWORD ms) +{ +    DWORD wait; +    cv->waiting++; +    PyMUTEX_UNLOCK(cs); +    /* "lost wakeup bug" would occur if the caller were interrupted here, +     * but we are safe because we are using a semaphore wich has an internal +     * count. +     */ +    wait = WaitForSingleObject(cv->sem, ms); +    PyMUTEX_LOCK(cs); +    if (wait != WAIT_OBJECT_0) +        --cv->waiting; +        /* Here we have a benign race condition with PyCOND_SIGNAL. +         * When failure occurs or timeout, it is possible that +         * PyCOND_SIGNAL also decrements this value +         * and signals releases the mutex.  This is benign because it +         * just means an extra spurious wakeup for a waiting thread. +         * ('waiting' corresponds to the semaphore's "negative" count and +         * we may end up with e.g. (waiting == -1 && sem.count == 1).  When +         * a new thread comes along, it will pass right throuhgh, having +         * adjusted it to (waiting == 0 && sem.count == 0). +         */ +          +    if (wait == WAIT_FAILED) +        return -1; +    /* return 0 on success, 1 on timeout */ +    return wait != WAIT_OBJECT_0; +} + +Py_LOCAL_INLINE(int) +PyCOND_WAIT(PyCOND_T *cv, PyMUTEX_T *cs) +{ +    int result = _PyCOND_WAIT_MS(cv, cs, INFINITE); +    return result >= 0 ? 0 : result; +} + +Py_LOCAL_INLINE(int) +PyCOND_TIMEDWAIT(PyCOND_T *cv, PyMUTEX_T *cs, long us) +{ +    return _PyCOND_WAIT_MS(cv, cs, us/1000); +} + +Py_LOCAL_INLINE(int) +PyCOND_SIGNAL(PyCOND_T *cv) +{ +    /* this test allows PyCOND_SIGNAL to be a no-op unless required +     * to wake someone up, thus preventing an unbounded increase of +     * the semaphore's internal counter. +     */ +    if (cv->waiting > 0) { +        /* notifying thread decreases the cv->waiting count so that +         * a delay between notify and actual wakeup of the target thread +         * doesn't cause a number of extra ReleaseSemaphore calls. +         */ +        cv->waiting--; +        return ReleaseSemaphore(cv->sem, 1, NULL) ? 0 : -1; +    } +    return 0; +} + +Py_LOCAL_INLINE(int) +PyCOND_BROADCAST(PyCOND_T *cv) +{ +    if (cv->waiting > 0) { +        return ReleaseSemaphore(cv->sem, cv->waiting, NULL) ? 0 : -1; +		cv->waiting = 0; +    } +    return 0; +} + +#else + +/* Use native Win7 primitives if build target is Win7 or higher */ + +/* SRWLOCK is faster and better than CriticalSection */ +typedef SRWLOCK PyMUTEX_T; + +Py_LOCAL_INLINE(int) +PyMUTEX_INIT(PyMUTEX_T *cs) +{ +    InitializeSRWLock(cs); +    return 0; +} + +Py_LOCAL_INLINE(int) +PyMUTEX_FINI(PyMUTEX_T *cs) +{ +    return 0; +} + +Py_LOCAL_INLINE(int) +PyMUTEX_LOCK(PyMUTEX_T *cs) +{ +    AcquireSRWLockExclusive(cs); +    return 0; +} + +Py_LOCAL_INLINE(int) +PyMUTEX_UNLOCK(PyMUTEX_T *cs) +{ +    ReleaseSRWLockExclusive(cs); +    return 0; +} + + +typedef CONDITION_VARIABLE  PyCOND_T; + +Py_LOCAL_INLINE(int) +PyCOND_INIT(PyCOND_T *cv) +{ +    InitializeConditionVariable(cv); +    return 0; +} +Py_LOCAL_INLINE(int) +PyCOND_FINI(PyCOND_T *cv) +{ +    return 0; +} + +Py_LOCAL_INLINE(int) +PyCOND_WAIT(PyCOND_T *cv, PyMUTEX_T *cs) +{ +    return SleepConditionVariableSRW(cv, cs, INFINITE, 0) ? 0 : -1; +} + +/* This implementation makes no distinction about timeouts.  Signal + * 2 to indicate that we don't know. + */ +Py_LOCAL_INLINE(int) +PyCOND_TIMEDWAIT(PyCOND_T *cv, PyMUTEX_T *cs, long us) +{ +    return SleepConditionVariableSRW(cv, cs, us/1000, 0) ? 2 : -1; +} + +Py_LOCAL_INLINE(int) +PyCOND_SIGNAL(PyCOND_T *cv) +{ +     WakeConditionVariable(cv); +     return 0; +} + +Py_LOCAL_INLINE(int) +PyCOND_BROADCAST(PyCOND_T *cv) +{ +     WakeAllConditionVariable(cv); +     return 0; +} + + +#endif /* _PY_EMULATED_WIN_CV */ + +#endif /* _POSIX_THREADS, NT_THREADS */ + +#endif /* _CONDVAR_H_ */ diff --git a/Python/dtoa.c b/Python/dtoa.c index 44dc01f1d5..83861ace18 100644 --- a/Python/dtoa.c +++ b/Python/dtoa.c @@ -265,6 +265,16 @@ typedef union { double d; ULong L[2]; } U;  #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))  #define Big1 0xffffffff +/* Standard NaN used by _Py_dg_stdnan. */ + +#define NAN_WORD0 0x7ff80000 +#define NAN_WORD1 0 + +/* Bits of the representation of positive infinity. */ + +#define POSINF_WORD0 0x7ff00000 +#define POSINF_WORD1 0 +  /* struct BCinfo is used to pass information from _Py_dg_strtod to bigcomp */  typedef struct BCinfo BCinfo; @@ -1486,6 +1496,36 @@ bigcomp(U *rv, const char *s0, BCinfo *bc)      return 0;  } +/* Return a 'standard' NaN value. + +   There are exactly two quiet NaNs that don't arise by 'quieting' signaling +   NaNs (see IEEE 754-2008, section 6.2.1).  If sign == 0, return the one whose +   sign bit is cleared.  Otherwise, return the one whose sign bit is set. +*/ + +double +_Py_dg_stdnan(int sign) +{ +    U rv; +    word0(&rv) = NAN_WORD0; +    word1(&rv) = NAN_WORD1; +    if (sign) +        word0(&rv) |= Sign_bit; +    return dval(&rv); +} + +/* Return positive or negative infinity, according to the given sign (0 for + * positive infinity, 1 for negative infinity). */ + +double +_Py_dg_infinity(int sign) +{ +    U rv; +    word0(&rv) = POSINF_WORD0; +    word1(&rv) = POSINF_WORD1; +    return sign ? -dval(&rv) : dval(&rv); +} +  double  _Py_dg_strtod(const char *s00, char **se)  { @@ -1886,20 +1926,20 @@ _Py_dg_strtod(const char *s00, char **se)          bd2++;          /* At this stage bd5 - bb5 == e == bd2 - bb2 + bbe, bb2 - bs2 == 1, -	   and bs == 1, so: +           and bs == 1, so:                tdv == bd * 10**e = bd * 2**(bbe - bb2 + bd2) * 5**(bd5 - bb5)                srv == bb * 2**bbe = bb * 2**(bbe - bb2 + bb2) -	      0.5 ulp(srv) == 2**(bbe-1) = bs * 2**(bbe - bb2 + bs2) +              0.5 ulp(srv) == 2**(bbe-1) = bs * 2**(bbe - bb2 + bs2) -	   It follows that: +           It follows that:                M * tdv = bd * 2**bd2 * 5**bd5                M * srv = bb * 2**bb2 * 5**bb5                M * 0.5 ulp(srv) = bs * 2**bs2 * 5**bb5 -	   for some constant M.  (Actually, M == 2**(bb2 - bbe) * 5**bb5, but -	   this fact is not needed below.) +           for some constant M.  (Actually, M == 2**(bb2 - bbe) * 5**bb5, but +           this fact is not needed below.)          */          /* Remove factor of 2**i, where i = min(bb2, bd2, bs2). */ @@ -2055,7 +2095,7 @@ _Py_dg_strtod(const char *s00, char **se)                          + Exp_msk1                          ;                      word1(&rv) = 0; -                    dsign = 0; +                    /* dsign = 0; */                      break;                  }              } @@ -2092,7 +2132,7 @@ _Py_dg_strtod(const char *s00, char **se)                      goto undfl;                  }              } -            dsign = 1 - dsign; +            /* dsign = 1 - dsign; */              break;          }          if ((aadj = ratio(delta, bs)) <= 2.) { diff --git a/Python/dynload_aix.c b/Python/dynload_aix.c index 149990d799..b4f71f291a 100644 --- a/Python/dynload_aix.c +++ b/Python/dynload_aix.c @@ -26,11 +26,7 @@ typedef struct Module {      void          *entry;  } Module, *ModulePtr; -const struct filedescr _PyImport_DynLoadFiletab[] = { -    {".so", "rb", C_EXTENSION}, -    {"module.so", "rb", C_EXTENSION}, -    {0, 0} -}; +const char *_PyImport_DynLoadFiletab[] = {".so", NULL};  static int  aix_getoldmodules(void **modlistptr) @@ -109,6 +105,8 @@ aix_loaderror(const char *pathname)  {      char *message[1024], errbuf[1024]; +    PyObject *pathname_ob = NULL; +    PyObject *errbuf_ob = NULL;      register int i,j;      struct errtab { @@ -129,7 +127,6 @@ aix_loaderror(const char *pathname)          {L_ERROR_ERRNO,                 NULL}      }; -#define LOAD_ERRTAB_LEN (sizeof(load_errtab)/sizeof(load_errtab[0]))  #define ERRBUF_APPEND(s) strncat(errbuf, s, sizeof(errbuf)-strlen(errbuf)-1)      PyOS_snprintf(errbuf, sizeof(errbuf), "from module %.200s ", pathname); @@ -140,7 +137,7 @@ aix_loaderror(const char *pathname)      }      for(i = 0; message[i] && *message[i]; i++) {          int nerr = atoi(message[i]); -        for (j=0; j<LOAD_ERRTAB_LEN ; j++) { +        for (j=0; j < Py_ARRAY_LENGTH(load_errtab); j++) {              if (nerr == load_errtab[j].errNo && load_errtab[j].errstr)              ERRBUF_APPEND(load_errtab[j].errstr);          } @@ -149,12 +146,16 @@ aix_loaderror(const char *pathname)          ERRBUF_APPEND("\n");      }      errbuf[strlen(errbuf)-1] = '\0';            /* trim off last newline */ -    PyErr_SetString(PyExc_ImportError, errbuf); +    pathname_ob = PyUnicode_FromString(pathname); +    errbuf_ob = PyUnicode_FromString(errbuf); +    PyErr_SetImportError(errbuf_ob, NULL, pathname); +    Py_DECREF(pathname_ob); +    Py_DECREF(errbuf_ob);      return;  } -dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,                                      const char *pathname, FILE *fp)  {      dl_funcptr p; diff --git a/Python/dynload_dl.c b/Python/dynload_dl.c index 2606e1e32f..5836cb3b29 100644 --- a/Python/dynload_dl.c +++ b/Python/dynload_dl.c @@ -9,18 +9,14 @@  extern char *Py_GetProgramName(void); -const struct filedescr _PyImport_DynLoadFiletab[] = { -	{".o", "rb", C_EXTENSION}, -	{"module.o", "rb", C_EXTENSION}, -	{0, 0} -}; +const char *_PyImport_DynLoadFiletab[] = {".o", NULL}; -dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, -				    const char *pathname, FILE *fp) +dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname, +                                    const char *pathname, FILE *fp)  { -	char funcname[258]; +    char funcname[258]; -	PyOS_snprintf(funcname, sizeof(funcname), "PyInit_%.200s", shortname); -	return dl_loadmod(Py_GetProgramName(), pathname, funcname); +    PyOS_snprintf(funcname, sizeof(funcname), "PyInit_%.200s", shortname); +    return dl_loadmod(Py_GetProgramName(), pathname, funcname);  } diff --git a/Python/dynload_hpux.c b/Python/dynload_hpux.c index 18a81377f2..c9554148cc 100644 --- a/Python/dynload_hpux.c +++ b/Python/dynload_hpux.c @@ -13,13 +13,9 @@  #define FUNCNAME_PATTERN "PyInit_%.200s"  #endif -const struct filedescr _PyImport_DynLoadFiletab[] = { -    {SHLIB_EXT, "rb", C_EXTENSION}, -    {"module"SHLIB_EXT, "rb", C_EXTENSION}, -    {0, 0} -}; +const char *_PyImport_DynLoadFiletab[] = {SHLIB_EXT, NULL}; -dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,                                      const char *pathname, FILE *fp)  {      dl_funcptr p; @@ -37,11 +33,21 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,      /* XXX Chuck Blake once wrote that 0 should be BIND_NOSTART? */      if (lib == NULL) {          char buf[256]; +        PyObject *pathname_ob = NULL; +        PyObject *buf_ob = NULL; +        PyObject *shortname_ob = NULL; +          if (Py_VerboseFlag)              perror(pathname);          PyOS_snprintf(buf, sizeof(buf), "Failed to load %.200s",                        pathname); -        PyErr_SetString(PyExc_ImportError, buf); +        buf_ob = PyUnicode_FromString(buf); +        shortname_ob = PyUnicode_FromString(shortname); +        pathname_ob = PyUnicode_FromString(pathname); +        PyErr_SetImportError(buf_ob, shortname_ob, pathname_ob); +        Py_DECREF(buf_ob); +        Py_DECREF(shortname_ob); +        Py_DECREF(pathname_ob);          return NULL;      }      PyOS_snprintf(funcname, sizeof(funcname), FUNCNAME_PATTERN, shortname); diff --git a/Python/dynload_next.c b/Python/dynload_next.c index cabf9b9663..85c95b41bb 100644 --- a/Python/dynload_next.c +++ b/Python/dynload_next.c @@ -8,11 +8,7 @@  #include <mach-o/dyld.h> -const struct filedescr _PyImport_DynLoadFiletab[] = { -    {".so", "rb", C_EXTENSION}, -    {"module.so", "rb", C_EXTENSION}, -    {0, 0} -}; +const char *_PyImport_DynLoadFiletab[] = {".so", NULL};  /*  ** Python modules are Mach-O MH_BUNDLE files. The best way to load these @@ -31,8 +27,8 @@ const struct filedescr _PyImport_DynLoadFiletab[] = {  #define LINKOPTIONS NSLINKMODULE_OPTION_BINDNOW| \      NSLINKMODULE_OPTION_RETURN_ON_ERROR|NSLINKMODULE_OPTION_PRIVATE  #endif -dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, -                                        const char *pathname, FILE *fp) +dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname, +                                    const char *pathname, FILE *fp)  {      dl_funcptr p = NULL;      char funcname[258]; diff --git a/Python/dynload_os2.c b/Python/dynload_os2.c index 101c024bbe..0e1b907b8c 100644 --- a/Python/dynload_os2.c +++ b/Python/dynload_os2.c @@ -9,13 +9,9 @@  #include "importdl.h" -const struct filedescr _PyImport_DynLoadFiletab[] = { -    {".pyd", "rb", C_EXTENSION}, -    {".dll", "rb", C_EXTENSION}, -    {0, 0} -}; +const char *_PyImport_DynLoadFiletab[] = {".pyd", ".dll", NULL}; -dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,                                      const char *pathname, FILE *fp)  {      dl_funcptr p; diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c index 7ea510e862..0ca65c7877 100644 --- a/Python/dynload_shlib.c +++ b/Python/dynload_shlib.c @@ -36,31 +36,25 @@     live in the same directory.  E.g. foomodule.cpython-32.so  */ -const struct filedescr _PyImport_DynLoadFiletab[] = { +const char *_PyImport_DynLoadFiletab[] = {  #ifdef __CYGWIN__ -    {".dll", "rb", C_EXTENSION}, -    {"module.dll", "rb", C_EXTENSION}, +    ".dll",  #else  /* !__CYGWIN__ */  #if defined(PYOS_OS2) && defined(PYCC_GCC) -    {".pyd", "rb", C_EXTENSION}, -    {".dll", "rb", C_EXTENSION}, +    ".pyd", +    ".dll",  #else  /* !(defined(PYOS_OS2) && defined(PYCC_GCC)) */  #ifdef __VMS -    {".exe", "rb", C_EXTENSION}, -    {".EXE", "rb", C_EXTENSION}, -    {"module.exe", "rb", C_EXTENSION}, -    {"MODULE.EXE", "rb", C_EXTENSION}, +    ".exe", +    ".EXE",  #else  /* !__VMS */ -    {"." SOABI ".so", "rb", C_EXTENSION}, -    {"module." SOABI ".so", "rb", C_EXTENSION}, -    {".abi" PYTHON_ABI_STRING ".so", "rb", C_EXTENSION}, -    {"module.abi" PYTHON_ABI_STRING ".so", "rb", C_EXTENSION}, -    {".so", "rb", C_EXTENSION}, -    {"module.so", "rb", C_EXTENSION}, +    "." SOABI ".so", +    ".abi" PYTHON_ABI_STRING ".so", +    ".so",  #endif  /* __VMS */  #endif  /* defined(PYOS_OS2) && defined(PYCC_GCC) */  #endif  /* __CYGWIN__ */ -    {0, 0} +    NULL,  };  static struct { @@ -75,7 +69,7 @@ static struct {  static int nhandles = 0; -dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, +dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,                                      const char *pathname, FILE *fp)  {      dl_funcptr p; @@ -121,10 +115,6 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,      dlopenflags = PyThreadState_GET()->interp->dlopenflags;  #endif -    if (Py_VerboseFlag) -        PySys_WriteStderr("dlopen(\"%s\", %x);\n", pathname, -                          dlopenflags); -  #ifdef __VMS      /* VMS currently don't allow a pathname, use a logical name instead */      /* Concatenate 'python_module_' and shortname */ @@ -139,10 +129,19 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,      handle = dlopen(pathname, dlopenflags);      if (handle == NULL) { +        PyObject *mod_name = NULL; +        PyObject *path = NULL; +        PyObject *error_ob = NULL;          const char *error = dlerror();          if (error == NULL)              error = "unknown dlopen() error"; -        PyErr_SetString(PyExc_ImportError, error); +        error_ob = PyUnicode_FromString(error); +        path = PyUnicode_FromString(pathname); +        mod_name = PyUnicode_FromString(shortname); +        PyErr_SetImportError(error_ob, mod_name, path); +        Py_XDECREF(error_ob); +        Py_XDECREF(path); +        Py_XDECREF(mod_name);          return NULL;      }      if (fp != NULL && nhandles < 128) diff --git a/Python/dynload_stub.c b/Python/dynload_stub.c index 69f8b450b3..59160483ca 100644 --- a/Python/dynload_stub.c +++ b/Python/dynload_stub.c @@ -6,6 +6,4 @@  #include "importdl.h" -const struct filedescr _PyImport_DynLoadFiletab[] = { -	{0, 0} -}; +const char *_PyImport_DynLoadFiletab[] = {NULL}; diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 73a1dcf897..25b6680b3b 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -12,16 +12,18 @@  #include <windows.h>  // "activation context" magic - see dl_nt.c... +#if HAVE_SXS  extern ULONG_PTR _Py_ActivateActCtx();  void _Py_DeactivateActCtx(ULONG_PTR cookie); +#endif -const struct filedescr _PyImport_DynLoadFiletab[] = { +const char *_PyImport_DynLoadFiletab[] = {  #ifdef _DEBUG -    {"_d.pyd", "rb", C_EXTENSION}, +    "_d.pyd",  #else -    {".pyd", "rb", C_EXTENSION}, +    ".pyd",  #endif -    {0, 0} +    NULL  }; @@ -171,43 +173,44 @@ static char *GetPythonImport (HINSTANCE hModule)      return NULL;  } -dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, -                                    const char *pathname, FILE *fp) +dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname, +                                       PyObject *pathname, FILE *fp)  {      dl_funcptr p;      char funcname[258], *import_python; +    wchar_t *wpathname;  #ifndef _DEBUG      _Py_CheckPython3();  #endif +    wpathname = PyUnicode_AsUnicode(pathname); +    if (wpathname == NULL) +        return NULL; +      PyOS_snprintf(funcname, sizeof(funcname), "PyInit_%.200s", shortname);      {          HINSTANCE hDLL = NULL; -        char pathbuf[260]; -        LPTSTR dummy;          unsigned int old_mode; +#if HAVE_SXS          ULONG_PTR cookie = 0; -        /* We use LoadLibraryEx so Windows looks for dependent DLLs -            in directory of pathname first.  However, Windows95 -            can sometimes not work correctly unless the absolute -            path is used.  If GetFullPathName() fails, the LoadLibrary -            will certainly fail too, so use its error code */ +#endif          /* Don't display a message box when Python can't load a DLL */          old_mode = SetErrorMode(SEM_FAILCRITICALERRORS); -        if (GetFullPathName(pathname, -                            sizeof(pathbuf), -                            pathbuf, -                            &dummy)) { -            ULONG_PTR cookie = _Py_ActivateActCtx(); -            /* XXX This call doesn't exist in Windows CE */ -            hDLL = LoadLibraryEx(pathname, NULL, -                                 LOAD_WITH_ALTERED_SEARCH_PATH); -            _Py_DeactivateActCtx(cookie); -        } +#if HAVE_SXS +        cookie = _Py_ActivateActCtx(); +#endif +        /* We use LoadLibraryEx so Windows looks for dependent DLLs +            in directory of pathname first. */ +        /* XXX This call doesn't exist in Windows CE */ +        hDLL = LoadLibraryExW(wpathname, NULL, +                              LOAD_WITH_ALTERED_SEARCH_PATH); +#if HAVE_SXS +        _Py_DeactivateActCtx(cookie); +#endif          /* restore old error mode settings */          SetErrorMode(old_mode); @@ -254,31 +257,34 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,                      "DLL load failed: ");                  PyUnicode_AppendAndDel(&message, -                    PyUnicode_FromUnicode( +                    PyUnicode_FromWideChar(                          theInfo,                          theLength));              } -            PyErr_SetObject(PyExc_ImportError, message); -            Py_XDECREF(message); +            if (message != NULL) { +                PyErr_SetImportError(message, PyUnicode_FromString(shortname), +                                     pathname); +                Py_DECREF(message); +            }              return NULL;          } else {              char buffer[256]; +            PyOS_snprintf(buffer, sizeof(buffer),  #ifdef _DEBUG -            PyOS_snprintf(buffer, sizeof(buffer), "python%d%d_d.dll", +                          "python%d%d_d.dll",  #else -            PyOS_snprintf(buffer, sizeof(buffer), "python%d%d.dll", +                          "python%d%d.dll",  #endif                            PY_MAJOR_VERSION,PY_MINOR_VERSION);              import_python = GetPythonImport(hDLL);              if (import_python &&                  strcasecmp(buffer,import_python)) { -                PyOS_snprintf(buffer, sizeof(buffer), -                              "Module use of %.150s conflicts " -                              "with this version of Python.", -                              import_python); -                PyErr_SetString(PyExc_ImportError,buffer); +                PyErr_Format(PyExc_ImportError, +                             "Module use of %.150s conflicts " +                             "with this version of Python.", +                             import_python);                  FreeLibrary(hDLL);                  return NULL;              } diff --git a/Python/errors.c b/Python/errors.c index 5a9a624279..626b16e46f 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -320,6 +320,39 @@ PyErr_Clear(void)      PyErr_Restore(NULL, NULL, NULL);  } +void +PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) +{ +    PyThreadState *tstate = PyThreadState_GET(); + +    *p_type = tstate->exc_type; +    *p_value = tstate->exc_value; +    *p_traceback = tstate->exc_traceback; + +    Py_XINCREF(*p_type); +    Py_XINCREF(*p_value); +    Py_XINCREF(*p_traceback); +} + +void +PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback) +{ +    PyObject *oldtype, *oldvalue, *oldtraceback; +    PyThreadState *tstate = PyThreadState_GET(); + +    oldtype = tstate->exc_type; +    oldvalue = tstate->exc_value; +    oldtraceback = tstate->exc_traceback; + +    tstate->exc_type = p_type; +    tstate->exc_value = p_value; +    tstate->exc_traceback = p_traceback; + +    Py_XDECREF(oldtype); +    Py_XDECREF(oldvalue); +    Py_XDECREF(oldtraceback); +} +  /* Convenience functions to set a type error exception and return 0 */  int @@ -341,11 +374,9 @@ PyObject *  PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)  {      PyObject *message; -    PyObject *v; +    PyObject *v, *args;      int i = errno; -#ifndef MS_WINDOWS -    char *s; -#else +#ifdef MS_WINDOWS      WCHAR *s_buf = NULL;  #endif /* Unix/Windows */ @@ -355,11 +386,14 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)  #endif  #ifndef MS_WINDOWS -    if (i == 0) -        s = "Error"; /* Sometimes errno didn't get set */ -    else -        s = strerror(i); -    message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore"); +    if (i != 0) { +        char *s = strerror(i); +        message = PyUnicode_DecodeLocale(s, "surrogateescape"); +    } +    else { +        /* Sometimes errno didn't get set */ +        message = PyUnicode_FromString("Error"); +    }  #else      if (i == 0)          message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */ @@ -395,7 +429,7 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)                  /* remove trailing cr/lf and dots */                  while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))                      s_buf[--len] = L'\0'; -                message = PyUnicode_FromUnicode(s_buf, len); +                message = PyUnicode_FromWideChar(s_buf, len);              }          }      } @@ -410,14 +444,18 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)      }      if (filenameObject != NULL) -        v = Py_BuildValue("(iOO)", i, message, filenameObject); +        args = Py_BuildValue("(iOO)", i, message, filenameObject);      else -        v = Py_BuildValue("(iO)", i, message); +        args = Py_BuildValue("(iO)", i, message);      Py_DECREF(message); -    if (v != NULL) { -        PyErr_SetObject(exc, v); -        Py_DECREF(v); +    if (args != NULL) { +        v = PyObject_Call(exc, args, NULL); +        Py_DECREF(args); +        if (v != NULL) { +            PyErr_SetObject((PyObject *) Py_TYPE(v), v); +            Py_DECREF(v); +        }      }  #ifdef MS_WINDOWS      LocalFree(s_buf); @@ -464,7 +502,7 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(      int len;      WCHAR *s_buf = NULL; /* Free via LocalFree */      PyObject *message; -    PyObject *v; +    PyObject *args, *v;      DWORD err = (DWORD)ierr;      if (err==0) err = GetLastError();      len = FormatMessageW( @@ -487,7 +525,7 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(          /* remove trailing cr/lf and dots */          while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))              s_buf[--len] = L'\0'; -        message = PyUnicode_FromUnicode(s_buf, len); +        message = PyUnicode_FromWideChar(s_buf, len);      }      if (message == NULL) @@ -496,15 +534,20 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(          return NULL;      } -    if (filenameObject != NULL) -        v = Py_BuildValue("(iOO)", err, message, filenameObject); -    else -        v = Py_BuildValue("(iO)", err, message); +    if (filenameObject == NULL) +        filenameObject = Py_None; +    /* This is the constructor signature for passing a Windows error code. +       The POSIX translation will be figured out by the constructor. */ +    args = Py_BuildValue("(iOOi)", 0, message, filenameObject, err);      Py_DECREF(message); -    if (v != NULL) { -        PyErr_SetObject(exc, v); -        Py_DECREF(v); +    if (args != NULL) { +        v = PyObject_Call(exc, args, NULL); +        Py_DECREF(args); +        if (v != NULL) { +            PyErr_SetObject((PyObject *) Py_TYPE(v), v); +            Py_DECREF(v); +        }      }      LocalFree(s_buf);      return NULL; @@ -575,6 +618,49 @@ PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(  }  #endif /* MS_WINDOWS */ +PyObject * +PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) +{ +    PyObject *args, *kwargs, *error; + +    if (msg == NULL) +        return NULL; + +    args = PyTuple_New(1); +    if (args == NULL) +        return NULL; + +    kwargs = PyDict_New(); +    if (kwargs == NULL) { +        Py_DECREF(args); +        return NULL; +    } + +    if (name == NULL) { +        name = Py_None; +    } + +    if (path == NULL) { +        path = Py_None; +    } + +    Py_INCREF(msg); +    PyTuple_SET_ITEM(args, 0, msg); +    PyDict_SetItemString(kwargs, "name", name); +    PyDict_SetItemString(kwargs, "path", path); + +    error = PyObject_Call(PyExc_ImportError, args, kwargs); +    if (error != NULL) { +        PyErr_SetObject((PyObject *)Py_TYPE(error), error); +        Py_DECREF(error); +    } + +    Py_DECREF(args); +    Py_DECREF(kwargs); + +    return NULL; +} +  void  _PyErr_BadInternalCall(const char *filename, int lineno)  { @@ -656,7 +742,7 @@ PyErr_NewException(const char *name, PyObject *base, PyObject *dict)          if (bases == NULL)              goto failure;      } -    /* Create a real new-style class. */ +    /* Create a real class. */      result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",                                     dot+1, bases, dict);    failure: @@ -707,6 +793,7 @@ PyErr_NewExceptionWithDoc(const char *name, const char *doc,  void  PyErr_WriteUnraisable(PyObject *obj)  { +    _Py_IDENTIFIER(__module__);      PyObject *f, *t, *v, *tb;      PyErr_Fetch(&t, &v, &tb);      f = PySys_GetObject("stderr"); @@ -723,7 +810,7 @@ PyErr_WriteUnraisable(PyObject *obj)                      className = dot+1;              } -            moduleName = PyObject_GetAttrString(t, "__module__"); +            moduleName = _PyObject_GetAttrId(t, &PyId___module__);              if (moduleName == NULL)                  PyFile_WriteString("<unknown>", f);              else { @@ -774,6 +861,12 @@ void  PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)  {      PyObject *exc, *v, *tb, *tmp; +    _Py_IDENTIFIER(filename); +    _Py_IDENTIFIER(lineno); +    _Py_IDENTIFIER(msg); +    _Py_IDENTIFIER(offset); +    _Py_IDENTIFIER(print_file_and_line); +    _Py_IDENTIFIER(text);      /* add attributes for the line number and filename for the error */      PyErr_Fetch(&exc, &v, &tb); @@ -784,7 +877,7 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)      if (tmp == NULL)          PyErr_Clear();      else { -        if (PyObject_SetAttrString(v, "lineno", tmp)) +        if (_PyObject_SetAttrId(v, &PyId_lineno, tmp))              PyErr_Clear();          Py_DECREF(tmp);      } @@ -793,7 +886,7 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)          if (tmp == NULL)              PyErr_Clear();          else { -            if (PyObject_SetAttrString(v, "offset", tmp)) +            if (_PyObject_SetAttrId(v, &PyId_offset, tmp))                  PyErr_Clear();              Py_DECREF(tmp);          } @@ -803,35 +896,35 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)          if (tmp == NULL)              PyErr_Clear();          else { -            if (PyObject_SetAttrString(v, "filename", tmp)) +            if (_PyObject_SetAttrId(v, &PyId_filename, tmp))                  PyErr_Clear();              Py_DECREF(tmp);          }          tmp = PyErr_ProgramText(filename, lineno);          if (tmp) { -            if (PyObject_SetAttrString(v, "text", tmp)) +            if (_PyObject_SetAttrId(v, &PyId_text, tmp))                  PyErr_Clear();              Py_DECREF(tmp);          }      } -    if (PyObject_SetAttrString(v, "offset", Py_None)) { +    if (_PyObject_SetAttrId(v, &PyId_offset, Py_None)) {          PyErr_Clear();      }      if (exc != PyExc_SyntaxError) { -        if (!PyObject_HasAttrString(v, "msg")) { +        if (!_PyObject_HasAttrId(v, &PyId_msg)) {              tmp = PyObject_Str(v);              if (tmp) { -                if (PyObject_SetAttrString(v, "msg", tmp)) +                if (_PyObject_SetAttrId(v, &PyId_msg, tmp))                      PyErr_Clear();                  Py_DECREF(tmp);              } else {                  PyErr_Clear();              }          } -        if (!PyObject_HasAttrString(v, "print_file_and_line")) { -            if (PyObject_SetAttrString(v, "print_file_and_line", -                                       Py_None)) +        if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) { +            if (_PyObject_SetAttrId(v, &PyId_print_file_and_line, +                                    Py_None))                  PyErr_Clear();          }      } diff --git a/Python/fileutils.c b/Python/fileutils.c index c563eaa5fb..501cb8c8d6 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -3,6 +3,40 @@  #  include <windows.h>  #endif +#ifdef HAVE_LANGINFO_H +#include <langinfo.h> +#endif + +PyObject * +_Py_device_encoding(int fd) +{ +#if defined(MS_WINDOWS) || defined(MS_WIN64) +    UINT cp; +#endif +    if (!_PyVerify_fd(fd) || !isatty(fd)) { +        Py_RETURN_NONE; +    } +#if defined(MS_WINDOWS) || defined(MS_WIN64) +    if (fd == 0) +        cp = GetConsoleCP(); +    else if (fd == 1 || fd == 2) +        cp = GetConsoleOutputCP(); +    else +        cp = 0; +    /* GetConsoleCP() and GetConsoleOutputCP() return 0 if the application +       has no console */ +    if (cp != 0) +        return PyUnicode_FromFormat("cp%u", (unsigned int)cp); +#elif defined(CODESET) +    { +        char *codeset = nl_langinfo(CODESET); +        if (codeset != NULL && codeset[0] != 0) +            return PyUnicode_FromString(codeset); +    } +#endif +    Py_RETURN_NONE; +} +  #ifdef HAVE_STAT  /* Decode a byte string from the locale encoding with the @@ -16,7 +50,9 @@     Return a pointer to a newly allocated wide character string (use     PyMem_Free() to free the memory) and write the number of written wide     characters excluding the null character into *size if size is not NULL, or -   NULL on error (conversion or memory allocation error). +   NULL on error (decoding or memory allocation error). If size is not NULL, +   *size is set to (size_t)-1 on memory error and (size_t)-2 on decoding +   error.     Conversion errors should never happen, unless there is a bug in the C     library. */ @@ -82,8 +118,9 @@ _Py_char2wchar(const char* arg, size_t *size)                 since we provide everything that we have -                 unless there is a bug in the C library, or I                 misunderstood how mbrtowc works. */ -            fprintf(stderr, "unexpected mbrtowc result -2\n");              PyMem_Free(res); +            if (size != NULL) +                *size = (size_t)-2;              return NULL;          }          if (converted == (size_t)-1) { @@ -112,7 +149,8 @@ _Py_char2wchar(const char* arg, size_t *size)         is ASCII (i.e. escape all bytes > 128. This will still roundtrip         correctly in the locale's charset, which must be an ASCII superset. */      res = PyMem_Malloc((strlen(arg)+1)*sizeof(wchar_t)); -    if (!res) goto oom; +    if (!res) +        goto oom;      in = (unsigned char*)arg;      out = res;      while(*in) @@ -126,7 +164,8 @@ _Py_char2wchar(const char* arg, size_t *size)          *size = out - res;      return res;  oom: -    fprintf(stderr, "out of memory\n"); +    if (size != NULL) +        *size = (size_t)-1;      return NULL;  } @@ -137,10 +176,10 @@ oom:     This function is the reverse of _Py_char2wchar().     Return a pointer to a newly allocated byte string (use PyMem_Free() to free -   the memory), or NULL on conversion or memory allocation error. +   the memory), or NULL on encoding or memory allocation error.     If error_pos is not NULL: *error_pos is the index of the invalid character -   on conversion error, or (size_t)-1 otherwise. */ +   on encoding error, or (size_t)-1 otherwise. */  char*  _Py_wchar2char(const wchar_t *text, size_t *error_pos)  { @@ -235,8 +274,8 @@ _Py_wstat(const wchar_t* path, struct stat *buf)  /* Call _wstat() on Windows, or encode the path to the filesystem encoding and     call stat() otherwise. Only fill st_mode attribute on Windows. -   Return 0 on success, -1 on _wstat() / stat() error or (if PyErr_Occurred()) -   unicode error. */ +   Return 0 on success, -1 on _wstat() / stat() error, -2 if an exception was +   raised. */  int  _Py_stat(PyObject *path, struct stat *statbuf) @@ -244,8 +283,12 @@ _Py_stat(PyObject *path, struct stat *statbuf)  #ifdef MS_WINDOWS      int err;      struct _stat wstatbuf; +    wchar_t *wpath; -    err = _wstat(PyUnicode_AS_UNICODE(path), &wstatbuf); +    wpath = PyUnicode_AsUnicode(path); +    if (wpath == NULL) +        return -2; +    err = _wstat(wpath, &wstatbuf);      if (!err)          statbuf->st_mode = wstatbuf.st_mode;      return err; @@ -253,7 +296,7 @@ _Py_stat(PyObject *path, struct stat *statbuf)      int ret;      PyObject *bytes = PyUnicode_EncodeFSDefault(path);      if (bytes == NULL) -        return -1; +        return -2;      ret = stat(PyBytes_AS_STRING(bytes), statbuf);      Py_DECREF(bytes);      return ret; @@ -297,18 +340,29 @@ FILE*  _Py_fopen(PyObject *path, const char *mode)  {  #ifdef MS_WINDOWS +    wchar_t *wpath;      wchar_t wmode[10];      int usize; +    if (!PyUnicode_Check(path)) { +        PyErr_Format(PyExc_TypeError, +                     "str file path expected under Windows, got %R", +                     Py_TYPE(path)); +        return NULL; +    } +    wpath = PyUnicode_AsUnicode(path); +    if (wpath == NULL) +        return NULL; +      usize = MultiByteToWideChar(CP_ACP, 0, mode, -1, wmode, sizeof(wmode));      if (usize == 0)          return NULL; -    return _wfopen(PyUnicode_AS_UNICODE(path), wmode); +    return _wfopen(wpath, wmode);  #else      FILE *f; -    PyObject *bytes = PyUnicode_EncodeFSDefault(path); -    if (bytes == NULL) +    PyObject *bytes; +    if (!PyUnicode_FSConverter(path, &bytes))          return NULL;      f = fopen(PyBytes_AS_STRING(bytes), mode);      Py_DECREF(bytes); @@ -319,7 +373,7 @@ _Py_fopen(PyObject *path, const char *mode)  #ifdef HAVE_READLINK  /* Read value of symbolic link. Encode the path to the locale encoding, decode -   the result from the locale encoding. */ +   the result from the locale encoding. Return -1 on error. */  int  _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz) @@ -363,7 +417,8 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz)  #ifdef HAVE_REALPATH  /* Return the canonicalized absolute pathname. Encode path to the locale -   encoding, decode the result from the locale encoding. */ +   encoding, decode the result from the locale encoding. +   Return NULL on error. */  wchar_t*  _Py_wrealpath(const wchar_t *path, @@ -401,7 +456,8 @@ _Py_wrealpath(const wchar_t *path,  #endif  /* Get the current directory. size is the buffer size in wide characters -   including the null character. Decode the path from the locale encoding. */ +   including the null character. Decode the path from the locale encoding. +   Return NULL on error. */  wchar_t*  _Py_wgetcwd(wchar_t *buf, size_t size) diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c index c350907da1..aa62502dbe 100644 --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -3,12 +3,1534 @@     of int.__float__, etc., that take and return unicode objects */  #include "Python.h" -#include "../Objects/stringlib/unicodedefs.h" +#include <locale.h> +/* Raises an exception about an unknown presentation type for this + * type. */ -#define FORMAT_STRING  _PyUnicode_FormatAdvanced -#define FORMAT_LONG    _PyLong_FormatAdvanced -#define FORMAT_FLOAT   _PyFloat_FormatAdvanced -#define FORMAT_COMPLEX _PyComplex_FormatAdvanced +static void +unknown_presentation_type(Py_UCS4 presentation_type, +                          const char* type_name) +{ +    /* %c might be out-of-range, hence the two cases. */ +    if (presentation_type > 32 && presentation_type < 128) +        PyErr_Format(PyExc_ValueError, +                     "Unknown format code '%c' " +                     "for object of type '%.200s'", +                     (char)presentation_type, +                     type_name); +    else +        PyErr_Format(PyExc_ValueError, +                     "Unknown format code '\\x%x' " +                     "for object of type '%.200s'", +                     (unsigned int)presentation_type, +                     type_name); +} -#include "../Objects/stringlib/formatter.h" +static void +invalid_comma_type(Py_UCS4 presentation_type) +{ +    if (presentation_type > 32 && presentation_type < 128) +        PyErr_Format(PyExc_ValueError, +                     "Cannot specify ',' with '%c'.", +                     (char)presentation_type); +    else +        PyErr_Format(PyExc_ValueError, +                     "Cannot specify ',' with '\\x%x'.", +                     (unsigned int)presentation_type); +} + +/* +    get_integer consumes 0 or more decimal digit characters from an +    input string, updates *result with the corresponding positive +    integer, and returns the number of digits consumed. + +    returns -1 on error. +*/ +static int +get_integer(PyObject *str, Py_ssize_t *pos, Py_ssize_t end, +                  Py_ssize_t *result) +{ +    Py_ssize_t accumulator, digitval; +    int numdigits; +    accumulator = numdigits = 0; +    for (;;(*pos)++, numdigits++) { +        if (*pos >= end) +            break; +        digitval = Py_UNICODE_TODECIMAL(PyUnicode_READ_CHAR(str, *pos)); +        if (digitval < 0) +            break; +        /* +           Detect possible overflow before it happens: + +              accumulator * 10 + digitval > PY_SSIZE_T_MAX if and only if +              accumulator > (PY_SSIZE_T_MAX - digitval) / 10. +        */ +        if (accumulator > (PY_SSIZE_T_MAX - digitval) / 10) { +            PyErr_Format(PyExc_ValueError, +                         "Too many decimal digits in format string"); +            return -1; +        } +        accumulator = accumulator * 10 + digitval; +    } +    *result = accumulator; +    return numdigits; +} + +/************************************************************************/ +/*********** standard format specifier parsing **************************/ +/************************************************************************/ + +/* returns true if this character is a specifier alignment token */ +Py_LOCAL_INLINE(int) +is_alignment_token(Py_UCS4 c) +{ +    switch (c) { +    case '<': case '>': case '=': case '^': +        return 1; +    default: +        return 0; +    } +} + +/* returns true if this character is a sign element */ +Py_LOCAL_INLINE(int) +is_sign_element(Py_UCS4 c) +{ +    switch (c) { +    case ' ': case '+': case '-': +        return 1; +    default: +        return 0; +    } +} + + +typedef struct { +    Py_UCS4 fill_char; +    Py_UCS4 align; +    int alternate; +    Py_UCS4 sign; +    Py_ssize_t width; +    int thousands_separators; +    Py_ssize_t precision; +    Py_UCS4 type; +} InternalFormatSpec; + +#if 0 +/* Occassionally useful for debugging. Should normally be commented out. */ +static void +DEBUG_PRINT_FORMAT_SPEC(InternalFormatSpec *format) +{ +    printf("internal format spec: fill_char %d\n", format->fill_char); +    printf("internal format spec: align %d\n", format->align); +    printf("internal format spec: alternate %d\n", format->alternate); +    printf("internal format spec: sign %d\n", format->sign); +    printf("internal format spec: width %zd\n", format->width); +    printf("internal format spec: thousands_separators %d\n", +           format->thousands_separators); +    printf("internal format spec: precision %zd\n", format->precision); +    printf("internal format spec: type %c\n", format->type); +    printf("\n"); +} +#endif + + +/* +  ptr points to the start of the format_spec, end points just past its end. +  fills in format with the parsed information. +  returns 1 on success, 0 on failure. +  if failure, sets the exception +*/ +static int +parse_internal_render_format_spec(PyObject *format_spec, +                                  Py_ssize_t start, Py_ssize_t end, +                                  InternalFormatSpec *format, +                                  char default_type, +                                  char default_align) +{ +    Py_ssize_t pos = start; +    /* end-pos is used throughout this code to specify the length of +       the input string */ +#define READ_spec(index) PyUnicode_READ_CHAR(format_spec, index) + +    Py_ssize_t consumed; +    int align_specified = 0; + +    format->fill_char = '\0'; +    format->align = default_align; +    format->alternate = 0; +    format->sign = '\0'; +    format->width = -1; +    format->thousands_separators = 0; +    format->precision = -1; +    format->type = default_type; + +    /* If the second char is an alignment token, +       then parse the fill char */ +    if (end-pos >= 2 && is_alignment_token(READ_spec(pos+1))) { +        format->align = READ_spec(pos+1); +        format->fill_char = READ_spec(pos); +        align_specified = 1; +        pos += 2; +    } +    else if (end-pos >= 1 && is_alignment_token(READ_spec(pos))) { +        format->align = READ_spec(pos); +        align_specified = 1; +        ++pos; +    } + +    /* Parse the various sign options */ +    if (end-pos >= 1 && is_sign_element(READ_spec(pos))) { +        format->sign = READ_spec(pos); +        ++pos; +    } + +    /* If the next character is #, we're in alternate mode.  This only +       applies to integers. */ +    if (end-pos >= 1 && READ_spec(pos) == '#') { +        format->alternate = 1; +        ++pos; +    } + +    /* The special case for 0-padding (backwards compat) */ +    if (format->fill_char == '\0' && end-pos >= 1 && READ_spec(pos) == '0') { +        format->fill_char = '0'; +        if (!align_specified) { +            format->align = '='; +        } +        ++pos; +    } + +    consumed = get_integer(format_spec, &pos, end, &format->width); +    if (consumed == -1) +        /* Overflow error. Exception already set. */ +        return 0; + +    /* If consumed is 0, we didn't consume any characters for the +       width. In that case, reset the width to -1, because +       get_integer() will have set it to zero. -1 is how we record +       that the width wasn't specified. */ +    if (consumed == 0) +        format->width = -1; + +    /* Comma signifies add thousands separators */ +    if (end-pos && READ_spec(pos) == ',') { +        format->thousands_separators = 1; +        ++pos; +    } + +    /* Parse field precision */ +    if (end-pos && READ_spec(pos) == '.') { +        ++pos; + +        consumed = get_integer(format_spec, &pos, end, &format->precision); +        if (consumed == -1) +            /* Overflow error. Exception already set. */ +            return 0; + +        /* Not having a precision after a dot is an error. */ +        if (consumed == 0) { +            PyErr_Format(PyExc_ValueError, +                         "Format specifier missing precision"); +            return 0; +        } + +    } + +    /* Finally, parse the type field. */ + +    if (end-pos > 1) { +        /* More than one char remain, invalid format specifier. */ +        PyErr_Format(PyExc_ValueError, "Invalid format specifier"); +        return 0; +    } + +    if (end-pos == 1) { +        format->type = READ_spec(pos); +        ++pos; +    } + +    /* Do as much validating as we can, just by looking at the format +       specifier.  Do not take into account what type of formatting +       we're doing (int, float, string). */ + +    if (format->thousands_separators) { +        switch (format->type) { +        case 'd': +        case 'e': +        case 'f': +        case 'g': +        case 'E': +        case 'G': +        case '%': +        case 'F': +        case '\0': +            /* These are allowed. See PEP 378.*/ +            break; +        default: +            invalid_comma_type(format->type); +            return 0; +        } +    } + +    assert (format->align <= 127); +    assert (format->sign <= 127); +    return 1; +} + +/* Calculate the padding needed. */ +static void +calc_padding(Py_ssize_t nchars, Py_ssize_t width, Py_UCS4 align, +             Py_ssize_t *n_lpadding, Py_ssize_t *n_rpadding, +             Py_ssize_t *n_total) +{ +    if (width >= 0) { +        if (nchars > width) +            *n_total = nchars; +        else +            *n_total = width; +    } +    else { +        /* not specified, use all of the chars and no more */ +        *n_total = nchars; +    } + +    /* Figure out how much leading space we need, based on the +       aligning */ +    if (align == '>') +        *n_lpadding = *n_total - nchars; +    else if (align == '^') +        *n_lpadding = (*n_total - nchars) / 2; +    else if (align == '<' || align == '=') +        *n_lpadding = 0; +    else { +        /* We should never have an unspecified alignment. */ +        *n_lpadding = 0; +        assert(0); +    } + +    *n_rpadding = *n_total - nchars - *n_lpadding; +} + +/* Do the padding, and return a pointer to where the caller-supplied +   content goes. */ +static Py_ssize_t +fill_padding(_PyUnicodeWriter *writer, +             Py_ssize_t nchars, +             Py_UCS4 fill_char, Py_ssize_t n_lpadding, +             Py_ssize_t n_rpadding) +{ +    Py_ssize_t pos; + +    /* Pad on left. */ +    if (n_lpadding) { +        pos = writer->pos; +        _PyUnicode_FastFill(writer->buffer, pos, n_lpadding, fill_char); +    } + +    /* Pad on right. */ +    if (n_rpadding) { +        pos = writer->pos + nchars + n_lpadding; +        _PyUnicode_FastFill(writer->buffer, pos, n_rpadding, fill_char); +    } + +    /* Pointer to the user content. */ +    writer->pos += n_lpadding; +    return 0; +} + +/************************************************************************/ +/*********** common routines for numeric formatting *********************/ +/************************************************************************/ + +/* Locale type codes. */ +#define LT_CURRENT_LOCALE 0 +#define LT_DEFAULT_LOCALE 1 +#define LT_NO_LOCALE 2 + +/* Locale info needed for formatting integers and the part of floats +   before and including the decimal. Note that locales only support +   8-bit chars, not unicode. */ +typedef struct { +    PyObject *decimal_point; +    PyObject *thousands_sep; +    const char *grouping; +} LocaleInfo; + +#define STATIC_LOCALE_INFO_INIT {0, 0, 0} + +/* describes the layout for an integer, see the comment in +   calc_number_widths() for details */ +typedef struct { +    Py_ssize_t n_lpadding; +    Py_ssize_t n_prefix; +    Py_ssize_t n_spadding; +    Py_ssize_t n_rpadding; +    char sign; +    Py_ssize_t n_sign;      /* number of digits needed for sign (0/1) */ +    Py_ssize_t n_grouped_digits; /* Space taken up by the digits, including +                                    any grouping chars. */ +    Py_ssize_t n_decimal;   /* 0 if only an integer */ +    Py_ssize_t n_remainder; /* Digits in decimal and/or exponent part, +                               excluding the decimal itself, if +                               present. */ + +    /* These 2 are not the widths of fields, but are needed by +       STRINGLIB_GROUPING. */ +    Py_ssize_t n_digits;    /* The number of digits before a decimal +                               or exponent. */ +    Py_ssize_t n_min_width; /* The min_width we used when we computed +                               the n_grouped_digits width. */ +} NumberFieldWidths; + + +/* Given a number of the form: +   digits[remainder] +   where ptr points to the start and end points to the end, find where +    the integer part ends. This could be a decimal, an exponent, both, +    or neither. +   If a decimal point is present, set *has_decimal and increment +    remainder beyond it. +   Results are undefined (but shouldn't crash) for improperly +    formatted strings. +*/ +static void +parse_number(PyObject *s, Py_ssize_t pos, Py_ssize_t end, +             Py_ssize_t *n_remainder, int *has_decimal) +{ +    Py_ssize_t remainder; + +    while (pos<end && isdigit(PyUnicode_READ_CHAR(s, pos))) +        ++pos; +    remainder = pos; + +    /* Does remainder start with a decimal point? */ +    *has_decimal = pos<end && PyUnicode_READ_CHAR(s, remainder) == '.'; + +    /* Skip the decimal point. */ +    if (*has_decimal) +        remainder++; + +    *n_remainder = end - remainder; +} + +/* not all fields of format are used.  for example, precision is +   unused.  should this take discrete params in order to be more clear +   about what it does?  or is passing a single format parameter easier +   and more efficient enough to justify a little obfuscation? */ +static Py_ssize_t +calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix, +                   Py_UCS4 sign_char, PyObject *number, Py_ssize_t n_start, +                   Py_ssize_t n_end, Py_ssize_t n_remainder, +                   int has_decimal, const LocaleInfo *locale, +                   const InternalFormatSpec *format, Py_UCS4 *maxchar) +{ +    Py_ssize_t n_non_digit_non_padding; +    Py_ssize_t n_padding; + +    spec->n_digits = n_end - n_start - n_remainder - (has_decimal?1:0); +    spec->n_lpadding = 0; +    spec->n_prefix = n_prefix; +    spec->n_decimal = has_decimal ? PyUnicode_GET_LENGTH(locale->decimal_point) : 0; +    spec->n_remainder = n_remainder; +    spec->n_spadding = 0; +    spec->n_rpadding = 0; +    spec->sign = '\0'; +    spec->n_sign = 0; + +    /* the output will look like: +       |                                                                                         | +       | <lpadding> <sign> <prefix> <spadding> <grouped_digits> <decimal> <remainder> <rpadding> | +       |                                                                                         | + +       sign is computed from format->sign and the actual +       sign of the number + +       prefix is given (it's for the '0x' prefix) + +       digits is already known + +       the total width is either given, or computed from the +       actual digits + +       only one of lpadding, spadding, and rpadding can be non-zero, +       and it's calculated from the width and other fields +    */ + +    /* compute the various parts we're going to write */ +    switch (format->sign) { +    case '+': +        /* always put a + or - */ +        spec->n_sign = 1; +        spec->sign = (sign_char == '-' ? '-' : '+'); +        break; +    case ' ': +        spec->n_sign = 1; +        spec->sign = (sign_char == '-' ? '-' : ' '); +        break; +    default: +        /* Not specified, or the default (-) */ +        if (sign_char == '-') { +            spec->n_sign = 1; +            spec->sign = '-'; +        } +    } + +    /* The number of chars used for non-digits and non-padding. */ +    n_non_digit_non_padding = spec->n_sign + spec->n_prefix + spec->n_decimal + +        spec->n_remainder; + +    /* min_width can go negative, that's okay. format->width == -1 means +       we don't care. */ +    if (format->fill_char == '0' && format->align == '=') +        spec->n_min_width = format->width - n_non_digit_non_padding; +    else +        spec->n_min_width = 0; + +    if (spec->n_digits == 0) +        /* This case only occurs when using 'c' formatting, we need +           to special case it because the grouping code always wants +           to have at least one character. */ +        spec->n_grouped_digits = 0; +    else { +        Py_UCS4 grouping_maxchar; +        spec->n_grouped_digits = _PyUnicode_InsertThousandsGrouping( +            NULL, 0, +            0, NULL, +            spec->n_digits, spec->n_min_width, +            locale->grouping, locale->thousands_sep, &grouping_maxchar); +        *maxchar = Py_MAX(*maxchar, grouping_maxchar); +    } + +    /* Given the desired width and the total of digit and non-digit +       space we consume, see if we need any padding. format->width can +       be negative (meaning no padding), but this code still works in +       that case. */ +    n_padding = format->width - +                        (n_non_digit_non_padding + spec->n_grouped_digits); +    if (n_padding > 0) { +        /* Some padding is needed. Determine if it's left, space, or right. */ +        switch (format->align) { +        case '<': +            spec->n_rpadding = n_padding; +            break; +        case '^': +            spec->n_lpadding = n_padding / 2; +            spec->n_rpadding = n_padding - spec->n_lpadding; +            break; +        case '=': +            spec->n_spadding = n_padding; +            break; +        case '>': +            spec->n_lpadding = n_padding; +            break; +        default: +            /* Shouldn't get here, but treat it as '>' */ +            spec->n_lpadding = n_padding; +            assert(0); +            break; +        } +    } + +    if (spec->n_lpadding || spec->n_spadding || spec->n_rpadding) +        *maxchar = Py_MAX(*maxchar, format->fill_char); + +    if (spec->n_decimal) +        *maxchar = Py_MAX(*maxchar, PyUnicode_MAX_CHAR_VALUE(locale->decimal_point)); + +    return spec->n_lpadding + spec->n_sign + spec->n_prefix + +        spec->n_spadding + spec->n_grouped_digits + spec->n_decimal + +        spec->n_remainder + spec->n_rpadding; +} + +/* Fill in the digit parts of a numbers's string representation, +   as determined in calc_number_widths(). +   Return -1 on error, or 0 on success. */ +static int +fill_number(_PyUnicodeWriter *writer, const NumberFieldWidths *spec, +            PyObject *digits, Py_ssize_t d_start, Py_ssize_t d_end, +            PyObject *prefix, Py_ssize_t p_start, +            Py_UCS4 fill_char, +            LocaleInfo *locale, int toupper) +{ +    /* Used to keep track of digits, decimal, and remainder. */ +    Py_ssize_t d_pos = d_start; +    const enum PyUnicode_Kind kind = writer->kind; +    const void *data = writer->data; +    Py_ssize_t r; + +    if (spec->n_lpadding) { +        _PyUnicode_FastFill(writer->buffer, +                            writer->pos, spec->n_lpadding, fill_char); +        writer->pos += spec->n_lpadding; +    } +    if (spec->n_sign == 1) { +        PyUnicode_WRITE(kind, data, writer->pos, spec->sign); +        writer->pos++; +    } +    if (spec->n_prefix) { +        _PyUnicode_FastCopyCharacters(writer->buffer, writer->pos, +                                      prefix, p_start, +                                      spec->n_prefix); +        if (toupper) { +            Py_ssize_t t; +            for (t = 0; t < spec->n_prefix; t++) { +                Py_UCS4 c = PyUnicode_READ(kind, data, writer->pos + t); +                c = Py_TOUPPER(c); +                assert (c <= 127); +                PyUnicode_WRITE(kind, data, writer->pos + t, c); +            } +        } +        writer->pos += spec->n_prefix; +    } +    if (spec->n_spadding) { +        _PyUnicode_FastFill(writer->buffer, +                            writer->pos, spec->n_spadding, fill_char); +        writer->pos += spec->n_spadding; +    } + +    /* Only for type 'c' special case, it has no digits. */ +    if (spec->n_digits != 0) { +        /* Fill the digits with InsertThousandsGrouping. */ +        char *pdigits; +        if (PyUnicode_READY(digits)) +            return -1; +        pdigits = PyUnicode_DATA(digits); +        if (PyUnicode_KIND(digits) < kind) { +            pdigits = _PyUnicode_AsKind(digits, kind); +            if (pdigits == NULL) +                return -1; +        } +        r = _PyUnicode_InsertThousandsGrouping( +                writer->buffer, writer->pos, +                spec->n_grouped_digits, +                pdigits + kind * d_pos, +                spec->n_digits, spec->n_min_width, +                locale->grouping, locale->thousands_sep, NULL); +        if (r == -1) +            return -1; +        assert(r == spec->n_grouped_digits); +        if (PyUnicode_KIND(digits) < kind) +            PyMem_Free(pdigits); +        d_pos += spec->n_digits; +    } +    if (toupper) { +        Py_ssize_t t; +        for (t = 0; t < spec->n_grouped_digits; t++) { +            Py_UCS4 c = PyUnicode_READ(kind, data, writer->pos + t); +            c = Py_TOUPPER(c); +            if (c > 127) { +                PyErr_SetString(PyExc_SystemError, "non-ascii grouped digit"); +                return -1; +            } +            PyUnicode_WRITE(kind, data, writer->pos + t, c); +        } +    } +    writer->pos += spec->n_grouped_digits; + +    if (spec->n_decimal) { +        _PyUnicode_FastCopyCharacters( +            writer->buffer, writer->pos, +            locale->decimal_point, 0, spec->n_decimal); +        writer->pos += spec->n_decimal; +        d_pos += 1; +    } + +    if (spec->n_remainder) { +        _PyUnicode_FastCopyCharacters( +            writer->buffer, writer->pos, +            digits, d_pos, spec->n_remainder); +        writer->pos += spec->n_remainder; +        /* d_pos += spec->n_remainder; */ +    } + +    if (spec->n_rpadding) { +        _PyUnicode_FastFill(writer->buffer, +                            writer->pos, spec->n_rpadding, +                            fill_char); +        writer->pos += spec->n_rpadding; +    } +    return 0; +} + +static char no_grouping[1] = {CHAR_MAX}; + +/* Find the decimal point character(s?), thousands_separator(s?), and +   grouping description, either for the current locale if type is +   LT_CURRENT_LOCALE, a hard-coded locale if LT_DEFAULT_LOCALE, or +   none if LT_NO_LOCALE. */ +static int +get_locale_info(int type, LocaleInfo *locale_info) +{ +    switch (type) { +    case LT_CURRENT_LOCALE: { +        struct lconv *locale_data = localeconv(); +        locale_info->decimal_point = PyUnicode_DecodeLocale( +                                         locale_data->decimal_point, +                                         NULL); +        if (locale_info->decimal_point == NULL) +            return -1; +        locale_info->thousands_sep = PyUnicode_DecodeLocale( +                                         locale_data->thousands_sep, +                                         NULL); +        if (locale_info->thousands_sep == NULL) { +            Py_DECREF(locale_info->decimal_point); +            return -1; +        } +        locale_info->grouping = locale_data->grouping; +        break; +    } +    case LT_DEFAULT_LOCALE: +        locale_info->decimal_point = PyUnicode_FromOrdinal('.'); +        locale_info->thousands_sep = PyUnicode_FromOrdinal(','); +        if (!locale_info->decimal_point || !locale_info->thousands_sep) { +            Py_XDECREF(locale_info->decimal_point); +            Py_XDECREF(locale_info->thousands_sep); +            return -1; +        } +        locale_info->grouping = "\3"; /* Group every 3 characters.  The +                                         (implicit) trailing 0 means repeat +                                         infinitely. */ +        break; +    case LT_NO_LOCALE: +        locale_info->decimal_point = PyUnicode_FromOrdinal('.'); +        locale_info->thousands_sep = PyUnicode_New(0, 0); +        if (!locale_info->decimal_point || !locale_info->thousands_sep) { +            Py_XDECREF(locale_info->decimal_point); +            Py_XDECREF(locale_info->thousands_sep); +            return -1; +        } +        locale_info->grouping = no_grouping; +        break; +    default: +        assert(0); +    } +    return 0; +} + +static void +free_locale_info(LocaleInfo *locale_info) +{ +    Py_XDECREF(locale_info->decimal_point); +    Py_XDECREF(locale_info->thousands_sep); +} + +/************************************************************************/ +/*********** string formatting ******************************************/ +/************************************************************************/ + +static int +format_string_internal(PyObject *value, const InternalFormatSpec *format, +                       _PyUnicodeWriter *writer) +{ +    Py_ssize_t lpad; +    Py_ssize_t rpad; +    Py_ssize_t total; +    Py_ssize_t len; +    int result = -1; +    Py_UCS4 maxchar; + +    assert(PyUnicode_IS_READY(value)); +    len = PyUnicode_GET_LENGTH(value); + +    /* sign is not allowed on strings */ +    if (format->sign != '\0') { +        PyErr_SetString(PyExc_ValueError, +                        "Sign not allowed in string format specifier"); +        goto done; +    } + +    /* alternate is not allowed on strings */ +    if (format->alternate) { +        PyErr_SetString(PyExc_ValueError, +                        "Alternate form (#) not allowed in string format " +                        "specifier"); +        goto done; +    } + +    /* '=' alignment not allowed on strings */ +    if (format->align == '=') { +        PyErr_SetString(PyExc_ValueError, +                        "'=' alignment not allowed " +                        "in string format specifier"); +        goto done; +    } + +    if (format->width == -1 && format->precision == -1) { +        /* Fast path */ +        return _PyUnicodeWriter_WriteStr(writer, value); +    } + +    /* if precision is specified, output no more that format.precision +       characters */ +    if (format->precision >= 0 && len >= format->precision) { +        len = format->precision; +    } + +    calc_padding(len, format->width, format->align, &lpad, &rpad, &total); + +    maxchar = _PyUnicode_FindMaxChar(value, 0, len); +    if (lpad != 0 || rpad != 0) +        maxchar = Py_MAX(maxchar, format->fill_char); + +    /* allocate the resulting string */ +    if (_PyUnicodeWriter_Prepare(writer, total, maxchar) == -1) +        goto done; + +    /* Write into that space. First the padding. */ +    result = fill_padding(writer, len, +                          format->fill_char=='\0'?' ':format->fill_char, +                          lpad, rpad); +    if (result == -1) +        goto done; + +    /* Then the source string. */ +    if (len) { +        _PyUnicode_FastCopyCharacters(writer->buffer, writer->pos, +                                      value, 0, len); +    } +    writer->pos += (len + rpad); +    result = 0; + +done: +    return result; +} + + +/************************************************************************/ +/*********** long formatting ********************************************/ +/************************************************************************/ + +static int +format_long_internal(PyObject *value, const InternalFormatSpec *format, +                     _PyUnicodeWriter *writer) +{ +    int result = -1; +    Py_UCS4 maxchar = 127; +    PyObject *tmp = NULL; +    Py_ssize_t inumeric_chars; +    Py_UCS4 sign_char = '\0'; +    Py_ssize_t n_digits;       /* count of digits need from the computed +                                  string */ +    Py_ssize_t n_remainder = 0; /* Used only for 'c' formatting, which +                                   produces non-digits */ +    Py_ssize_t n_prefix = 0;   /* Count of prefix chars, (e.g., '0x') */ +    Py_ssize_t n_total; +    Py_ssize_t prefix = 0; +    NumberFieldWidths spec; +    long x; + +    /* Locale settings, either from the actual locale or +       from a hard-code pseudo-locale */ +    LocaleInfo locale = STATIC_LOCALE_INFO_INIT; + +    /* no precision allowed on integers */ +    if (format->precision != -1) { +        PyErr_SetString(PyExc_ValueError, +                        "Precision not allowed in integer format specifier"); +        goto done; +    } + +    /* special case for character formatting */ +    if (format->type == 'c') { +        /* error to specify a sign */ +        if (format->sign != '\0') { +            PyErr_SetString(PyExc_ValueError, +                            "Sign not allowed with integer" +                            " format specifier 'c'"); +            goto done; +        } + +        /* taken from unicodeobject.c formatchar() */ +        /* Integer input truncated to a character */ +        x = PyLong_AsLong(value); +        if (x == -1 && PyErr_Occurred()) +            goto done; +        if (x < 0 || x > 0x10ffff) { +            PyErr_SetString(PyExc_OverflowError, +                            "%c arg not in range(0x110000)"); +            goto done; +        } +        tmp = PyUnicode_FromOrdinal(x); +        inumeric_chars = 0; +        n_digits = 1; +        maxchar = Py_MAX(maxchar, (Py_UCS4)x); + +        /* As a sort-of hack, we tell calc_number_widths that we only +           have "remainder" characters. calc_number_widths thinks +           these are characters that don't get formatted, only copied +           into the output string. We do this for 'c' formatting, +           because the characters are likely to be non-digits. */ +        n_remainder = 1; +    } +    else { +        int base; +        int leading_chars_to_skip = 0;  /* Number of characters added by +                                           PyNumber_ToBase that we want to +                                           skip over. */ + +        /* Compute the base and how many characters will be added by +           PyNumber_ToBase */ +        switch (format->type) { +        case 'b': +            base = 2; +            leading_chars_to_skip = 2; /* 0b */ +            break; +        case 'o': +            base = 8; +            leading_chars_to_skip = 2; /* 0o */ +            break; +        case 'x': +        case 'X': +            base = 16; +            leading_chars_to_skip = 2; /* 0x */ +            break; +        default:  /* shouldn't be needed, but stops a compiler warning */ +        case 'd': +        case 'n': +            base = 10; +            break; +        } + +        if (format->sign != '+' && format->sign != ' ' +            && format->width == -1 +            && format->type != 'X' && format->type != 'n' +            && !format->thousands_separators +            && PyLong_CheckExact(value)) +        { +            /* Fast path */ +            return _PyLong_FormatWriter(writer, value, base, format->alternate); +        } + +        /* The number of prefix chars is the same as the leading +           chars to skip */ +        if (format->alternate) +            n_prefix = leading_chars_to_skip; + +        /* Do the hard part, converting to a string in a given base */ +        tmp = _PyLong_Format(value, base); +        if (tmp == NULL || PyUnicode_READY(tmp) == -1) +            goto done; + +        inumeric_chars = 0; +        n_digits = PyUnicode_GET_LENGTH(tmp); + +        prefix = inumeric_chars; + +        /* Is a sign character present in the output?  If so, remember it +           and skip it */ +        if (PyUnicode_READ_CHAR(tmp, inumeric_chars) == '-') { +            sign_char = '-'; +            ++prefix; +            ++leading_chars_to_skip; +        } + +        /* Skip over the leading chars (0x, 0b, etc.) */ +        n_digits -= leading_chars_to_skip; +        inumeric_chars += leading_chars_to_skip; +    } + +    /* Determine the grouping, separator, and decimal point, if any. */ +    if (get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE : +                        (format->thousands_separators ? +                         LT_DEFAULT_LOCALE : +                         LT_NO_LOCALE), +                        &locale) == -1) +        goto done; + +    /* Calculate how much memory we'll need. */ +    n_total = calc_number_widths(&spec, n_prefix, sign_char, tmp, inumeric_chars, +                                 inumeric_chars + n_digits, n_remainder, 0, +                                 &locale, format, &maxchar); + +    /* Allocate the memory. */ +    if (_PyUnicodeWriter_Prepare(writer, n_total, maxchar) == -1) +        goto done; + +    /* Populate the memory. */ +    result = fill_number(writer, &spec, +                         tmp, inumeric_chars, inumeric_chars + n_digits, +                         tmp, prefix, +                         format->fill_char == '\0' ? ' ' : format->fill_char, +                         &locale, format->type == 'X'); + +done: +    Py_XDECREF(tmp); +    free_locale_info(&locale); +    return result; +} + +/************************************************************************/ +/*********** float formatting *******************************************/ +/************************************************************************/ + +/* much of this is taken from unicodeobject.c */ +static int +format_float_internal(PyObject *value, +                      const InternalFormatSpec *format, +                      _PyUnicodeWriter *writer) +{ +    char *buf = NULL;       /* buffer returned from PyOS_double_to_string */ +    Py_ssize_t n_digits; +    Py_ssize_t n_remainder; +    Py_ssize_t n_total; +    int has_decimal; +    double val; +    Py_ssize_t precision = format->precision; +    Py_ssize_t default_precision = 6; +    Py_UCS4 type = format->type; +    int add_pct = 0; +    Py_ssize_t index; +    NumberFieldWidths spec; +    int flags = 0; +    int result = -1; +    Py_UCS4 maxchar = 127; +    Py_UCS4 sign_char = '\0'; +    int float_type; /* Used to see if we have a nan, inf, or regular float. */ +    PyObject *unicode_tmp = NULL; + +    /* Locale settings, either from the actual locale or +       from a hard-code pseudo-locale */ +    LocaleInfo locale = STATIC_LOCALE_INFO_INIT; + +    if (format->alternate) +        flags |= Py_DTSF_ALT; + +    if (type == '\0') { +        /* Omitted type specifier.  Behaves in the same way as repr(x) +           and str(x) if no precision is given, else like 'g', but with +           at least one digit after the decimal point. */ +        flags |= Py_DTSF_ADD_DOT_0; +        type = 'r'; +        default_precision = 0; +    } + +    if (type == 'n') +        /* 'n' is the same as 'g', except for the locale used to +           format the result. We take care of that later. */ +        type = 'g'; + +    val = PyFloat_AsDouble(value); +    if (val == -1.0 && PyErr_Occurred()) +        goto done; + +    if (type == '%') { +        type = 'f'; +        val *= 100; +        add_pct = 1; +    } + +    if (precision < 0) +        precision = default_precision; +    else if (type == 'r') +        type = 'g'; + +    /* Cast "type", because if we're in unicode we need to pass a +       8-bit char. This is safe, because we've restricted what "type" +       can be. */ +    buf = PyOS_double_to_string(val, (char)type, precision, flags, +                                &float_type); +    if (buf == NULL) +        goto done; +    n_digits = strlen(buf); + +    if (add_pct) { +        /* We know that buf has a trailing zero (since we just called +           strlen() on it), and we don't use that fact any more. So we +           can just write over the trailing zero. */ +        buf[n_digits] = '%'; +        n_digits += 1; +    } + +    /* Since there is no unicode version of PyOS_double_to_string, +       just use the 8 bit version and then convert to unicode. */ +    unicode_tmp = _PyUnicode_FromASCII(buf, n_digits); +    PyMem_Free(buf); +    if (unicode_tmp == NULL) +        goto done; + +    if (format->sign != '+' && format->sign != ' ' +        && format->width == -1 +        && format->type != 'n' +        && !format->thousands_separators) +    { +        /* Fast path */ +        result = _PyUnicodeWriter_WriteStr(writer, unicode_tmp); +        Py_DECREF(unicode_tmp); +        return result; +    } + +    /* Is a sign character present in the output?  If so, remember it +       and skip it */ +    index = 0; +    if (PyUnicode_READ_CHAR(unicode_tmp, index) == '-') { +        sign_char = '-'; +        ++index; +        --n_digits; +    } + +    /* Determine if we have any "remainder" (after the digits, might include +       decimal or exponent or both (or neither)) */ +    parse_number(unicode_tmp, index, index + n_digits, &n_remainder, &has_decimal); + +    /* Determine the grouping, separator, and decimal point, if any. */ +    if (get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE : +                        (format->thousands_separators ? +                         LT_DEFAULT_LOCALE : +                         LT_NO_LOCALE), +                        &locale) == -1) +        goto done; + +    /* Calculate how much memory we'll need. */ +    n_total = calc_number_widths(&spec, 0, sign_char, unicode_tmp, index, +                                 index + n_digits, n_remainder, has_decimal, +                                 &locale, format, &maxchar); + +    /* Allocate the memory. */ +    if (_PyUnicodeWriter_Prepare(writer, n_total, maxchar) == -1) +        goto done; + +    /* Populate the memory. */ +    result = fill_number(writer, &spec, +                         unicode_tmp, index, index + n_digits, +                         NULL, 0, +                         format->fill_char == '\0' ? ' ' : format->fill_char, +                         &locale, 0); + +done: +    Py_XDECREF(unicode_tmp); +    free_locale_info(&locale); +    return result; +} + +/************************************************************************/ +/*********** complex formatting *****************************************/ +/************************************************************************/ + +static int +format_complex_internal(PyObject *value, +                        const InternalFormatSpec *format, +                        _PyUnicodeWriter *writer) +{ +    double re; +    double im; +    char *re_buf = NULL;       /* buffer returned from PyOS_double_to_string */ +    char *im_buf = NULL;       /* buffer returned from PyOS_double_to_string */ + +    InternalFormatSpec tmp_format = *format; +    Py_ssize_t n_re_digits; +    Py_ssize_t n_im_digits; +    Py_ssize_t n_re_remainder; +    Py_ssize_t n_im_remainder; +    Py_ssize_t n_re_total; +    Py_ssize_t n_im_total; +    int re_has_decimal; +    int im_has_decimal; +    Py_ssize_t precision = format->precision; +    Py_ssize_t default_precision = 6; +    Py_UCS4 type = format->type; +    Py_ssize_t i_re; +    Py_ssize_t i_im; +    NumberFieldWidths re_spec; +    NumberFieldWidths im_spec; +    int flags = 0; +    int result = -1; +    Py_UCS4 maxchar = 127; +    enum PyUnicode_Kind rkind; +    void *rdata; +    Py_UCS4 re_sign_char = '\0'; +    Py_UCS4 im_sign_char = '\0'; +    int re_float_type; /* Used to see if we have a nan, inf, or regular float. */ +    int im_float_type; +    int add_parens = 0; +    int skip_re = 0; +    Py_ssize_t lpad; +    Py_ssize_t rpad; +    Py_ssize_t total; +    PyObject *re_unicode_tmp = NULL; +    PyObject *im_unicode_tmp = NULL; + +    /* Locale settings, either from the actual locale or +       from a hard-code pseudo-locale */ +    LocaleInfo locale = STATIC_LOCALE_INFO_INIT; + +    /* Zero padding is not allowed. */ +    if (format->fill_char == '0') { +        PyErr_SetString(PyExc_ValueError, +                        "Zero padding is not allowed in complex format " +                        "specifier"); +        goto done; +    } + +    /* Neither is '=' alignment . */ +    if (format->align == '=') { +        PyErr_SetString(PyExc_ValueError, +                        "'=' alignment flag is not allowed in complex format " +                        "specifier"); +        goto done; +    } + +    re = PyComplex_RealAsDouble(value); +    if (re == -1.0 && PyErr_Occurred()) +        goto done; +    im = PyComplex_ImagAsDouble(value); +    if (im == -1.0 && PyErr_Occurred()) +        goto done; + +    if (format->alternate) +        flags |= Py_DTSF_ALT; + +    if (type == '\0') { +        /* Omitted type specifier. Should be like str(self). */ +        type = 'r'; +        default_precision = 0; +        if (re == 0.0 && copysign(1.0, re) == 1.0) +            skip_re = 1; +        else +            add_parens = 1; +    } + +    if (type == 'n') +        /* 'n' is the same as 'g', except for the locale used to +           format the result. We take care of that later. */ +        type = 'g'; + +    if (precision < 0) +        precision = default_precision; +    else if (type == 'r') +        type = 'g'; + +    /* Cast "type", because if we're in unicode we need to pass a +       8-bit char. This is safe, because we've restricted what "type" +       can be. */ +    re_buf = PyOS_double_to_string(re, (char)type, precision, flags, +                                   &re_float_type); +    if (re_buf == NULL) +        goto done; +    im_buf = PyOS_double_to_string(im, (char)type, precision, flags, +                                   &im_float_type); +    if (im_buf == NULL) +        goto done; + +    n_re_digits = strlen(re_buf); +    n_im_digits = strlen(im_buf); + +    /* Since there is no unicode version of PyOS_double_to_string, +       just use the 8 bit version and then convert to unicode. */ +    re_unicode_tmp = _PyUnicode_FromASCII(re_buf, n_re_digits); +    if (re_unicode_tmp == NULL) +        goto done; +    i_re = 0; + +    im_unicode_tmp = _PyUnicode_FromASCII(im_buf, n_im_digits); +    if (im_unicode_tmp == NULL) +        goto done; +    i_im = 0; + +    /* Is a sign character present in the output?  If so, remember it +       and skip it */ +    if (PyUnicode_READ_CHAR(re_unicode_tmp, i_re) == '-') { +        re_sign_char = '-'; +        ++i_re; +        --n_re_digits; +    } +    if (PyUnicode_READ_CHAR(im_unicode_tmp, i_im) == '-') { +        im_sign_char = '-'; +        ++i_im; +        --n_im_digits; +    } + +    /* Determine if we have any "remainder" (after the digits, might include +       decimal or exponent or both (or neither)) */ +    parse_number(re_unicode_tmp, i_re, i_re + n_re_digits, +                 &n_re_remainder, &re_has_decimal); +    parse_number(im_unicode_tmp, i_im, i_im + n_im_digits, +                 &n_im_remainder, &im_has_decimal); + +    /* Determine the grouping, separator, and decimal point, if any. */ +    if (get_locale_info(format->type == 'n' ? LT_CURRENT_LOCALE : +                        (format->thousands_separators ? +                         LT_DEFAULT_LOCALE : +                         LT_NO_LOCALE), +                        &locale) == -1) +        goto done; + +    /* Turn off any padding. We'll do it later after we've composed +       the numbers without padding. */ +    tmp_format.fill_char = '\0'; +    tmp_format.align = '<'; +    tmp_format.width = -1; + +    /* Calculate how much memory we'll need. */ +    n_re_total = calc_number_widths(&re_spec, 0, re_sign_char, re_unicode_tmp, +                                    i_re, i_re + n_re_digits, n_re_remainder, +                                    re_has_decimal, &locale, &tmp_format, +                                    &maxchar); + +    /* Same formatting, but always include a sign, unless the real part is +     * going to be omitted, in which case we use whatever sign convention was +     * requested by the original format. */ +    if (!skip_re) +        tmp_format.sign = '+'; +    n_im_total = calc_number_widths(&im_spec, 0, im_sign_char, im_unicode_tmp, +                                    i_im, i_im + n_im_digits, n_im_remainder, +                                    im_has_decimal, &locale, &tmp_format, +                                    &maxchar); + +    if (skip_re) +        n_re_total = 0; + +    /* Add 1 for the 'j', and optionally 2 for parens. */ +    calc_padding(n_re_total + n_im_total + 1 + add_parens * 2, +                 format->width, format->align, &lpad, &rpad, &total); + +    if (lpad || rpad) +        maxchar = Py_MAX(maxchar, format->fill_char); + +    if (_PyUnicodeWriter_Prepare(writer, total, maxchar) == -1) +        goto done; +    rkind = writer->kind; +    rdata = writer->data; + +    /* Populate the memory. First, the padding. */ +    result = fill_padding(writer, +                          n_re_total + n_im_total + 1 + add_parens * 2, +                          format->fill_char=='\0' ? ' ' : format->fill_char, +                          lpad, rpad); +    if (result == -1) +        goto done; + +    if (add_parens) { +        PyUnicode_WRITE(rkind, rdata, writer->pos, '('); +        writer->pos++; +    } + +    if (!skip_re) { +        result = fill_number(writer, &re_spec, +                             re_unicode_tmp, i_re, i_re + n_re_digits, +                             NULL, 0, +                             0, +                             &locale, 0); +        if (result == -1) +            goto done; +    } +    result = fill_number(writer, &im_spec, +                         im_unicode_tmp, i_im, i_im + n_im_digits, +                         NULL, 0, +                         0, +                         &locale, 0); +    if (result == -1) +        goto done; +    PyUnicode_WRITE(rkind, rdata, writer->pos, 'j'); +    writer->pos++; + +    if (add_parens) { +        PyUnicode_WRITE(rkind, rdata, writer->pos, ')'); +        writer->pos++; +    } + +    writer->pos += rpad; + +done: +    PyMem_Free(re_buf); +    PyMem_Free(im_buf); +    Py_XDECREF(re_unicode_tmp); +    Py_XDECREF(im_unicode_tmp); +    free_locale_info(&locale); +    return result; +} + +/************************************************************************/ +/*********** built in formatters ****************************************/ +/************************************************************************/ +static int +format_obj(PyObject *obj, _PyUnicodeWriter *writer) +{ +    PyObject *str; +    int err; + +    str = PyObject_Str(obj); +    if (str == NULL) +        return -1; +    err = _PyUnicodeWriter_WriteStr(writer, str); +    Py_DECREF(str); +    return err; +} + +int +_PyUnicode_FormatAdvancedWriter(_PyUnicodeWriter *writer, +                                PyObject *obj, +                                PyObject *format_spec, +                                Py_ssize_t start, Py_ssize_t end) +{ +    InternalFormatSpec format; + +    assert(PyUnicode_Check(obj)); + +    /* check for the special case of zero length format spec, make +       it equivalent to str(obj) */ +    if (start == end) { +        if (PyUnicode_CheckExact(obj)) +            return _PyUnicodeWriter_WriteStr(writer, obj); +        else +            return format_obj(obj, writer); +    } + +    /* parse the format_spec */ +    if (!parse_internal_render_format_spec(format_spec, start, end, +                                           &format, 's', '<')) +        return -1; + +    /* type conversion? */ +    switch (format.type) { +    case 's': +        /* no type conversion needed, already a string.  do the formatting */ +        return format_string_internal(obj, &format, writer); +    default: +        /* unknown */ +        unknown_presentation_type(format.type, obj->ob_type->tp_name); +        return -1; +    } +} + +int +_PyLong_FormatAdvancedWriter(_PyUnicodeWriter *writer, +                             PyObject *obj, +                             PyObject *format_spec, +                             Py_ssize_t start, Py_ssize_t end) +{ +    PyObject *tmp = NULL, *str = NULL; +    InternalFormatSpec format; +    int result = -1; + +    /* check for the special case of zero length format spec, make +       it equivalent to str(obj) */ +    if (start == end) { +        if (PyLong_CheckExact(obj)) +            return _PyLong_FormatWriter(writer, obj, 10, 0); +        else +            return format_obj(obj, writer); +    } + +    /* parse the format_spec */ +    if (!parse_internal_render_format_spec(format_spec, start, end, +                                           &format, 'd', '>')) +        goto done; + +    /* type conversion? */ +    switch (format.type) { +    case 'b': +    case 'c': +    case 'd': +    case 'o': +    case 'x': +    case 'X': +    case 'n': +        /* no type conversion needed, already an int (or long).  do +           the formatting */ +        result = format_long_internal(obj, &format, writer); +        break; + +    case 'e': +    case 'E': +    case 'f': +    case 'F': +    case 'g': +    case 'G': +    case '%': +        /* convert to float */ +        tmp = PyNumber_Float(obj); +        if (tmp == NULL) +            goto done; +        result = format_float_internal(tmp, &format, writer); +        break; + +    default: +        /* unknown */ +        unknown_presentation_type(format.type, obj->ob_type->tp_name); +        goto done; +    } + +done: +    Py_XDECREF(tmp); +    Py_XDECREF(str); +    return result; +} + +int +_PyFloat_FormatAdvancedWriter(_PyUnicodeWriter *writer, +                              PyObject *obj, +                              PyObject *format_spec, +                              Py_ssize_t start, Py_ssize_t end) +{ +    InternalFormatSpec format; + +    /* check for the special case of zero length format spec, make +       it equivalent to str(obj) */ +    if (start == end) +        return format_obj(obj, writer); + +    /* parse the format_spec */ +    if (!parse_internal_render_format_spec(format_spec, start, end, +                                           &format, '\0', '>')) +        return -1; + +    /* type conversion? */ +    switch (format.type) { +    case '\0': /* No format code: like 'g', but with at least one decimal. */ +    case 'e': +    case 'E': +    case 'f': +    case 'F': +    case 'g': +    case 'G': +    case 'n': +    case '%': +        /* no conversion, already a float.  do the formatting */ +        return format_float_internal(obj, &format, writer); + +    default: +        /* unknown */ +        unknown_presentation_type(format.type, obj->ob_type->tp_name); +        return -1; +    } +} + +int +_PyComplex_FormatAdvancedWriter(_PyUnicodeWriter *writer, +                                PyObject *obj, +                                PyObject *format_spec, +                                Py_ssize_t start, Py_ssize_t end) +{ +    InternalFormatSpec format; + +    /* check for the special case of zero length format spec, make +       it equivalent to str(obj) */ +    if (start == end) +        return format_obj(obj, writer); + +    /* parse the format_spec */ +    if (!parse_internal_render_format_spec(format_spec, start, end, +                                           &format, '\0', '>')) +        return -1; + +    /* type conversion? */ +    switch (format.type) { +    case '\0': /* No format code: like 'g', but with at least one decimal. */ +    case 'e': +    case 'E': +    case 'f': +    case 'F': +    case 'g': +    case 'G': +    case 'n': +        /* no conversion, already a complex.  do the formatting */ +        return format_complex_internal(obj, &format, writer); + +    default: +        /* unknown */ +        unknown_presentation_type(format.type, obj->ob_type->tp_name); +        return -1; +    } +} diff --git a/Python/frozen.c b/Python/frozen.c index ddf6224e6d..25fdc17b3f 100644 --- a/Python/frozen.c +++ b/Python/frozen.c @@ -2,6 +2,7 @@  /* Dummy frozen modules initializer */  #include "Python.h" +#include "importlib.h"  /* In order to test the support for frozen modules, by default we     define a single frozen module, __hello__.  Loading it will print @@ -28,6 +29,8 @@ static unsigned char M___hello__[] = {  #define SIZE (int)sizeof(M___hello__)  static struct _frozen _PyImport_FrozenModules[] = { +    /* importlib */ +    {"_frozen_importlib", _Py_M__importlib, (int)sizeof(_Py_M__importlib)},      /* Test module */      {"__hello__", M___hello__, SIZE},      /* Test package (negative size indicates package-ness) */ diff --git a/Python/getargs.c b/Python/getargs.c index 0069671d3c..9f72fa4ebf 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -33,16 +33,33 @@ PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *,  #define FLAG_COMPAT 1  #define FLAG_SIZE_T 2 +typedef int (*destr_t)(PyObject *, void *); + + +/* Keep track of "objects" that have been allocated or initialized and +   which will need to be deallocated or cleaned up somehow if overall +   parsing fails. +*/ +typedef struct { +  void *item; +  destr_t destructor; +} freelistentry_t; + +typedef struct { +  int first_available; +  freelistentry_t *entries; +} freelist_t; +  /* Forward */  static int vgetargs1(PyObject *, const char *, va_list *, int);  static void seterror(int, const char *, int *, const char *, const char *);  static char *convertitem(PyObject *, const char **, va_list *, int, int *, -                         char *, size_t, PyObject **); +                         char *, size_t, freelist_t *);  static char *converttuple(PyObject *, const char **, va_list *, int, -                          int *, char *, size_t, int, PyObject **); +                          int *, char *, size_t, int, freelist_t *);  static char *convertsimple(PyObject *, const char **, va_list *, int, char *, -                           size_t, PyObject **); +                           size_t, freelist_t *);  static Py_ssize_t convertbuffer(PyObject *, void **p, char **);  static int getbuffer(PyObject *, Py_buffer *, char**); @@ -123,115 +140,54 @@ _PyArg_VaParse_SizeT(PyObject *args, char *format, va_list va)  /* Handle cleanup of allocated memory in case of exception */ -#define GETARGS_CAPSULE_NAME_CLEANUP_PTR "getargs.cleanup_ptr" -#define GETARGS_CAPSULE_NAME_CLEANUP_BUFFER "getargs.cleanup_buffer" -#define GETARGS_CAPSULE_NAME_CLEANUP_CONVERT "getargs.cleanup_convert" - -static void -cleanup_ptr(PyObject *self) +static int +cleanup_ptr(PyObject *self, void *ptr)  { -    void *ptr = PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_PTR);      if (ptr) {          PyMem_FREE(ptr);      } +    return 0;  } -static void -cleanup_buffer(PyObject *self) +static int +cleanup_buffer(PyObject *self, void *ptr)  { -    Py_buffer *ptr = (Py_buffer *)PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_BUFFER); -    if (ptr) { -        PyBuffer_Release(ptr); +    Py_buffer *buf = (Py_buffer *)ptr; +    if (buf) { +        PyBuffer_Release(buf);      } +    return 0;  }  static int -addcleanup(void *ptr, PyObject **freelist, int is_buffer) +addcleanup(void *ptr, freelist_t *freelist, destr_t destructor)  { -    PyObject *cobj; -    const char *name; -    PyCapsule_Destructor destr; - -    if (is_buffer) { -        destr = cleanup_buffer; -        name = GETARGS_CAPSULE_NAME_CLEANUP_BUFFER; -    } else { -        destr = cleanup_ptr; -        name = GETARGS_CAPSULE_NAME_CLEANUP_PTR; -    } - -    if (!*freelist) { -        *freelist = PyList_New(0); -        if (!*freelist) { -            destr(ptr); -            return -1; -        } -    } +    int index; -    cobj = PyCapsule_New(ptr, name, destr); -    if (!cobj) { -        destr(ptr); -        return -1; -    } -    if (PyList_Append(*freelist, cobj)) { -        Py_DECREF(cobj); -        return -1; -    } -    Py_DECREF(cobj); -    return 0; -} +    index = freelist->first_available; +    freelist->first_available += 1; -static void -cleanup_convert(PyObject *self) -{ -    typedef int (*destr_t)(PyObject *, void *); -    destr_t destr = (destr_t)PyCapsule_GetContext(self); -    void *ptr = PyCapsule_GetPointer(self, -                                     GETARGS_CAPSULE_NAME_CLEANUP_CONVERT); -    if (ptr && destr) -        destr(NULL, ptr); -} +    freelist->entries[index].item = ptr; +    freelist->entries[index].destructor = destructor; -static int -addcleanup_convert(void *ptr, PyObject **freelist, int (*destr)(PyObject*,void*)) -{ -    PyObject *cobj; -    if (!*freelist) { -        *freelist = PyList_New(0); -        if (!*freelist) { -            destr(NULL, ptr); -            return -1; -        } -    } -    cobj = PyCapsule_New(ptr, GETARGS_CAPSULE_NAME_CLEANUP_CONVERT, -                         cleanup_convert); -    if (!cobj) { -        destr(NULL, ptr); -        return -1; -    } -    if (PyCapsule_SetContext(cobj, destr) == -1) { -        /* This really should not happen. */ -        Py_FatalError("capsule refused setting of context."); -    } -    if (PyList_Append(*freelist, cobj)) { -        Py_DECREF(cobj); /* This will also call destr. */ -        return -1; -    } -    Py_DECREF(cobj);      return 0;  }  static int -cleanreturn(int retval, PyObject *freelist) +cleanreturn(int retval, freelist_t *freelist)  { -    if (freelist && retval != 0) { -        /* We were successful, reset the destructors so that they -           don't get called. */ -        Py_ssize_t len = PyList_GET_SIZE(freelist), i; -        for (i = 0; i < len; i++) -            PyCapsule_SetDestructor(PyList_GET_ITEM(freelist, i), NULL); -    } -    Py_XDECREF(freelist); +    int index; + +    if (retval == 0) { +      /* A failure occurred, therefore execute all of the cleanup +         functions. +      */ +      for (index = 0; index < freelist->first_available; ++index) { +          freelist->entries[index].destructor(NULL, +                                              freelist->entries[index].item); +      } +    } +    PyMem_FREE(freelist->entries);      return retval;  } @@ -250,7 +206,7 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)      const char *formatsave = format;      Py_ssize_t i, len;      char *msg; -    PyObject *freelist = NULL; +    freelist_t freelist = {0, NULL};      int compat = flags & FLAG_COMPAT;      assert(compat || (args != (PyObject*)NULL)); @@ -306,64 +262,66 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)      format = formatsave; +    freelist.entries = PyMem_NEW(freelistentry_t, max); +    if (freelist.entries == NULL) { +        PyErr_NoMemory(); +        return 0; +    } +      if (compat) {          if (max == 0) {              if (args == NULL)                  return 1; -            PyOS_snprintf(msgbuf, sizeof(msgbuf), -                          "%.200s%s takes no arguments", -                          fname==NULL ? "function" : fname, -                          fname==NULL ? "" : "()"); -            PyErr_SetString(PyExc_TypeError, msgbuf); -            return 0; +            PyErr_Format(PyExc_TypeError, +                         "%.200s%s takes no arguments", +                         fname==NULL ? "function" : fname, +                         fname==NULL ? "" : "()"); +            return cleanreturn(0, &freelist);          }          else if (min == 1 && max == 1) {              if (args == NULL) { -                PyOS_snprintf(msgbuf, sizeof(msgbuf), -                      "%.200s%s takes at least one argument", -                          fname==NULL ? "function" : fname, -                          fname==NULL ? "" : "()"); -                PyErr_SetString(PyExc_TypeError, msgbuf); -                return 0; +                PyErr_Format(PyExc_TypeError, +                             "%.200s%s takes at least one argument", +                             fname==NULL ? "function" : fname, +                             fname==NULL ? "" : "()"); +                return cleanreturn(0, &freelist);              }              msg = convertitem(args, &format, p_va, flags, levels,                                msgbuf, sizeof(msgbuf), &freelist);              if (msg == NULL) -                return cleanreturn(1, freelist); +                return cleanreturn(1, &freelist);              seterror(levels[0], msg, levels+1, fname, message); -            return cleanreturn(0, freelist); +            return cleanreturn(0, &freelist);          }          else {              PyErr_SetString(PyExc_SystemError,                  "old style getargs format uses new features"); -            return 0; +            return cleanreturn(0, &freelist);          }      }      if (!PyTuple_Check(args)) {          PyErr_SetString(PyExc_SystemError,              "new style getargs format but argument is not a tuple"); -        return 0; +        return cleanreturn(0, &freelist);      }      len = PyTuple_GET_SIZE(args);      if (len < min || max < len) { -        if (message == NULL) { -            PyOS_snprintf(msgbuf, sizeof(msgbuf), -                          "%.150s%s takes %s %d argument%s " -                          "(%ld given)", -                          fname==NULL ? "function" : fname, -                          fname==NULL ? "" : "()", -                          min==max ? "exactly" -                          : len < min ? "at least" : "at most", -                          len < min ? min : max, -                          (len < min ? min : max) == 1 ? "" : "s", -                          Py_SAFE_DOWNCAST(len, Py_ssize_t, long)); -            message = msgbuf; -        } -        PyErr_SetString(PyExc_TypeError, message); -        return 0; +        if (message == NULL) +            PyErr_Format(PyExc_TypeError, +                         "%.150s%s takes %s %d argument%s (%ld given)", +                         fname==NULL ? "function" : fname, +                         fname==NULL ? "" : "()", +                         min==max ? "exactly" +                         : len < min ? "at least" : "at most", +                         len < min ? min : max, +                         (len < min ? min : max) == 1 ? "" : "s", +                         Py_SAFE_DOWNCAST(len, Py_ssize_t, long)); +        else +            PyErr_SetString(PyExc_TypeError, message); +        return cleanreturn(0, &freelist);      }      for (i = 0; i < len; i++) { @@ -374,7 +332,7 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)                            sizeof(msgbuf), &freelist);          if (msg) {              seterror(i+1, msg, levels, fname, msg); -            return cleanreturn(0, freelist); +            return cleanreturn(0, &freelist);          }      } @@ -383,10 +341,10 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)          *format != '|' && *format != ':' && *format != ';') {          PyErr_Format(PyExc_SystemError,                       "bad format string: %.200s", formatsave); -        return cleanreturn(0, freelist); +        return cleanreturn(0, &freelist);      } -    return cleanreturn(1, freelist); +    return cleanreturn(1, &freelist);  } @@ -450,7 +408,7 @@ seterror(int iarg, const char *msg, int *levels, const char *fname,  static char *  converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,               int *levels, char *msgbuf, size_t bufsize, int toplevel, -             PyObject **freelist) +             freelist_t *freelist)  {      int level = 0;      int n = 0; @@ -525,7 +483,7 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,  static char *  convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags, -            int *levels, char *msgbuf, size_t bufsize, PyObject **freelist) +            int *levels, char *msgbuf, size_t bufsize, freelist_t *freelist)  {      char *msg;      const char *format = *p_format; @@ -550,9 +508,6 @@ convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags, -#define UNICODE_DEFAULT_ENCODING(arg) \ -    _PyUnicode_AsDefaultEncodedString(arg, NULL) -  /* Format an error message generated by convertsimple(). */  static char * @@ -593,7 +548,7 @@ float_argument_error(PyObject *arg)  static char *  convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, -              char *msgbuf, size_t bufsize, PyObject **freelist) +              char *msgbuf, size_t bufsize, freelist_t *freelist)  {      /* For # codes */  #define FETCH_SIZE      int *q=NULL;Py_ssize_t *q2=NULL;\ @@ -615,7 +570,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,      const char *format = *p_format;      char c = *format++; -    PyObject *uarg; +    char *sarg;      switch (c) { @@ -832,6 +787,8 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,          char *p = va_arg(*p_va, char *);          if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)              *p = PyBytes_AS_STRING(arg)[0]; +        else if (PyByteArray_Check(arg) && PyByteArray_Size(arg) == 1) +            *p = PyByteArray_AS_STRING(arg)[0];          else              return converterr("a byte string of length 1", arg, msgbuf, bufsize);          break; @@ -839,11 +796,33 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,      case 'C': {/* unicode char */          int *p = va_arg(*p_va, int *); -        if (PyUnicode_Check(arg) && -            PyUnicode_GET_SIZE(arg) == 1) -            *p = PyUnicode_AS_UNICODE(arg)[0]; -        else +        int kind; +        void *data; + +        if (!PyUnicode_Check(arg))              return converterr("a unicode character", arg, msgbuf, bufsize); + +        if (PyUnicode_READY(arg)) +            RETURN_ERR_OCCURRED; + +        if (PyUnicode_GET_LENGTH(arg) != 1) +            return converterr("a unicode character", arg, msgbuf, bufsize); + +        kind = PyUnicode_KIND(arg); +        data = PyUnicode_DATA(arg); +        *p = PyUnicode_READ(kind, data, 0); +        break; +    } + +    case 'p': {/* boolean *p*redicate */ +        int *p = va_arg(*p_va, int *); +        int val = PyObject_IsTrue(arg); +        if (val > 0) +            *p = 1; +        else if (val == 0) +            *p = 0; +        else +            RETURN_ERR_OCCURRED;          break;      } @@ -858,7 +837,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,              if (getbuffer(arg, (Py_buffer*)p, &buf) < 0)                  return converterr(buf, arg, msgbuf, bufsize);              format++; -            if (addcleanup(p, freelist, 1)) { +            if (addcleanup(p, freelist, cleanup_buffer)) {                  return converterr(                      "(cleanup problem)",                      arg, msgbuf, bufsize); @@ -891,20 +870,19 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,              if (c == 'z' && arg == Py_None)                  PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0);              else if (PyUnicode_Check(arg)) { -                uarg = UNICODE_DEFAULT_ENCODING(arg); -                if (uarg == NULL) +                Py_ssize_t len; +                sarg = PyUnicode_AsUTF8AndSize(arg, &len); +                if (sarg == NULL)                      return converterr(CONV_UNICODE,                                        arg, msgbuf, bufsize); -                PyBuffer_FillInfo(p, arg, -                                  PyBytes_AS_STRING(uarg), PyBytes_GET_SIZE(uarg), -                                  1, 0); +                PyBuffer_FillInfo(p, arg, sarg, len, 1, 0);              }              else { /* any buffer-like object */                  char *buf;                  if (getbuffer(arg, p, &buf) < 0)                      return converterr(buf, arg, msgbuf, bufsize);              } -            if (addcleanup(p, freelist, 1)) { +            if (addcleanup(p, freelist, cleanup_buffer)) {                  return converterr(                      "(cleanup problem)",                      arg, msgbuf, bufsize); @@ -920,12 +898,13 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,                  STORE_SIZE(0);              }              else if (PyUnicode_Check(arg)) { -                uarg = UNICODE_DEFAULT_ENCODING(arg); -                if (uarg == NULL) +                Py_ssize_t len; +                sarg = PyUnicode_AsUTF8AndSize(arg, &len); +                if (sarg == NULL)                      return converterr(CONV_UNICODE,                                        arg, msgbuf, bufsize); -                *p = PyBytes_AS_STRING(uarg); -                STORE_SIZE(PyBytes_GET_SIZE(uarg)); +                *p = sarg; +                STORE_SIZE(len);              }              else { /* any buffer-like object */                  /* XXX Really? */ @@ -939,25 +918,25 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,          } else {              /* "s" or "z" */              char **p = va_arg(*p_va, char **); -            uarg = NULL; +            Py_ssize_t len; +            sarg = NULL;              if (c == 'z' && arg == Py_None)                  *p = NULL;              else if (PyUnicode_Check(arg)) { -                uarg = UNICODE_DEFAULT_ENCODING(arg); -                if (uarg == NULL) +                sarg = PyUnicode_AsUTF8AndSize(arg, &len); +                if (sarg == NULL)                      return converterr(CONV_UNICODE,                                        arg, msgbuf, bufsize); -                *p = PyBytes_AS_STRING(uarg); +                *p = sarg;              }              else                  return converterr(c == 'z' ? "str or None" : "str",                                    arg, msgbuf, bufsize); -            if (*p != NULL && uarg != NULL && -                (Py_ssize_t) strlen(*p) != PyBytes_GET_SIZE(uarg)) +            if (*p != NULL && sarg != NULL && (Py_ssize_t) strlen(*p) != len)                  return converterr( -                    c == 'z' ? "str without null bytes or None" -                             : "str without null bytes", +                    c == 'z' ? "str without null characters or None" +                             : "str without null characters",                      arg, msgbuf, bufsize);          }          break; @@ -966,9 +945,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,      case 'u': /* raw unicode buffer (Py_UNICODE *) */      case 'Z': /* raw unicode buffer or None */      { +        Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); +          if (*format == '#') { /* any buffer-like object */              /* "s#" or "Z#" */ -            Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);              FETCH_SIZE;              if (c == 'Z' && arg == Py_None) { @@ -976,23 +956,27 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,                  STORE_SIZE(0);              }              else if (PyUnicode_Check(arg)) { -                *p = PyUnicode_AS_UNICODE(arg); -                STORE_SIZE(PyUnicode_GET_SIZE(arg)); +                Py_ssize_t len; +                *p = PyUnicode_AsUnicodeAndSize(arg, &len); +                if (*p == NULL) +                    RETURN_ERR_OCCURRED; +                STORE_SIZE(len);              }              else                  return converterr("str or None", arg, msgbuf, bufsize);              format++;          } else {              /* "s" or "Z" */ -            Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); -              if (c == 'Z' && arg == Py_None)                  *p = NULL;              else if (PyUnicode_Check(arg)) { -                *p = PyUnicode_AS_UNICODE(arg); -                if (Py_UNICODE_strlen(*p) != PyUnicode_GET_SIZE(arg)) +                Py_ssize_t len; +                *p = PyUnicode_AsUnicodeAndSize(arg, &len); +                if (*p == NULL) +                    RETURN_ERR_OCCURRED; +                if (Py_UNICODE_strlen(*p) != len)                      return converterr( -                        "str without null character or None", +                        "str without null characters or None",                          arg, msgbuf, bufsize);              } else                  return converterr(c == 'Z' ? "str or None" : "str", @@ -1110,7 +1094,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,                      PyErr_NoMemory();                      RETURN_ERR_OCCURRED;                  } -                if (addcleanup(*buffer, freelist, 0)) { +                if (addcleanup(*buffer, freelist, cleanup_ptr)) {                      Py_DECREF(s);                      return converterr(                          "(cleanup problem)", @@ -1152,7 +1136,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,                  PyErr_NoMemory();                  RETURN_ERR_OCCURRED;              } -            if (addcleanup(*buffer, freelist, 0)) { +            if (addcleanup(*buffer, freelist, cleanup_ptr)) {                  Py_DECREF(s);                  return converterr("(cleanup problem)",                                  arg, msgbuf, bufsize); @@ -1183,8 +1167,11 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,      case 'U': { /* PyUnicode object */          PyObject **p = va_arg(*p_va, PyObject **); -        if (PyUnicode_Check(arg)) +        if (PyUnicode_Check(arg)) { +            if (PyUnicode_READY(arg) == -1) +                RETURN_ERR_OCCURRED;              *p = arg; +        }          else              return converterr("str", arg, msgbuf, bufsize);          break; @@ -1213,7 +1200,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,                  return converterr("(unspecified)",                                    arg, msgbuf, bufsize);              if (res == Py_CLEANUP_SUPPORTED && -                addcleanup_convert(addr, freelist, convert) == -1) +                addcleanup(addr, freelist, convert) == -1)                  return converterr("(cleanup problem)",                                  arg, msgbuf, bufsize);          } @@ -1244,7 +1231,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,              PyBuffer_Release((Py_buffer*)p);              return converterr("contiguous buffer", arg, msgbuf, bufsize);          } -        if (addcleanup(p, freelist, 1)) { +        if (addcleanup(p, freelist, cleanup_buffer)) {              return converterr(                  "(cleanup problem)",                  arg, msgbuf, bufsize); @@ -1431,8 +1418,10 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,      int levels[32];      const char *fname, *msg, *custom_msg, *keyword;      int min = INT_MAX; +    int max = INT_MAX;      int i, len, nargs, nkeywords; -    PyObject *freelist = NULL, *current_arg; +    PyObject *current_arg; +    freelist_t freelist = {0, NULL};      assert(args != NULL && PyTuple_Check(args));      assert(keywords == NULL || PyDict_Check(keywords)); @@ -1456,31 +1445,68 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,      for (len=0; kwlist[len]; len++)          continue; +    freelist.entries = PyMem_NEW(freelistentry_t, len); +    if (freelist.entries == NULL) { +        PyErr_NoMemory(); +        return 0; +    } +      nargs = PyTuple_GET_SIZE(args);      nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords);      if (nargs + nkeywords > len) { -        PyErr_Format(PyExc_TypeError, "%s%s takes at most %d " -                     "argument%s (%d given)", +        PyErr_Format(PyExc_TypeError, +                     "%s%s takes at most %d argument%s (%d given)",                       (fname == NULL) ? "function" : fname,                       (fname == NULL) ? "" : "()",                       len,                       (len == 1) ? "" : "s",                       nargs + nkeywords); -        return 0; +        return cleanreturn(0, &freelist);      }      /* convert tuple args and keyword args in same loop, using kwlist to drive process */      for (i = 0; i < len; i++) {          keyword = kwlist[i];          if (*format == '|') { +            if (min != INT_MAX) { +                PyErr_SetString(PyExc_RuntimeError, +                                "Invalid format string (| specified twice)"); +                return cleanreturn(0, &freelist); +            } +              min = i;              format++; + +            if (max != INT_MAX) { +                PyErr_SetString(PyExc_RuntimeError, +                                "Invalid format string ($ before |)"); +                return cleanreturn(0, &freelist); +            } +        } +        if (*format == '$') { +            if (max != INT_MAX) { +                PyErr_SetString(PyExc_RuntimeError, +                                "Invalid format string ($ specified twice)"); +                return cleanreturn(0, &freelist); +            } + +            max = i; +            format++; + +            if (max < nargs) { +                PyErr_Format(PyExc_TypeError, +                             "Function takes %s %d positional arguments" +                             " (%d given)", +                             (min != INT_MAX) ? "at most" : "exactly", +                             max, nargs); +                return cleanreturn(0, &freelist); +            }          }          if (IS_END_OF_FORMAT(*format)) {              PyErr_Format(PyExc_RuntimeError,                           "More keyword list entries (%d) than "                           "format specifiers (%d)", len, i); -            return cleanreturn(0, freelist); +            return cleanreturn(0, &freelist);          }          current_arg = NULL;          if (nkeywords) { @@ -1494,11 +1520,11 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,                               "Argument given by name ('%s') "                               "and position (%d)",                               keyword, i+1); -                return cleanreturn(0, freelist); +                return cleanreturn(0, &freelist);              }          }          else if (nkeywords && PyErr_Occurred()) -            return cleanreturn(0, freelist); +            return cleanreturn(0, &freelist);          else if (i < nargs)              current_arg = PyTuple_GET_ITEM(args, i); @@ -1507,7 +1533,7 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,                  levels, msgbuf, sizeof(msgbuf), &freelist);              if (msg) {                  seterror(i+1, msg, levels, fname, custom_msg); -                return cleanreturn(0, freelist); +                return cleanreturn(0, &freelist);              }              continue;          } @@ -1516,14 +1542,14 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,              PyErr_Format(PyExc_TypeError, "Required argument "                           "'%s' (pos %d) not found",                           keyword, i+1); -            return cleanreturn(0, freelist); +            return cleanreturn(0, &freelist);          }          /* current code reports success when all required args           * fulfilled and no keyword args left, with no further           * validation. XXX Maybe skip this in debug build ?           */          if (!nkeywords) -            return cleanreturn(1, freelist); +            return cleanreturn(1, &freelist);          /* We are into optional args, skip thru to any remaining           * keyword args */ @@ -1531,15 +1557,15 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,          if (msg) {              PyErr_Format(PyExc_RuntimeError, "%s: '%s'", msg,                           format); -            return cleanreturn(0, freelist); +            return cleanreturn(0, &freelist);          }      } -    if (!IS_END_OF_FORMAT(*format) && *format != '|') { +    if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) {          PyErr_Format(PyExc_RuntimeError,              "more argument specifiers than keyword list entries "              "(remaining format:'%s')", format); -        return cleanreturn(0, freelist); +        return cleanreturn(0, &freelist);      }      /* make sure there are no extraneous keyword arguments */ @@ -1552,7 +1578,7 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,              if (!PyUnicode_Check(key)) {                  PyErr_SetString(PyExc_TypeError,                                  "keywords must be strings"); -                return cleanreturn(0, freelist); +                return cleanreturn(0, &freelist);              }              /* check that _PyUnicode_AsString() result is not NULL */              ks = _PyUnicode_AsString(key); @@ -1569,12 +1595,12 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,                               "'%U' is an invalid keyword "                               "argument for this function",                               key); -                return cleanreturn(0, freelist); +                return cleanreturn(0, &freelist);              }          }      } -    return cleanreturn(1, freelist); +    return cleanreturn(1, &freelist);  } @@ -1586,8 +1612,10 @@ skipitem(const char **p_format, va_list *p_va, int flags)      switch (c) { -    /* simple codes -     * The individual types (second arg of va_arg) are irrelevant */ +    /* +     * codes that take a single data pointer as an argument +     * (the type of the pointer is irrelevant) +     */      case 'b': /* byte -- very short int */      case 'B': /* byte as bitfield */ @@ -1601,22 +1629,21 @@ skipitem(const char **p_format, va_list *p_va, int flags)      case 'L': /* PY_LONG_LONG */      case 'K': /* PY_LONG_LONG sized bitfield */  #endif +    case 'n': /* Py_ssize_t */      case 'f': /* float */      case 'd': /* double */      case 'D': /* complex double */      case 'c': /* char */      case 'C': /* unicode char */ +    case 'p': /* boolean predicate */ +    case 'S': /* string object */ +    case 'Y': /* string object */ +    case 'U': /* unicode string object */          {              (void) va_arg(*p_va, void *);              break;          } -    case 'n': /* Py_ssize_t */ -        { -            (void) va_arg(*p_va, Py_ssize_t *); -            break; -        } -      /* string codes */      case 'e': /* string with encoding */ @@ -1649,16 +1676,6 @@ skipitem(const char **p_format, va_list *p_va, int flags)              break;          } -    /* object codes */ - -    case 'S': /* string object */ -    case 'Y': /* string object */ -    case 'U': /* unicode string object */ -        { -            (void) va_arg(*p_va, PyObject **); -            break; -        } -      case 'O': /* object */          {              if (*format == '!') { diff --git a/Python/getcopyright.c b/Python/getcopyright.c index d1e2578747..d83c6da1a2 100644 --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -19,5 +19,5 @@ All Rights Reserved.";  const char *  Py_GetCopyright(void)  { -	return cprt; +    return cprt;  } diff --git a/Python/graminit.c b/Python/graminit.c index cabc4d63b3..e04999bbff 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -1791,7 +1791,7 @@ static arc arcs_80_0[1] = {      {167, 1},  };  static arc arcs_80_1[2] = { -    {9, 2}, +    {168, 2},      {0, 1},  };  static arc arcs_80_2[1] = { @@ -1802,171 +1802,188 @@ static state states_80[3] = {      {2, arcs_80_1},      {1, arcs_80_2},  }; -static dfa dfas[81] = { +static arc arcs_81_0[2] = { +    {73, 1}, +    {9, 2}, +}; +static arc arcs_81_1[1] = { +    {24, 2}, +}; +static arc arcs_81_2[1] = { +    {0, 2}, +}; +static state states_81[3] = { +    {2, arcs_81_0}, +    {1, arcs_81_1}, +    {1, arcs_81_2}, +}; +static dfa dfas[82] = {      {256, "single_input", 0, 3, states_0, -     "\004\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204"}, +     "\004\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"},      {257, "file_input", 0, 2, states_1, -     "\204\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204"}, +     "\204\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"},      {258, "eval_input", 0, 3, states_2, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {259, "decorator", 0, 7, states_3, -     "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {260, "decorators", 0, 2, states_4, -     "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {261, "decorated", 0, 3, states_5, -     "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {262, "funcdef", 0, 8, states_6, -     "\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {263, "parameters", 0, 4, states_7, -     "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {264, "typedargslist", 0, 18, states_8, -     "\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {265, "tfpdef", 0, 4, states_9, -     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {266, "varargslist", 0, 18, states_10, -     "\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\040\200\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {267, "vfpdef", 0, 2, states_11, -     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {268, "stmt", 0, 2, states_12, -     "\000\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204"}, +     "\000\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"},      {269, "simple_stmt", 0, 4, states_13, -     "\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200"}, +     "\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"},      {270, "small_stmt", 0, 2, states_14, -     "\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200"}, +     "\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"},      {271, "expr_stmt", 0, 6, states_15, -     "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {272, "testlist_star_expr", 0, 3, states_16, -     "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {273, "augassign", 0, 2, states_17, -     "\000\000\000\000\000\000\376\037\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\376\037\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {274, "del_stmt", 0, 3, states_18, -     "\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {275, "pass_stmt", 0, 2, states_19, -     "\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {276, "flow_stmt", 0, 2, states_20, -     "\000\000\000\000\000\000\000\000\340\001\000\000\000\000\000\000\000\000\000\000\200"}, +     "\000\000\000\000\000\000\000\000\340\001\000\000\000\000\000\000\000\000\000\000\200\000"},      {277, "break_stmt", 0, 2, states_21, -     "\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {278, "continue_stmt", 0, 2, states_22, -     "\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {279, "return_stmt", 0, 3, states_23, -     "\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {280, "yield_stmt", 0, 2, states_24, -     "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200"}, +     "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"},      {281, "raise_stmt", 0, 5, states_25, -     "\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000"},      {282, "import_stmt", 0, 2, states_26, -     "\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000\000"},      {283, "import_name", 0, 3, states_27, -     "\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000"},      {284, "import_from", 0, 8, states_28, -     "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000"},      {285, "import_as_name", 0, 4, states_29, -     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {286, "dotted_as_name", 0, 4, states_30, -     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {287, "import_as_names", 0, 3, states_31, -     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {288, "dotted_as_names", 0, 2, states_32, -     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {289, "dotted_name", 0, 2, states_33, -     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {290, "global_stmt", 0, 3, states_34, -     "\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000"},      {291, "nonlocal_stmt", 0, 3, states_35, -     "\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000"},      {292, "assert_stmt", 0, 5, states_36, -     "\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000"},      {293, "compound_stmt", 0, 2, states_37, -     "\000\010\020\000\000\000\000\000\000\000\000\220\045\000\000\000\000\000\000\000\004"}, +     "\000\010\020\000\000\000\000\000\000\000\000\220\045\000\000\000\000\000\000\000\004\000"},      {294, "if_stmt", 0, 8, states_38, -     "\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"},      {295, "while_stmt", 0, 8, states_39, -     "\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000"},      {296, "for_stmt", 0, 10, states_40, -     "\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"},      {297, "try_stmt", 0, 13, states_41, -     "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000"},      {298, "with_stmt", 0, 5, states_42, -     "\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000"},      {299, "with_item", 0, 4, states_43, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {300, "except_clause", 0, 5, states_44, -     "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"},      {301, "suite", 0, 5, states_45, -     "\004\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200"}, +     "\004\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"},      {302, "test", 0, 6, states_46, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {303, "test_nocond", 0, 2, states_47, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {304, "lambdef", 0, 5, states_48, -     "\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000"},      {305, "lambdef_nocond", 0, 5, states_49, -     "\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000"},      {306, "or_test", 0, 2, states_50, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"},      {307, "and_test", 0, 2, states_51, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"},      {308, "not_test", 0, 3, states_52, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"},      {309, "comparison", 0, 2, states_53, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},      {310, "comp_op", 0, 4, states_54, -     "\000\000\000\000\000\000\000\000\000\000\000\000\002\000\220\177\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\000\002\000\220\177\000\000\000\000\000\000"},      {311, "star_expr", 0, 3, states_55, -     "\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {312, "expr", 0, 2, states_56, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},      {313, "xor_expr", 0, 2, states_57, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},      {314, "and_expr", 0, 2, states_58, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},      {315, "shift_expr", 0, 2, states_59, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},      {316, "arith_expr", 0, 2, states_60, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},      {317, "term", 0, 2, states_61, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},      {318, "factor", 0, 3, states_62, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},      {319, "power", 0, 4, states_63, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000\000"},      {320, "atom", 0, 9, states_64, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000\000"},      {321, "testlist_comp", 0, 5, states_65, -     "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {322, "trailer", 0, 7, states_66, -     "\000\040\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\020\000\000"}, +     "\000\040\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\020\000\000\000"},      {323, "subscriptlist", 0, 3, states_67, -     "\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {324, "subscript", 0, 5, states_68, -     "\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {325, "sliceop", 0, 3, states_69, -     "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {326, "exprlist", 0, 3, states_70, -     "\000\040\040\200\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000"}, +     "\000\040\040\200\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"},      {327, "testlist", 0, 3, states_71, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {328, "dictorsetmaker", 0, 11, states_72, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {329, "classdef", 0, 8, states_73, -     "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004"}, +     "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000"},      {330, "arglist", 0, 8, states_74, -     "\000\040\040\200\001\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\200\001\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {331, "argument", 0, 4, states_75, -     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000"}, +     "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"},      {332, "comp_iter", 0, 2, states_76, -     "\000\000\000\000\000\000\000\000\000\000\000\020\001\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\020\001\000\000\000\000\000\000\000\000\000"},      {333, "comp_for", 0, 6, states_77, -     "\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"},      {334, "comp_if", 0, 4, states_78, -     "\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000"}, +     "\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"},      {335, "encoding_decl", 0, 2, states_79, -     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, +     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},      {336, "yield_expr", 0, 3, states_80, -     "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200"}, +     "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"}, +    {337, "yield_arg", 0, 3, states_81, +     "\000\040\040\000\000\000\000\000\000\202\000\000\000\200\020\000\000\206\120\076\000\000"},  }; -static label labels[168] = { +static label labels[169] = {      {0, "EMPTY"},      {256, 0},      {4, 0}, @@ -2135,10 +2152,11 @@ static label labels[168] = {      {334, 0},      {335, 0},      {1, "yield"}, +    {337, 0},  };  grammar _PyParser_Grammar = { -    81, +    82,      dfas, -    {168, labels}, +    {169, labels},      256  }; diff --git a/Python/import.c b/Python/import.c index beb0eecb5a..2f71b97bc8 100644 --- a/Python/import.c +++ b/Python/import.c @@ -8,6 +8,7 @@  #include "errcode.h"  #include "marshal.h"  #include "code.h" +#include "frameobject.h"  #include "osdefs.h"  #include "importdl.h" @@ -26,176 +27,38 @@ typedef unsigned short mode_t;  #endif -/* Magic word to reject .pyc files generated by other Python versions. -   It should change for each incompatible change to the bytecode. - -   The value of CR and LF is incorporated so if you ever read or write -   a .pyc file in text mode the magic number will be wrong; also, the -   Apple MPW compiler swaps their values, botching string constants. - -   The magic numbers must be spaced apart at least 2 values, as the -   -U interpeter flag will cause MAGIC+1 being used. They have been -   odd numbers for some time now. - -   There were a variety of old schemes for setting the magic number. -   The current working scheme is to increment the previous value by -   10. - -   Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic -   number also includes a new "magic tag", i.e. a human readable string used -   to represent the magic number in __pycache__ directories.  When you change -   the magic number, you must also set a new unique magic tag.  Generally this -   can be named after the Python major version of the magic number bump, but -   it can really be anything, as long as it's different than anything else -   that's come before.  The tags are included in the following table, starting -   with Python 3.2a0. - -   Known values: -       Python 1.5:   20121 -       Python 1.5.1: 20121 -       Python 1.5.2: 20121 -       Python 1.6:   50428 -       Python 2.0:   50823 -       Python 2.0.1: 50823 -       Python 2.1:   60202 -       Python 2.1.1: 60202 -       Python 2.1.2: 60202 -       Python 2.2:   60717 -       Python 2.3a0: 62011 -       Python 2.3a0: 62021 -       Python 2.3a0: 62011 (!) -       Python 2.4a0: 62041 -       Python 2.4a3: 62051 -       Python 2.4b1: 62061 -       Python 2.5a0: 62071 -       Python 2.5a0: 62081 (ast-branch) -       Python 2.5a0: 62091 (with) -       Python 2.5a0: 62092 (changed WITH_CLEANUP opcode) -       Python 2.5b3: 62101 (fix wrong code: for x, in ...) -       Python 2.5b3: 62111 (fix wrong code: x += yield) -       Python 2.5c1: 62121 (fix wrong lnotab with for loops and -                            storing constants that should have been removed) -       Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp) -       Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode) -       Python 2.6a1: 62161 (WITH_CLEANUP optimization) -       Python 3000:   3000 -                      3010 (removed UNARY_CONVERT) -                      3020 (added BUILD_SET) -                      3030 (added keyword-only parameters) -                      3040 (added signature annotations) -                      3050 (print becomes a function) -                      3060 (PEP 3115 metaclass syntax) -                      3061 (string literals become unicode) -                      3071 (PEP 3109 raise changes) -                      3081 (PEP 3137 make __file__ and __name__ unicode) -                      3091 (kill str8 interning) -                      3101 (merge from 2.6a0, see 62151) -                      3103 (__file__ points to source file) -       Python 3.0a4: 3111 (WITH_CLEANUP optimization). -       Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT) -       Python 3.1a0: 3141 (optimize list, set and dict comprehensions: -               change LIST_APPEND and SET_ADD, add MAP_ADD) -       Python 3.1a0: 3151 (optimize conditional branches: -               introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE) -       Python 3.2a0: 3160 (add SETUP_WITH) -                     tag: cpython-32 -       Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR) -                     tag: cpython-32 -       Python 3.2a2  3180 (add DELETE_DEREF) -*/ - -/* MAGIC must change whenever the bytecode emitted by the compiler may no -   longer be understood by older implementations of the eval loop (usually -   due to the addition of new opcodes) -   TAG must change for each major Python release. The magic number will take -   care of any bytecode changes that occur during development. -*/ -#define MAGIC (3180 | ((long)'\r'<<16) | ((long)'\n'<<24)) -#define TAG "cpython-32"  #define CACHEDIR "__pycache__" -/* Current magic word and string tag as globals. */ -static long pyc_magic = MAGIC; -static const char *pyc_tag = TAG; -/* See _PyImport_FixupExtensionUnicode() below */ +/* See _PyImport_FixupExtensionObject() below */  static PyObject *extensions = NULL; +/* Function from Parser/tokenizer.c */ +extern char * PyTokenizer_FindEncodingFilename(int, PyObject *); +  /* This table is defined in config.c: */  extern struct _inittab _PyImport_Inittab[]; -/* Method from Parser/tokenizer.c */ -extern char * PyTokenizer_FindEncoding(int); -  struct _inittab *PyImport_Inittab = _PyImport_Inittab; -/* these tables define the module suffixes that Python recognizes */ -struct filedescr * _PyImport_Filetab = NULL; - -static const struct filedescr _PyImport_StandardFiletab[] = { -    {".py", "U", PY_SOURCE}, -#ifdef MS_WINDOWS -    {".pyw", "U", PY_SOURCE}, -#endif -    {".pyc", "rb", PY_COMPILED}, -    {0, 0} -}; - +static PyObject *initstr = NULL;  /* Initialize things */  void  _PyImport_Init(void)  { -    const struct filedescr *scan; -    struct filedescr *filetab; -    int countD = 0; -    int countS = 0; - -    /* prepare _PyImport_Filetab: copy entries from -       _PyImport_DynLoadFiletab and _PyImport_StandardFiletab. -     */ -#ifdef HAVE_DYNAMIC_LOADING -    for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan) -        ++countD; -#endif -    for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan) -        ++countS; -    filetab = PyMem_NEW(struct filedescr, countD + countS + 1); -    if (filetab == NULL) -        Py_FatalError("Can't initialize import file table."); -#ifdef HAVE_DYNAMIC_LOADING -    memcpy(filetab, _PyImport_DynLoadFiletab, -           countD * sizeof(struct filedescr)); -#endif -    memcpy(filetab + countD, _PyImport_StandardFiletab, -           countS * sizeof(struct filedescr)); -    filetab[countD + countS].suffix = NULL; - -    _PyImport_Filetab = filetab; - -    if (Py_OptimizeFlag) { -        /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */ -        for (; filetab->suffix != NULL; filetab++) { -            if (strcmp(filetab->suffix, ".pyc") == 0) -                filetab->suffix = ".pyo"; -        } -    } +    initstr = PyUnicode_InternFromString("__init__"); +    if (initstr == NULL) +        Py_FatalError("Can't initialize import variables");  }  void  _PyImportHooks_Init(void)  { -    PyObject *v, *path_hooks = NULL, *zimpimport; +    PyObject *v, *path_hooks = NULL;      int err = 0; -    /* adding sys.path_hooks and sys.path_importer_cache, setting up -       zipimport */ -    if (PyType_Ready(&PyNullImporter_Type) < 0) -        goto error; - -    if (Py_VerboseFlag) -        PySys_WriteStderr("# installing zipimport hook\n"); - +    /* adding sys.path_hooks and sys.path_importer_cache */      v = PyList_New(0);      if (v == NULL)          goto error; @@ -216,11 +79,25 @@ _PyImportHooks_Init(void)      err = PySys_SetObject("path_hooks", path_hooks);      if (err) {    error: -        PyErr_Print(); -        Py_FatalError("initializing sys.meta_path, sys.path_hooks, " -                      "path_importer_cache, or NullImporter failed" -                      ); +    PyErr_Print(); +    Py_FatalError("initializing sys.meta_path, sys.path_hooks, " +                  "or path_importer_cache failed");      } +    Py_DECREF(path_hooks); +} + +void +_PyImportZip_Init(void) +{ +    PyObject *path_hooks, *zimpimport; +    int err = 0; + +    path_hooks = PySys_GetObject("path_hooks"); +    if (path_hooks == NULL) +        goto error; + +    if (Py_VerboseFlag) +        PySys_WriteStderr("# installing zipimport hook\n");      zimpimport = PyImport_ImportModule("zipimport");      if (zimpimport == NULL) { @@ -229,8 +106,9 @@ _PyImportHooks_Init(void)              PySys_WriteStderr("# can't import zipimport\n");      }      else { -        PyObject *zipimporter = PyObject_GetAttrString(zimpimport, -                                                       "zipimporter"); +        _Py_IDENTIFIER(zipimporter); +        PyObject *zipimporter = _PyObject_GetAttrId(zimpimport, +                                                    &PyId_zipimporter);          Py_DECREF(zimpimport);          if (zipimporter == NULL) {              PyErr_Clear(); /* No zipimporter object -- okay */ @@ -239,17 +117,23 @@ _PyImportHooks_Init(void)                      "# can't import zipimport.zipimporter\n");          }          else { -            /* sys.path_hooks.append(zipimporter) */ -            err = PyList_Append(path_hooks, zipimporter); +            /* sys.path_hooks.insert(0, zipimporter) */ +            err = PyList_Insert(path_hooks, 0, zipimporter);              Py_DECREF(zipimporter); -            if (err) +            if (err < 0) {                  goto error; +            }              if (Py_VerboseFlag)                  PySys_WriteStderr(                      "# installed zipimport hook\n");          }      } -    Py_DECREF(path_hooks); + +    return; + +  error: +    PyErr_Print(); +    Py_FatalError("initializing zipimport failed");  }  /* Locking primitives to prevent parallel imports of the same module @@ -319,7 +203,7 @@ _PyImport_ReInitLock(void)          /* Forked as a side effect of import */          long me = PyThread_get_thread_ident();          PyThread_acquire_lock(import_lock, 0); -	/* XXX: can the previous line fail? */ +        /* XXX: can the previous line fail? */          import_lock_thread = me;          import_lock_level--;      } else { @@ -369,8 +253,6 @@ _PyImport_Fini(void)  {      Py_XDECREF(extensions);      extensions = NULL; -    PyMem_DEL(_PyImport_Filetab); -    _PyImport_Filetab = NULL;  #ifdef WITH_THREAD      if (import_lock != NULL) {          PyThread_free_lock(import_lock); @@ -379,14 +261,6 @@ _PyImport_Fini(void)  #endif  } -static void -imp_modules_reloading_clear(void) -{ -    PyInterpreterState *interp = PyThreadState_Get()->interp; -    if (interp->modules_reloading != NULL) -        PyDict_Clear(interp->modules_reloading); -} -  /* Helper for sys */  PyObject * @@ -423,7 +297,6 @@ void  PyImport_Cleanup(void)  {      Py_ssize_t pos, ndone; -    char *name;      PyObject *key, *value, *dict;      PyInterpreterState *interp = PyThreadState_GET()->interp;      PyObject *modules = interp->modules; @@ -496,14 +369,13 @@ PyImport_Cleanup(void)              if (value->ob_refcnt != 1)                  continue;              if (PyUnicode_Check(key) && PyModule_Check(value)) { -                name = _PyUnicode_AsString(key); -                if (strcmp(name, "builtins") == 0) +                if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0)                      continue; -                if (strcmp(name, "sys") == 0) +                if (PyUnicode_CompareWithASCIIString(key, "sys") == 0)                      continue;                  if (Py_VerboseFlag) -                    PySys_WriteStderr( -                        "# cleanup[1] %s\n", name); +                    PySys_FormatStderr( +                        "# cleanup[1] %U\n", key);                  _PyModule_Clear(value);                  PyDict_SetItem(modules, key, Py_None);                  ndone++; @@ -515,13 +387,12 @@ PyImport_Cleanup(void)      pos = 0;      while (PyDict_Next(modules, &pos, &key, &value)) {          if (PyUnicode_Check(key) && PyModule_Check(value)) { -            name = _PyUnicode_AsString(key); -            if (strcmp(name, "builtins") == 0) +            if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0)                  continue; -            if (strcmp(name, "sys") == 0) +            if (PyUnicode_CompareWithASCIIString(key, "sys") == 0)                  continue;              if (Py_VerboseFlag) -                PySys_WriteStderr("# cleanup[2] %s\n", name); +                PySys_FormatStderr("# cleanup[2] %U\n", key);              _PyModule_Clear(value);              PyDict_SetItem(modules, key, Py_None);          } @@ -547,7 +418,6 @@ PyImport_Cleanup(void)      PyDict_Clear(modules);      interp->modules = NULL;      Py_DECREF(modules); -    Py_CLEAR(interp->modules_reloading);  } @@ -556,25 +426,36 @@ PyImport_Cleanup(void)  long  PyImport_GetMagicNumber(void)  { -    return pyc_magic; +    long res; +    PyInterpreterState *interp = PyThreadState_Get()->interp; +    PyObject *pyc_magic = PyObject_GetAttrString(interp->importlib, +                                                 "_RAW_MAGIC_NUMBER"); +    if (pyc_magic == NULL) +        return -1; +    res = PyLong_AsLong(pyc_magic); +    Py_DECREF(pyc_magic); +    return res;  } +extern const char * _PySys_ImplCacheTag; +  const char *  PyImport_GetMagicTag(void)  { -    return pyc_tag; +    return _PySys_ImplCacheTag;  } +  /* Magic for extension modules (built-in as well as dynamically     loaded).  To prevent initializing an extension module more than     once, we keep a static dictionary 'extensions' keyed by module name     (for built-in modules) or by filename (for dynamically loaded     modules), containing these modules.  A copy of the module's -   dictionary is stored by calling _PyImport_FixupExtensionUnicode() +   dictionary is stored by calling _PyImport_FixupExtensionObject()     immediately after the module initialization function succeeds.  A     copy can be retrieved from there by calling -   _PyImport_FindExtensionUnicode(). +   _PyImport_FindExtensionObject().     Modules which do support multiple initialization set their m_size     field to a non-negative number (indicating the size of the @@ -583,7 +464,8 @@ PyImport_GetMagicTag(void)  */  int -_PyImport_FixupExtensionUnicode(PyObject *mod, char *name, PyObject *filename) +_PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, +                               PyObject *filename)  {      PyObject *modules, *dict;      struct PyModuleDef *def; @@ -602,10 +484,10 @@ _PyImport_FixupExtensionUnicode(PyObject *mod, char *name, PyObject *filename)          return -1;      }      modules = PyImport_GetModuleDict(); -    if (PyDict_SetItemString(modules, name, mod) < 0) +    if (PyDict_SetItem(modules, name, mod) < 0)          return -1;      if (_PyState_AddModule(mod, def) < 0) { -        PyDict_DelItemString(modules, name); +        PyDict_DelItem(modules, name);          return -1;      }      if (def->m_size == -1) { @@ -631,17 +513,17 @@ int  _PyImport_FixupBuiltin(PyObject *mod, char *name)  {      int res; -    PyObject *filename; -    filename = PyUnicode_FromString(name); -    if (filename == NULL) +    PyObject *nameobj; +    nameobj = PyUnicode_InternFromString(name); +    if (nameobj == NULL)          return -1; -    res = _PyImport_FixupExtensionUnicode(mod, name, filename); -    Py_DECREF(filename); +    res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj); +    Py_DECREF(nameobj);      return res;  }  PyObject * -_PyImport_FindExtensionUnicode(char *name, PyObject *filename) +_PyImport_FindExtensionObject(PyObject *name, PyObject *filename)  {      PyObject *mod, *mdict;      PyModuleDef* def; @@ -654,7 +536,7 @@ _PyImport_FindExtensionUnicode(char *name, PyObject *filename)          /* Module does not support repeated initialization */          if (def->m_base.m_copy == NULL)              return NULL; -        mod = PyImport_AddModule(name); +        mod = PyImport_AddModuleObject(name);          if (mod == NULL)              return NULL;          mdict = PyModule_GetDict(mod); @@ -669,30 +551,30 @@ _PyImport_FindExtensionUnicode(char *name, PyObject *filename)          mod = def->m_base.m_init();          if (mod == NULL)              return NULL; -        PyDict_SetItemString(PyImport_GetModuleDict(), name, mod); +        PyDict_SetItem(PyImport_GetModuleDict(), name, mod);          Py_DECREF(mod);      }      if (_PyState_AddModule(mod, def) < 0) { -        PyDict_DelItemString(PyImport_GetModuleDict(), name); +        PyDict_DelItem(PyImport_GetModuleDict(), name);          Py_DECREF(mod);          return NULL;      }      if (Py_VerboseFlag) -        PySys_FormatStderr("import %s # previously loaded (%U)\n", +        PySys_FormatStderr("import %U # previously loaded (%R)\n",                            name, filename);      return mod;  }  PyObject * -_PyImport_FindBuiltin(char *name) +_PyImport_FindBuiltin(const char *name)  { -    PyObject *res, *filename; -    filename = PyUnicode_FromString(name); -    if (filename == NULL) +    PyObject *res, *nameobj; +    nameobj = PyUnicode_InternFromString(name); +    if (nameobj == NULL)          return NULL; -    res = _PyImport_FindExtensionUnicode(name, filename); -    Py_DECREF(filename); +    res = _PyImport_FindExtensionObject(nameobj, nameobj); +    Py_DECREF(nameobj);      return res;  } @@ -703,18 +585,18 @@ _PyImport_FindBuiltin(char *name)     'NEW' REFERENCE! */  PyObject * -PyImport_AddModule(const char *name) +PyImport_AddModuleObject(PyObject *name)  {      PyObject *modules = PyImport_GetModuleDict();      PyObject *m; -    if ((m = PyDict_GetItemString(modules, name)) != NULL && +    if ((m = PyDict_GetItem(modules, name)) != NULL &&          PyModule_Check(m))          return m; -    m = PyModule_New(name); +    m = PyModule_NewObject(name);      if (m == NULL)          return NULL; -    if (PyDict_SetItemString(modules, name, m) != 0) { +    if (PyDict_SetItem(modules, name, m) != 0) {          Py_DECREF(m);          return NULL;      } @@ -723,22 +605,31 @@ PyImport_AddModule(const char *name)      return m;  } +PyObject * +PyImport_AddModule(const char *name) +{ +    PyObject *nameobj, *module; +    nameobj = PyUnicode_FromString(name); +    if (nameobj == NULL) +        return NULL; +    module = PyImport_AddModuleObject(nameobj); +    Py_DECREF(nameobj); +    return module; +} + +  /* Remove name from sys.modules, if it's there. */  static void -remove_module(const char *name) +remove_module(PyObject *name)  {      PyObject *modules = PyImport_GetModuleDict(); -    if (PyDict_GetItemString(modules, name) == NULL) +    if (PyDict_GetItem(modules, name) == NULL)          return; -    if (PyDict_DelItemString(modules, name) < 0) +    if (PyDict_DelItem(modules, name) < 0)          Py_FatalError("import:  deleting existing key in"                        "sys.modules failed");  } -static PyObject * get_sourcefile(char *file); -static char *make_source_pathname(char *pathname, char *buf); -static char *make_compiled_pathname(char *pathname, char *buf, size_t buflen, -                                    int debug);  /* Execute a code object in a module and return the module object   * WITH INCREMENTED REFERENCE COUNT.  If an error occurs, name is @@ -768,10 +659,60 @@ PyObject *  PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,                                       char *cpathname)  { +    PyObject *m = NULL; +    PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL; + +    nameobj = PyUnicode_FromString(name); +    if (nameobj == NULL) +        return NULL; + +    if (cpathname != NULL) { +        cpathobj = PyUnicode_DecodeFSDefault(cpathname); +        if (cpathobj == NULL) +            goto error; +    } +    else +        cpathobj = NULL; + +    if (pathname != NULL) { +        pathobj = PyUnicode_DecodeFSDefault(pathname); +        if (pathobj == NULL) +            goto error; +    } +    else if (cpathobj != NULL) { +        PyInterpreterState *interp = PyThreadState_GET()->interp; +        _Py_IDENTIFIER(_get_sourcefile); + +        if (interp == NULL) { +            Py_FatalError("PyImport_ExecCodeModuleWithPathnames: " +                          "no interpreter!"); +        } + +        pathobj = _PyObject_CallMethodObjIdArgs(interp->importlib, +                                                &PyId__get_sourcefile, cpathobj, +                                                NULL); +        if (pathobj == NULL) +            PyErr_Clear(); +    } +    else +        pathobj = NULL; + +    m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj); +error: +    Py_DECREF(nameobj); +    Py_XDECREF(pathobj); +    Py_XDECREF(cpathobj); +    return m; +} + +PyObject* +PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, +                              PyObject *cpathname) +{      PyObject *modules = PyImport_GetModuleDict();      PyObject *m, *d, *v; -    m = PyImport_AddModule(name); +    m = PyImport_AddModuleObject(name);      if (m == NULL)          return NULL;      /* If the module is being reloaded, we get the old module back @@ -782,43 +723,33 @@ PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,                                   PyEval_GetBuiltins()) != 0)              goto error;      } -    /* Remember the filename as the __file__ attribute */ -    v = NULL;      if (pathname != NULL) { -        v = get_sourcefile(pathname); -        if (v == NULL) -            PyErr_Clear(); +        v = pathname;      } -    if (v == NULL) { +    else {          v = ((PyCodeObject *)co)->co_filename; -        Py_INCREF(v);      } +    Py_INCREF(v);      if (PyDict_SetItemString(d, "__file__", v) != 0)          PyErr_Clear(); /* Not important enough to report */      Py_DECREF(v);      /* Remember the pyc path name as the __cached__ attribute. */ -    if (cpathname == NULL) { -        v = Py_None; -        Py_INCREF(v); -    } -    else if ((v = PyUnicode_FromString(cpathname)) == NULL) { -        PyErr_Clear(); /* Not important enough to report */ +    if (cpathname != NULL) +        v = cpathname; +    else          v = Py_None; -        Py_INCREF(v); -    }      if (PyDict_SetItemString(d, "__cached__", v) != 0)          PyErr_Clear(); /* Not important enough to report */ -    Py_DECREF(v);      v = PyEval_EvalCode(co, d, d);      if (v == NULL)          goto error;      Py_DECREF(v); -    if ((m = PyDict_GetItemString(modules, name)) == NULL) { +    if ((m = PyDict_GetItem(modules, name)) == NULL) {          PyErr_Format(PyExc_ImportError, -                     "Loaded module %.200s not found in sys.modules", +                     "Loaded module %R not found in sys.modules",                       name);          return NULL;      } @@ -833,409 +764,6 @@ PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,  } -/* Like strrchr(string, '/') but searches for the rightmost of either SEP -   or ALTSEP, if the latter is defined. -*/ -static char * -rightmost_sep(char *s) -{ -    char *found, c; -    for (found = NULL; (c = *s); s++) { -        if (c == SEP -#ifdef ALTSEP -            || c == ALTSEP -#endif -            ) -        { -            found = s; -        } -    } -    return found; -} - - -/* Given a pathname for a Python source file, fill a buffer with the -   pathname for the corresponding compiled file.  Return the pathname -   for the compiled file, or NULL if there's no space in the buffer. -   Doesn't set an exception. */ - -static char * -make_compiled_pathname(char *pathname, char *buf, size_t buflen, int debug) -{ -    /* foo.py -> __pycache__/foo.<tag>.pyc */ -    size_t len = strlen(pathname); -    size_t i, save; -    char *pos; -    int sep = SEP; - -    /* Sanity check that the buffer has roughly enough space to hold what -       will eventually be the full path to the compiled file.  The 5 extra -       bytes include the slash afer __pycache__, the two extra dots, the -       extra trailing character ('c' or 'o') and null.  This isn't exact -       because the contents of the buffer can affect how many actual -       characters of the string get into the buffer.  We'll do a final -       sanity check before writing the extension to ensure we do not -       overflow the buffer. -    */ -    if (len + strlen(CACHEDIR) + strlen(pyc_tag) + 5 > buflen) -        return NULL; - -    /* Find the last path separator and copy everything from the start of -       the source string up to and including the separator. -    */ -    if ((pos = rightmost_sep(pathname)) == NULL) { -        i = 0; -    } -    else { -        sep = *pos; -        i = pos - pathname + 1; -        strncpy(buf, pathname, i); -    } - -    save = i; -    buf[i++] = '\0'; -    /* Add __pycache__/ */ -    strcat(buf, CACHEDIR); -    i += strlen(CACHEDIR) - 1; -    buf[i++] = sep; -    buf[i++] = '\0'; -    /* Add the base filename, but remove the .py or .pyw extension, since -       the tag name must go before the extension. -    */ -    strcat(buf, pathname + save); -    if ((pos = strrchr(buf, '.')) != NULL) -        *++pos = '\0'; -    strcat(buf, pyc_tag); -    /* The length test above assumes that we're only adding one character -       to the end of what would normally be the extension.  What if there -       is no extension, or the string ends in '.' or '.p', and otherwise -       fills the buffer?  By appending 4 more characters onto the string -       here, we could overrun the buffer. - -       As a simple example, let's say buflen=32 and the input string is -       'xxx.py'.  strlen() would be 6 and the test above would yield: - -       (6 + 11 + 10 + 5 == 32) > 32 - -       which is false and so the name mangling would continue.  This would -       be fine because we'd end up with this string in buf: - -       __pycache__/xxx.cpython-32.pyc\0 - -       strlen(of that) == 30 + the nul fits inside a 32 character buffer. -       We can even handle an input string of say 'xxxxx' above because -       that's (5 + 11 + 10 + 5 == 31) > 32 which is also false.  Name -       mangling that yields: - -       __pycache__/xxxxxcpython-32.pyc\0 - -       which is 32 characters including the nul, and thus fits in the -       buffer. However, an input string of 'xxxxxx' would yield a result -       string of: - -       __pycache__/xxxxxxcpython-32.pyc\0 - -       which is 33 characters long (including the nul), thus overflowing -       the buffer, even though the first test would fail, i.e.: the input -       string is also 6 characters long, so 32 > 32 is false. - -       The reason the first test fails but we still overflow the buffer is -       that the test above only expects to add one extra character to be -       added to the extension, and here we're adding three (pyc).  We -       don't add the first dot, so that reclaims one of expected -       positions, leaving us overflowing by 1 byte (3 extra - 1 reclaimed -       dot - 1 expected extra == 1 overflowed). - -       The best we can do is ensure that we still have enough room in the -       target buffer before we write the extension.  Because it's always -       only the extension that can cause the overflow, and never the other -       path bytes we've written, it's sufficient to just do one more test -       here.  Still, the assertion that follows can't hurt. -    */ -#if 0 -    printf("strlen(buf): %d; buflen: %d\n", (int)strlen(buf), (int)buflen); -#endif -    if (strlen(buf) + 5 > buflen) -        return NULL; -    strcat(buf, debug ? ".pyc" : ".pyo"); -    assert(strlen(buf) < buflen); -    return buf; -} - - -/* Given a pathname to a Python byte compiled file, return the path to the -   source file, if the path matches the PEP 3147 format.  This does not check -   for any file existence, however, if the pyc file name does not match PEP -   3147 style, NULL is returned.  buf must be at least as big as pathname; -   the resulting path will always be shorter. */ - -static char * -make_source_pathname(char *pathname, char *buf) -{ -    /* __pycache__/foo.<tag>.pyc -> foo.py */ -    size_t i, j; -    char *left, *right, *dot0, *dot1, sep; - -    /* Look back two slashes from the end.  In between these two slashes -       must be the string __pycache__ or this is not a PEP 3147 style -       path.  It's possible for there to be only one slash. -    */ -    if ((right = rightmost_sep(pathname)) == NULL) -        return NULL; -    sep = *right; -    *right = '\0'; -    left = rightmost_sep(pathname); -    *right = sep; -    if (left == NULL) -        left = pathname; -    else -        left++; -    if (right-left != strlen(CACHEDIR) || -        strncmp(left, CACHEDIR, right-left) != 0) -        return NULL; - -    /* Now verify that the path component to the right of the last slash -       has two dots in it. -    */ -    if ((dot0 = strchr(right + 1, '.')) == NULL) -        return NULL; -    if ((dot1 = strchr(dot0 + 1, '.')) == NULL) -        return NULL; -    /* Too many dots? */ -    if (strchr(dot1 + 1, '.') != NULL) -        return NULL; - -    /* This is a PEP 3147 path.  Start by copying everything from the -       start of pathname up to and including the leftmost slash.  Then -       copy the file's basename, removing the magic tag and adding a .py -       suffix. -    */ -    strncpy(buf, pathname, (i=left-pathname)); -    strncpy(buf+i, right+1, (j=dot0-right)); -    strcpy(buf+i+j, "py"); -    return buf; -} - -/* Given a pathname for a Python source file, its time of last -   modification, and a pathname for a compiled file, check whether the -   compiled file represents the same version of the source.  If so, -   return a FILE pointer for the compiled file, positioned just after -   the header; if not, return NULL. -   Doesn't set an exception. */ - -static FILE * -check_compiled_module(char *pathname, time_t mtime, char *cpathname) -{ -    FILE *fp; -    long magic; -    long pyc_mtime; - -    fp = fopen(cpathname, "rb"); -    if (fp == NULL) -        return NULL; -    magic = PyMarshal_ReadLongFromFile(fp); -    if (magic != pyc_magic) { -        if (Py_VerboseFlag) -            PySys_WriteStderr("# %s has bad magic\n", cpathname); -        fclose(fp); -        return NULL; -    } -    pyc_mtime = PyMarshal_ReadLongFromFile(fp); -    if (pyc_mtime != mtime) { -        if (Py_VerboseFlag) -            PySys_WriteStderr("# %s has bad mtime\n", cpathname); -        fclose(fp); -        return NULL; -    } -    if (Py_VerboseFlag) -        PySys_WriteStderr("# %s matches %s\n", cpathname, pathname); -    return fp; -} - - -/* Read a code object from a file and check it for validity */ - -static PyCodeObject * -read_compiled_module(char *cpathname, FILE *fp) -{ -    PyObject *co; - -    co = PyMarshal_ReadLastObjectFromFile(fp); -    if (co == NULL) -        return NULL; -    if (!PyCode_Check(co)) { -        PyErr_Format(PyExc_ImportError, -                     "Non-code object in %.200s", cpathname); -        Py_DECREF(co); -        return NULL; -    } -    return (PyCodeObject *)co; -} - - -/* Load a module from a compiled file, execute it, and return its -   module object WITH INCREMENTED REFERENCE COUNT */ - -static PyObject * -load_compiled_module(char *name, char *cpathname, FILE *fp) -{ -    long magic; -    PyCodeObject *co; -    PyObject *m; - -    magic = PyMarshal_ReadLongFromFile(fp); -    if (magic != pyc_magic) { -        PyErr_Format(PyExc_ImportError, -                     "Bad magic number in %.200s", cpathname); -        return NULL; -    } -    (void) PyMarshal_ReadLongFromFile(fp); -    co = read_compiled_module(cpathname, fp); -    if (co == NULL) -        return NULL; -    if (Py_VerboseFlag) -        PySys_WriteStderr("import %s # precompiled from %s\n", -            name, cpathname); -    m = PyImport_ExecCodeModuleWithPathnames( -        name, (PyObject *)co, cpathname, cpathname); -    Py_DECREF(co); - -    return m; -} - -/* Parse a source file and return the corresponding code object */ - -static PyCodeObject * -parse_source_module(const char *pathname, FILE *fp) -{ -    PyCodeObject *co = NULL; -    mod_ty mod; -    PyCompilerFlags flags; -    PyArena *arena = PyArena_New(); -    if (arena == NULL) -        return NULL; - -    flags.cf_flags = 0; -    mod = PyParser_ASTFromFile(fp, pathname, NULL, -                               Py_file_input, 0, 0, &flags, -                               NULL, arena); -    if (mod) { -        co = PyAST_Compile(mod, pathname, NULL, arena); -    } -    PyArena_Free(arena); -    return co; -} - - -/* Helper to open a bytecode file for writing in exclusive mode */ - -static FILE * -open_exclusive(char *filename, mode_t mode) -{ -#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC) -    /* Use O_EXCL to avoid a race condition when another process tries to -       write the same file.  When that happens, our open() call fails, -       which is just fine (since it's only a cache). -       XXX If the file exists and is writable but the directory is not -       writable, the file will never be written.  Oh well. -    */ -    int fd; -    (void) unlink(filename); -    fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC -#ifdef O_BINARY -                            |O_BINARY   /* necessary for Windows */ -#endif -#ifdef __VMS -            , mode, "ctxt=bin", "shr=nil" -#else -            , mode -#endif -          ); -    if (fd < 0) -        return NULL; -    return fdopen(fd, "wb"); -#else -    /* Best we can do -- on Windows this can't happen anyway */ -    return fopen(filename, "wb"); -#endif -} - - -/* Write a compiled module to a file, placing the time of last -   modification of its source into the header. -   Errors are ignored, if a write error occurs an attempt is made to -   remove the file. */ - -static void -write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat) -{ -    FILE *fp; -    char *dirpath; -    time_t mtime = srcstat->st_mtime; -#ifdef MS_WINDOWS   /* since Windows uses different permissions  */ -    mode_t mode = srcstat->st_mode & ~S_IEXEC; -#else -    mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH; -    mode_t dirmode = (srcstat->st_mode | -                      S_IXUSR | S_IXGRP | S_IXOTH | -                      S_IWUSR | S_IWGRP | S_IWOTH); -#endif -    int saved; - -    /* Ensure that the __pycache__ directory exists. */ -    dirpath = rightmost_sep(cpathname); -    if (dirpath == NULL) { -        if (Py_VerboseFlag) -            PySys_WriteStderr( -                "# no %s path found %s\n", -                CACHEDIR, cpathname); -        return; -    } -    saved = *dirpath; -    *dirpath = '\0'; - -#ifdef MS_WINDOWS -    if (_mkdir(cpathname) < 0 && errno != EEXIST) { -#else -    if (mkdir(cpathname, dirmode) < 0 && errno != EEXIST) { -#endif -        *dirpath = saved; -        if (Py_VerboseFlag) -            PySys_WriteStderr( -                "# cannot create cache dir %s\n", cpathname); -        return; -    } -    *dirpath = saved; - -    fp = open_exclusive(cpathname, mode); -    if (fp == NULL) { -        if (Py_VerboseFlag) -            PySys_WriteStderr( -                "# can't create %s\n", cpathname); -        return; -    } -    PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION); -    /* First write a 0 for mtime */ -    PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION); -    PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION); -    if (fflush(fp) != 0 || ferror(fp)) { -        if (Py_VerboseFlag) -            PySys_WriteStderr("# can't write %s\n", cpathname); -        /* Don't keep partial file */ -        fclose(fp); -        (void) unlink(cpathname); -        return; -    } -    /* Now write the true mtime (as a 32-bit field) */ -    fseek(fp, 4L, 0); -    assert(mtime <= 0xFFFFFFFF); -    PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION); -    fflush(fp); -    fclose(fp); -    if (Py_VerboseFlag) -        PySys_WriteStderr("# wrote %s\n", cpathname); -} -  static void  update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)  { @@ -1260,227 +788,60 @@ update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)      }  } -static int -update_compiled_module(PyCodeObject *co, char *pathname) +static void +update_compiled_module(PyCodeObject *co, PyObject *newname)  { -    PyObject *oldname, *newname; +    PyObject *oldname; -    newname = PyUnicode_DecodeFSDefault(pathname); -    if (newname == NULL) -        return -1; - -    if (!PyUnicode_Compare(co->co_filename, newname)) { -        Py_DECREF(newname); -        return 0; -    } +    if (PyUnicode_Compare(co->co_filename, newname) == 0) +        return;      oldname = co->co_filename;      Py_INCREF(oldname);      update_code_filenames(co, oldname, newname);      Py_DECREF(oldname); -    Py_DECREF(newname); -    return 1;  } -/* Load a source module from a given file and return its module -   object WITH INCREMENTED REFERENCE COUNT.  If there's a matching -   byte-compiled file, use that instead. */ -  static PyObject * -load_source_module(char *name, char *pathname, FILE *fp) +imp_fix_co_filename(PyObject *self, PyObject *args)  { -    struct stat st; -    FILE *fpc; -    char *buf; -    char *cpathname; -    PyCodeObject *co = NULL; -    PyObject *m; +    PyObject *co; +    PyObject *file_path; -    if (fstat(fileno(fp), &st) != 0) { -        PyErr_Format(PyExc_RuntimeError, -                     "unable to get file status from '%s'", -                     pathname); +    if (!PyArg_ParseTuple(args, "OO:_fix_co_filename", &co, &file_path))          return NULL; -    } -    if (sizeof st.st_mtime > 4) { -        /* Python's .pyc timestamp handling presumes that the timestamp fits -           in 4 bytes. Since the code only does an equality comparison, -           ordering is not important and we can safely ignore the higher bits -           (collisions are extremely unlikely). -         */ -        st.st_mtime &= 0xFFFFFFFF; -    } -    buf = PyMem_MALLOC(MAXPATHLEN+1); -    if (buf == NULL) { -        return PyErr_NoMemory(); -    } -    cpathname = make_compiled_pathname( -        pathname, buf, (size_t)MAXPATHLEN + 1, !Py_OptimizeFlag); -    if (cpathname != NULL && -        (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) { -        co = read_compiled_module(cpathname, fpc); -        fclose(fpc); -        if (co == NULL) -            goto error_exit; -        if (update_compiled_module(co, pathname) < 0) -            goto error_exit; -        if (Py_VerboseFlag) -            PySys_WriteStderr("import %s # precompiled from %s\n", -                name, cpathname); -        pathname = cpathname; -    } -    else { -        co = parse_source_module(pathname, fp); -        if (co == NULL) -            goto error_exit; -        if (Py_VerboseFlag) -            PySys_WriteStderr("import %s # from %s\n", -                name, pathname); -        if (cpathname) { -            PyObject *ro = PySys_GetObject("dont_write_bytecode"); -            int b = (ro == NULL) ? 0 : PyObject_IsTrue(ro); -            if (b < 0) -                goto error_exit; -            if (!b) -                write_compiled_module(co, cpathname, &st); -        } -    } -    m = PyImport_ExecCodeModuleWithPathnames( -        name, (PyObject *)co, pathname, cpathname); -    Py_DECREF(co); -    PyMem_FREE(buf); -    return m; - -error_exit: -    Py_XDECREF(co); -    PyMem_FREE(buf); -    return NULL; -} - -/* Get source file -> unicode or None - * Returns the path to the py file if available, else the given path - */ -static PyObject * -get_sourcefile(char *file) -{ -    char *py = NULL; -    Py_ssize_t len; -    PyObject *u; -    struct stat statbuf; - -    if (!file || !*file) { -        Py_RETURN_NONE; +    if (!PyCode_Check(co)) { +        PyErr_SetString(PyExc_TypeError, +                        "first argument must be a code object"); +        return NULL;      } -    len = strlen(file); -    /* match '*.py?' */ -    if (len > MAXPATHLEN || PyOS_strnicmp(&file[len-4], ".py", 3) != 0) { -        return PyUnicode_DecodeFSDefault(file); +    if (!PyUnicode_Check(file_path)) { +        PyErr_SetString(PyExc_TypeError, +                        "second argument must be a string"); +        return NULL;      } -    py = PyMem_MALLOC(MAXPATHLEN+1); -    if (py == NULL) { -        return PyErr_NoMemory(); -    } -    /* Start by trying to turn PEP 3147 path into source path.  If that -     * fails, just chop off the trailing character, i.e. legacy pyc path -     * to py. -     */ -    if (make_source_pathname(file, py) == NULL) { -        strncpy(py, file, len-1); -        py[len-1] = '\0'; -    } +    update_compiled_module((PyCodeObject*)co, file_path); -    if (stat(py, &statbuf) == 0 && -        S_ISREG(statbuf.st_mode)) { -        u = PyUnicode_DecodeFSDefault(py); -    } -    else { -        u = PyUnicode_DecodeFSDefault(file); -    } -    PyMem_FREE(py); -    return u; +    Py_RETURN_NONE;  } -/* Forward */ -static PyObject *load_module(char *, FILE *, char *, int, PyObject *); -static struct filedescr *find_module(char *, char *, PyObject *, -                                     char *, size_t, FILE **, PyObject **); -static struct _frozen * find_frozen(char *); - -/* Load a package and return its module object WITH INCREMENTED -   REFERENCE COUNT */ - -static PyObject * -load_package(char *name, char *pathname) -{ -    PyObject *m, *d; -    PyObject *file = NULL; -    PyObject *path = NULL; -    int err; -    char *buf = NULL; -    FILE *fp = NULL; -    struct filedescr *fdp; - -    m = PyImport_AddModule(name); -    if (m == NULL) -        return NULL; -    if (Py_VerboseFlag) -        PySys_WriteStderr("import %s # directory %s\n", -            name, pathname); -    d = PyModule_GetDict(m); -    file = get_sourcefile(pathname); -    if (file == NULL) -        goto error; -    path = Py_BuildValue("[O]", file); -    if (path == NULL) -        goto error; -    err = PyDict_SetItemString(d, "__file__", file); -    if (err == 0) -        err = PyDict_SetItemString(d, "__path__", path); -    if (err != 0) -        goto error; -    buf = PyMem_MALLOC(MAXPATHLEN+1); -    if (buf == NULL) { -        PyErr_NoMemory(); -        goto error; -    } -    buf[0] = '\0'; -    fdp = find_module(name, "__init__", path, buf, MAXPATHLEN+1, &fp, NULL); -    if (fdp == NULL) { -        if (PyErr_ExceptionMatches(PyExc_ImportError)) { -            PyErr_Clear(); -            Py_INCREF(m); -        } -        else -            m = NULL; -        goto cleanup; -    } -    m = load_module(name, fp, buf, fdp->type, NULL); -    if (fp != NULL) -        fclose(fp); -    goto cleanup; -  error: -    m = NULL; -  cleanup: -    if (buf) -        PyMem_FREE(buf); -    Py_XDECREF(path); -    Py_XDECREF(file); -    return m; -} +/* Forward */ +static struct _frozen * find_frozen(PyObject *);  /* Helper to test for built-in module */  static int -is_builtin(char *name) +is_builtin(PyObject *name)  { -    int i; +    int i, cmp;      for (i = 0; PyImport_Inittab[i].name != NULL; i++) { -        if (strcmp(name, PyImport_Inittab[i].name) == 0) { +        cmp = PyUnicode_CompareWithASCIIString(name, PyImport_Inittab[i].name); +        if (cmp == 0) {              if (PyImport_Inittab[i].initfunc == NULL)                  return -1;              else @@ -1536,15 +897,7 @@ get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,          PyErr_Clear();      }      if (importer == NULL) { -        importer = PyObject_CallFunctionObjArgs( -            (PyObject *)&PyNullImporter_Type, p, NULL -        ); -        if (importer == NULL) { -            if (PyErr_ExceptionMatches(PyExc_ImportError)) { -                PyErr_Clear(); -                return Py_None; -            } -        } +        return Py_None;      }      if (importer != NULL) {          int err = PyDict_SetItem(path_importer_cache, p, importer); @@ -1569,661 +922,38 @@ PyImport_GetImporter(PyObject *path) {      return importer;  } -/* Search the path (default sys.path) for a module.  Return the -   corresponding filedescr struct, and (via return arguments) the -   pathname and an open file.  Return NULL if the module is not found. */ - -#ifdef MS_COREDLL -extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **, -                                        char *, Py_ssize_t); -#endif - -static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *); -static int find_init_module(char *); /* Forward */ -static struct filedescr importhookdescr = {"", "", IMP_HOOK}; - -static struct filedescr * -find_module(char *fullname, char *subname, PyObject *path, char *buf, -            size_t buflen, FILE **p_fp, PyObject **p_loader) -{ -    Py_ssize_t i, npath; -    size_t len, namelen; -    struct filedescr *fdp = NULL; -    char *filemode; -    FILE *fp = NULL; -    PyObject *path_hooks, *path_importer_cache; -    struct stat statbuf; -    static struct filedescr fd_frozen = {"", "", PY_FROZEN}; -    static struct filedescr fd_builtin = {"", "", C_BUILTIN}; -    static struct filedescr fd_package = {"", "", PKG_DIRECTORY}; -    char *name; -#if defined(PYOS_OS2) -    size_t saved_len; -    size_t saved_namelen; -    char *saved_buf = NULL; -#endif -    if (p_loader != NULL) -        *p_loader = NULL; - -    if (strlen(subname) > MAXPATHLEN) { -        PyErr_SetString(PyExc_OverflowError, -                        "module name is too long"); -        return NULL; -    } -    name = PyMem_MALLOC(MAXPATHLEN+1); -    if (name == NULL) { -        PyErr_NoMemory(); -        return NULL; -    } -    strcpy(name, subname); - -    /* sys.meta_path import hook */ -    if (p_loader != NULL) { -        PyObject *meta_path; - -        meta_path = PySys_GetObject("meta_path"); -        if (meta_path == NULL || !PyList_Check(meta_path)) { -            PyErr_SetString(PyExc_RuntimeError, -                            "sys.meta_path must be a list of " -                            "import hooks"); -            goto error_exit; -        } -        Py_INCREF(meta_path);  /* zap guard */ -        npath = PyList_Size(meta_path); -        for (i = 0; i < npath; i++) { -            PyObject *loader; -            PyObject *hook = PyList_GetItem(meta_path, i); -            loader = PyObject_CallMethod(hook, "find_module", -                                         "sO", fullname, -                                         path != NULL ? -                                         path : Py_None); -            if (loader == NULL) { -                Py_DECREF(meta_path); -                goto error_exit;  /* true error */ -            } -            if (loader != Py_None) { -                /* a loader was found */ -                *p_loader = loader; -                Py_DECREF(meta_path); -                PyMem_FREE(name); -                return &importhookdescr; -            } -            Py_DECREF(loader); -        } -        Py_DECREF(meta_path); -    } - -    if (find_frozen(fullname) != NULL) { -        strcpy(buf, fullname); -        PyMem_FREE(name); -        return &fd_frozen; -    } - -    if (path == NULL) { -        if (is_builtin(name)) { -            strcpy(buf, name); -            PyMem_FREE(name); -            return &fd_builtin; -        } -#ifdef MS_COREDLL -        fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen); -        if (fp != NULL) { -            *p_fp = fp; -            PyMem_FREE(name); -            return fdp; -        } -#endif -        path = PySys_GetObject("path"); -    } - -    if (path == NULL || !PyList_Check(path)) { -        PyErr_SetString(PyExc_RuntimeError, -                        "sys.path must be a list of directory names"); -        goto error_exit; -    } - -    path_hooks = PySys_GetObject("path_hooks"); -    if (path_hooks == NULL || !PyList_Check(path_hooks)) { -        PyErr_SetString(PyExc_RuntimeError, -                        "sys.path_hooks must be a list of " -                        "import hooks"); -        goto error_exit; -    } -    path_importer_cache = PySys_GetObject("path_importer_cache"); -    if (path_importer_cache == NULL || -        !PyDict_Check(path_importer_cache)) { -        PyErr_SetString(PyExc_RuntimeError, -                        "sys.path_importer_cache must be a dict"); -        goto error_exit; -    } - -    npath = PyList_Size(path); -    namelen = strlen(name); -    for (i = 0; i < npath; i++) { -        PyObject *v = PyList_GetItem(path, i); -        PyObject *origv = v; -        const char *base; -        Py_ssize_t size; -        if (!v) -            goto error_exit; -        if (PyUnicode_Check(v)) { -            v = PyUnicode_EncodeFSDefault(v); -            if (v == NULL) -                goto error_exit; -        } -        else if (!PyBytes_Check(v)) -            continue; -        else -            Py_INCREF(v); - -        base = PyBytes_AS_STRING(v); -        size = PyBytes_GET_SIZE(v); -        len = size; -        if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) { -            Py_DECREF(v); -            continue; /* Too long */ -        } -        strcpy(buf, base); -        Py_DECREF(v); - -        if (strlen(buf) != len) { -            continue; /* v contains '\0' */ -        } - -        /* sys.path_hooks import hook */ -        if (p_loader != NULL) { -            PyObject *importer; - -            importer = get_path_importer(path_importer_cache, -                                         path_hooks, origv); -            if (importer == NULL) { -                goto error_exit; -            } -            /* Note: importer is a borrowed reference */ -            if (importer != Py_None) { -                PyObject *loader; -                loader = PyObject_CallMethod(importer, -                                             "find_module", -                                             "s", fullname); -                if (loader == NULL) -                    goto error_exit;  /* error */ -                if (loader != Py_None) { -                    /* a loader was found */ -                    *p_loader = loader; -                    PyMem_FREE(name); -                    return &importhookdescr; -                } -                Py_DECREF(loader); -                continue; -            } -        } -        /* no hook was found, use builtin import */ - -        if (len > 0 && buf[len-1] != SEP -#ifdef ALTSEP -            && buf[len-1] != ALTSEP -#endif -            ) -            buf[len++] = SEP; -        strcpy(buf+len, name); -        len += namelen; - -        /* Check for package import (buf holds a directory name, -           and there's an __init__ module in that directory */ -#ifdef HAVE_STAT -        if (stat(buf, &statbuf) == 0 &&         /* it exists */ -            S_ISDIR(statbuf.st_mode) &&         /* it's a directory */ -            case_ok(buf, len, namelen, name)) { /* case matches */ -            if (find_init_module(buf)) { /* and has __init__.py */ -                PyMem_FREE(name); -                return &fd_package; -            } -            else { -                int err; -                PyObject *unicode = PyUnicode_DecodeFSDefault(buf); -                if (unicode == NULL) -                    goto error_exit; -                err = PyErr_WarnFormat(PyExc_ImportWarning, 1, -                    "Not importing directory '%U': missing __init__.py", -                    unicode); -                Py_DECREF(unicode); -                if (err) -                    goto error_exit; -            } -        } -#endif -#if defined(PYOS_OS2) -        /* take a snapshot of the module spec for restoration -         * after the 8 character DLL hackery -         */ -        saved_buf = strdup(buf); -        saved_len = len; -        saved_namelen = namelen; -#endif /* PYOS_OS2 */ -        for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) { -            struct stat statbuf; -#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING) -            /* OS/2 limits DLLs to 8 character names (w/o -               extension) -             * so if the name is longer than that and its a -             * dynamically loaded module we're going to try, -             * truncate the name before trying -             */ -            if (strlen(subname) > 8) { -                /* is this an attempt to load a C extension? */ -                const struct filedescr *scan; -                scan = _PyImport_DynLoadFiletab; -                while (scan->suffix != NULL) { -                    if (!strcmp(scan->suffix, fdp->suffix)) -                        break; -                    else -                        scan++; -                } -                if (scan->suffix != NULL) { -                    /* yes, so truncate the name */ -                    namelen = 8; -                    len -= strlen(subname) - namelen; -                    buf[len] = '\0'; -                } -            } -#endif /* PYOS_OS2 */ -            strcpy(buf+len, fdp->suffix); -            if (Py_VerboseFlag > 1) -                PySys_WriteStderr("# trying %s\n", buf); - -            filemode = fdp->mode; -            if (filemode[0] == 'U') -                filemode = "r" PY_STDIOTEXTMODE; - -            if (stat(buf, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) -                /* it's a directory */ -                fp = NULL; -            else -                fp = fopen(buf, filemode); -            if (fp != NULL) { -                if (case_ok(buf, len, namelen, name)) -                    break; -                else {                   /* continue search */ -                    fclose(fp); -                    fp = NULL; -                } -            } -#if defined(PYOS_OS2) -            /* restore the saved snapshot */ -            strcpy(buf, saved_buf); -            len = saved_len; -            namelen = saved_namelen; -#endif -        } -#if defined(PYOS_OS2) -        /* don't need/want the module name snapshot anymore */ -        if (saved_buf) -        { -            free(saved_buf); -            saved_buf = NULL; -        } -#endif -        if (fp != NULL) -            break; -    } -    if (fp == NULL) { -        PyErr_Format(PyExc_ImportError, -                     "No module named %.200s", name); -        goto error_exit; -    } -    *p_fp = fp; -    PyMem_FREE(name); -    return fdp; - -error_exit: -    PyMem_FREE(name); -    return NULL; -} - -/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name) - * The arguments here are tricky, best shown by example: - *    /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0 - *    ^                      ^                   ^    ^ - *    |--------------------- buf ---------------------| - *    |------------------- len ------------------| - *                           |------ name -------| - *                           |----- namelen -----| - * buf is the full path, but len only counts up to (& exclusive of) the - * extension.  name is the module name, also exclusive of extension. - * - * We've already done a successful stat() or fopen() on buf, so know that - * there's some match, possibly case-insensitive. - * - * case_ok() is to return 1 if there's a case-sensitive match for - * name, else 0.  case_ok() is also to return 1 if envar PYTHONCASEOK - * exists. - * - * case_ok() is used to implement case-sensitive import semantics even - * on platforms with case-insensitive filesystems.  It's trivial to implement - * for case-sensitive filesystems.  It's pretty much a cross-platform - * nightmare for systems with case-insensitive filesystems. - */ - -/* First we may need a pile of platform-specific header files; the sequence - * of #if's here should match the sequence in the body of case_ok(). - */ -#if defined(MS_WINDOWS) -#include <windows.h> - -#elif defined(DJGPP) -#include <dir.h> - -#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H) -#include <sys/types.h> -#include <dirent.h> - -#elif defined(PYOS_OS2) -#define INCL_DOS -#define INCL_DOSERRORS -#define INCL_NOPMAPI -#include <os2.h> -#endif - -static int -case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name) -{ -/* Pick a platform-specific implementation; the sequence of #if's here should - * match the sequence just above. - */ - -/* MS_WINDOWS */ -#if defined(MS_WINDOWS) -    WIN32_FIND_DATA data; -    HANDLE h; - -    if (Py_GETENV("PYTHONCASEOK") != NULL) -        return 1; - -    h = FindFirstFile(buf, &data); -    if (h == INVALID_HANDLE_VALUE) { -        PyErr_Format(PyExc_NameError, -          "Can't find file for module %.100s\n(filename %.300s)", -          name, buf); -        return 0; -    } -    FindClose(h); -    return strncmp(data.cFileName, name, namelen) == 0; - -/* DJGPP */ -#elif defined(DJGPP) -    struct ffblk ffblk; -    int done; - -    if (Py_GETENV("PYTHONCASEOK") != NULL) -        return 1; - -    done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC); -    if (done) { -        PyErr_Format(PyExc_NameError, -          "Can't find file for module %.100s\n(filename %.300s)", -          name, buf); -        return 0; -    } -    return strncmp(ffblk.ff_name, name, namelen) == 0; - -/* new-fangled macintosh (macosx) or Cygwin */ -#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H) -    DIR *dirp; -    struct dirent *dp; -    char dirname[MAXPATHLEN + 1]; -    const int dirlen = len - namelen - 1; /* don't want trailing SEP */ - -    if (Py_GETENV("PYTHONCASEOK") != NULL) -        return 1; - -    /* Copy the dir component into dirname; substitute "." if empty */ -    if (dirlen <= 0) { -        dirname[0] = '.'; -        dirname[1] = '\0'; -    } -    else { -        assert(dirlen <= MAXPATHLEN); -        memcpy(dirname, buf, dirlen); -        dirname[dirlen] = '\0'; -    } -    /* Open the directory and search the entries for an exact match. */ -    dirp = opendir(dirname); -    if (dirp) { -        char *nameWithExt = buf + len - namelen; -        while ((dp = readdir(dirp)) != NULL) { -            const int thislen = -#ifdef _DIRENT_HAVE_D_NAMELEN -                                    dp->d_namlen; -#else -                                    strlen(dp->d_name); -#endif -            if (thislen >= namelen && -                strcmp(dp->d_name, nameWithExt) == 0) { -                (void)closedir(dirp); -                return 1; /* Found */ -            } -        } -        (void)closedir(dirp); -    } -    return 0 ; /* Not found */ - -/* OS/2 */ -#elif defined(PYOS_OS2) -    HDIR hdir = 1; -    ULONG srchcnt = 1; -    FILEFINDBUF3 ffbuf; -    APIRET rc; - -    if (Py_GETENV("PYTHONCASEOK") != NULL) -        return 1; - -    rc = DosFindFirst(buf, -                      &hdir, -                      FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY, -                      &ffbuf, sizeof(ffbuf), -                      &srchcnt, -                      FIL_STANDARD); -    if (rc != NO_ERROR) -        return 0; -    return strncmp(ffbuf.achName, name, namelen) == 0; - -/* assuming it's a case-sensitive filesystem, so there's nothing to do! */ -#else -    return 1; - -#endif -} - -#ifdef HAVE_STAT - -/* Helper to look for __init__.py or __init__.py[co] in potential package */ -static int -find_init_module(char *buf) -{ -    const size_t save_len = strlen(buf); -    size_t i = save_len; -    char *pname;  /* pointer to start of __init__ */ -    struct stat statbuf; - -/*      For calling case_ok(buf, len, namelen, name): - *      /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0 - *      ^                      ^                   ^    ^ - *      |--------------------- buf ---------------------| - *      |------------------- len ------------------| - *                             |------ name -------| - *                             |----- namelen -----| - */ -    if (save_len + 13 >= MAXPATHLEN) -        return 0; -    buf[i++] = SEP; -    pname = buf + i; -    strcpy(pname, "__init__.py"); -    if (stat(buf, &statbuf) == 0) { -        if (case_ok(buf, -                    save_len + 9,               /* len("/__init__") */ -                8,                              /* len("__init__") */ -                pname)) { -            buf[save_len] = '\0'; -            return 1; -        } -    } -    i += strlen(pname); -    strcpy(buf+i, Py_OptimizeFlag ? "o" : "c"); -    if (stat(buf, &statbuf) == 0) { -        if (case_ok(buf, -                    save_len + 9,               /* len("/__init__") */ -                8,                              /* len("__init__") */ -                pname)) { -            buf[save_len] = '\0'; -            return 1; -        } -    } -    buf[save_len] = '\0'; -    return 0; -} - -#endif /* HAVE_STAT */ - - -static int init_builtin(char *); /* Forward */ - -static PyObject* -load_builtin(char *name, char *pathname, int type) -{ -    PyObject *m, *modules; -    int err; - -    if (pathname != NULL && pathname[0] != '\0') -        name = pathname; - -    if (type == C_BUILTIN) -        err = init_builtin(name); -    else -        err = PyImport_ImportFrozenModule(name); -    if (err < 0) -        return NULL; -    if (err == 0) { -        PyErr_Format(PyExc_ImportError, -                "Purported %s module %.200s not found", -                type == C_BUILTIN ? -                "builtin" : "frozen", -                name); -        return NULL; -    } - -    modules = PyImport_GetModuleDict(); -    m = PyDict_GetItemString(modules, name); -    if (m == NULL) { -        PyErr_Format( -                PyExc_ImportError, -                "%s module %.200s not properly initialized", -                type == C_BUILTIN ? -                "builtin" : "frozen", -                name); -        return NULL; -    } -    Py_INCREF(m); -    return m; -} - -/* Load an external module using the default search path and return -   its module object WITH INCREMENTED REFERENCE COUNT */ - -static PyObject * -load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader) -{ -    PyObject *m; - -    /* First check that there's an open file (if we need one)  */ -    switch (type) { -    case PY_SOURCE: -    case PY_COMPILED: -        if (fp == NULL) { -            PyErr_Format(PyExc_ValueError, -               "file object required for import (type code %d)", -                         type); -            return NULL; -        } -    } - -    switch (type) { - -    case PY_SOURCE: -        m = load_source_module(name, pathname, fp); -        break; - -    case PY_COMPILED: -        m = load_compiled_module(name, pathname, fp); -        break; - -#ifdef HAVE_DYNAMIC_LOADING -    case C_EXTENSION: -        m = _PyImport_LoadDynamicModule(name, pathname, fp); -        break; -#endif - -    case PKG_DIRECTORY: -        m = load_package(name, pathname); -        break; - -    case C_BUILTIN: -    case PY_FROZEN: -        m = load_builtin(name, pathname, type); -        break; - -    case IMP_HOOK: { -        if (loader == NULL) { -            PyErr_SetString(PyExc_ImportError, -                            "import hook without loader"); -            return NULL; -        } -        m = PyObject_CallMethod(loader, "load_module", "s", name); -        break; -    } - -    default: -        PyErr_Format(PyExc_ImportError, -                     "Don't know how to import %.200s (type code %d)", -                      name, type); -        m = NULL; - -    } - -    return m; -} +static int init_builtin(PyObject *); /* Forward */  /* Initialize a built-in module.     Return 1 for success, 0 if the module is not found, and -1 with     an exception set if the initialization failed. */  static int -init_builtin(char *name) +init_builtin(PyObject *name)  {      struct _inittab *p; -    if (_PyImport_FindBuiltin(name) != NULL) +    if (_PyImport_FindExtensionObject(name, name) != NULL)          return 1;      for (p = PyImport_Inittab; p->name != NULL; p++) {          PyObject *mod;          PyModuleDef *def; -        if (strcmp(name, p->name) == 0) { +        if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) {              if (p->initfunc == NULL) {                  PyErr_Format(PyExc_ImportError, -                    "Cannot re-init internal module %.200s", +                    "Cannot re-init internal module %R",                      name);                  return -1;              } -            if (Py_VerboseFlag) -                PySys_WriteStderr("import %s # builtin\n", name);              mod = (*p->initfunc)();              if (mod == 0)                  return -1;              /* Remember pointer to module init function. */              def = PyModule_GetDef(mod);              def->m_base.m_init = p->initfunc; -            if (_PyImport_FixupBuiltin(mod, name) < 0) +            if (_PyImport_FixupExtensionObject(mod, name, name) < 0)                  return -1;              /* FixupExtension has put the module into sys.modules,                 so we can release our own reference. */ @@ -2238,37 +968,37 @@ init_builtin(char *name)  /* Frozen modules */  static struct _frozen * -find_frozen(char *name) +find_frozen(PyObject *name)  {      struct _frozen *p; -    if (!name) +    if (name == NULL)          return NULL;      for (p = PyImport_FrozenModules; ; p++) {          if (p->name == NULL)              return NULL; -        if (strcmp(p->name, name) == 0) +        if (PyUnicode_CompareWithASCIIString(name, p->name) == 0)              break;      }      return p;  }  static PyObject * -get_frozen_object(char *name) +get_frozen_object(PyObject *name)  {      struct _frozen *p = find_frozen(name);      int size;      if (p == NULL) {          PyErr_Format(PyExc_ImportError, -                     "No such frozen object named %.200s", +                     "No such frozen object named %R",                       name);          return NULL;      }      if (p->code == NULL) {          PyErr_Format(PyExc_ImportError, -                     "Excluded frozen object named %.200s", +                     "Excluded frozen object named %R",                       name);          return NULL;      } @@ -2279,14 +1009,14 @@ get_frozen_object(char *name)  }  static PyObject * -is_frozen_package(char *name) +is_frozen_package(PyObject *name)  {      struct _frozen *p = find_frozen(name);      int size;      if (p == NULL) {          PyErr_Format(PyExc_ImportError, -                     "No such frozen object named %.200s", +                     "No such frozen object named %R",                       name);          return NULL;      } @@ -2306,19 +1036,20 @@ is_frozen_package(char *name)     This function is also used from frozenmain.c */  int -PyImport_ImportFrozenModule(char *name) +PyImport_ImportFrozenModuleObject(PyObject *name)  { -    struct _frozen *p = find_frozen(name); -    PyObject *co; -    PyObject *m; +    struct _frozen *p; +    PyObject *co, *m, *path;      int ispackage;      int size; +    p = find_frozen(name); +      if (p == NULL)          return 0;      if (p->code == NULL) {          PyErr_Format(PyExc_ImportError, -                     "Excluded frozen object named %.200s", +                     "Excluded frozen object named %R",                       name);          return -1;      } @@ -2326,41 +1057,39 @@ PyImport_ImportFrozenModule(char *name)      ispackage = (size < 0);      if (ispackage)          size = -size; -    if (Py_VerboseFlag) -        PySys_WriteStderr("import %s # frozen%s\n", -            name, ispackage ? " package" : "");      co = PyMarshal_ReadObjectFromString((char *)p->code, size);      if (co == NULL)          return -1;      if (!PyCode_Check(co)) {          PyErr_Format(PyExc_TypeError, -                     "frozen object %.200s is not a code object", +                     "frozen object %R is not a code object",                       name);          goto err_return;      }      if (ispackage) {          /* Set __path__ to the package name */ -        PyObject *d, *s, *l; +        PyObject *d, *l;          int err; -        m = PyImport_AddModule(name); +        m = PyImport_AddModuleObject(name);          if (m == NULL)              goto err_return;          d = PyModule_GetDict(m); -        s = PyUnicode_InternFromString(name); -        if (s == NULL) -            goto err_return;          l = PyList_New(1);          if (l == NULL) { -            Py_DECREF(s);              goto err_return;          } -        PyList_SET_ITEM(l, 0, s); +        Py_INCREF(name); +        PyList_SET_ITEM(l, 0, name);          err = PyDict_SetItemString(d, "__path__", l);          Py_DECREF(l);          if (err != 0)              goto err_return;      } -    m = PyImport_ExecCodeModuleEx(name, co, "<frozen>"); +    path = PyUnicode_FromString("<frozen>"); +    if (path == NULL) +        goto err_return; +    m = PyImport_ExecCodeModuleObject(name, co, path, NULL); +    Py_DECREF(path);      if (m == NULL)          goto err_return;      Py_DECREF(co); @@ -2371,6 +1100,19 @@ err_return:      return -1;  } +int +PyImport_ImportFrozenModule(char *name) +{ +    PyObject *nameobj; +    int ret; +    nameobj = PyUnicode_InternFromString(name); +    if (nameobj == NULL) +        return -1; +    ret = PyImport_ImportFrozenModuleObject(nameobj); +    Py_DECREF(nameobj); +    return ret; +} +  /* Import a module, either built-in, frozen, or external, and return     its module object WITH INCREMENTED REFERENCE COUNT */ @@ -2401,585 +1143,411 @@ PyImport_ImportModule(const char *name)  PyObject *  PyImport_ImportModuleNoBlock(const char *name)  { -    PyObject *result; -    PyObject *modules; -#ifdef WITH_THREAD -    long me; -#endif - -    /* Try to get the module from sys.modules[name] */ -    modules = PyImport_GetModuleDict(); -    if (modules == NULL) -        return NULL; - -    result = PyDict_GetItemString(modules, name); -    if (result != NULL) { -        Py_INCREF(result); -        return result; -    } -    else { -        PyErr_Clear(); -    } -#ifdef WITH_THREAD -    /* check the import lock -     * me might be -1 but I ignore the error here, the lock function -     * takes care of the problem */ -    me = PyThread_get_thread_ident(); -    if (import_lock_thread == -1 || import_lock_thread == me) { -        /* no thread or me is holding the lock */ -        return PyImport_ImportModule(name); -    } -    else { -        PyErr_Format(PyExc_ImportError, -                     "Failed to import %.200s because the import lock" -                     "is held by another thread.", -                     name); -        return NULL; -    } -#else      return PyImport_ImportModule(name); -#endif  } -/* Forward declarations for helper routines */ -static PyObject *get_parent(PyObject *globals, char *buf, -                            Py_ssize_t *p_buflen, int level); -static PyObject *load_next(PyObject *mod, PyObject *altmod, -                           char **p_name, char *buf, Py_ssize_t *p_buflen); -static int mark_miss(char *name); -static int ensure_fromlist(PyObject *mod, PyObject *fromlist, -                           char *buf, Py_ssize_t buflen, int recursive); -static PyObject * import_submodule(PyObject *mod, char *name, char *fullname); - -/* The Magnum Opus of dotted-name import :-) */ - -static PyObject * -import_module_level(char *name, PyObject *globals, PyObject *locals, -                    PyObject *fromlist, int level) -{ -    char *buf; -    Py_ssize_t buflen = 0; -    PyObject *parent, *head, *next, *tail; -    if (strchr(name, '/') != NULL -#ifdef MS_WINDOWS -        || strchr(name, '\\') != NULL -#endif -        ) { -        PyErr_SetString(PyExc_ImportError, -                        "Import by filename is not supported."); -        return NULL; +/* Remove importlib frames from the traceback, + * except in Verbose mode. */ +static void +remove_importlib_frames(void) +{ +    const char *importlib_filename = "<frozen importlib._bootstrap>"; +    const char *remove_frames = "_call_with_frames_removed"; +    int always_trim = 0; +    int in_importlib = 0; +    PyObject *exception, *value, *base_tb, *tb; +    PyObject **prev_link, **outer_link = NULL; + +    /* Synopsis: if it's an ImportError, we trim all importlib chunks +       from the traceback. We always trim chunks +       which end with a call to "_call_with_frames_removed". */ + +    PyErr_Fetch(&exception, &value, &base_tb); +    if (!exception || Py_VerboseFlag) +        goto done; +    if (PyType_IsSubtype((PyTypeObject *) exception, +                         (PyTypeObject *) PyExc_ImportError)) +        always_trim = 1; + +    prev_link = &base_tb; +    tb = base_tb; +    while (tb != NULL) { +        PyTracebackObject *traceback = (PyTracebackObject *)tb; +        PyObject *next = (PyObject *) traceback->tb_next; +        PyFrameObject *frame = traceback->tb_frame; +        PyCodeObject *code = frame->f_code; +        int now_in_importlib; + +        assert(PyTraceBack_Check(tb)); +        now_in_importlib = (PyUnicode_CompareWithASCIIString( +                                code->co_filename, +                                importlib_filename) == 0); +        if (now_in_importlib && !in_importlib) { +            /* This is the link to this chunk of importlib tracebacks */ +            outer_link = prev_link; +        } +        in_importlib = now_in_importlib; + +        if (in_importlib && +            (always_trim || +             PyUnicode_CompareWithASCIIString(code->co_name, +                                              remove_frames) == 0)) { +            PyObject *tmp = *outer_link; +            *outer_link = next; +            Py_XINCREF(next); +            Py_DECREF(tmp); +            prev_link = outer_link; +        } +        else { +            prev_link = (PyObject **) &traceback->tb_next; +        } +        tb = next;      } +done: +    PyErr_Restore(exception, value, base_tb); +} -    buf = PyMem_MALLOC(MAXPATHLEN+1); -    if (buf == NULL) { -        return PyErr_NoMemory(); -    } -    parent = get_parent(globals, buf, &buflen, level); -    if (parent == NULL) -        goto error_exit; -    head = load_next(parent, level < 0 ? Py_None : parent, &name, buf, -                        &buflen); -    if (head == NULL) -        goto error_exit; +PyObject * +PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, +                                 PyObject *locals, PyObject *given_fromlist, +                                 int level) +{ +    _Py_IDENTIFIER(__import__); +    _Py_IDENTIFIER(__initializing__); +    _Py_IDENTIFIER(__package__); +    _Py_IDENTIFIER(__path__); +    _Py_IDENTIFIER(__name__); +    _Py_IDENTIFIER(_find_and_load); +    _Py_IDENTIFIER(_handle_fromlist); +    _Py_IDENTIFIER(_lock_unlock_module); +    _Py_static_string(single_dot, "."); +    PyObject *abs_name = NULL; +    PyObject *builtins_import = NULL; +    PyObject *final_mod = NULL; +    PyObject *mod = NULL; +    PyObject *package = NULL; +    PyObject *globals = NULL; +    PyObject *fromlist = NULL; +    PyInterpreterState *interp = PyThreadState_GET()->interp; -    tail = head; -    Py_INCREF(tail); -    while (name) { -        next = load_next(tail, tail, &name, buf, &buflen); -        Py_DECREF(tail); -        if (next == NULL) { -            Py_DECREF(head); -            goto error_exit; +    /* Make sure to use default values so as to not have +       PyObject_CallMethodObjArgs() truncate the parameter list because of a +       NULL argument. */ +    if (given_globals == NULL) { +        globals = PyDict_New(); +        if (globals == NULL) { +            goto error;          } -        tail = next; -    } -    if (tail == Py_None) { -        /* If tail is Py_None, both get_parent and load_next found -           an empty module name: someone called __import__("") or -           doctored faulty bytecode */ -        Py_DECREF(tail); -        Py_DECREF(head); -        PyErr_SetString(PyExc_ValueError, -                        "Empty module name"); -        goto error_exit; -    } - -    if (fromlist != NULL) { -        int b = (fromlist == Py_None) ? 0 : PyObject_IsTrue(fromlist); -        if (b < 0) { -            Py_DECREF(tail); -            Py_DECREF(head); -            goto error_exit; +    } +    else { +        /* Only have to care what given_globals is if it will be used +           for something. */ +        if (level > 0 && !PyDict_Check(given_globals)) { +            PyErr_SetString(PyExc_TypeError, "globals must be a dict"); +            goto error;          } -        if (!b) -            fromlist = NULL; +        globals = given_globals; +        Py_INCREF(globals);      } -    if (fromlist == NULL) { -        Py_DECREF(tail); -        PyMem_FREE(buf); -        return head; +    if (given_fromlist == NULL) { +        fromlist = PyList_New(0); +        if (fromlist == NULL) { +            goto error; +        }      } - -    Py_DECREF(head); -    if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) { -        Py_DECREF(tail); -        goto error_exit; +    else { +        fromlist = given_fromlist; +        Py_INCREF(fromlist);      } - -    PyMem_FREE(buf); -    return tail; - -error_exit: -    PyMem_FREE(buf); -    return NULL; -} - -PyObject * -PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, -                         PyObject *fromlist, int level) -{ -    PyObject *result; -    _PyImport_AcquireLock(); -    result = import_module_level(name, globals, locals, fromlist, level); -    if (_PyImport_ReleaseLock() < 0) { -        Py_XDECREF(result); -        PyErr_SetString(PyExc_RuntimeError, -                        "not holding the import lock"); -        return NULL; +    if (name == NULL) { +        PyErr_SetString(PyExc_ValueError, "Empty module name"); +        goto error;      } -    return result; -} - -/* Return the package that an import is being performed in.  If globals comes -   from the module foo.bar.bat (not itself a package), this returns the -   sys.modules entry for foo.bar.  If globals is from a package's __init__.py, -   the package's entry in sys.modules is returned, as a borrowed reference. - -   The *name* of the returned package is returned in buf, with the length of -   the name in *p_buflen. -   If globals doesn't come from a package or a module in a package, or a -   corresponding entry is not found in sys.modules, Py_None is returned. -*/ -static PyObject * -get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level) -{ -    static PyObject *namestr = NULL; -    static PyObject *pathstr = NULL; -    static PyObject *pkgstr = NULL; -    PyObject *pkgname, *modname, *modpath, *modules, *parent; -    int orig_level = level; +    /* The below code is importlib.__import__() & _gcd_import(), ported to C +       for added performance. */ -    if (globals == NULL || !PyDict_Check(globals) || !level) -        return Py_None; - -    if (namestr == NULL) { -        namestr = PyUnicode_InternFromString("__name__"); -        if (namestr == NULL) -            return NULL; +    if (!PyUnicode_Check(name)) { +        PyErr_SetString(PyExc_TypeError, "module name must be a string"); +        goto error;      } -    if (pathstr == NULL) { -        pathstr = PyUnicode_InternFromString("__path__"); -        if (pathstr == NULL) -            return NULL; +    else if (PyUnicode_READY(name) < 0) { +        goto error;      } -    if (pkgstr == NULL) { -        pkgstr = PyUnicode_InternFromString("__package__"); -        if (pkgstr == NULL) -            return NULL; +    if (level < 0) { +        PyErr_SetString(PyExc_ValueError, "level must be >= 0"); +        goto error;      } - -    *buf = '\0'; -    *p_buflen = 0; -    pkgname = PyDict_GetItem(globals, pkgstr); - -    if ((pkgname != NULL) && (pkgname != Py_None)) { -        /* __package__ is set, so use it */ -        char *pkgname_str; -        Py_ssize_t len; - -        if (!PyUnicode_Check(pkgname)) { -            PyErr_SetString(PyExc_ValueError, -                            "__package__ set to non-string"); -            return NULL; -        } -        pkgname_str = _PyUnicode_AsStringAndSize(pkgname, &len); -        if (len == 0) { -            if (level > 0) { -                PyErr_SetString(PyExc_ValueError, -                    "Attempted relative import in non-package"); -                return NULL; +    else if (level > 0) { +        package = _PyDict_GetItemId(globals, &PyId___package__); +        if (package != NULL && package != Py_None) { +            Py_INCREF(package); +            if (!PyUnicode_Check(package)) { +                PyErr_SetString(PyExc_TypeError, "package must be a string"); +                goto error;              } -            return Py_None;          } -        if (len > MAXPATHLEN) { -            PyErr_SetString(PyExc_ValueError, -                            "Package name too long"); -            return NULL; -        } -        strcpy(buf, pkgname_str); -    } else { -        /* __package__ not set, so figure it out and set it */ -        modname = PyDict_GetItem(globals, namestr); -        if (modname == NULL || !PyUnicode_Check(modname)) -            return Py_None; - -        modpath = PyDict_GetItem(globals, pathstr); -        if (modpath != NULL) { -            /* __path__ is set, so modname is already the package name */ -            char *modname_str; -            Py_ssize_t len; -            int error; - -            modname_str = _PyUnicode_AsStringAndSize(modname, &len); -            if (len > MAXPATHLEN) { -                PyErr_SetString(PyExc_ValueError, -                                "Module name too long"); -                return NULL; +        else { +            package = _PyDict_GetItemId(globals, &PyId___name__); +            if (package == NULL) { +                PyErr_SetString(PyExc_KeyError, "'__name__' not in globals"); +                goto error;              } -            strcpy(buf, modname_str); -            error = PyDict_SetItem(globals, pkgstr, modname); -            if (error) { -                PyErr_SetString(PyExc_ValueError, -                                "Could not set __package__"); -                return NULL; +            else if (!PyUnicode_Check(package)) { +                PyErr_SetString(PyExc_TypeError, "__name__ must be a string");              } -        } else { -            /* Normal module, so work out the package name if any */ -            char *start = _PyUnicode_AsString(modname); -            char *lastdot = strrchr(start, '.'); -            size_t len; -            int error; -            if (lastdot == NULL && level > 0) { -                PyErr_SetString(PyExc_ValueError, -                    "Attempted relative import in non-package"); -                return NULL; -            } -            if (lastdot == NULL) { -                error = PyDict_SetItem(globals, pkgstr, Py_None); -                if (error) { -                    PyErr_SetString(PyExc_ValueError, -                        "Could not set __package__"); -                    return NULL; +            Py_INCREF(package); + +            if (_PyDict_GetItemId(globals, &PyId___path__) == NULL) { +                PyObject *partition = NULL; +                PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot); +                if (borrowed_dot == NULL) { +                    goto error;                  } -                return Py_None; -            } -            len = lastdot - start; -            if (len >= MAXPATHLEN) { -                PyErr_SetString(PyExc_ValueError, -                                "Module name too long"); -                return NULL; -            } -            strncpy(buf, start, len); -            buf[len] = '\0'; -            pkgname = PyUnicode_FromString(buf); -            if (pkgname == NULL) { -                return NULL; -            } -            error = PyDict_SetItem(globals, pkgstr, pkgname); -            Py_DECREF(pkgname); -            if (error) { -                PyErr_SetString(PyExc_ValueError, -                                "Could not set __package__"); -                return NULL; +                partition = PyUnicode_RPartition(package, borrowed_dot); +                Py_DECREF(package); +                if (partition == NULL) { +                    goto error; +                } +                package = PyTuple_GET_ITEM(partition, 0); +                Py_INCREF(package); +                Py_DECREF(partition);              }          } + +        if (PyDict_GetItem(interp->modules, package) == NULL) { +            PyErr_Format(PyExc_SystemError, +                    "Parent module %R not loaded, cannot perform relative " +                    "import", package); +            goto error; +        }      } -    while (--level > 0) { -        char *dot = strrchr(buf, '.'); -        if (dot == NULL) { -            PyErr_SetString(PyExc_ValueError, -                "Attempted relative import beyond " -                "toplevel package"); -            return NULL; +    else {  /* level == 0 */ +        if (PyUnicode_GET_LENGTH(name) == 0) { +            PyErr_SetString(PyExc_ValueError, "Empty module name"); +            goto error;          } -        *dot = '\0'; +        package = Py_None; +        Py_INCREF(package);      } -    *p_buflen = strlen(buf); -    modules = PyImport_GetModuleDict(); -    parent = PyDict_GetItemString(modules, buf); -    if (parent == NULL) { -        if (orig_level < 1) { -            PyObject *err_msg = PyBytes_FromFormat( -                "Parent module '%.200s' not found " -                "while handling absolute import", buf); -            if (err_msg == NULL) { -                return NULL; +    if (level > 0) { +        Py_ssize_t last_dot = PyUnicode_GET_LENGTH(package); +        PyObject *base = NULL; +        int level_up = 1; + +        for (level_up = 1; level_up < level; level_up += 1) { +            last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1); +            if (last_dot == -2) { +                goto error;              } -            if (!PyErr_WarnEx(PyExc_RuntimeWarning, -                              PyBytes_AsString(err_msg), 1)) { -                *buf = '\0'; -                *p_buflen = 0; -                parent = Py_None; +            else if (last_dot == -1) { +                PyErr_SetString(PyExc_ValueError, +                                "attempted relative import beyond top-level " +                                "package"); +                goto error;              } -            Py_DECREF(err_msg); -        } else { -            PyErr_Format(PyExc_SystemError, -                "Parent module '%.200s' not loaded, " -                "cannot perform relative import", buf);          } -    } -    return parent; -    /* We expect, but can't guarantee, if parent != None, that: -       - parent.__name__ == buf -       - parent.__dict__ is globals -       If this is violated...  Who cares? */ -} - -/* altmod is either None or same as mod */ -static PyObject * -load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf, -          Py_ssize_t *p_buflen) -{ -    char *name = *p_name; -    char *dot = strchr(name, '.'); -    size_t len; -    char *p; -    PyObject *result; - -    if (strlen(name) == 0) { -        /* completely empty module name should only happen in -           'from . import' (or '__import__("")')*/ -        Py_INCREF(mod); -        *p_name = NULL; -        return mod; -    } +        base = PyUnicode_Substring(package, 0, last_dot); +        if (PyUnicode_GET_LENGTH(name) > 0) { +            PyObject *borrowed_dot, *seq = NULL; + +            borrowed_dot = _PyUnicode_FromId(&single_dot); +            seq = PyTuple_Pack(2, base, name); +            Py_DECREF(base); +            if (borrowed_dot == NULL || seq == NULL) { +                goto error; +            } -    if (dot == NULL) { -        *p_name = NULL; -        len = strlen(name); +            abs_name = PyUnicode_Join(borrowed_dot, seq); +            Py_DECREF(seq); +            if (abs_name == NULL) { +                goto error; +            } +        } +        else { +            abs_name = base; +        }      }      else { -        *p_name = dot+1; -        len = dot-name; -    } -    if (len == 0) { -        PyErr_SetString(PyExc_ValueError, -                        "Empty module name"); -        return NULL; +        abs_name = name; +        Py_INCREF(abs_name);      } -    p = buf + *p_buflen; -    if (p != buf) -        *p++ = '.'; -    if (p+len-buf >= MAXPATHLEN) { -        PyErr_SetString(PyExc_ValueError, -                        "Module name too long"); -        return NULL; -    } -    strncpy(p, name, len); -    p[len] = '\0'; -    *p_buflen = p+len-buf; - -    result = import_submodule(mod, p, buf); -    if (result == Py_None && altmod != mod) { -        Py_DECREF(result); -        /* Here, altmod must be None and mod must not be None */ -        result = import_submodule(altmod, p, p); -        if (result != NULL && result != Py_None) { -            if (mark_miss(buf) != 0) { -                Py_DECREF(result); -                return NULL; -            } -            strncpy(buf, name, len); -            buf[len] = '\0'; -            *p_buflen = len; +#ifdef WITH_THREAD +    _PyImport_AcquireLock(); +#endif +   /* From this point forward, goto error_with_unlock! */ +    if (PyDict_Check(globals)) { +        builtins_import = _PyDict_GetItemId(globals, &PyId___import__); +    } +    if (builtins_import == NULL) { +        builtins_import = _PyDict_GetItemId(interp->builtins, &PyId___import__); +        if (builtins_import == NULL) { +            Py_FatalError("__import__ missing");          }      } -    if (result == NULL) -        return NULL; +    Py_INCREF(builtins_import); -    if (result == Py_None) { -        Py_DECREF(result); -        PyErr_Format(PyExc_ImportError, -                     "No module named %.200s", name); -        return NULL; +    mod = PyDict_GetItem(interp->modules, abs_name); +    if (mod == Py_None) { +        PyObject *msg = PyUnicode_FromFormat("import of %R halted; " +                                             "None in sys.modules", abs_name); +        if (msg != NULL) { +            PyErr_SetImportError(msg, abs_name, NULL); +            Py_DECREF(msg); +        } +        mod = NULL; +        goto error_with_unlock;      } +    else if (mod != NULL) { +        PyObject *value; +        int initializing = 0; -    return result; -} - -static int -mark_miss(char *name) -{ -    PyObject *modules = PyImport_GetModuleDict(); -    return PyDict_SetItemString(modules, name, Py_None); -} - -static int -ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen, -                int recursive) -{ -    int i; - -    if (!PyObject_HasAttrString(mod, "__path__")) -        return 1; - -    for (i = 0; ; i++) { -        PyObject *item = PySequence_GetItem(fromlist, i); -        int hasit; -        if (item == NULL) { -            if (PyErr_ExceptionMatches(PyExc_IndexError)) { +        Py_INCREF(mod); +        /* Optimization: only call _bootstrap._lock_unlock_module() if +           __initializing__ is true. +           NOTE: because of this, __initializing__ must be set *before* +           stuffing the new module in sys.modules. +         */ +        value = _PyObject_GetAttrId(mod, &PyId___initializing__); +        if (value == NULL) +            PyErr_Clear(); +        else { +            initializing = PyObject_IsTrue(value); +            Py_DECREF(value); +            if (initializing == -1)                  PyErr_Clear(); -                return 1; -            } -            return 0;          } -        if (!PyUnicode_Check(item)) { -            PyErr_SetString(PyExc_TypeError, -                            "Item in ``from list'' not a string"); -            Py_DECREF(item); -            return 0; +        if (initializing > 0) { +            /* _bootstrap._lock_unlock_module() releases the import lock */ +            value = _PyObject_CallMethodObjIdArgs(interp->importlib, +                                            &PyId__lock_unlock_module, abs_name, +                                            NULL); +            if (value == NULL) +                goto error; +            Py_DECREF(value);          } -        if (PyUnicode_AS_UNICODE(item)[0] == '*') { -            PyObject *all; -            Py_DECREF(item); -            /* See if the package defines __all__ */ -            if (recursive) -                continue; /* Avoid endless recursion */ -            all = PyObject_GetAttrString(mod, "__all__"); -            if (all == NULL) -                PyErr_Clear(); -            else { -                int ret = ensure_fromlist(mod, all, buf, buflen, 1); -                Py_DECREF(all); -                if (!ret) -                    return 0; +        else { +#ifdef WITH_THREAD +            if (_PyImport_ReleaseLock() < 0) { +                PyErr_SetString(PyExc_RuntimeError, "not holding the import lock"); +                goto error;              } -            continue; +#endif          } -        hasit = PyObject_HasAttr(mod, item); -        if (!hasit) { -            PyObject *item8; -            char *subname; -            PyObject *submod; -            char *p; -            item8 = PyUnicode_EncodeFSDefault(item); -            if (!item8) { -                PyErr_SetString(PyExc_ValueError, "Cannot encode path item"); -                return 0; -            } -            subname = PyBytes_AS_STRING(item8); -            if (buflen + strlen(subname) >= MAXPATHLEN) { -                PyErr_SetString(PyExc_ValueError, -                                "Module name too long"); -                Py_DECREF(item); -                return 0; -            } -            p = buf + buflen; -            *p++ = '.'; -            strcpy(p, subname); -            submod = import_submodule(mod, subname, buf); -            Py_DECREF(item8); -            Py_XDECREF(submod); -            if (submod == NULL) { -                Py_DECREF(item); -                return 0; -            } +    } +    else { +        /* _bootstrap._find_and_load() releases the import lock */ +        mod = _PyObject_CallMethodObjIdArgs(interp->importlib, +                                            &PyId__find_and_load, abs_name, +                                            builtins_import, NULL); +        if (mod == NULL) { +            goto error;          } -        Py_DECREF(item);      } +    /* From now on we don't hold the import lock anymore. */ -    /* NOTREACHED */ -} +    if (PyObject_Not(fromlist)) { +        if (level == 0 || PyUnicode_GET_LENGTH(name) > 0) { +            PyObject *front = NULL; +            PyObject *partition = NULL; +            PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot); -static int -add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname, -              PyObject *modules) -{ -    if (mod == Py_None) -        return 1; -    /* Irrespective of the success of this load, make a -       reference to it in the parent package module.  A copy gets -       saved in the modules dictionary under the full name, so get a -       reference from there, if need be.  (The exception is when the -       load failed with a SyntaxError -- then there's no trace in -       sys.modules.  In that case, of course, do nothing extra.) */ -    if (submod == NULL) { -        submod = PyDict_GetItemString(modules, fullname); -        if (submod == NULL) -            return 1; -    } -    if (PyModule_Check(mod)) { -        /* We can't use setattr here since it can give a -         * spurious warning if the submodule name shadows a -         * builtin name */ -        PyObject *dict = PyModule_GetDict(mod); -        if (!dict) -            return 0; -        if (PyDict_SetItemString(dict, subname, submod) < 0) -            return 0; -    } -    else { -        if (PyObject_SetAttrString(mod, subname, submod) < 0) -            return 0; -    } -    return 1; -} +            if (borrowed_dot == NULL) { +                goto error; +            } -static PyObject * -import_submodule(PyObject *mod, char *subname, char *fullname) -{ -    PyObject *modules = PyImport_GetModuleDict(); -    PyObject *m = NULL; +            partition = PyUnicode_Partition(name, borrowed_dot); +            if (partition == NULL) { +                goto error; +            } -    /* Require: -       if mod == None: subname == fullname -       else: mod.__name__ + "." + subname == fullname -    */ +            if (PyUnicode_GET_LENGTH(PyTuple_GET_ITEM(partition, 1)) == 0) { +                /* No dot in module name, simple exit */ +                Py_DECREF(partition); +                final_mod = mod; +                Py_INCREF(mod); +                goto error; +            } -    if ((m = PyDict_GetItemString(modules, fullname)) != NULL) { -        Py_INCREF(m); -    } -    else { -        PyObject *path, *loader = NULL; -        char *buf; -        struct filedescr *fdp; -        FILE *fp = NULL; +            front = PyTuple_GET_ITEM(partition, 0); +            Py_INCREF(front); +            Py_DECREF(partition); -        if (mod == Py_None) -            path = NULL; -        else { -            path = PyObject_GetAttrString(mod, "__path__"); -            if (path == NULL) { -                PyErr_Clear(); -                Py_INCREF(Py_None); -                return Py_None; +            if (level == 0) { +                final_mod = PyObject_CallFunctionObjArgs(builtins_import, front, NULL); +                Py_DECREF(front);              } -        } +            else { +                Py_ssize_t cut_off = PyUnicode_GET_LENGTH(name) - +                                        PyUnicode_GET_LENGTH(front); +                Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name); +                PyObject *to_return = PyUnicode_Substring(abs_name, 0, +                                                        abs_name_len - cut_off); +                Py_DECREF(front); +                if (to_return == NULL) { +                    goto error; +                } -        buf = PyMem_MALLOC(MAXPATHLEN+1); -        if (buf == NULL) { -            return PyErr_NoMemory(); -        } -        buf[0] = '\0'; -        fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1, -                          &fp, &loader); -        Py_XDECREF(path); -        if (fdp == NULL) { -            PyMem_FREE(buf); -            if (!PyErr_ExceptionMatches(PyExc_ImportError)) -                return NULL; -            PyErr_Clear(); -            Py_INCREF(Py_None); -            return Py_None; +                final_mod = PyDict_GetItem(interp->modules, to_return); +                if (final_mod == NULL) { +                    PyErr_Format(PyExc_KeyError, +                                 "%R not in sys.modules as expected", +                                 to_return); +                } +                else { +                    Py_INCREF(final_mod); +                } +                Py_DECREF(to_return); +            }          } -        m = load_module(fullname, fp, buf, fdp->type, loader); -        Py_XDECREF(loader); -        if (fp) -            fclose(fp); -        if (!add_submodule(mod, m, fullname, subname, modules)) { -            Py_XDECREF(m); -            m = NULL; +        else { +            final_mod = mod; +            Py_INCREF(mod);          } -        PyMem_FREE(buf);      } +    else { +        final_mod = _PyObject_CallMethodObjIdArgs(interp->importlib, +                                                  &PyId__handle_fromlist, mod, +                                                  fromlist, builtins_import, +                                                  NULL); +    } +    goto error; -    return m; +  error_with_unlock: +#ifdef WITH_THREAD +    if (_PyImport_ReleaseLock() < 0) { +        PyErr_SetString(PyExc_RuntimeError, "not holding the import lock"); +    } +#endif +  error: +    Py_XDECREF(abs_name); +    Py_XDECREF(builtins_import); +    Py_XDECREF(mod); +    Py_XDECREF(package); +    Py_XDECREF(globals); +    Py_XDECREF(fromlist); +    if (final_mod == NULL) +        remove_importlib_frames(); +    return final_mod; +} + +PyObject * +PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals, +                           PyObject *fromlist, int level) +{ +    PyObject *nameobj, *mod; +    nameobj = PyUnicode_FromString(name); +    if (nameobj == NULL) +        return NULL; +    mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals, +                                           fromlist, level); +    Py_DECREF(nameobj); +    return mod;  } @@ -2989,103 +1557,23 @@ import_submodule(PyObject *mod, char *subname, char *fullname)  PyObject *  PyImport_ReloadModule(PyObject *m)  { -    PyInterpreterState *interp = PyThreadState_Get()->interp; -    PyObject *modules_reloading = interp->modules_reloading; +    _Py_IDENTIFIER(reload); +    PyObject *reloaded_module = NULL;      PyObject *modules = PyImport_GetModuleDict(); -    PyObject *path = NULL, *loader = NULL, *existing_m = NULL; -    char *name, *subname; -    char *buf; -    struct filedescr *fdp; -    FILE *fp = NULL; -    PyObject *newm; - -    if (modules_reloading == NULL) { -        Py_FatalError("PyImport_ReloadModule: " -                      "no modules_reloading dictionary!"); -        return NULL; -    } - -    if (m == NULL || !PyModule_Check(m)) { -        PyErr_SetString(PyExc_TypeError, -                        "reload() argument must be module"); -        return NULL; -    } -    name = (char*)PyModule_GetName(m); -    if (name == NULL) -        return NULL; -    if (m != PyDict_GetItemString(modules, name)) { -        PyErr_Format(PyExc_ImportError, -                     "reload(): module %.200s not in sys.modules", -                     name); -        return NULL; -    } -    existing_m = PyDict_GetItemString(modules_reloading, name); -    if (existing_m != NULL) { -        /* Due to a recursive reload, this module is already -           being reloaded. */ -        Py_INCREF(existing_m); -        return existing_m; -    } -    if (PyDict_SetItemString(modules_reloading, name, m) < 0) -        return NULL; - -    subname = strrchr(name, '.'); -    if (subname == NULL) -        subname = name; -    else { -        PyObject *parentname, *parent; -        parentname = PyUnicode_FromStringAndSize(name, (subname-name)); -        if (parentname == NULL) { -            imp_modules_reloading_clear(); +    PyObject *imp = PyDict_GetItemString(modules, "imp"); +    if (imp == NULL) { +        imp = PyImport_ImportModule("imp"); +        if (imp == NULL) {              return NULL;          } -        parent = PyDict_GetItem(modules, parentname); -        if (parent == NULL) { -            PyErr_Format(PyExc_ImportError, -                "reload(): parent %U not in sys.modules", -                 parentname); -            Py_DECREF(parentname); -            imp_modules_reloading_clear(); -            return NULL; -        } -        Py_DECREF(parentname); -        subname++; -        path = PyObject_GetAttrString(parent, "__path__"); -        if (path == NULL) -            PyErr_Clear(); -    } -    buf = PyMem_MALLOC(MAXPATHLEN+1); -    if (buf == NULL) { -        Py_XDECREF(path); -        return PyErr_NoMemory();      } -    buf[0] = '\0'; -    fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader); -    Py_XDECREF(path); - -    if (fdp == NULL) { -        Py_XDECREF(loader); -        imp_modules_reloading_clear(); -        PyMem_FREE(buf); -        return NULL; +    else { +        Py_INCREF(imp);      } -    newm = load_module(name, fp, buf, fdp->type, loader); -    Py_XDECREF(loader); - -    if (fp) -        fclose(fp); -    if (newm == NULL) { -        /* load_module probably removed name from modules because of -         * the error.  Put back the original module object.  We're -         * going to return NULL in this case regardless of whether -         * replacing name succeeds, so the return value is ignored. -         */ -        PyDict_SetItemString(modules, name, m); -    } -    imp_modules_reloading_clear(); -    PyMem_FREE(buf); -    return newm; +    reloaded_module = _PyObject_CallMethodId(imp, &PyId_reload, "O", m); +    Py_DECREF(imp); +    return reloaded_module;  } @@ -3175,48 +1663,19 @@ PyImport_Import(PyObject *module_name)      return r;  } - -/* Module 'imp' provides Python access to the primitives used for -   importing modules. -*/ - -static PyObject * -imp_make_magic(long magic) -{ -    char buf[4]; - -    buf[0] = (char) ((magic >>  0) & 0xff); -    buf[1] = (char) ((magic >>  8) & 0xff); -    buf[2] = (char) ((magic >> 16) & 0xff); -    buf[3] = (char) ((magic >> 24) & 0xff); - -    return PyBytes_FromStringAndSize(buf, 4); -} - -static PyObject * -imp_get_magic(PyObject *self, PyObject *noargs) -{ -    return imp_make_magic(pyc_magic); -} - -static PyObject * -imp_get_tag(PyObject *self, PyObject *noargs) -{ -    return PyUnicode_FromString(pyc_tag); -} -  static PyObject * -imp_get_suffixes(PyObject *self, PyObject *noargs) +imp_extension_suffixes(PyObject *self, PyObject *noargs)  {      PyObject *list; -    struct filedescr *fdp; +    const char *suffix; +    unsigned int index = 0;      list = PyList_New(0);      if (list == NULL)          return NULL; -    for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) { -        PyObject *item = Py_BuildValue("ssi", -                               fdp->suffix, fdp->mode, fdp->type); +#ifdef HAVE_DYNAMIC_LOADING +    while ((suffix = _PyImport_DynLoadFiletab[index])) { +        PyObject *item = PyUnicode_FromString(suffix);          if (item == NULL) {              Py_DECREF(list);              return NULL; @@ -3227,102 +1686,19 @@ imp_get_suffixes(PyObject *self, PyObject *noargs)              return NULL;          }          Py_DECREF(item); +        index += 1;      } +#endif      return list;  }  static PyObject * -call_find_module(char *name, PyObject *path) -{ -    extern int fclose(FILE *); -    PyObject *fob, *ret; -    PyObject *pathobj; -    struct filedescr *fdp; -    char *pathname; -    FILE *fp = NULL; -    int fd = -1; -    char *found_encoding = NULL; -    char *encoding = NULL; - -    pathname = PyMem_MALLOC(MAXPATHLEN+1); -    if (pathname == NULL) { -        return PyErr_NoMemory(); -    } -    pathname[0] = '\0'; -    if (path == Py_None) -        path = NULL; -    fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL); -    if (fdp == NULL) -        goto error_exit; -    if (fp != NULL) { -        fd = fileno(fp); -        if (fd != -1) -            fd = dup(fd); -        fclose(fp); -        fp = NULL; -        if (fd == -1) { -            PyErr_SetFromErrno(PyExc_OSError); -            goto error_exit; -        } -    } -    if (fd != -1) { -        if (strchr(fdp->mode, 'b') == NULL) { -            /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed -               memory. */ -            found_encoding = PyTokenizer_FindEncoding(fd); -            lseek(fd, 0, 0); /* Reset position */ -            if (found_encoding == NULL && PyErr_Occurred()) { -                close(fd); -                goto error_exit; -            } -            encoding = (found_encoding != NULL) ? found_encoding : -                   (char*)PyUnicode_GetDefaultEncoding(); -        } -        fob = PyFile_FromFd(fd, pathname, fdp->mode, -1, -                            (char*)encoding, NULL, NULL, 1); -        if (fob == NULL) { -            close(fd); -            PyMem_FREE(found_encoding); -            goto error_exit; -        } -    } -    else { -        fob = Py_None; -        Py_INCREF(fob); -    } -    pathobj = PyUnicode_DecodeFSDefault(pathname); -    ret = Py_BuildValue("NN(ssi)", -                  fob, pathobj, fdp->suffix, fdp->mode, fdp->type); -    PyMem_FREE(found_encoding); -    PyMem_FREE(pathname); -    return ret; - -error_exit: -    PyMem_FREE(pathname); -    return NULL; -} - -static PyObject * -imp_find_module(PyObject *self, PyObject *args) -{ -    PyObject *name; -    PyObject *ret, *path = NULL; -    if (!PyArg_ParseTuple(args, "O&|O:find_module", -                          PyUnicode_FSConverter, &name, -                          &path)) -        return NULL; -    ret = call_find_module(PyBytes_AS_STRING(name), path); -    Py_DECREF(name); -    return ret; -} - -static PyObject *  imp_init_builtin(PyObject *self, PyObject *args)  { -    char *name; +    PyObject *name;      int ret;      PyObject *m; -    if (!PyArg_ParseTuple(args, "s:init_builtin", &name)) +    if (!PyArg_ParseTuple(args, "U:init_builtin", &name))          return NULL;      ret = init_builtin(name);      if (ret < 0) @@ -3331,7 +1707,7 @@ imp_init_builtin(PyObject *self, PyObject *args)          Py_INCREF(Py_None);          return Py_None;      } -    m = PyImport_AddModule(name); +    m = PyImport_AddModuleObject(name);      Py_XINCREF(m);      return m;  } @@ -3339,19 +1715,19 @@ imp_init_builtin(PyObject *self, PyObject *args)  static PyObject *  imp_init_frozen(PyObject *self, PyObject *args)  { -    char *name; +    PyObject *name;      int ret;      PyObject *m; -    if (!PyArg_ParseTuple(args, "s:init_frozen", &name)) +    if (!PyArg_ParseTuple(args, "U:init_frozen", &name))          return NULL; -    ret = PyImport_ImportFrozenModule(name); +    ret = PyImport_ImportFrozenModuleObject(name);      if (ret < 0)          return NULL;      if (ret == 0) {          Py_INCREF(Py_None);          return Py_None;      } -    m = PyImport_AddModule(name); +    m = PyImport_AddModuleObject(name);      Py_XINCREF(m);      return m;  } @@ -3359,9 +1735,9 @@ imp_init_frozen(PyObject *self, PyObject *args)  static PyObject *  imp_get_frozen_object(PyObject *self, PyObject *args)  { -    char *name; +    PyObject *name; -    if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name)) +    if (!PyArg_ParseTuple(args, "U:get_frozen_object", &name))          return NULL;      return get_frozen_object(name);  } @@ -3369,9 +1745,9 @@ imp_get_frozen_object(PyObject *self, PyObject *args)  static PyObject *  imp_is_frozen_package(PyObject *self, PyObject *args)  { -    char *name; +    PyObject *name; -    if (!PyArg_ParseTuple(args, "s:is_frozen_package", &name)) +    if (!PyArg_ParseTuple(args, "U:is_frozen_package", &name))          return NULL;      return is_frozen_package(name);  } @@ -3379,8 +1755,8 @@ imp_is_frozen_package(PyObject *self, PyObject *args)  static PyObject *  imp_is_builtin(PyObject *self, PyObject *args)  { -    char *name; -    if (!PyArg_ParseTuple(args, "s:is_builtin", &name)) +    PyObject *name; +    if (!PyArg_ParseTuple(args, "U:is_builtin", &name))          return NULL;      return PyLong_FromLong(is_builtin(name));  } @@ -3388,333 +1764,54 @@ imp_is_builtin(PyObject *self, PyObject *args)  static PyObject *  imp_is_frozen(PyObject *self, PyObject *args)  { -    char *name; +    PyObject *name;      struct _frozen *p; -    if (!PyArg_ParseTuple(args, "s:is_frozen", &name)) +    if (!PyArg_ParseTuple(args, "U:is_frozen", &name))          return NULL;      p = find_frozen(name);      return PyBool_FromLong((long) (p == NULL ? 0 : p->size));  } -static FILE * -get_file(char *pathname, PyObject *fob, char *mode) -{ -    FILE *fp; -    if (mode[0] == 'U') -        mode = "r" PY_STDIOTEXTMODE; -    if (fob == NULL) { -        fp = fopen(pathname, mode); -    } -    else { -        int fd = PyObject_AsFileDescriptor(fob); -        if (fd == -1) -            return NULL; -        if (!_PyVerify_fd(fd)) -            goto error; -        /* the FILE struct gets a new fd, so that it can be closed -         * independently of the file descriptor given -         */ -        fd = dup(fd); -        if (fd == -1) -            goto error; -        fp = fdopen(fd, mode); -    } -    if (fp) -        return fp; -error: -    PyErr_SetFromErrno(PyExc_IOError); -    return NULL; -} - -static PyObject * -imp_load_compiled(PyObject *self, PyObject *args) -{ -    char *name; -    PyObject *pathname; -    PyObject *fob = NULL; -    PyObject *m; -    FILE *fp; -    if (!PyArg_ParseTuple(args, "sO&|O:load_compiled", -                          &name, -                          PyUnicode_FSConverter, &pathname, -                          &fob)) -        return NULL; -    fp = get_file(PyBytes_AS_STRING(pathname), fob, "rb"); -    if (fp == NULL) { -        Py_DECREF(pathname); -        return NULL; -    } -    m = load_compiled_module(name, PyBytes_AS_STRING(pathname), fp); -    fclose(fp); -    Py_DECREF(pathname); -    return m; -} -  #ifdef HAVE_DYNAMIC_LOADING  static PyObject *  imp_load_dynamic(PyObject *self, PyObject *args)  { -    char *name; -    PyObject *pathbytes; -    char *pathname; -    PyObject *fob = NULL; -    PyObject *m; -    FILE *fp = NULL; -    if (!PyArg_ParseTuple(args, "sO&|O:load_dynamic", -                          &name, PyUnicode_FSConverter, &pathbytes, &fob)) -        return NULL; -    pathname = PyBytes_AS_STRING(pathbytes); -    if (fob) { -        fp = get_file(pathname, fob, "r"); -        if (fp == NULL) { -            Py_DECREF(pathbytes); -            return NULL; -        } -    } -    m = _PyImport_LoadDynamicModule(name, pathname, fp); -    Py_DECREF(pathbytes); -    if (fp) -        fclose(fp); -    return m; -} - -#endif /* HAVE_DYNAMIC_LOADING */ - -static PyObject * -imp_load_source(PyObject *self, PyObject *args) -{ -    char *name; -    PyObject *pathname; -    PyObject *fob = NULL; -    PyObject *m; +    PyObject *name, *pathname, *fob = NULL, *mod;      FILE *fp; -    if (!PyArg_ParseTuple(args, "sO&|O:load_source", -                          &name, -                          PyUnicode_FSConverter, &pathname, -                          &fob)) -        return NULL; -    fp = get_file(PyBytes_AS_STRING(pathname), fob, "r"); -    if (fp == NULL) { -        Py_DECREF(pathname); -        return NULL; -    } -    m = load_source_module(name, PyBytes_AS_STRING(pathname), fp); -    Py_DECREF(pathname); -    fclose(fp); -    return m; -} -static PyObject * -imp_load_module(PyObject *self, PyObject *args) -{ -    char *name; -    PyObject *fob; -    PyObject *pathname; -    PyObject * ret; -    char *suffix; /* Unused */ -    char *mode; -    int type; -    FILE *fp; - -    if (!PyArg_ParseTuple(args, "sOO&(ssi):load_module", -                          &name, &fob, -                          PyUnicode_FSConverter, &pathname, -                          &suffix, &mode, &type)) +    if (!PyArg_ParseTuple(args, "UO&|O:load_dynamic", +                          &name, PyUnicode_FSDecoder, &pathname, &fob))          return NULL; -    if (*mode) { -        /* Mode must start with 'r' or 'U' and must not contain '+'. -           Implicit in this test is the assumption that the mode -           may contain other modifiers like 'b' or 't'. */ - -        if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) { -            PyErr_Format(PyExc_ValueError, -                         "invalid file open mode %.200s", mode); -            Py_DECREF(pathname); -            return NULL; -        } -    } -    if (fob == Py_None) -        fp = NULL; -    else { -        fp = get_file(NULL, fob, mode); +    if (fob != NULL) { +        fp = _Py_fopen(pathname, "r");          if (fp == NULL) {              Py_DECREF(pathname); +            if (!PyErr_Occurred()) +                PyErr_SetFromErrno(PyExc_IOError);              return NULL;          }      } -    ret = load_module(name, fp, PyBytes_AS_STRING(pathname), type, NULL); +    else +        fp = NULL; +    mod = _PyImport_LoadDynamicModule(name, pathname, fp);      Py_DECREF(pathname);      if (fp)          fclose(fp); -    return ret; -} - -static PyObject * -imp_load_package(PyObject *self, PyObject *args) -{ -    char *name; -    PyObject *pathname; -    PyObject * ret; -    if (!PyArg_ParseTuple(args, "sO&:load_package", -                          &name, PyUnicode_FSConverter, &pathname)) -        return NULL; -    ret = load_package(name, PyBytes_AS_STRING(pathname)); -    Py_DECREF(pathname); -    return ret; -} - -static PyObject * -imp_new_module(PyObject *self, PyObject *args) -{ -    char *name; -    if (!PyArg_ParseTuple(args, "s:new_module", &name)) -        return NULL; -    return PyModule_New(name); -} - -static PyObject * -imp_reload(PyObject *self, PyObject *v) -{ -    return PyImport_ReloadModule(v); -} - -PyDoc_STRVAR(doc_reload, -"reload(module) -> module\n\ -\n\ -Reload the module.  The module must have been successfully imported before."); - -static PyObject * -imp_cache_from_source(PyObject *self, PyObject *args, PyObject *kws) -{ -    static char *kwlist[] = {"path", "debug_override", NULL}; - -    char *buf; -    PyObject *pathbytes; -    char *cpathname; -    PyObject *debug_override = NULL; -    int debug = !Py_OptimizeFlag; - -    if (!PyArg_ParseTupleAndKeywords( -                args, kws, "O&|O", kwlist, -                PyUnicode_FSConverter, &pathbytes, &debug_override)) -        return NULL; - -    if (debug_override != NULL && -        (debug = PyObject_IsTrue(debug_override)) < 0) { -        Py_DECREF(pathbytes); -        return NULL; -    } - -    buf = PyMem_MALLOC(MAXPATHLEN+1); -    if (buf == NULL) { -        return PyErr_NoMemory(); -    } -    cpathname = make_compiled_pathname( -        PyBytes_AS_STRING(pathbytes), -        buf, MAXPATHLEN+1, debug); -    Py_DECREF(pathbytes); - -    if (cpathname == NULL) { -        PyErr_Format(PyExc_SystemError, "path buffer too short"); -        PyMem_FREE(buf); -        return NULL; -    } -    { -        PyObject *ret = PyUnicode_DecodeFSDefault(buf); -        PyMem_FREE(buf); -        return ret; -    } +    return mod;  } -PyDoc_STRVAR(doc_cache_from_source, -"cache_from_source(path, [debug_override]) -> path\n\ -Given the path to a .py file, return the path to its .pyc/.pyo file.\n\ -\n\ -The .py file does not need to exist; this simply returns the path to the\n\ -.pyc/.pyo file calculated as if the .py file were imported.  The extension\n\ -will be .pyc unless __debug__ is not defined, then it will be .pyo.\n\ -\n\ -If debug_override is not None, then it must be a boolean and is taken as\n\ -the value of __debug__ instead."); - -static PyObject * -imp_source_from_cache(PyObject *self, PyObject *args, PyObject *kws) -{ -    static char *kwlist[] = {"path", NULL}; - -    PyObject *pathname_obj; -    char *pathname; -    char *buf; - -    if (!PyArg_ParseTupleAndKeywords( -                args, kws, "O&", kwlist, -                PyUnicode_FSConverter, &pathname_obj)) -        return NULL; - -    pathname = PyBytes_AS_STRING(pathname_obj); -    buf = PyMem_MALLOC(MAXPATHLEN+1); -    if (buf == NULL) { -        return PyErr_NoMemory(); -    } -    if (make_source_pathname(pathname, buf) == NULL) { -        PyErr_Format(PyExc_ValueError, "Not a PEP 3147 pyc path: %s", -                     pathname); -        Py_DECREF(pathname_obj); -        PyMem_FREE(buf); -        return NULL; -    } -    Py_DECREF(pathname_obj); -    { -        PyObject *ret = PyUnicode_FromString(buf); -        PyMem_FREE(buf); -        return ret; -    } -} +#endif /* HAVE_DYNAMIC_LOADING */ -PyDoc_STRVAR(doc_source_from_cache, -"source_from_cache(path) -> path\n\ -Given the path to a .pyc./.pyo file, return the path to its .py file.\n\ -\n\ -The .pyc/.pyo file does not need to exist; this simply returns the path to\n\ -the .py file calculated to correspond to the .pyc/.pyo file.  If path\n\ -does not conform to PEP 3147 format, ValueError will be raised.");  /* Doc strings */  PyDoc_STRVAR(doc_imp, -"This module provides the components needed to build your own\n\ -__import__ function.  Undocumented functions are obsolete."); - -PyDoc_STRVAR(doc_find_module, -"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\ -Search for a module.  If path is omitted or None, search for a\n\ -built-in, frozen or special module and continue search in sys.path.\n\ -The module name cannot contain '.'; to search for a submodule of a\n\ -package, pass the submodule name and the package's __path__."); - -PyDoc_STRVAR(doc_load_module, -"load_module(name, file, filename, (suffix, mode, type)) -> module\n\ -Load a module, given information returned by find_module().\n\ -The module name must include the full package name, if any."); - -PyDoc_STRVAR(doc_get_magic, -"get_magic() -> string\n\ -Return the magic number for .pyc or .pyo files."); - -PyDoc_STRVAR(doc_get_tag, -"get_tag() -> string\n\ -Return the magic tag for .pyc or .pyo files."); - -PyDoc_STRVAR(doc_get_suffixes, -"get_suffixes() -> [(suffix, mode, type), ...]\n\ -Return a list of (suffix, mode, type) tuples describing the files\n\ -that find_module() looks for."); - -PyDoc_STRVAR(doc_new_module, -"new_module(name) -> module\n\ -Create a new module.  Do not enter it in sys.modules.\n\ -The module name must include the full package name, if any."); +"(Extremely) low-level import machinery bits as used by importlib and imp."); + +PyDoc_STRVAR(doc_extension_suffixes, +"extension_suffixes() -> list of strings\n\ +Returns the list of file suffixes used to identify extension modules.");  PyDoc_STRVAR(doc_lock_held,  "lock_held() -> boolean\n\ @@ -3734,179 +1831,28 @@ Release the interpreter's import lock.\n\  On platforms without threads, this function does nothing.");  static PyMethodDef imp_methods[] = { -    {"find_module",      imp_find_module,  METH_VARARGS, doc_find_module}, -    {"get_magic",        imp_get_magic,    METH_NOARGS,  doc_get_magic}, -    {"get_tag",          imp_get_tag,      METH_NOARGS,  doc_get_tag}, -    {"get_suffixes", imp_get_suffixes, METH_NOARGS,  doc_get_suffixes}, -    {"load_module",      imp_load_module,  METH_VARARGS, doc_load_module}, -    {"new_module",       imp_new_module,   METH_VARARGS, doc_new_module}, +    {"extension_suffixes", imp_extension_suffixes, METH_NOARGS, +        doc_extension_suffixes},      {"lock_held",        imp_lock_held,    METH_NOARGS,  doc_lock_held},      {"acquire_lock", imp_acquire_lock, METH_NOARGS,  doc_acquire_lock},      {"release_lock", imp_release_lock, METH_NOARGS,  doc_release_lock}, -    {"reload",       imp_reload,       METH_O,       doc_reload}, -    {"cache_from_source", (PyCFunction)imp_cache_from_source, -     METH_VARARGS | METH_KEYWORDS, doc_cache_from_source}, -    {"source_from_cache", (PyCFunction)imp_source_from_cache, -     METH_VARARGS | METH_KEYWORDS, doc_source_from_cache}, -    /* The rest are obsolete */      {"get_frozen_object",       imp_get_frozen_object,  METH_VARARGS},      {"is_frozen_package",   imp_is_frozen_package,  METH_VARARGS},      {"init_builtin",            imp_init_builtin,       METH_VARARGS},      {"init_frozen",             imp_init_frozen,        METH_VARARGS},      {"is_builtin",              imp_is_builtin,         METH_VARARGS},      {"is_frozen",               imp_is_frozen,          METH_VARARGS}, -    {"load_compiled",           imp_load_compiled,      METH_VARARGS},  #ifdef HAVE_DYNAMIC_LOADING      {"load_dynamic",            imp_load_dynamic,       METH_VARARGS},  #endif -    {"load_package",            imp_load_package,       METH_VARARGS}, -    {"load_source",             imp_load_source,        METH_VARARGS}, +    {"_fix_co_filename",        imp_fix_co_filename,    METH_VARARGS},      {NULL,                      NULL}           /* sentinel */  }; -static int -setint(PyObject *d, char *name, int value) -{ -    PyObject *v; -    int err; - -    v = PyLong_FromLong((long)value); -    err = PyDict_SetItemString(d, name, v); -    Py_XDECREF(v); -    return err; -} - -typedef struct { -    PyObject_HEAD -} NullImporter; - -static int -NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds) -{ -#ifndef MS_WINDOWS -    PyObject *path; -    struct stat statbuf; -    int rv; - -    if (!_PyArg_NoKeywords("NullImporter()", kwds)) -        return -1; - -    if (!PyArg_ParseTuple(args, "O&:NullImporter", -                          PyUnicode_FSConverter, &path)) -        return -1; - -    if (PyBytes_GET_SIZE(path) == 0) { -        Py_DECREF(path); -        PyErr_SetString(PyExc_ImportError, "empty pathname"); -        return -1; -    } - -    rv = stat(PyBytes_AS_STRING(path), &statbuf); -    Py_DECREF(path); -    if (rv == 0) { -        /* it exists */ -        if (S_ISDIR(statbuf.st_mode)) { -            /* it's a directory */ -            PyErr_SetString(PyExc_ImportError, "existing directory"); -            return -1; -        } -    } -#else /* MS_WINDOWS */ -    PyObject *pathobj; -    DWORD rv; -    wchar_t *path; - -    if (!_PyArg_NoKeywords("NullImporter()", kwds)) -        return -1; - -    if (!PyArg_ParseTuple(args, "U:NullImporter", -                          &pathobj)) -        return -1; - -    if (PyUnicode_GET_SIZE(pathobj) == 0) { -        PyErr_SetString(PyExc_ImportError, "empty pathname"); -        return -1; -    } - -    path = PyUnicode_AsWideCharString(pathobj, NULL); -    if (path == NULL) -        return -1; -    /* see issue1293 and issue3677: -     * stat() on Windows doesn't recognise paths like -     * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs. -     */ -    rv = GetFileAttributesW(path); -    PyMem_Free(path); -    if (rv != INVALID_FILE_ATTRIBUTES) { -        /* it exists */ -        if (rv & FILE_ATTRIBUTE_DIRECTORY) { -            /* it's a directory */ -            PyErr_SetString(PyExc_ImportError, "existing directory"); -            return -1; -        } -    } -#endif -    return 0; -} - -static PyObject * -NullImporter_find_module(NullImporter *self, PyObject *args) -{ -    Py_RETURN_NONE; -} - -static PyMethodDef NullImporter_methods[] = { -    {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS, -     "Always return None" -    }, -    {NULL}  /* Sentinel */ -}; - - -PyTypeObject PyNullImporter_Type = { -    PyVarObject_HEAD_INIT(NULL, 0) -    "imp.NullImporter",        /*tp_name*/ -    sizeof(NullImporter),      /*tp_basicsize*/ -    0,                         /*tp_itemsize*/ -    0,                         /*tp_dealloc*/ -    0,                         /*tp_print*/ -    0,                         /*tp_getattr*/ -    0,                         /*tp_setattr*/ -    0,                         /*tp_reserved*/ -    0,                         /*tp_repr*/ -    0,                         /*tp_as_number*/ -    0,                         /*tp_as_sequence*/ -    0,                         /*tp_as_mapping*/ -    0,                         /*tp_hash */ -    0,                         /*tp_call*/ -    0,                         /*tp_str*/ -    0,                         /*tp_getattro*/ -    0,                         /*tp_setattro*/ -    0,                         /*tp_as_buffer*/ -    Py_TPFLAGS_DEFAULT,        /*tp_flags*/ -    "Null importer object",    /* tp_doc */ -    0,                             /* tp_traverse */ -    0,                             /* tp_clear */ -    0,                             /* tp_richcompare */ -    0,                             /* tp_weaklistoffset */ -    0,                             /* tp_iter */ -    0,                             /* tp_iternext */ -    NullImporter_methods,      /* tp_methods */ -    0,                         /* tp_members */ -    0,                         /* tp_getset */ -    0,                         /* tp_base */ -    0,                         /* tp_dict */ -    0,                         /* tp_descr_get */ -    0,                         /* tp_descr_set */ -    0,                         /* tp_dictoffset */ -    (initproc)NullImporter_init,      /* tp_init */ -    0,                         /* tp_alloc */ -    PyType_GenericNew          /* tp_new */ -};  static struct PyModuleDef impmodule = {      PyModuleDef_HEAD_INIT, -    "imp", +    "_imp",      doc_imp,      0,      imp_methods, @@ -3921,9 +1867,6 @@ PyInit_imp(void)  {      PyObject *m, *d; -    if (PyType_Ready(&PyNullImporter_Type) < 0) -        return NULL; -      m = PyModule_Create(&impmodule);      if (m == NULL)          goto failure; @@ -3931,19 +1874,6 @@ PyInit_imp(void)      if (d == NULL)          goto failure; -    if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure; -    if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure; -    if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure; -    if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure; -    if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure; -    if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure; -    if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure; -    if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure; -    if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure; -    if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure; - -    Py_INCREF(&PyNullImporter_Type); -    PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);      return m;    failure:      Py_XDECREF(m); diff --git a/Python/importdl.c b/Python/importdl.c index 9caed453aa..942e4b8d28 100644 --- a/Python/importdl.c +++ b/Python/importdl.c @@ -12,50 +12,73 @@  #include "importdl.h" -extern dl_funcptr _PyImport_GetDynLoadFunc(const char *name, -                                           const char *shortname, +#ifdef MS_WINDOWS +extern dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname, +                                              PyObject *pathname, FILE *fp); +#else +extern dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,                                             const char *pathname, FILE *fp); - - +#endif  PyObject * -_PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp) +_PyImport_LoadDynamicModule(PyObject *name, PyObject *path, FILE *fp)  { -    PyObject *m; -    PyObject *path; -    char *lastdot, *shortname, *packagecontext, *oldcontext; +    PyObject *m = NULL; +#ifndef MS_WINDOWS +    PyObject *pathbytes; +#endif +    PyObject *nameascii; +    char *namestr, *lastdot, *shortname, *packagecontext, *oldcontext;      dl_funcptr p0;      PyObject* (*p)(void);      struct PyModuleDef *def; -    PyObject *result; - -    path = PyUnicode_DecodeFSDefault(pathname); -    if (path == NULL) -        return NULL; -    if ((m = _PyImport_FindExtensionUnicode(name, path)) != NULL) { +    m = _PyImport_FindExtensionObject(name, path); +    if (m != NULL) {          Py_INCREF(m); -        result = m; -        goto finally; +        return m;      } -    lastdot = strrchr(name, '.'); + +    /* name must be encodable to ASCII because dynamic module must have a +       function called "PyInit_NAME", they are written in C, and the C language +       doesn't accept non-ASCII identifiers. */ +    nameascii = PyUnicode_AsEncodedString(name, "ascii", NULL); +    if (nameascii == NULL) +        return NULL; + +    namestr = PyBytes_AS_STRING(nameascii); +    if (namestr == NULL) +        goto error; + +    lastdot = strrchr(namestr, '.');      if (lastdot == NULL) {          packagecontext = NULL; -        shortname = name; +        shortname = namestr;      }      else { -        packagecontext = name; +        packagecontext = namestr;          shortname = lastdot+1;      } -    p0 = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp); +#ifdef MS_WINDOWS +    p0 = _PyImport_GetDynLoadWindows(shortname, path, fp); +#else +    pathbytes = PyUnicode_EncodeFSDefault(path); +    if (pathbytes == NULL) +        goto error; +    p0 = _PyImport_GetDynLoadFunc(shortname, +                                  PyBytes_AS_STRING(pathbytes), fp); +    Py_DECREF(pathbytes); +#endif      p = (PyObject*(*)(void))p0;      if (PyErr_Occurred())          goto error;      if (p == NULL) { -        PyErr_Format(PyExc_ImportError, -           "dynamic module does not define init function (PyInit_%.200s)", -                     shortname); +        PyObject *msg = PyUnicode_FromFormat("dynamic module does not define " +                                             "init function (PyInit_%s)", +                                             shortname); +        PyErr_SetImportError(msg, name, path); +        Py_DECREF(msg);          goto error;      }      oldcontext = _Py_PackageContext; @@ -66,7 +89,6 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)          goto error;      if (PyErr_Occurred()) { -        Py_DECREF(m);          PyErr_Format(PyExc_SystemError,                       "initialization of %s raised unreported exception",                       shortname); @@ -83,20 +105,15 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)      else          Py_INCREF(path); -    if (_PyImport_FixupExtensionUnicode(m, name, path) < 0) +    if (_PyImport_FixupExtensionObject(m, name, path) < 0)          goto error; -    if (Py_VerboseFlag) -        PySys_WriteStderr( -            "import %s # dynamically loaded from %s\n", -            name, pathname); -    result = m; -    goto finally; +    Py_DECREF(nameascii); +    return m;  error: -    result = NULL; -finally: -    Py_DECREF(path); -    return result; +    Py_DECREF(nameascii); +    Py_XDECREF(m); +    return NULL;  }  #endif /* HAVE_DYNAMIC_LOADING */ diff --git a/Python/importdl.h b/Python/importdl.h index b4d21be6f0..6b9cf750a4 100644 --- a/Python/importdl.h +++ b/Python/importdl.h @@ -6,29 +6,9 @@ extern "C" {  #endif -/* Definitions for dynamic loading of extension modules */ -enum filetype { -    SEARCH_ERROR, -    PY_SOURCE, -    PY_COMPILED, -    C_EXTENSION, -    PY_RESOURCE, /* Mac only */ -    PKG_DIRECTORY, -    C_BUILTIN, -    PY_FROZEN, -    PY_CODERESOURCE, /* Mac only */ -    IMP_HOOK -}; - -struct filedescr { -    char *suffix; -    char *mode; -    enum filetype type; -}; -extern struct filedescr * _PyImport_Filetab; -extern const struct filedescr _PyImport_DynLoadFiletab[]; - -extern PyObject *_PyImport_LoadDynamicModule(char *name, char *pathname, +extern const char *_PyImport_DynLoadFiletab[]; + +extern PyObject *_PyImport_LoadDynamicModule(PyObject *name, PyObject *pathname,                                               FILE *);  /* Max length of module suffix searched for -- accommodates "module.slb" */ diff --git a/Python/importlib.h b/Python/importlib.h new file mode 100644 index 0000000000..e0e013c0a2 --- /dev/null +++ b/Python/importlib.h @@ -0,0 +1,4385 @@ +/* Auto-generated by Modules/_freeze_importlib.c */ +unsigned char _Py_M__importlib[] = { +    99,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0, +    0,64,0,0,0,115,206,3,0,0,100,0,0,90,0,0, +    100,129,0,90,1,0,100,4,0,100,5,0,132,0,0,90, +    2,0,100,6,0,100,7,0,132,0,0,90,3,0,100,8, +    0,100,9,0,132,0,0,90,4,0,100,10,0,100,11,0, +    132,0,0,90,5,0,100,12,0,100,13,0,132,0,0,90, +    6,0,100,14,0,100,15,0,132,0,0,90,7,0,100,16, +    0,100,17,0,132,0,0,90,8,0,100,18,0,100,19,0, +    132,0,0,90,9,0,100,20,0,100,21,0,100,22,0,132, +    1,0,90,10,0,100,23,0,100,24,0,132,0,0,90,11, +    0,101,12,0,101,11,0,106,13,0,131,1,0,90,14,0, +    100,25,0,100,26,0,132,0,0,90,15,0,105,0,0,90, +    16,0,105,0,0,90,17,0,71,100,27,0,100,28,0,132, +    0,0,100,28,0,101,18,0,131,3,0,90,19,0,71,100, +    29,0,100,30,0,132,0,0,100,30,0,131,2,0,90,20, +    0,71,100,31,0,100,32,0,132,0,0,100,32,0,131,2, +    0,90,21,0,100,33,0,100,34,0,132,0,0,90,22,0, +    100,35,0,100,36,0,132,0,0,90,23,0,100,37,0,100, +    38,0,132,0,0,90,24,0,100,39,0,101,25,0,100,40, +    0,131,1,0,100,41,0,62,66,101,25,0,100,42,0,131, +    1,0,100,43,0,62,66,90,26,0,101,27,0,100,44,0, +    100,45,0,132,0,0,101,28,0,100,46,0,100,47,0,100, +    48,0,131,3,0,68,131,1,0,131,1,0,90,29,0,100, +    49,0,90,30,0,100,50,0,103,1,0,90,31,0,100,51, +    0,103,1,0,90,32,0,100,52,0,103,1,0,90,33,0, +    101,32,0,90,34,0,100,128,0,100,53,0,100,54,0,132, +    1,0,90,36,0,100,55,0,100,56,0,132,0,0,90,37, +    0,100,57,0,100,58,0,132,0,0,90,38,0,100,59,0, +    100,60,0,132,0,0,90,39,0,100,61,0,100,62,0,132, +    0,0,90,40,0,100,63,0,100,64,0,132,0,0,90,41, +    0,100,65,0,100,66,0,132,0,0,90,42,0,100,67,0, +    100,68,0,132,0,0,90,43,0,100,69,0,100,70,0,132, +    0,0,90,44,0,100,71,0,100,72,0,132,0,0,90,45, +    0,100,73,0,100,74,0,132,0,0,90,46,0,71,100,75, +    0,100,76,0,132,0,0,100,76,0,131,2,0,90,47,0, +    71,100,77,0,100,78,0,132,0,0,100,78,0,131,2,0, +    90,48,0,71,100,79,0,100,80,0,132,0,0,100,80,0, +    131,2,0,90,49,0,71,100,81,0,100,82,0,132,0,0, +    100,82,0,131,2,0,90,50,0,71,100,83,0,100,84,0, +    132,0,0,100,84,0,101,50,0,131,3,0,90,51,0,71, +    100,85,0,100,86,0,132,0,0,100,86,0,131,2,0,90, +    52,0,71,100,87,0,100,88,0,132,0,0,100,88,0,101, +    52,0,101,51,0,131,4,0,90,53,0,71,100,89,0,100, +    90,0,132,0,0,100,90,0,101,52,0,101,50,0,131,4, +    0,90,54,0,103,0,0,90,55,0,71,100,91,0,100,92, +    0,132,0,0,100,92,0,131,2,0,90,56,0,71,100,93, +    0,100,94,0,132,0,0,100,94,0,131,2,0,90,57,0, +    71,100,95,0,100,96,0,132,0,0,100,96,0,131,2,0, +    90,58,0,71,100,97,0,100,98,0,132,0,0,100,98,0, +    131,2,0,90,59,0,71,100,99,0,100,100,0,132,0,0, +    100,100,0,131,2,0,90,60,0,71,100,101,0,100,102,0, +    132,0,0,100,102,0,131,2,0,90,61,0,100,103,0,100, +    104,0,132,0,0,90,62,0,100,105,0,100,106,0,132,0, +    0,90,63,0,100,107,0,100,108,0,132,0,0,90,64,0, +    100,109,0,90,65,0,100,110,0,100,111,0,132,0,0,90, +    66,0,100,112,0,100,113,0,132,0,0,90,67,0,100,128, +    0,100,46,0,100,114,0,100,115,0,132,2,0,90,68,0, +    100,116,0,100,117,0,132,0,0,90,69,0,100,118,0,100, +    119,0,132,0,0,90,70,0,100,120,0,100,121,0,132,0, +    0,90,71,0,100,128,0,100,128,0,102,0,0,100,46,0, +    100,122,0,100,123,0,132,4,0,90,72,0,100,124,0,100, +    125,0,132,0,0,90,73,0,100,126,0,100,127,0,132,0, +    0,90,74,0,100,128,0,83,40,130,0,0,0,117,83,1, +    0,0,67,111,114,101,32,105,109,112,108,101,109,101,110,116, +    97,116,105,111,110,32,111,102,32,105,109,112,111,114,116,46, +    10,10,84,104,105,115,32,109,111,100,117,108,101,32,105,115, +    32,78,79,84,32,109,101,97,110,116,32,116,111,32,98,101, +    32,100,105,114,101,99,116,108,121,32,105,109,112,111,114,116, +    101,100,33,32,73,116,32,104,97,115,32,98,101,101,110,32, +    100,101,115,105,103,110,101,100,32,115,117,99,104,10,116,104, +    97,116,32,105,116,32,99,97,110,32,98,101,32,98,111,111, +    116,115,116,114,97,112,112,101,100,32,105,110,116,111,32,80, +    121,116,104,111,110,32,97,115,32,116,104,101,32,105,109,112, +    108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,105, +    109,112,111,114,116,46,32,65,115,10,115,117,99,104,32,105, +    116,32,114,101,113,117,105,114,101,115,32,116,104,101,32,105, +    110,106,101,99,116,105,111,110,32,111,102,32,115,112,101,99, +    105,102,105,99,32,109,111,100,117,108,101,115,32,97,110,100, +    32,97,116,116,114,105,98,117,116,101,115,32,105,110,32,111, +    114,100,101,114,32,116,111,10,119,111,114,107,46,32,79,110, +    101,32,115,104,111,117,108,100,32,117,115,101,32,105,109,112, +    111,114,116,108,105,98,32,97,115,32,116,104,101,32,112,117, +    98,108,105,99,45,102,97,99,105,110,103,32,118,101,114,115, +    105,111,110,32,111,102,32,116,104,105,115,32,109,111,100,117, +    108,101,46,10,10,117,3,0,0,0,119,105,110,117,6,0, +    0,0,99,121,103,119,105,110,117,6,0,0,0,100,97,114, +    119,105,110,99,0,0,0,0,0,0,0,0,1,0,0,0, +    2,0,0,0,67,0,0,0,115,49,0,0,0,116,0,0, +    106,1,0,106,2,0,116,3,0,131,1,0,114,33,0,100, +    1,0,100,2,0,132,0,0,125,0,0,110,12,0,100,3, +    0,100,2,0,132,0,0,125,0,0,124,0,0,83,40,4, +    0,0,0,78,99,0,0,0,0,0,0,0,0,0,0,0, +    0,2,0,0,0,83,0,0,0,115,13,0,0,0,100,1, +    0,116,0,0,106,1,0,107,6,0,83,40,2,0,0,0, +    117,53,0,0,0,84,114,117,101,32,105,102,32,102,105,108, +    101,110,97,109,101,115,32,109,117,115,116,32,98,101,32,99, +    104,101,99,107,101,100,32,99,97,115,101,45,105,110,115,101, +    110,115,105,116,105,118,101,108,121,46,115,12,0,0,0,80, +    89,84,72,79,78,67,65,83,69,79,75,40,2,0,0,0, +    117,3,0,0,0,95,111,115,117,7,0,0,0,101,110,118, +    105,114,111,110,40,0,0,0,0,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,11,0,0,0,95,114,101,108,97,120, +    95,99,97,115,101,34,0,0,0,115,2,0,0,0,0,2, +    117,37,0,0,0,95,109,97,107,101,95,114,101,108,97,120, +    95,99,97,115,101,46,60,108,111,99,97,108,115,62,46,95, +    114,101,108,97,120,95,99,97,115,101,99,0,0,0,0,0, +    0,0,0,0,0,0,0,1,0,0,0,83,0,0,0,115, +    4,0,0,0,100,1,0,83,40,2,0,0,0,117,53,0, +    0,0,84,114,117,101,32,105,102,32,102,105,108,101,110,97, +    109,101,115,32,109,117,115,116,32,98,101,32,99,104,101,99, +    107,101,100,32,99,97,115,101,45,105,110,115,101,110,115,105, +    116,105,118,101,108,121,46,70,40,1,0,0,0,117,5,0, +    0,0,70,97,108,115,101,40,0,0,0,0,40,0,0,0, +    0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, +    101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, +    111,116,115,116,114,97,112,62,117,11,0,0,0,95,114,101, +    108,97,120,95,99,97,115,101,38,0,0,0,115,2,0,0, +    0,0,2,40,4,0,0,0,117,3,0,0,0,115,121,115, +    117,8,0,0,0,112,108,97,116,102,111,114,109,117,10,0, +    0,0,115,116,97,114,116,115,119,105,116,104,117,27,0,0, +    0,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, +    86,69,95,80,76,65,84,70,79,82,77,83,40,1,0,0, +    0,117,11,0,0,0,95,114,101,108,97,120,95,99,97,115, +    101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, +    60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, +    98,46,95,98,111,111,116,115,116,114,97,112,62,117,16,0, +    0,0,95,109,97,107,101,95,114,101,108,97,120,95,99,97, +    115,101,32,0,0,0,115,8,0,0,0,0,1,18,1,15, +    4,12,3,117,16,0,0,0,95,109,97,107,101,95,114,101, +    108,97,120,95,99,97,115,101,99,1,0,0,0,0,0,0, +    0,2,0,0,0,3,0,0,0,67,0,0,0,115,108,0, +    0,0,116,0,0,124,0,0,131,1,0,125,0,0,103,0, +    0,125,1,0,124,1,0,106,1,0,124,0,0,100,1,0, +    64,131,1,0,1,124,1,0,106,1,0,124,0,0,100,2, +    0,63,100,1,0,64,131,1,0,1,124,1,0,106,1,0, +    124,0,0,100,3,0,63,100,1,0,64,131,1,0,1,124, +    1,0,106,1,0,124,0,0,100,4,0,63,100,1,0,64, +    131,1,0,1,116,2,0,124,1,0,131,1,0,83,40,5, +    0,0,0,117,111,0,0,0,67,111,110,118,101,114,116,32, +    97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114, +    32,116,111,32,108,105,116,116,108,101,45,101,110,100,105,97, +    110,46,10,10,32,32,32,32,88,88,88,32,84,101,109,112, +    111,114,97,114,121,32,117,110,116,105,108,32,109,97,114,115, +    104,97,108,39,115,32,108,111,110,103,32,102,117,110,99,116, +    105,111,110,115,32,97,114,101,32,101,120,112,111,115,101,100, +    46,10,10,32,32,32,32,105,255,0,0,0,105,8,0,0, +    0,105,16,0,0,0,105,24,0,0,0,40,3,0,0,0, +    117,3,0,0,0,105,110,116,117,6,0,0,0,97,112,112, +    101,110,100,117,9,0,0,0,98,121,116,101,97,114,114,97, +    121,40,2,0,0,0,117,1,0,0,0,120,117,9,0,0, +    0,105,110,116,95,98,121,116,101,115,40,0,0,0,0,40, +    0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, +    32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, +    115,116,114,97,112,62,117,7,0,0,0,95,119,95,108,111, +    110,103,45,0,0,0,115,14,0,0,0,0,6,12,1,6, +    1,17,1,21,1,21,1,21,1,117,7,0,0,0,95,119, +    95,108,111,110,103,99,1,0,0,0,0,0,0,0,2,0, +    0,0,3,0,0,0,67,0,0,0,115,68,0,0,0,124, +    0,0,100,1,0,25,125,1,0,124,1,0,124,0,0,100, +    2,0,25,100,3,0,62,79,125,1,0,124,1,0,124,0, +    0,100,4,0,25,100,5,0,62,79,125,1,0,124,1,0, +    124,0,0,100,6,0,25,100,7,0,62,79,125,1,0,124, +    1,0,83,40,8,0,0,0,117,115,0,0,0,67,111,110, +    118,101,114,116,32,52,32,98,121,116,101,115,32,105,110,32, +    108,105,116,116,108,101,45,101,110,100,105,97,110,32,116,111, +    32,97,110,32,105,110,116,101,103,101,114,46,10,10,32,32, +    32,32,88,88,88,32,84,101,109,112,111,114,97,114,121,32, +    117,110,116,105,108,32,109,97,114,115,104,97,108,39,115,32, +    108,111,110,103,32,102,117,110,99,116,105,111,110,32,97,114, +    101,32,101,120,112,111,115,101,100,46,10,10,32,32,32,32, +    105,0,0,0,0,105,1,0,0,0,105,8,0,0,0,105, +    2,0,0,0,105,16,0,0,0,105,3,0,0,0,105,24, +    0,0,0,40,0,0,0,0,40,2,0,0,0,117,9,0, +    0,0,105,110,116,95,98,121,116,101,115,117,1,0,0,0, +    120,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, +    60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, +    98,46,95,98,111,111,116,115,116,114,97,112,62,117,7,0, +    0,0,95,114,95,108,111,110,103,61,0,0,0,115,10,0, +    0,0,0,6,10,1,18,1,18,1,18,1,117,7,0,0, +    0,95,114,95,108,111,110,103,99,0,0,0,0,0,0,0, +    0,3,0,0,0,4,0,0,0,71,0,0,0,115,103,0, +    0,0,103,0,0,125,1,0,120,71,0,124,0,0,68,93, +    63,0,125,2,0,124,2,0,115,31,0,113,13,0,110,0, +    0,124,1,0,106,0,0,124,2,0,131,1,0,1,124,2, +    0,100,4,0,25,116,1,0,107,7,0,114,13,0,124,1, +    0,106,0,0,116,2,0,131,1,0,1,113,13,0,113,13, +    0,87,100,2,0,106,3,0,124,1,0,100,3,0,100,5, +    0,133,2,0,25,131,1,0,83,40,6,0,0,0,117,31, +    0,0,0,82,101,112,108,97,99,101,109,101,110,116,32,102, +    111,114,32,111,115,46,112,97,116,104,46,106,111,105,110,40, +    41,46,105,1,0,0,0,117,0,0,0,0,78,105,255,255, +    255,255,105,255,255,255,255,40,4,0,0,0,117,6,0,0, +    0,97,112,112,101,110,100,117,15,0,0,0,112,97,116,104, +    95,115,101,112,97,114,97,116,111,114,115,117,8,0,0,0, +    112,97,116,104,95,115,101,112,117,4,0,0,0,106,111,105, +    110,40,3,0,0,0,117,10,0,0,0,112,97,116,104,95, +    112,97,114,116,115,117,9,0,0,0,110,101,119,95,112,97, +    114,116,115,117,4,0,0,0,112,97,114,116,40,0,0,0, +    0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, +    101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, +    111,116,115,116,114,97,112,62,117,10,0,0,0,95,112,97, +    116,104,95,106,111,105,110,74,0,0,0,115,16,0,0,0, +    0,2,6,1,13,1,6,1,6,1,13,1,16,1,20,1, +    117,10,0,0,0,95,112,97,116,104,95,106,111,105,110,99, +    1,0,0,0,0,0,0,0,6,0,0,0,3,0,0,0, +    67,0,0,0,115,85,0,0,0,120,48,0,116,0,0,124, +    0,0,131,1,0,68,93,28,0,125,1,0,124,1,0,116, +    1,0,107,6,0,114,13,0,124,1,0,125,2,0,80,113, +    13,0,113,13,0,87,116,2,0,125,2,0,124,0,0,106, +    3,0,124,2,0,131,1,0,92,3,0,125,3,0,125,4, +    0,125,5,0,124,3,0,124,5,0,102,2,0,83,40,1, +    0,0,0,117,32,0,0,0,82,101,112,108,97,99,101,109, +    101,110,116,32,102,111,114,32,111,115,46,112,97,116,104,46, +    115,112,108,105,116,40,41,46,40,4,0,0,0,117,8,0, +    0,0,114,101,118,101,114,115,101,100,117,15,0,0,0,112, +    97,116,104,95,115,101,112,97,114,97,116,111,114,115,117,8, +    0,0,0,112,97,116,104,95,115,101,112,117,10,0,0,0, +    114,112,97,114,116,105,116,105,111,110,40,6,0,0,0,117, +    4,0,0,0,112,97,116,104,117,1,0,0,0,120,117,3, +    0,0,0,115,101,112,117,5,0,0,0,102,114,111,110,116, +    117,1,0,0,0,95,117,4,0,0,0,116,97,105,108,40, +    0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, +    114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, +    95,98,111,111,116,115,116,114,97,112,62,117,11,0,0,0, +    95,112,97,116,104,95,115,112,108,105,116,86,0,0,0,115, +    14,0,0,0,0,2,19,1,12,1,6,1,8,2,6,1, +    24,1,117,11,0,0,0,95,112,97,116,104,95,115,112,108, +    105,116,99,2,0,0,0,0,0,0,0,3,0,0,0,11, +    0,0,0,67,0,0,0,115,61,0,0,0,121,19,0,116, +    0,0,106,1,0,124,0,0,131,1,0,125,2,0,87,110, +    22,0,4,116,2,0,107,10,0,114,43,0,1,1,1,100, +    2,0,83,89,110,1,0,88,124,2,0,106,4,0,100,1, +    0,64,124,1,0,107,2,0,83,40,3,0,0,0,117,49, +    0,0,0,84,101,115,116,32,119,104,101,116,104,101,114,32, +    116,104,101,32,112,97,116,104,32,105,115,32,116,104,101,32, +    115,112,101,99,105,102,105,101,100,32,109,111,100,101,32,116, +    121,112,101,46,105,0,240,0,0,70,40,5,0,0,0,117, +    3,0,0,0,95,111,115,117,4,0,0,0,115,116,97,116, +    117,7,0,0,0,79,83,69,114,114,111,114,117,5,0,0, +    0,70,97,108,115,101,117,7,0,0,0,115,116,95,109,111, +    100,101,40,3,0,0,0,117,4,0,0,0,112,97,116,104, +    117,4,0,0,0,109,111,100,101,117,9,0,0,0,115,116, +    97,116,95,105,110,102,111,40,0,0,0,0,40,0,0,0, +    0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, +    112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, +    97,112,62,117,18,0,0,0,95,112,97,116,104,95,105,115, +    95,109,111,100,101,95,116,121,112,101,98,0,0,0,115,10, +    0,0,0,0,2,3,1,19,1,13,1,9,1,117,18,0, +    0,0,95,112,97,116,104,95,105,115,95,109,111,100,101,95, +    116,121,112,101,99,1,0,0,0,0,0,0,0,1,0,0, +    0,3,0,0,0,67,0,0,0,115,13,0,0,0,116,0, +    0,124,0,0,100,1,0,131,2,0,83,40,2,0,0,0, +    117,31,0,0,0,82,101,112,108,97,99,101,109,101,110,116, +    32,102,111,114,32,111,115,46,112,97,116,104,46,105,115,102, +    105,108,101,46,105,0,128,0,0,40,1,0,0,0,117,18, +    0,0,0,95,112,97,116,104,95,105,115,95,109,111,100,101, +    95,116,121,112,101,40,1,0,0,0,117,4,0,0,0,112, +    97,116,104,40,0,0,0,0,40,0,0,0,0,117,29,0, +    0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, +    108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, +    12,0,0,0,95,112,97,116,104,95,105,115,102,105,108,101, +    108,0,0,0,115,2,0,0,0,0,2,117,12,0,0,0, +    95,112,97,116,104,95,105,115,102,105,108,101,99,1,0,0, +    0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, +    0,115,34,0,0,0,124,0,0,115,21,0,116,0,0,106, +    1,0,131,0,0,125,0,0,110,0,0,116,2,0,124,0, +    0,100,1,0,131,2,0,83,40,2,0,0,0,117,30,0, +    0,0,82,101,112,108,97,99,101,109,101,110,116,32,102,111, +    114,32,111,115,46,112,97,116,104,46,105,115,100,105,114,46, +    105,0,64,0,0,40,3,0,0,0,117,3,0,0,0,95, +    111,115,117,6,0,0,0,103,101,116,99,119,100,117,18,0, +    0,0,95,112,97,116,104,95,105,115,95,109,111,100,101,95, +    116,121,112,101,40,1,0,0,0,117,4,0,0,0,112,97, +    116,104,40,0,0,0,0,40,0,0,0,0,117,29,0,0, +    0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, +    105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11, +    0,0,0,95,112,97,116,104,95,105,115,100,105,114,114,0, +    0,0,115,6,0,0,0,0,2,6,1,15,1,117,11,0, +    0,0,95,112,97,116,104,95,105,115,100,105,114,105,182,1, +    0,0,99,3,0,0,0,0,0,0,0,6,0,0,0,17, +    0,0,0,67,0,0,0,115,192,0,0,0,100,1,0,106, +    0,0,124,0,0,116,1,0,124,0,0,131,1,0,131,2, +    0,125,3,0,116,2,0,106,3,0,124,3,0,116,2,0, +    106,4,0,116,2,0,106,5,0,66,116,2,0,106,6,0, +    66,124,2,0,100,2,0,64,131,3,0,125,4,0,121,60, +    0,116,7,0,106,8,0,124,4,0,100,3,0,131,2,0, +    143,20,0,125,5,0,124,5,0,106,9,0,124,1,0,131, +    1,0,1,87,100,4,0,81,88,116,2,0,106,10,0,124, +    3,0,124,0,0,131,2,0,1,87,110,59,0,4,116,11, +    0,107,10,0,114,187,0,1,1,1,121,17,0,116,2,0, +    106,12,0,124,3,0,131,1,0,1,87,110,18,0,4,116, +    11,0,107,10,0,114,179,0,1,1,1,89,110,1,0,88, +    130,0,0,89,110,1,0,88,100,4,0,83,40,5,0,0, +    0,117,162,0,0,0,66,101,115,116,45,101,102,102,111,114, +    116,32,102,117,110,99,116,105,111,110,32,116,111,32,119,114, +    105,116,101,32,100,97,116,97,32,116,111,32,97,32,112,97, +    116,104,32,97,116,111,109,105,99,97,108,108,121,46,10,32, +    32,32,32,66,101,32,112,114,101,112,97,114,101,100,32,116, +    111,32,104,97,110,100,108,101,32,97,32,70,105,108,101,69, +    120,105,115,116,115,69,114,114,111,114,32,105,102,32,99,111, +    110,99,117,114,114,101,110,116,32,119,114,105,116,105,110,103, +    32,111,102,32,116,104,101,10,32,32,32,32,116,101,109,112, +    111,114,97,114,121,32,102,105,108,101,32,105,115,32,97,116, +    116,101,109,112,116,101,100,46,117,5,0,0,0,123,125,46, +    123,125,105,182,1,0,0,117,2,0,0,0,119,98,78,40, +    13,0,0,0,117,6,0,0,0,102,111,114,109,97,116,117, +    2,0,0,0,105,100,117,3,0,0,0,95,111,115,117,4, +    0,0,0,111,112,101,110,117,6,0,0,0,79,95,69,88, +    67,76,117,7,0,0,0,79,95,67,82,69,65,84,117,8, +    0,0,0,79,95,87,82,79,78,76,89,117,3,0,0,0, +    95,105,111,117,6,0,0,0,70,105,108,101,73,79,117,5, +    0,0,0,119,114,105,116,101,117,7,0,0,0,114,101,112, +    108,97,99,101,117,7,0,0,0,79,83,69,114,114,111,114, +    117,6,0,0,0,117,110,108,105,110,107,40,6,0,0,0, +    117,4,0,0,0,112,97,116,104,117,4,0,0,0,100,97, +    116,97,117,4,0,0,0,109,111,100,101,117,8,0,0,0, +    112,97,116,104,95,116,109,112,117,2,0,0,0,102,100,117, +    4,0,0,0,102,105,108,101,40,0,0,0,0,40,0,0, +    0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, +    109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, +    114,97,112,62,117,13,0,0,0,95,119,114,105,116,101,95, +    97,116,111,109,105,99,121,0,0,0,115,26,0,0,0,0, +    5,24,1,9,1,33,1,3,3,21,1,19,1,20,1,13, +    1,3,1,17,1,13,1,5,1,117,13,0,0,0,95,119, +    114,105,116,101,95,97,116,111,109,105,99,99,2,0,0,0, +    0,0,0,0,3,0,0,0,7,0,0,0,67,0,0,0, +    115,95,0,0,0,120,69,0,100,1,0,100,2,0,100,3, +    0,100,4,0,103,4,0,68,93,49,0,125,2,0,116,0, +    0,124,1,0,124,2,0,131,2,0,114,19,0,116,1,0, +    124,0,0,124,2,0,116,2,0,124,1,0,124,2,0,131, +    2,0,131,3,0,1,113,19,0,113,19,0,87,124,0,0, +    106,3,0,106,4,0,124,1,0,106,3,0,131,1,0,1, +    100,5,0,83,40,6,0,0,0,117,47,0,0,0,83,105, +    109,112,108,101,32,115,117,98,115,116,105,116,117,116,101,32, +    102,111,114,32,102,117,110,99,116,111,111,108,115,46,117,112, +    100,97,116,101,95,119,114,97,112,112,101,114,46,117,10,0, +    0,0,95,95,109,111,100,117,108,101,95,95,117,8,0,0, +    0,95,95,110,97,109,101,95,95,117,12,0,0,0,95,95, +    113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,95, +    95,100,111,99,95,95,78,40,5,0,0,0,117,7,0,0, +    0,104,97,115,97,116,116,114,117,7,0,0,0,115,101,116, +    97,116,116,114,117,7,0,0,0,103,101,116,97,116,116,114, +    117,8,0,0,0,95,95,100,105,99,116,95,95,117,6,0, +    0,0,117,112,100,97,116,101,40,3,0,0,0,117,3,0, +    0,0,110,101,119,117,3,0,0,0,111,108,100,117,7,0, +    0,0,114,101,112,108,97,99,101,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,5,0,0,0,95,119,114,97,112,143, +    0,0,0,115,8,0,0,0,0,2,25,1,15,1,32,1, +    117,5,0,0,0,95,119,114,97,112,99,1,0,0,0,0, +    0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, +    16,0,0,0,116,0,0,116,1,0,131,1,0,124,0,0, +    131,1,0,83,40,1,0,0,0,117,75,0,0,0,67,114, +    101,97,116,101,32,97,32,110,101,119,32,109,111,100,117,108, +    101,46,10,10,32,32,32,32,84,104,101,32,109,111,100,117, +    108,101,32,105,115,32,110,111,116,32,101,110,116,101,114,101, +    100,32,105,110,116,111,32,115,121,115,46,109,111,100,117,108, +    101,115,46,10,10,32,32,32,32,40,2,0,0,0,117,4, +    0,0,0,116,121,112,101,117,3,0,0,0,95,105,111,40, +    1,0,0,0,117,4,0,0,0,110,97,109,101,40,0,0, +    0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, +    122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, +    111,111,116,115,116,114,97,112,62,117,10,0,0,0,110,101, +    119,95,109,111,100,117,108,101,154,0,0,0,115,2,0,0, +    0,0,6,117,10,0,0,0,110,101,119,95,109,111,100,117, +    108,101,99,1,0,0,0,0,0,0,0,1,0,0,0,1, +    0,0,0,66,0,0,0,115,20,0,0,0,124,0,0,69, +    101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,83, +    40,2,0,0,0,117,14,0,0,0,95,68,101,97,100,108, +    111,99,107,69,114,114,111,114,78,40,3,0,0,0,117,8, +    0,0,0,95,95,110,97,109,101,95,95,117,10,0,0,0, +    95,95,109,111,100,117,108,101,95,95,117,12,0,0,0,95, +    95,113,117,97,108,110,97,109,101,95,95,40,1,0,0,0, +    117,10,0,0,0,95,95,108,111,99,97,108,115,95,95,40, +    0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, +    114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, +    95,98,111,111,116,115,116,114,97,112,62,117,14,0,0,0, +    95,68,101,97,100,108,111,99,107,69,114,114,111,114,171,0, +    0,0,115,2,0,0,0,16,1,117,14,0,0,0,95,68, +    101,97,100,108,111,99,107,69,114,114,111,114,99,1,0,0, +    0,0,0,0,0,1,0,0,0,2,0,0,0,66,0,0, +    0,115,86,0,0,0,124,0,0,69,101,0,0,90,1,0, +    100,0,0,90,2,0,100,1,0,90,3,0,100,2,0,100, +    3,0,132,0,0,90,4,0,100,4,0,100,5,0,132,0, +    0,90,5,0,100,6,0,100,7,0,132,0,0,90,6,0, +    100,8,0,100,9,0,132,0,0,90,7,0,100,10,0,100, +    11,0,132,0,0,90,8,0,100,12,0,83,40,13,0,0, +    0,117,11,0,0,0,95,77,111,100,117,108,101,76,111,99, +    107,117,169,0,0,0,65,32,114,101,99,117,114,115,105,118, +    101,32,108,111,99,107,32,105,109,112,108,101,109,101,110,116, +    97,116,105,111,110,32,119,104,105,99,104,32,105,115,32,97, +    98,108,101,32,116,111,32,100,101,116,101,99,116,32,100,101, +    97,100,108,111,99,107,115,10,32,32,32,32,40,101,46,103, +    46,32,116,104,114,101,97,100,32,49,32,116,114,121,105,110, +    103,32,116,111,32,116,97,107,101,32,108,111,99,107,115,32, +    65,32,116,104,101,110,32,66,44,32,97,110,100,32,116,104, +    114,101,97,100,32,50,32,116,114,121,105,110,103,32,116,111, +    10,32,32,32,32,116,97,107,101,32,108,111,99,107,115,32, +    66,32,116,104,101,110,32,65,41,46,10,32,32,32,32,99, +    2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, +    67,0,0,0,115,70,0,0,0,116,0,0,106,1,0,131, +    0,0,124,0,0,95,2,0,116,0,0,106,1,0,131,0, +    0,124,0,0,95,3,0,124,1,0,124,0,0,95,4,0, +    100,0,0,124,0,0,95,6,0,100,1,0,124,0,0,95, +    7,0,100,1,0,124,0,0,95,8,0,100,0,0,83,40, +    2,0,0,0,78,105,0,0,0,0,40,9,0,0,0,117, +    7,0,0,0,95,116,104,114,101,97,100,117,13,0,0,0, +    97,108,108,111,99,97,116,101,95,108,111,99,107,117,4,0, +    0,0,108,111,99,107,117,6,0,0,0,119,97,107,101,117, +    112,117,4,0,0,0,110,97,109,101,117,4,0,0,0,78, +    111,110,101,117,5,0,0,0,111,119,110,101,114,117,5,0, +    0,0,99,111,117,110,116,117,7,0,0,0,119,97,105,116, +    101,114,115,40,2,0,0,0,117,4,0,0,0,115,101,108, +    102,117,4,0,0,0,110,97,109,101,40,0,0,0,0,40, +    0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, +    32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, +    115,116,114,97,112,62,117,8,0,0,0,95,95,105,110,105, +    116,95,95,181,0,0,0,115,12,0,0,0,0,1,15,1, +    15,1,9,1,9,1,9,1,117,20,0,0,0,95,77,111, +    100,117,108,101,76,111,99,107,46,95,95,105,110,105,116,95, +    95,99,1,0,0,0,0,0,0,0,4,0,0,0,2,0, +    0,0,67,0,0,0,115,87,0,0,0,116,0,0,106,1, +    0,131,0,0,125,1,0,124,0,0,106,2,0,125,2,0, +    120,59,0,116,3,0,106,4,0,124,2,0,131,1,0,125, +    3,0,124,3,0,100,0,0,107,8,0,114,55,0,100,1, +    0,83,124,3,0,106,2,0,125,2,0,124,2,0,124,1, +    0,107,2,0,114,24,0,100,2,0,83,113,24,0,100,0, +    0,83,40,3,0,0,0,78,70,84,40,8,0,0,0,117, +    7,0,0,0,95,116,104,114,101,97,100,117,9,0,0,0, +    103,101,116,95,105,100,101,110,116,117,5,0,0,0,111,119, +    110,101,114,117,12,0,0,0,95,98,108,111,99,107,105,110, +    103,95,111,110,117,3,0,0,0,103,101,116,117,4,0,0, +    0,78,111,110,101,117,5,0,0,0,70,97,108,115,101,117, +    4,0,0,0,84,114,117,101,40,4,0,0,0,117,4,0, +    0,0,115,101,108,102,117,2,0,0,0,109,101,117,3,0, +    0,0,116,105,100,117,4,0,0,0,108,111,99,107,40,0, +    0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, +    111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, +    98,111,111,116,115,116,114,97,112,62,117,12,0,0,0,104, +    97,115,95,100,101,97,100,108,111,99,107,189,0,0,0,115, +    18,0,0,0,0,2,12,1,9,1,3,1,15,1,12,1, +    4,1,9,1,12,1,117,24,0,0,0,95,77,111,100,117, +    108,101,76,111,99,107,46,104,97,115,95,100,101,97,100,108, +    111,99,107,99,1,0,0,0,0,0,0,0,2,0,0,0, +    17,0,0,0,67,0,0,0,115,214,0,0,0,116,0,0, +    106,1,0,131,0,0,125,1,0,124,0,0,116,2,0,124, +    1,0,60,122,177,0,120,170,0,124,0,0,106,3,0,143, +    130,0,1,124,0,0,106,4,0,100,1,0,107,2,0,115, +    68,0,124,0,0,106,5,0,124,1,0,107,2,0,114,96, +    0,124,1,0,124,0,0,95,5,0,124,0,0,4,106,4, +    0,100,2,0,55,2,95,4,0,100,5,0,83,124,0,0, +    106,7,0,131,0,0,114,127,0,116,8,0,100,3,0,124, +    0,0,22,131,1,0,130,1,0,110,0,0,124,0,0,106, +    9,0,106,10,0,100,6,0,131,1,0,114,163,0,124,0, +    0,4,106,12,0,100,2,0,55,2,95,12,0,110,0,0, +    87,100,4,0,81,88,124,0,0,106,9,0,106,10,0,131, +    0,0,1,124,0,0,106,9,0,106,13,0,131,0,0,1, +    113,28,0,87,100,4,0,116,2,0,124,1,0,61,88,100, +    4,0,83,40,7,0,0,0,117,185,0,0,0,10,32,32, +    32,32,32,32,32,32,65,99,113,117,105,114,101,32,116,104, +    101,32,109,111,100,117,108,101,32,108,111,99,107,46,32,32, +    73,102,32,97,32,112,111,116,101,110,116,105,97,108,32,100, +    101,97,100,108,111,99,107,32,105,115,32,100,101,116,101,99, +    116,101,100,44,10,32,32,32,32,32,32,32,32,97,32,95, +    68,101,97,100,108,111,99,107,69,114,114,111,114,32,105,115, +    32,114,97,105,115,101,100,46,10,32,32,32,32,32,32,32, +    32,79,116,104,101,114,119,105,115,101,44,32,116,104,101,32, +    108,111,99,107,32,105,115,32,97,108,119,97,121,115,32,97, +    99,113,117,105,114,101,100,32,97,110,100,32,84,114,117,101, +    32,105,115,32,114,101,116,117,114,110,101,100,46,10,32,32, +    32,32,32,32,32,32,105,0,0,0,0,105,1,0,0,0, +    117,23,0,0,0,100,101,97,100,108,111,99,107,32,100,101, +    116,101,99,116,101,100,32,98,121,32,37,114,78,84,70,40, +    14,0,0,0,117,7,0,0,0,95,116,104,114,101,97,100, +    117,9,0,0,0,103,101,116,95,105,100,101,110,116,117,12, +    0,0,0,95,98,108,111,99,107,105,110,103,95,111,110,117, +    4,0,0,0,108,111,99,107,117,5,0,0,0,99,111,117, +    110,116,117,5,0,0,0,111,119,110,101,114,117,4,0,0, +    0,84,114,117,101,117,12,0,0,0,104,97,115,95,100,101, +    97,100,108,111,99,107,117,14,0,0,0,95,68,101,97,100, +    108,111,99,107,69,114,114,111,114,117,6,0,0,0,119,97, +    107,101,117,112,117,7,0,0,0,97,99,113,117,105,114,101, +    117,5,0,0,0,70,97,108,115,101,117,7,0,0,0,119, +    97,105,116,101,114,115,117,7,0,0,0,114,101,108,101,97, +    115,101,40,2,0,0,0,117,4,0,0,0,115,101,108,102, +    117,3,0,0,0,116,105,100,40,0,0,0,0,40,0,0, +    0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, +    109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, +    114,97,112,62,117,7,0,0,0,97,99,113,117,105,114,101, +    201,0,0,0,115,32,0,0,0,0,6,12,1,10,1,3, +    1,3,1,10,1,30,1,9,1,15,1,4,1,12,1,19, +    1,18,1,24,2,13,1,20,2,117,19,0,0,0,95,77, +    111,100,117,108,101,76,111,99,107,46,97,99,113,117,105,114, +    101,99,1,0,0,0,0,0,0,0,2,0,0,0,10,0, +    0,0,67,0,0,0,115,165,0,0,0,116,0,0,106,1, +    0,131,0,0,125,1,0,124,0,0,106,2,0,143,138,0, +    1,124,0,0,106,3,0,124,1,0,107,3,0,114,52,0, +    116,4,0,100,1,0,131,1,0,130,1,0,110,0,0,124, +    0,0,106,5,0,100,2,0,107,4,0,115,73,0,116,6, +    0,130,1,0,124,0,0,4,106,5,0,100,3,0,56,2, +    95,5,0,124,0,0,106,5,0,100,2,0,107,2,0,114, +    155,0,100,0,0,124,0,0,95,3,0,124,0,0,106,8, +    0,114,155,0,124,0,0,4,106,8,0,100,3,0,56,2, +    95,8,0,124,0,0,106,9,0,106,10,0,131,0,0,1, +    113,155,0,110,0,0,87,100,0,0,81,88,100,0,0,83, +    40,4,0,0,0,78,117,31,0,0,0,99,97,110,110,111, +    116,32,114,101,108,101,97,115,101,32,117,110,45,97,99,113, +    117,105,114,101,100,32,108,111,99,107,105,0,0,0,0,105, +    1,0,0,0,40,11,0,0,0,117,7,0,0,0,95,116, +    104,114,101,97,100,117,9,0,0,0,103,101,116,95,105,100, +    101,110,116,117,4,0,0,0,108,111,99,107,117,5,0,0, +    0,111,119,110,101,114,117,12,0,0,0,82,117,110,116,105, +    109,101,69,114,114,111,114,117,5,0,0,0,99,111,117,110, +    116,117,14,0,0,0,65,115,115,101,114,116,105,111,110,69, +    114,114,111,114,117,4,0,0,0,78,111,110,101,117,7,0, +    0,0,119,97,105,116,101,114,115,117,6,0,0,0,119,97, +    107,101,117,112,117,7,0,0,0,114,101,108,101,97,115,101, +    40,2,0,0,0,117,4,0,0,0,115,101,108,102,117,3, +    0,0,0,116,105,100,40,0,0,0,0,40,0,0,0,0, +    117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, +    111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, +    112,62,117,7,0,0,0,114,101,108,101,97,115,101,226,0, +    0,0,115,22,0,0,0,0,1,12,1,10,1,15,1,15, +    1,21,1,15,1,15,1,9,1,9,1,15,1,117,19,0, +    0,0,95,77,111,100,117,108,101,76,111,99,107,46,114,101, +    108,101,97,115,101,99,1,0,0,0,0,0,0,0,1,0, +    0,0,4,0,0,0,67,0,0,0,115,23,0,0,0,100, +    1,0,124,0,0,106,0,0,116,1,0,124,0,0,131,1, +    0,102,2,0,22,83,40,2,0,0,0,78,117,21,0,0, +    0,95,77,111,100,117,108,101,76,111,99,107,40,37,114,41, +    32,97,116,32,37,100,40,2,0,0,0,117,4,0,0,0, +    110,97,109,101,117,2,0,0,0,105,100,40,1,0,0,0, +    117,4,0,0,0,115,101,108,102,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,8,0,0,0,95,95,114,101,112,114, +    95,95,239,0,0,0,115,2,0,0,0,0,1,117,20,0, +    0,0,95,77,111,100,117,108,101,76,111,99,107,46,95,95, +    114,101,112,114,95,95,78,40,9,0,0,0,117,8,0,0, +    0,95,95,110,97,109,101,95,95,117,10,0,0,0,95,95, +    109,111,100,117,108,101,95,95,117,12,0,0,0,95,95,113, +    117,97,108,110,97,109,101,95,95,117,7,0,0,0,95,95, +    100,111,99,95,95,117,8,0,0,0,95,95,105,110,105,116, +    95,95,117,12,0,0,0,104,97,115,95,100,101,97,100,108, +    111,99,107,117,7,0,0,0,97,99,113,117,105,114,101,117, +    7,0,0,0,114,101,108,101,97,115,101,117,8,0,0,0, +    95,95,114,101,112,114,95,95,40,1,0,0,0,117,10,0, +    0,0,95,95,108,111,99,97,108,115,95,95,40,0,0,0, +    0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, +    101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, +    111,116,115,116,114,97,112,62,117,11,0,0,0,95,77,111, +    100,117,108,101,76,111,99,107,175,0,0,0,115,12,0,0, +    0,16,4,6,2,12,8,12,12,12,25,12,13,117,11,0, +    0,0,95,77,111,100,117,108,101,76,111,99,107,99,1,0, +    0,0,0,0,0,0,1,0,0,0,2,0,0,0,66,0, +    0,0,115,74,0,0,0,124,0,0,69,101,0,0,90,1, +    0,100,0,0,90,2,0,100,1,0,90,3,0,100,2,0, +    100,3,0,132,0,0,90,4,0,100,4,0,100,5,0,132, +    0,0,90,5,0,100,6,0,100,7,0,132,0,0,90,6, +    0,100,8,0,100,9,0,132,0,0,90,7,0,100,10,0, +    83,40,11,0,0,0,117,16,0,0,0,95,68,117,109,109, +    121,77,111,100,117,108,101,76,111,99,107,117,86,0,0,0, +    65,32,115,105,109,112,108,101,32,95,77,111,100,117,108,101, +    76,111,99,107,32,101,113,117,105,118,97,108,101,110,116,32, +    102,111,114,32,80,121,116,104,111,110,32,98,117,105,108,100, +    115,32,119,105,116,104,111,117,116,10,32,32,32,32,109,117, +    108,116,105,45,116,104,114,101,97,100,105,110,103,32,115,117, +    112,112,111,114,116,46,99,2,0,0,0,0,0,0,0,2, +    0,0,0,2,0,0,0,67,0,0,0,115,22,0,0,0, +    124,1,0,124,0,0,95,0,0,100,1,0,124,0,0,95, +    1,0,100,0,0,83,40,2,0,0,0,78,105,0,0,0, +    0,40,2,0,0,0,117,4,0,0,0,110,97,109,101,117, +    5,0,0,0,99,111,117,110,116,40,2,0,0,0,117,4, +    0,0,0,115,101,108,102,117,4,0,0,0,110,97,109,101, +    40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, +    102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, +    46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0, +    0,95,95,105,110,105,116,95,95,247,0,0,0,115,4,0, +    0,0,0,1,9,1,117,25,0,0,0,95,68,117,109,109, +    121,77,111,100,117,108,101,76,111,99,107,46,95,95,105,110, +    105,116,95,95,99,1,0,0,0,0,0,0,0,1,0,0, +    0,3,0,0,0,67,0,0,0,115,19,0,0,0,124,0, +    0,4,106,0,0,100,1,0,55,2,95,0,0,100,2,0, +    83,40,3,0,0,0,78,105,1,0,0,0,84,40,2,0, +    0,0,117,5,0,0,0,99,111,117,110,116,117,4,0,0, +    0,84,114,117,101,40,1,0,0,0,117,4,0,0,0,115, +    101,108,102,40,0,0,0,0,40,0,0,0,0,117,29,0, +    0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, +    108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, +    7,0,0,0,97,99,113,117,105,114,101,251,0,0,0,115, +    4,0,0,0,0,1,15,1,117,24,0,0,0,95,68,117, +    109,109,121,77,111,100,117,108,101,76,111,99,107,46,97,99, +    113,117,105,114,101,99,1,0,0,0,0,0,0,0,1,0, +    0,0,3,0,0,0,67,0,0,0,115,49,0,0,0,124, +    0,0,106,0,0,100,1,0,107,2,0,114,30,0,116,1, +    0,100,2,0,131,1,0,130,1,0,110,0,0,124,0,0, +    4,106,0,0,100,3,0,56,2,95,0,0,100,0,0,83, +    40,4,0,0,0,78,105,0,0,0,0,117,31,0,0,0, +    99,97,110,110,111,116,32,114,101,108,101,97,115,101,32,117, +    110,45,97,99,113,117,105,114,101,100,32,108,111,99,107,105, +    1,0,0,0,40,2,0,0,0,117,5,0,0,0,99,111, +    117,110,116,117,12,0,0,0,82,117,110,116,105,109,101,69, +    114,114,111,114,40,1,0,0,0,117,4,0,0,0,115,101, +    108,102,40,0,0,0,0,40,0,0,0,0,117,29,0,0, +    0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, +    105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,7, +    0,0,0,114,101,108,101,97,115,101,255,0,0,0,115,6, +    0,0,0,0,1,15,1,15,1,117,24,0,0,0,95,68, +    117,109,109,121,77,111,100,117,108,101,76,111,99,107,46,114, +    101,108,101,97,115,101,99,1,0,0,0,0,0,0,0,1, +    0,0,0,4,0,0,0,67,0,0,0,115,23,0,0,0, +    100,1,0,124,0,0,106,0,0,116,1,0,124,0,0,131, +    1,0,102,2,0,22,83,40,2,0,0,0,78,117,26,0, +    0,0,95,68,117,109,109,121,77,111,100,117,108,101,76,111, +    99,107,40,37,114,41,32,97,116,32,37,100,40,2,0,0, +    0,117,4,0,0,0,110,97,109,101,117,2,0,0,0,105, +    100,40,1,0,0,0,117,4,0,0,0,115,101,108,102,40, +    0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, +    114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, +    95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,0, +    95,95,114,101,112,114,95,95,4,1,0,0,115,2,0,0, +    0,0,1,117,25,0,0,0,95,68,117,109,109,121,77,111, +    100,117,108,101,76,111,99,107,46,95,95,114,101,112,114,95, +    95,78,40,8,0,0,0,117,8,0,0,0,95,95,110,97, +    109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,108, +    101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,97, +    109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,95, +    117,8,0,0,0,95,95,105,110,105,116,95,95,117,7,0, +    0,0,97,99,113,117,105,114,101,117,7,0,0,0,114,101, +    108,101,97,115,101,117,8,0,0,0,95,95,114,101,112,114, +    95,95,40,1,0,0,0,117,10,0,0,0,95,95,108,111, +    99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0, +    117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, +    111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, +    112,62,117,16,0,0,0,95,68,117,109,109,121,77,111,100, +    117,108,101,76,111,99,107,243,0,0,0,115,10,0,0,0, +    16,2,6,2,12,4,12,4,12,5,117,16,0,0,0,95, +    68,117,109,109,121,77,111,100,117,108,101,76,111,99,107,99, +    1,0,0,0,0,0,0,0,3,0,0,0,11,0,0,0, +    3,0,0,0,115,142,0,0,0,100,3,0,125,1,0,121, +    17,0,116,1,0,136,0,0,25,131,0,0,125,1,0,87, +    110,18,0,4,116,2,0,107,10,0,114,43,0,1,1,1, +    89,110,1,0,88,124,1,0,100,3,0,107,8,0,114,138, +    0,116,3,0,100,3,0,107,8,0,114,83,0,116,4,0, +    136,0,0,131,1,0,125,1,0,110,12,0,116,5,0,136, +    0,0,131,1,0,125,1,0,135,0,0,102,1,0,100,1, +    0,100,2,0,134,0,0,125,2,0,116,6,0,106,7,0, +    124,1,0,124,2,0,131,2,0,116,1,0,136,0,0,60, +    110,0,0,124,1,0,83,40,4,0,0,0,117,109,0,0, +    0,71,101,116,32,111,114,32,99,114,101,97,116,101,32,116, +    104,101,32,109,111,100,117,108,101,32,108,111,99,107,32,102, +    111,114,32,97,32,103,105,118,101,110,32,109,111,100,117,108, +    101,32,110,97,109,101,46,10,10,32,32,32,32,83,104,111, +    117,108,100,32,111,110,108,121,32,98,101,32,99,97,108,108, +    101,100,32,119,105,116,104,32,116,104,101,32,105,109,112,111, +    114,116,32,108,111,99,107,32,116,97,107,101,110,46,99,1, +    0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,19, +    0,0,0,115,11,0,0,0,116,0,0,136,0,0,61,100, +    0,0,83,40,1,0,0,0,78,40,1,0,0,0,117,13, +    0,0,0,95,109,111,100,117,108,101,95,108,111,99,107,115, +    40,1,0,0,0,117,1,0,0,0,95,40,1,0,0,0, +    117,4,0,0,0,110,97,109,101,40,0,0,0,0,117,29, +    0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, +    116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, +    117,2,0,0,0,99,98,24,1,0,0,115,2,0,0,0, +    0,1,117,28,0,0,0,95,103,101,116,95,109,111,100,117, +    108,101,95,108,111,99,107,46,60,108,111,99,97,108,115,62, +    46,99,98,78,40,8,0,0,0,117,4,0,0,0,78,111, +    110,101,117,13,0,0,0,95,109,111,100,117,108,101,95,108, +    111,99,107,115,117,8,0,0,0,75,101,121,69,114,114,111, +    114,117,7,0,0,0,95,116,104,114,101,97,100,117,16,0, +    0,0,95,68,117,109,109,121,77,111,100,117,108,101,76,111, +    99,107,117,11,0,0,0,95,77,111,100,117,108,101,76,111, +    99,107,117,8,0,0,0,95,119,101,97,107,114,101,102,117, +    3,0,0,0,114,101,102,40,3,0,0,0,117,4,0,0, +    0,110,97,109,101,117,4,0,0,0,108,111,99,107,117,2, +    0,0,0,99,98,40,0,0,0,0,40,1,0,0,0,117, +    4,0,0,0,110,97,109,101,117,29,0,0,0,60,102,114, +    111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, +    98,111,111,116,115,116,114,97,112,62,117,16,0,0,0,95, +    103,101,116,95,109,111,100,117,108,101,95,108,111,99,107,10, +    1,0,0,115,24,0,0,0,0,4,6,1,3,1,17,1, +    13,1,5,1,12,1,12,1,15,2,12,1,18,2,25,1, +    117,16,0,0,0,95,103,101,116,95,109,111,100,117,108,101, +    95,108,111,99,107,99,1,0,0,0,0,0,0,0,2,0, +    0,0,11,0,0,0,67,0,0,0,115,71,0,0,0,116, +    0,0,124,0,0,131,1,0,125,1,0,116,1,0,106,2, +    0,131,0,0,1,121,14,0,124,1,0,106,3,0,131,0, +    0,1,87,110,18,0,4,116,4,0,107,10,0,114,56,0, +    1,1,1,89,110,11,0,88,124,1,0,106,5,0,131,0, +    0,1,100,1,0,83,40,2,0,0,0,117,21,1,0,0, +    82,101,108,101,97,115,101,32,116,104,101,32,103,108,111,98, +    97,108,32,105,109,112,111,114,116,32,108,111,99,107,44,32, +    97,110,100,32,97,99,113,117,105,114,101,115,32,116,104,101, +    110,32,114,101,108,101,97,115,101,32,116,104,101,10,32,32, +    32,32,109,111,100,117,108,101,32,108,111,99,107,32,102,111, +    114,32,97,32,103,105,118,101,110,32,109,111,100,117,108,101, +    32,110,97,109,101,46,10,32,32,32,32,84,104,105,115,32, +    105,115,32,117,115,101,100,32,116,111,32,101,110,115,117,114, +    101,32,97,32,109,111,100,117,108,101,32,105,115,32,99,111, +    109,112,108,101,116,101,108,121,32,105,110,105,116,105,97,108, +    105,122,101,100,44,32,105,110,32,116,104,101,10,32,32,32, +    32,101,118,101,110,116,32,105,116,32,105,115,32,98,101,105, +    110,103,32,105,109,112,111,114,116,101,100,32,98,121,32,97, +    110,111,116,104,101,114,32,116,104,114,101,97,100,46,10,10, +    32,32,32,32,83,104,111,117,108,100,32,111,110,108,121,32, +    98,101,32,99,97,108,108,101,100,32,119,105,116,104,32,116, +    104,101,32,105,109,112,111,114,116,32,108,111,99,107,32,116, +    97,107,101,110,46,78,40,6,0,0,0,117,16,0,0,0, +    95,103,101,116,95,109,111,100,117,108,101,95,108,111,99,107, +    117,4,0,0,0,95,105,109,112,117,12,0,0,0,114,101, +    108,101,97,115,101,95,108,111,99,107,117,7,0,0,0,97, +    99,113,117,105,114,101,117,14,0,0,0,95,68,101,97,100, +    108,111,99,107,69,114,114,111,114,117,7,0,0,0,114,101, +    108,101,97,115,101,40,2,0,0,0,117,4,0,0,0,110, +    97,109,101,117,4,0,0,0,108,111,99,107,40,0,0,0, +    0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, +    101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, +    111,116,115,116,114,97,112,62,117,19,0,0,0,95,108,111, +    99,107,95,117,110,108,111,99,107,95,109,111,100,117,108,101, +    29,1,0,0,115,14,0,0,0,0,7,12,1,10,1,3, +    1,14,1,13,3,5,2,117,19,0,0,0,95,108,111,99, +    107,95,117,110,108,111,99,107,95,109,111,100,117,108,101,99, +    1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, +    79,0,0,0,115,13,0,0,0,124,0,0,124,1,0,124, +    2,0,142,0,0,83,40,1,0,0,0,117,46,1,0,0, +    114,101,109,111,118,101,95,105,109,112,111,114,116,108,105,98, +    95,102,114,97,109,101,115,32,105,110,32,105,109,112,111,114, +    116,46,99,32,119,105,108,108,32,97,108,119,97,121,115,32, +    114,101,109,111,118,101,32,115,101,113,117,101,110,99,101,115, +    10,32,32,32,32,111,102,32,105,109,112,111,114,116,108,105, +    98,32,102,114,97,109,101,115,32,116,104,97,116,32,101,110, +    100,32,119,105,116,104,32,97,32,99,97,108,108,32,116,111, +    32,116,104,105,115,32,102,117,110,99,116,105,111,110,10,10, +    32,32,32,32,85,115,101,32,105,116,32,105,110,115,116,101, +    97,100,32,111,102,32,97,32,110,111,114,109,97,108,32,99, +    97,108,108,32,105,110,32,112,108,97,99,101,115,32,119,104, +    101,114,101,32,105,110,99,108,117,100,105,110,103,32,116,104, +    101,32,105,109,112,111,114,116,108,105,98,10,32,32,32,32, +    102,114,97,109,101,115,32,105,110,116,114,111,100,117,99,101, +    115,32,117,110,119,97,110,116,101,100,32,110,111,105,115,101, +    32,105,110,116,111,32,116,104,101,32,116,114,97,99,101,98, +    97,99,107,32,40,101,46,103,46,32,119,104,101,110,32,101, +    120,101,99,117,116,105,110,103,10,32,32,32,32,109,111,100, +    117,108,101,32,99,111,100,101,41,10,32,32,32,32,40,0, +    0,0,0,40,3,0,0,0,117,1,0,0,0,102,117,4, +    0,0,0,97,114,103,115,117,4,0,0,0,107,119,100,115, +    40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, +    102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, +    46,95,98,111,111,116,115,116,114,97,112,62,117,25,0,0, +    0,95,99,97,108,108,95,119,105,116,104,95,102,114,97,109, +    101,115,95,114,101,109,111,118,101,100,49,1,0,0,115,2, +    0,0,0,0,8,117,25,0,0,0,95,99,97,108,108,95, +    119,105,116,104,95,102,114,97,109,101,115,95,114,101,109,111, +    118,101,100,105,158,12,0,0,117,1,0,0,0,13,105,16, +    0,0,0,117,1,0,0,0,10,105,24,0,0,0,99,1, +    0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,99, +    0,0,0,115,29,0,0,0,124,0,0,93,19,0,125,1, +    0,116,0,0,124,1,0,63,100,0,0,64,86,1,113,3, +    0,100,1,0,83,40,2,0,0,0,105,255,0,0,0,78, +    40,1,0,0,0,117,17,0,0,0,95,82,65,87,95,77, +    65,71,73,67,95,78,85,77,66,69,82,40,2,0,0,0, +    117,2,0,0,0,46,48,117,1,0,0,0,110,40,0,0, +    0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, +    122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, +    111,111,116,115,116,114,97,112,62,117,9,0,0,0,60,103, +    101,110,101,120,112,114,62,150,1,0,0,115,2,0,0,0, +    6,0,117,9,0,0,0,60,103,101,110,101,120,112,114,62, +    105,0,0,0,0,105,25,0,0,0,105,8,0,0,0,117, +    11,0,0,0,95,95,112,121,99,97,99,104,101,95,95,117, +    3,0,0,0,46,112,121,117,4,0,0,0,46,112,121,99, +    117,4,0,0,0,46,112,121,111,99,2,0,0,0,0,0, +    0,0,11,0,0,0,6,0,0,0,67,0,0,0,115,173, +    0,0,0,124,1,0,100,5,0,107,8,0,114,18,0,116, +    1,0,110,3,0,124,1,0,125,2,0,124,2,0,114,39, +    0,116,2,0,125,3,0,110,6,0,116,3,0,125,3,0, +    116,4,0,124,0,0,131,1,0,92,2,0,125,4,0,125, +    5,0,124,5,0,106,5,0,100,1,0,131,1,0,92,3, +    0,125,6,0,125,7,0,125,8,0,116,6,0,106,7,0, +    106,8,0,125,9,0,124,9,0,100,5,0,107,8,0,114, +    126,0,116,9,0,100,2,0,131,1,0,130,1,0,110,0, +    0,100,3,0,106,10,0,124,6,0,124,7,0,124,9,0, +    124,3,0,100,4,0,25,103,4,0,131,1,0,125,10,0, +    116,11,0,124,4,0,116,12,0,124,10,0,131,3,0,83, +    40,6,0,0,0,117,242,1,0,0,71,105,118,101,110,32, +    116,104,101,32,112,97,116,104,32,116,111,32,97,32,46,112, +    121,32,102,105,108,101,44,32,114,101,116,117,114,110,32,116, +    104,101,32,112,97,116,104,32,116,111,32,105,116,115,32,46, +    112,121,99,47,46,112,121,111,32,102,105,108,101,46,10,10, +    32,32,32,32,84,104,101,32,46,112,121,32,102,105,108,101, +    32,100,111,101,115,32,110,111,116,32,110,101,101,100,32,116, +    111,32,101,120,105,115,116,59,32,116,104,105,115,32,115,105, +    109,112,108,121,32,114,101,116,117,114,110,115,32,116,104,101, +    32,112,97,116,104,32,116,111,32,116,104,101,10,32,32,32, +    32,46,112,121,99,47,46,112,121,111,32,102,105,108,101,32, +    99,97,108,99,117,108,97,116,101,100,32,97,115,32,105,102, +    32,116,104,101,32,46,112,121,32,102,105,108,101,32,119,101, +    114,101,32,105,109,112,111,114,116,101,100,46,32,32,84,104, +    101,32,101,120,116,101,110,115,105,111,110,10,32,32,32,32, +    119,105,108,108,32,98,101,32,46,112,121,99,32,117,110,108, +    101,115,115,32,95,95,100,101,98,117,103,95,95,32,105,115, +    32,110,111,116,32,100,101,102,105,110,101,100,44,32,116,104, +    101,110,32,105,116,32,119,105,108,108,32,98,101,32,46,112, +    121,111,46,10,10,32,32,32,32,73,102,32,100,101,98,117, +    103,95,111,118,101,114,114,105,100,101,32,105,115,32,110,111, +    116,32,78,111,110,101,44,32,116,104,101,110,32,105,116,32, +    109,117,115,116,32,98,101,32,97,32,98,111,111,108,101,97, +    110,32,97,110,100,32,105,115,32,116,97,107,101,110,32,97, +    115,10,32,32,32,32,116,104,101,32,118,97,108,117,101,32, +    111,102,32,95,95,100,101,98,117,103,95,95,32,105,110,115, +    116,101,97,100,46,10,10,32,32,32,32,73,102,32,115,121, +    115,46,105,109,112,108,101,109,101,110,116,97,116,105,111,110, +    46,99,97,99,104,101,95,116,97,103,32,105,115,32,78,111, +    110,101,32,116,104,101,110,32,78,111,116,73,109,112,108,101, +    109,101,110,116,101,100,69,114,114,111,114,32,105,115,32,114, +    97,105,115,101,100,46,10,10,32,32,32,32,117,1,0,0, +    0,46,117,36,0,0,0,115,121,115,46,105,109,112,108,101, +    109,101,110,116,97,116,105,111,110,46,99,97,99,104,101,95, +    116,97,103,32,105,115,32,78,111,110,101,117,0,0,0,0, +    105,0,0,0,0,78,40,13,0,0,0,117,4,0,0,0, +    78,111,110,101,117,9,0,0,0,95,95,100,101,98,117,103, +    95,95,117,23,0,0,0,68,69,66,85,71,95,66,89,84, +    69,67,79,68,69,95,83,85,70,70,73,88,69,83,117,27, +    0,0,0,79,80,84,73,77,73,90,69,68,95,66,89,84, +    69,67,79,68,69,95,83,85,70,70,73,88,69,83,117,11, +    0,0,0,95,112,97,116,104,95,115,112,108,105,116,117,9, +    0,0,0,112,97,114,116,105,116,105,111,110,117,3,0,0, +    0,115,121,115,117,14,0,0,0,105,109,112,108,101,109,101, +    110,116,97,116,105,111,110,117,9,0,0,0,99,97,99,104, +    101,95,116,97,103,117,19,0,0,0,78,111,116,73,109,112, +    108,101,109,101,110,116,101,100,69,114,114,111,114,117,4,0, +    0,0,106,111,105,110,117,10,0,0,0,95,112,97,116,104, +    95,106,111,105,110,117,8,0,0,0,95,80,89,67,65,67, +    72,69,40,11,0,0,0,117,4,0,0,0,112,97,116,104, +    117,14,0,0,0,100,101,98,117,103,95,111,118,101,114,114, +    105,100,101,117,5,0,0,0,100,101,98,117,103,117,8,0, +    0,0,115,117,102,102,105,120,101,115,117,4,0,0,0,104, +    101,97,100,117,4,0,0,0,116,97,105,108,117,13,0,0, +    0,98,97,115,101,95,102,105,108,101,110,97,109,101,117,3, +    0,0,0,115,101,112,117,1,0,0,0,95,117,3,0,0, +    0,116,97,103,117,8,0,0,0,102,105,108,101,110,97,109, +    101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, +    60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, +    98,46,95,98,111,111,116,115,116,114,97,112,62,117,17,0, +    0,0,99,97,99,104,101,95,102,114,111,109,95,115,111,117, +    114,99,101,163,1,0,0,115,22,0,0,0,0,13,24,1, +    6,1,9,2,6,1,18,1,24,1,12,1,12,1,15,1, +    31,1,117,17,0,0,0,99,97,99,104,101,95,102,114,111, +    109,95,115,111,117,114,99,101,99,1,0,0,0,0,0,0, +    0,5,0,0,0,5,0,0,0,67,0,0,0,115,193,0, +    0,0,116,0,0,106,1,0,106,2,0,100,7,0,107,8, +    0,114,33,0,116,4,0,100,1,0,131,1,0,130,1,0, +    110,0,0,116,5,0,124,0,0,131,1,0,92,2,0,125, +    1,0,125,2,0,116,5,0,124,1,0,131,1,0,92,2, +    0,125,1,0,125,3,0,124,3,0,116,6,0,107,3,0, +    114,108,0,116,7,0,100,2,0,106,8,0,116,6,0,124, +    0,0,131,2,0,131,1,0,130,1,0,110,0,0,124,2, +    0,106,9,0,100,3,0,131,1,0,100,4,0,107,3,0, +    114,153,0,116,7,0,100,5,0,106,8,0,124,2,0,131, +    1,0,131,1,0,130,1,0,110,0,0,124,2,0,106,10, +    0,100,3,0,131,1,0,100,6,0,25,125,4,0,116,11, +    0,124,1,0,124,4,0,116,12,0,100,6,0,25,23,131, +    2,0,83,40,8,0,0,0,117,121,1,0,0,71,105,118, +    101,110,32,116,104,101,32,112,97,116,104,32,116,111,32,97, +    32,46,112,121,99,46,47,46,112,121,111,32,102,105,108,101, +    44,32,114,101,116,117,114,110,32,116,104,101,32,112,97,116, +    104,32,116,111,32,105,116,115,32,46,112,121,32,102,105,108, +    101,46,10,10,32,32,32,32,84,104,101,32,46,112,121,99, +    47,46,112,121,111,32,102,105,108,101,32,100,111,101,115,32, +    110,111,116,32,110,101,101,100,32,116,111,32,101,120,105,115, +    116,59,32,116,104,105,115,32,115,105,109,112,108,121,32,114, +    101,116,117,114,110,115,32,116,104,101,32,112,97,116,104,32, +    116,111,10,32,32,32,32,116,104,101,32,46,112,121,32,102, +    105,108,101,32,99,97,108,99,117,108,97,116,101,100,32,116, +    111,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32, +    116,104,101,32,46,112,121,99,47,46,112,121,111,32,102,105, +    108,101,46,32,32,73,102,32,112,97,116,104,32,100,111,101, +    115,10,32,32,32,32,110,111,116,32,99,111,110,102,111,114, +    109,32,116,111,32,80,69,80,32,51,49,52,55,32,102,111, +    114,109,97,116,44,32,86,97,108,117,101,69,114,114,111,114, +    32,119,105,108,108,32,98,101,32,114,97,105,115,101,100,46, +    32,73,102,10,32,32,32,32,115,121,115,46,105,109,112,108, +    101,109,101,110,116,97,116,105,111,110,46,99,97,99,104,101, +    95,116,97,103,32,105,115,32,78,111,110,101,32,116,104,101, +    110,32,78,111,116,73,109,112,108,101,109,101,110,116,101,100, +    69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46, +    10,10,32,32,32,32,117,36,0,0,0,115,121,115,46,105, +    109,112,108,101,109,101,110,116,97,116,105,111,110,46,99,97, +    99,104,101,95,116,97,103,32,105,115,32,78,111,110,101,117, +    37,0,0,0,123,125,32,110,111,116,32,98,111,116,116,111, +    109,45,108,101,118,101,108,32,100,105,114,101,99,116,111,114, +    121,32,105,110,32,123,33,114,125,117,1,0,0,0,46,105, +    2,0,0,0,117,28,0,0,0,101,120,112,101,99,116,101, +    100,32,111,110,108,121,32,50,32,100,111,116,115,32,105,110, +    32,123,33,114,125,105,0,0,0,0,78,40,13,0,0,0, +    117,3,0,0,0,115,121,115,117,14,0,0,0,105,109,112, +    108,101,109,101,110,116,97,116,105,111,110,117,9,0,0,0, +    99,97,99,104,101,95,116,97,103,117,4,0,0,0,78,111, +    110,101,117,19,0,0,0,78,111,116,73,109,112,108,101,109, +    101,110,116,101,100,69,114,114,111,114,117,11,0,0,0,95, +    112,97,116,104,95,115,112,108,105,116,117,8,0,0,0,95, +    80,89,67,65,67,72,69,117,10,0,0,0,86,97,108,117, +    101,69,114,114,111,114,117,6,0,0,0,102,111,114,109,97, +    116,117,5,0,0,0,99,111,117,110,116,117,9,0,0,0, +    112,97,114,116,105,116,105,111,110,117,10,0,0,0,95,112, +    97,116,104,95,106,111,105,110,117,15,0,0,0,83,79,85, +    82,67,69,95,83,85,70,70,73,88,69,83,40,5,0,0, +    0,117,4,0,0,0,112,97,116,104,117,4,0,0,0,104, +    101,97,100,117,16,0,0,0,112,121,99,97,99,104,101,95, +    102,105,108,101,110,97,109,101,117,7,0,0,0,112,121,99, +    97,99,104,101,117,13,0,0,0,98,97,115,101,95,102,105, +    108,101,110,97,109,101,40,0,0,0,0,40,0,0,0,0, +    117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, +    111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, +    112,62,117,17,0,0,0,115,111,117,114,99,101,95,102,114, +    111,109,95,99,97,99,104,101,190,1,0,0,115,24,0,0, +    0,0,9,18,1,15,1,18,1,18,1,12,1,9,1,18, +    1,21,1,9,1,15,1,19,1,117,17,0,0,0,115,111, +    117,114,99,101,95,102,114,111,109,95,99,97,99,104,101,99, +    1,0,0,0,0,0,0,0,5,0,0,0,13,0,0,0, +    67,0,0,0,115,164,0,0,0,116,0,0,124,0,0,131, +    1,0,100,1,0,107,2,0,114,22,0,100,6,0,83,124, +    0,0,106,2,0,100,2,0,131,1,0,92,3,0,125,1, +    0,125,2,0,125,3,0,124,1,0,12,115,81,0,124,3, +    0,106,3,0,131,0,0,100,7,0,100,8,0,133,2,0, +    25,100,5,0,107,3,0,114,85,0,124,0,0,83,121,16, +    0,116,4,0,124,0,0,131,1,0,125,4,0,87,110,40, +    0,4,116,5,0,116,6,0,102,2,0,107,10,0,114,143, +    0,1,1,1,116,7,0,100,9,0,100,6,0,133,2,0, +    25,125,4,0,89,110,1,0,88,116,8,0,116,9,0,131, +    1,0,114,160,0,124,4,0,83,124,0,0,83,40,10,0, +    0,0,117,188,0,0,0,67,111,110,118,101,114,116,32,97, +    32,98,121,116,101,99,111,100,101,32,102,105,108,101,32,112, +    97,116,104,32,116,111,32,97,32,115,111,117,114,99,101,32, +    112,97,116,104,32,40,105,102,32,112,111,115,115,105,98,108, +    101,41,46,10,10,32,32,32,32,84,104,105,115,32,102,117, +    110,99,116,105,111,110,32,101,120,105,115,116,115,32,112,117, +    114,101,108,121,32,102,111,114,32,98,97,99,107,119,97,114, +    100,115,45,99,111,109,112,97,116,105,98,105,108,105,116,121, +    32,102,111,114,10,32,32,32,32,80,121,73,109,112,111,114, +    116,95,69,120,101,99,67,111,100,101,77,111,100,117,108,101, +    87,105,116,104,70,105,108,101,110,97,109,101,115,40,41,32, +    105,110,32,116,104,101,32,67,32,65,80,73,46,10,10,32, +    32,32,32,105,0,0,0,0,117,1,0,0,0,46,105,3, +    0,0,0,105,1,0,0,0,117,3,0,0,0,46,112,121, +    78,105,253,255,255,255,105,255,255,255,255,105,255,255,255,255, +    40,10,0,0,0,117,3,0,0,0,108,101,110,117,4,0, +    0,0,78,111,110,101,117,9,0,0,0,114,112,97,114,105, +    116,105,111,110,117,5,0,0,0,108,111,119,101,114,117,17, +    0,0,0,115,111,117,114,99,101,95,102,114,111,109,95,99, +    97,99,104,101,117,19,0,0,0,78,111,116,73,109,112,108, +    101,109,101,110,116,101,100,69,114,114,111,114,117,10,0,0, +    0,86,97,108,117,101,69,114,114,111,114,117,12,0,0,0, +    98,121,116,99,111,100,101,95,112,97,116,104,117,12,0,0, +    0,95,112,97,116,104,95,105,115,102,105,108,101,117,12,0, +    0,0,115,111,117,114,99,101,95,115,116,97,116,115,40,5, +    0,0,0,117,13,0,0,0,98,121,116,101,99,111,100,101, +    95,112,97,116,104,117,4,0,0,0,114,101,115,116,117,1, +    0,0,0,95,117,9,0,0,0,101,120,116,101,110,115,105, +    111,110,117,11,0,0,0,115,111,117,114,99,101,95,112,97, +    116,104,40,0,0,0,0,40,0,0,0,0,117,29,0,0, +    0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, +    105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,15, +    0,0,0,95,103,101,116,95,115,111,117,114,99,101,102,105, +    108,101,213,1,0,0,115,20,0,0,0,0,7,18,1,4, +    1,24,1,35,1,4,2,3,1,16,1,19,1,21,2,117, +    15,0,0,0,95,103,101,116,95,115,111,117,114,99,101,102, +    105,108,101,99,1,0,0,0,0,0,0,0,2,0,0,0, +    4,0,0,0,71,0,0,0,115,75,0,0,0,116,0,0, +    106,1,0,106,2,0,114,71,0,124,0,0,106,3,0,100, +    6,0,131,1,0,115,40,0,100,3,0,124,0,0,23,125, +    0,0,110,0,0,116,4,0,124,0,0,106,5,0,124,1, +    0,140,0,0,100,4,0,116,0,0,106,6,0,131,1,1, +    1,110,0,0,100,5,0,83,40,7,0,0,0,117,61,0, +    0,0,80,114,105,110,116,32,116,104,101,32,109,101,115,115, +    97,103,101,32,116,111,32,115,116,100,101,114,114,32,105,102, +    32,45,118,47,80,89,84,72,79,78,86,69,82,66,79,83, +    69,32,105,115,32,116,117,114,110,101,100,32,111,110,46,117, +    1,0,0,0,35,117,7,0,0,0,105,109,112,111,114,116, +    32,117,2,0,0,0,35,32,117,4,0,0,0,102,105,108, +    101,78,40,2,0,0,0,117,1,0,0,0,35,117,7,0, +    0,0,105,109,112,111,114,116,32,40,7,0,0,0,117,3, +    0,0,0,115,121,115,117,5,0,0,0,102,108,97,103,115, +    117,7,0,0,0,118,101,114,98,111,115,101,117,10,0,0, +    0,115,116,97,114,116,115,119,105,116,104,117,5,0,0,0, +    112,114,105,110,116,117,6,0,0,0,102,111,114,109,97,116, +    117,6,0,0,0,115,116,100,101,114,114,40,2,0,0,0, +    117,7,0,0,0,109,101,115,115,97,103,101,117,4,0,0, +    0,97,114,103,115,40,0,0,0,0,40,0,0,0,0,117, +    29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, +    114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, +    62,117,16,0,0,0,95,118,101,114,98,111,115,101,95,109, +    101,115,115,97,103,101,234,1,0,0,115,8,0,0,0,0, +    2,12,1,15,1,13,1,117,16,0,0,0,95,118,101,114, +    98,111,115,101,95,109,101,115,115,97,103,101,99,1,0,0, +    0,0,0,0,0,2,0,0,0,3,0,0,0,3,0,0, +    0,115,35,0,0,0,135,0,0,102,1,0,100,1,0,100, +    2,0,134,0,0,125,1,0,116,0,0,124,1,0,136,0, +    0,131,2,0,1,124,1,0,83,40,3,0,0,0,117,39, +    0,0,0,83,101,116,32,95,95,112,97,99,107,97,103,101, +    95,95,32,111,110,32,116,104,101,32,114,101,116,117,114,110, +    101,100,32,109,111,100,117,108,101,46,99,0,0,0,0,0, +    0,0,0,3,0,0,0,4,0,0,0,31,0,0,0,115, +    101,0,0,0,136,0,0,124,0,0,124,1,0,142,0,0, +    125,2,0,116,0,0,124,2,0,100,1,0,100,0,0,131, +    3,0,100,0,0,107,8,0,114,97,0,124,2,0,106,2, +    0,124,2,0,95,3,0,116,4,0,124,2,0,100,2,0, +    131,2,0,115,97,0,124,2,0,106,3,0,106,5,0,100, +    3,0,131,1,0,100,4,0,25,124,2,0,95,3,0,113, +    97,0,110,0,0,124,2,0,83,40,5,0,0,0,78,117, +    11,0,0,0,95,95,112,97,99,107,97,103,101,95,95,117, +    8,0,0,0,95,95,112,97,116,104,95,95,117,1,0,0, +    0,46,105,0,0,0,0,40,6,0,0,0,117,7,0,0, +    0,103,101,116,97,116,116,114,117,4,0,0,0,78,111,110, +    101,117,8,0,0,0,95,95,110,97,109,101,95,95,117,11, +    0,0,0,95,95,112,97,99,107,97,103,101,95,95,117,7, +    0,0,0,104,97,115,97,116,116,114,117,10,0,0,0,114, +    112,97,114,116,105,116,105,111,110,40,3,0,0,0,117,4, +    0,0,0,97,114,103,115,117,6,0,0,0,107,119,97,114, +    103,115,117,6,0,0,0,109,111,100,117,108,101,40,1,0, +    0,0,117,3,0,0,0,102,120,110,40,0,0,0,0,117, +    29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, +    114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, +    62,117,19,0,0,0,115,101,116,95,112,97,99,107,97,103, +    101,95,119,114,97,112,112,101,114,244,1,0,0,115,12,0, +    0,0,0,1,15,1,24,1,12,1,15,1,31,1,117,40, +    0,0,0,115,101,116,95,112,97,99,107,97,103,101,46,60, +    108,111,99,97,108,115,62,46,115,101,116,95,112,97,99,107, +    97,103,101,95,119,114,97,112,112,101,114,40,1,0,0,0, +    117,5,0,0,0,95,119,114,97,112,40,2,0,0,0,117, +    3,0,0,0,102,120,110,117,19,0,0,0,115,101,116,95, +    112,97,99,107,97,103,101,95,119,114,97,112,112,101,114,40, +    0,0,0,0,40,1,0,0,0,117,3,0,0,0,102,120, +    110,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, +    112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, +    97,112,62,117,11,0,0,0,115,101,116,95,112,97,99,107, +    97,103,101,242,1,0,0,115,6,0,0,0,0,2,18,7, +    13,1,117,11,0,0,0,115,101,116,95,112,97,99,107,97, +    103,101,99,1,0,0,0,0,0,0,0,2,0,0,0,3, +    0,0,0,3,0,0,0,115,35,0,0,0,135,0,0,102, +    1,0,100,1,0,100,2,0,134,0,0,125,1,0,116,0, +    0,124,1,0,136,0,0,131,2,0,1,124,1,0,83,40, +    3,0,0,0,117,38,0,0,0,83,101,116,32,95,95,108, +    111,97,100,101,114,95,95,32,111,110,32,116,104,101,32,114, +    101,116,117,114,110,101,100,32,109,111,100,117,108,101,46,99, +    1,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, +    31,0,0,0,115,49,0,0,0,136,0,0,124,0,0,124, +    1,0,124,2,0,142,1,0,125,3,0,116,0,0,124,3, +    0,100,1,0,131,2,0,115,45,0,124,0,0,124,3,0, +    95,1,0,110,0,0,124,3,0,83,40,2,0,0,0,78, +    117,10,0,0,0,95,95,108,111,97,100,101,114,95,95,40, +    2,0,0,0,117,7,0,0,0,104,97,115,97,116,116,114, +    117,10,0,0,0,95,95,108,111,97,100,101,114,95,95,40, +    4,0,0,0,117,4,0,0,0,115,101,108,102,117,4,0, +    0,0,97,114,103,115,117,6,0,0,0,107,119,97,114,103, +    115,117,6,0,0,0,109,111,100,117,108,101,40,1,0,0, +    0,117,3,0,0,0,102,120,110,40,0,0,0,0,117,29, +    0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, +    116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, +    117,18,0,0,0,115,101,116,95,108,111,97,100,101,114,95, +    119,114,97,112,112,101,114,1,2,0,0,115,8,0,0,0, +    0,1,18,1,15,1,12,1,117,38,0,0,0,115,101,116, +    95,108,111,97,100,101,114,46,60,108,111,99,97,108,115,62, +    46,115,101,116,95,108,111,97,100,101,114,95,119,114,97,112, +    112,101,114,40,1,0,0,0,117,5,0,0,0,95,119,114, +    97,112,40,2,0,0,0,117,3,0,0,0,102,120,110,117, +    18,0,0,0,115,101,116,95,108,111,97,100,101,114,95,119, +    114,97,112,112,101,114,40,0,0,0,0,40,1,0,0,0, +    117,3,0,0,0,102,120,110,117,29,0,0,0,60,102,114, +    111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, +    98,111,111,116,115,116,114,97,112,62,117,10,0,0,0,115, +    101,116,95,108,111,97,100,101,114,255,1,0,0,115,6,0, +    0,0,0,2,18,5,13,1,117,10,0,0,0,115,101,116, +    95,108,111,97,100,101,114,99,1,0,0,0,0,0,0,0, +    2,0,0,0,3,0,0,0,3,0,0,0,115,35,0,0, +    0,135,0,0,102,1,0,100,1,0,100,2,0,134,0,0, +    125,1,0,116,0,0,124,1,0,136,0,0,131,2,0,1, +    124,1,0,83,40,3,0,0,0,117,42,3,0,0,68,101, +    99,111,114,97,116,111,114,32,116,111,32,104,97,110,100,108, +    101,32,115,101,108,101,99,116,105,110,103,32,116,104,101,32, +    112,114,111,112,101,114,32,109,111,100,117,108,101,32,102,111, +    114,32,108,111,97,100,101,114,115,46,10,10,32,32,32,32, +    84,104,101,32,100,101,99,111,114,97,116,101,100,32,102,117, +    110,99,116,105,111,110,32,105,115,32,112,97,115,115,101,100, +    32,116,104,101,32,109,111,100,117,108,101,32,116,111,32,117, +    115,101,32,105,110,115,116,101,97,100,32,111,102,32,116,104, +    101,32,109,111,100,117,108,101,10,32,32,32,32,110,97,109, +    101,46,32,84,104,101,32,109,111,100,117,108,101,32,112,97, +    115,115,101,100,32,105,110,32,116,111,32,116,104,101,32,102, +    117,110,99,116,105,111,110,32,105,115,32,101,105,116,104,101, +    114,32,102,114,111,109,32,115,121,115,46,109,111,100,117,108, +    101,115,32,105,102,10,32,32,32,32,105,116,32,97,108,114, +    101,97,100,121,32,101,120,105,115,116,115,32,111,114,32,105, +    115,32,97,32,110,101,119,32,109,111,100,117,108,101,46,32, +    73,102,32,116,104,101,32,109,111,100,117,108,101,32,105,115, +    32,110,101,119,44,32,116,104,101,110,32,95,95,110,97,109, +    101,95,95,10,32,32,32,32,105,115,32,115,101,116,32,116, +    104,101,32,102,105,114,115,116,32,97,114,103,117,109,101,110, +    116,32,116,111,32,116,104,101,32,109,101,116,104,111,100,44, +    32,95,95,108,111,97,100,101,114,95,95,32,105,115,32,115, +    101,116,32,116,111,32,115,101,108,102,44,32,97,110,100,10, +    32,32,32,32,95,95,112,97,99,107,97,103,101,95,95,32, +    105,115,32,115,101,116,32,97,99,99,111,114,100,105,110,103, +    108,121,32,40,105,102,32,115,101,108,102,46,105,115,95,112, +    97,99,107,97,103,101,40,41,32,105,115,32,100,101,102,105, +    110,101,100,41,32,119,105,108,108,32,98,101,32,115,101,116, +    10,32,32,32,32,98,101,102,111,114,101,32,105,116,32,105, +    115,32,112,97,115,115,101,100,32,116,111,32,116,104,101,32, +    100,101,99,111,114,97,116,101,100,32,102,117,110,99,116,105, +    111,110,32,40,105,102,32,115,101,108,102,46,105,115,95,112, +    97,99,107,97,103,101,40,41,32,100,111,101,115,10,32,32, +    32,32,110,111,116,32,119,111,114,107,32,102,111,114,32,116, +    104,101,32,109,111,100,117,108,101,32,105,116,32,119,105,108, +    108,32,98,101,32,115,101,116,32,112,111,115,116,45,108,111, +    97,100,41,46,10,10,32,32,32,32,73,102,32,97,110,32, +    101,120,99,101,112,116,105,111,110,32,105,115,32,114,97,105, +    115,101,100,32,97,110,100,32,116,104,101,32,100,101,99,111, +    114,97,116,111,114,32,99,114,101,97,116,101,100,32,116,104, +    101,32,109,111,100,117,108,101,32,105,116,32,105,115,10,32, +    32,32,32,115,117,98,115,101,113,117,101,110,116,108,121,32, +    114,101,109,111,118,101,100,32,102,114,111,109,32,115,121,115, +    46,109,111,100,117,108,101,115,46,10,10,32,32,32,32,84, +    104,101,32,100,101,99,111,114,97,116,111,114,32,97,115,115, +    117,109,101,115,32,116,104,97,116,32,116,104,101,32,100,101, +    99,111,114,97,116,101,100,32,102,117,110,99,116,105,111,110, +    32,116,97,107,101,115,32,116,104,101,32,109,111,100,117,108, +    101,32,110,97,109,101,32,97,115,10,32,32,32,32,116,104, +    101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110, +    116,46,10,10,32,32,32,32,99,2,0,0,0,0,0,0, +    0,7,0,0,0,25,0,0,0,31,0,0,0,115,254,0, +    0,0,116,0,0,106,1,0,106,2,0,124,1,0,131,1, +    0,125,4,0,124,4,0,100,0,0,107,9,0,125,5,0, +    124,5,0,115,168,0,116,4,0,124,1,0,131,1,0,125, +    4,0,100,3,0,124,4,0,95,6,0,124,4,0,116,0, +    0,106,1,0,124,1,0,60,124,0,0,124,4,0,95,7, +    0,121,19,0,124,0,0,106,8,0,124,1,0,131,1,0, +    125,6,0,87,110,24,0,4,116,9,0,116,10,0,102,2, +    0,107,10,0,114,124,0,1,1,1,89,113,177,0,88,124, +    6,0,114,143,0,124,1,0,124,4,0,95,11,0,113,177, +    0,124,1,0,106,12,0,100,1,0,131,1,0,100,2,0, +    25,124,4,0,95,11,0,110,9,0,100,3,0,124,4,0, +    95,6,0,122,60,0,121,23,0,136,0,0,124,0,0,124, +    4,0,124,2,0,124,3,0,142,2,0,83,87,110,30,0, +    1,1,1,124,5,0,115,228,0,116,0,0,106,1,0,124, +    1,0,61,110,0,0,130,0,0,89,110,1,0,88,87,100, +    0,0,100,4,0,124,4,0,95,6,0,88,100,0,0,83, +    40,5,0,0,0,78,117,1,0,0,0,46,105,0,0,0, +    0,84,70,40,14,0,0,0,117,3,0,0,0,115,121,115, +    117,7,0,0,0,109,111,100,117,108,101,115,117,3,0,0, +    0,103,101,116,117,4,0,0,0,78,111,110,101,117,10,0, +    0,0,110,101,119,95,109,111,100,117,108,101,117,4,0,0, +    0,84,114,117,101,117,16,0,0,0,95,95,105,110,105,116, +    105,97,108,105,122,105,110,103,95,95,117,10,0,0,0,95, +    95,108,111,97,100,101,114,95,95,117,10,0,0,0,105,115, +    95,112,97,99,107,97,103,101,117,11,0,0,0,73,109,112, +    111,114,116,69,114,114,111,114,117,14,0,0,0,65,116,116, +    114,105,98,117,116,101,69,114,114,111,114,117,11,0,0,0, +    95,95,112,97,99,107,97,103,101,95,95,117,10,0,0,0, +    114,112,97,114,116,105,116,105,111,110,117,5,0,0,0,70, +    97,108,115,101,40,7,0,0,0,117,4,0,0,0,115,101, +    108,102,117,8,0,0,0,102,117,108,108,110,97,109,101,117, +    4,0,0,0,97,114,103,115,117,6,0,0,0,107,119,97, +    114,103,115,117,6,0,0,0,109,111,100,117,108,101,117,9, +    0,0,0,105,115,95,114,101,108,111,97,100,117,10,0,0, +    0,105,115,95,112,97,99,107,97,103,101,40,1,0,0,0, +    117,3,0,0,0,102,120,110,40,0,0,0,0,117,29,0, +    0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, +    108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, +    25,0,0,0,109,111,100,117,108,101,95,102,111,114,95,108, +    111,97,100,101,114,95,119,114,97,112,112,101,114,28,2,0, +    0,115,44,0,0,0,0,1,18,1,12,1,6,4,12,3, +    9,1,13,1,9,1,3,1,19,1,19,1,5,2,6,1, +    12,2,25,2,9,1,6,2,23,1,3,1,6,1,13,1, +    12,2,117,52,0,0,0,109,111,100,117,108,101,95,102,111, +    114,95,108,111,97,100,101,114,46,60,108,111,99,97,108,115, +    62,46,109,111,100,117,108,101,95,102,111,114,95,108,111,97, +    100,101,114,95,119,114,97,112,112,101,114,40,1,0,0,0, +    117,5,0,0,0,95,119,114,97,112,40,2,0,0,0,117, +    3,0,0,0,102,120,110,117,25,0,0,0,109,111,100,117, +    108,101,95,102,111,114,95,108,111,97,100,101,114,95,119,114, +    97,112,112,101,114,40,0,0,0,0,40,1,0,0,0,117, +    3,0,0,0,102,120,110,117,29,0,0,0,60,102,114,111, +    122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, +    111,111,116,115,116,114,97,112,62,117,17,0,0,0,109,111, +    100,117,108,101,95,102,111,114,95,108,111,97,100,101,114,10, +    2,0,0,115,6,0,0,0,0,18,18,33,13,1,117,17, +    0,0,0,109,111,100,117,108,101,95,102,111,114,95,108,111, +    97,100,101,114,99,1,0,0,0,0,0,0,0,2,0,0, +    0,4,0,0,0,3,0,0,0,115,38,0,0,0,100,3, +    0,135,0,0,102,1,0,100,1,0,100,2,0,134,1,0, +    125,1,0,116,1,0,124,1,0,136,0,0,131,2,0,1, +    124,1,0,83,40,4,0,0,0,117,252,0,0,0,68,101, +    99,111,114,97,116,111,114,32,116,111,32,118,101,114,105,102, +    121,32,116,104,97,116,32,116,104,101,32,109,111,100,117,108, +    101,32,98,101,105,110,103,32,114,101,113,117,101,115,116,101, +    100,32,109,97,116,99,104,101,115,32,116,104,101,32,111,110, +    101,32,116,104,101,10,32,32,32,32,108,111,97,100,101,114, +    32,99,97,110,32,104,97,110,100,108,101,46,10,10,32,32, +    32,32,84,104,101,32,102,105,114,115,116,32,97,114,103,117, +    109,101,110,116,32,40,115,101,108,102,41,32,109,117,115,116, +    32,100,101,102,105,110,101,32,95,110,97,109,101,32,119,104, +    105,99,104,32,116,104,101,32,115,101,99,111,110,100,32,97, +    114,103,117,109,101,110,116,32,105,115,10,32,32,32,32,99, +    111,109,112,97,114,101,100,32,97,103,97,105,110,115,116,46, +    32,73,102,32,116,104,101,32,99,111,109,112,97,114,105,115, +    111,110,32,102,97,105,108,115,32,116,104,101,110,32,73,109, +    112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, +    115,101,100,46,10,10,32,32,32,32,99,2,0,0,0,0, +    0,0,0,4,0,0,0,5,0,0,0,31,0,0,0,115, +    83,0,0,0,124,1,0,100,0,0,107,8,0,114,24,0, +    124,0,0,106,1,0,125,1,0,110,40,0,124,0,0,106, +    1,0,124,1,0,107,3,0,114,64,0,116,2,0,100,1, +    0,124,1,0,22,100,2,0,124,1,0,131,1,1,130,1, +    0,110,0,0,136,0,0,124,0,0,124,1,0,124,2,0, +    124,3,0,142,2,0,83,40,3,0,0,0,78,117,23,0, +    0,0,108,111,97,100,101,114,32,99,97,110,110,111,116,32, +    104,97,110,100,108,101,32,37,115,117,4,0,0,0,110,97, +    109,101,40,3,0,0,0,117,4,0,0,0,78,111,110,101, +    117,4,0,0,0,110,97,109,101,117,11,0,0,0,73,109, +    112,111,114,116,69,114,114,111,114,40,4,0,0,0,117,4, +    0,0,0,115,101,108,102,117,4,0,0,0,110,97,109,101, +    117,4,0,0,0,97,114,103,115,117,6,0,0,0,107,119, +    97,114,103,115,40,1,0,0,0,117,6,0,0,0,109,101, +    116,104,111,100,40,0,0,0,0,117,29,0,0,0,60,102, +    114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, +    95,98,111,111,116,115,116,114,97,112,62,117,19,0,0,0, +    95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112, +    112,101,114,73,2,0,0,115,10,0,0,0,0,1,12,1, +    12,1,15,1,25,1,117,40,0,0,0,95,99,104,101,99, +    107,95,110,97,109,101,46,60,108,111,99,97,108,115,62,46, +    95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112, +    112,101,114,78,40,2,0,0,0,117,4,0,0,0,78,111, +    110,101,117,5,0,0,0,95,119,114,97,112,40,2,0,0, +    0,117,6,0,0,0,109,101,116,104,111,100,117,19,0,0, +    0,95,99,104,101,99,107,95,110,97,109,101,95,119,114,97, +    112,112,101,114,40,0,0,0,0,40,1,0,0,0,117,6, +    0,0,0,109,101,116,104,111,100,117,29,0,0,0,60,102, +    114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, +    95,98,111,111,116,115,116,114,97,112,62,117,11,0,0,0, +    95,99,104,101,99,107,95,110,97,109,101,65,2,0,0,115, +    6,0,0,0,0,8,21,6,13,1,117,11,0,0,0,95, +    99,104,101,99,107,95,110,97,109,101,99,1,0,0,0,0, +    0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,115, +    35,0,0,0,135,0,0,102,1,0,100,1,0,100,2,0, +    134,0,0,125,1,0,116,0,0,124,1,0,136,0,0,131, +    2,0,1,124,1,0,83,40,3,0,0,0,117,49,0,0, +    0,68,101,99,111,114,97,116,111,114,32,116,111,32,118,101, +    114,105,102,121,32,116,104,101,32,110,97,109,101,100,32,109, +    111,100,117,108,101,32,105,115,32,98,117,105,108,116,45,105, +    110,46,99,2,0,0,0,0,0,0,0,2,0,0,0,4, +    0,0,0,19,0,0,0,115,58,0,0,0,124,1,0,116, +    0,0,106,1,0,107,7,0,114,45,0,116,2,0,100,1, +    0,106,3,0,124,1,0,131,1,0,100,2,0,124,1,0, +    131,1,1,130,1,0,110,0,0,136,0,0,124,0,0,124, +    1,0,131,2,0,83,40,3,0,0,0,78,117,27,0,0, +    0,123,125,32,105,115,32,110,111,116,32,97,32,98,117,105, +    108,116,45,105,110,32,109,111,100,117,108,101,117,4,0,0, +    0,110,97,109,101,40,4,0,0,0,117,3,0,0,0,115, +    121,115,117,20,0,0,0,98,117,105,108,116,105,110,95,109, +    111,100,117,108,101,95,110,97,109,101,115,117,11,0,0,0, +    73,109,112,111,114,116,69,114,114,111,114,117,6,0,0,0, +    102,111,114,109,97,116,40,2,0,0,0,117,4,0,0,0, +    115,101,108,102,117,8,0,0,0,102,117,108,108,110,97,109, +    101,40,1,0,0,0,117,3,0,0,0,102,120,110,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,25,0,0,0,95,114,101,113,117,105, +    114,101,115,95,98,117,105,108,116,105,110,95,119,114,97,112, +    112,101,114,85,2,0,0,115,8,0,0,0,0,1,15,1, +    18,1,12,1,117,52,0,0,0,95,114,101,113,117,105,114, +    101,115,95,98,117,105,108,116,105,110,46,60,108,111,99,97, +    108,115,62,46,95,114,101,113,117,105,114,101,115,95,98,117, +    105,108,116,105,110,95,119,114,97,112,112,101,114,40,1,0, +    0,0,117,5,0,0,0,95,119,114,97,112,40,2,0,0, +    0,117,3,0,0,0,102,120,110,117,25,0,0,0,95,114, +    101,113,117,105,114,101,115,95,98,117,105,108,116,105,110,95, +    119,114,97,112,112,101,114,40,0,0,0,0,40,1,0,0, +    0,117,3,0,0,0,102,120,110,117,29,0,0,0,60,102, +    114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, +    95,98,111,111,116,115,116,114,97,112,62,117,17,0,0,0, +    95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,105, +    110,83,2,0,0,115,6,0,0,0,0,2,18,5,13,1, +    117,17,0,0,0,95,114,101,113,117,105,114,101,115,95,98, +    117,105,108,116,105,110,99,1,0,0,0,0,0,0,0,2, +    0,0,0,3,0,0,0,3,0,0,0,115,35,0,0,0, +    135,0,0,102,1,0,100,1,0,100,2,0,134,0,0,125, +    1,0,116,0,0,124,1,0,136,0,0,131,2,0,1,124, +    1,0,83,40,3,0,0,0,117,47,0,0,0,68,101,99, +    111,114,97,116,111,114,32,116,111,32,118,101,114,105,102,121, +    32,116,104,101,32,110,97,109,101,100,32,109,111,100,117,108, +    101,32,105,115,32,102,114,111,122,101,110,46,99,2,0,0, +    0,0,0,0,0,2,0,0,0,4,0,0,0,19,0,0, +    0,115,58,0,0,0,116,0,0,106,1,0,124,1,0,131, +    1,0,115,45,0,116,2,0,100,1,0,106,3,0,124,1, +    0,131,1,0,100,2,0,124,1,0,131,1,1,130,1,0, +    110,0,0,136,0,0,124,0,0,124,1,0,131,2,0,83, +    40,3,0,0,0,78,117,25,0,0,0,123,125,32,105,115, +    32,110,111,116,32,97,32,102,114,111,122,101,110,32,109,111, +    100,117,108,101,117,4,0,0,0,110,97,109,101,40,4,0, +    0,0,117,4,0,0,0,95,105,109,112,117,9,0,0,0, +    105,115,95,102,114,111,122,101,110,117,11,0,0,0,73,109, +    112,111,114,116,69,114,114,111,114,117,6,0,0,0,102,111, +    114,109,97,116,40,2,0,0,0,117,4,0,0,0,115,101, +    108,102,117,8,0,0,0,102,117,108,108,110,97,109,101,40, +    1,0,0,0,117,3,0,0,0,102,120,110,40,0,0,0, +    0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, +    112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, +    97,112,62,117,24,0,0,0,95,114,101,113,117,105,114,101, +    115,95,102,114,111,122,101,110,95,119,114,97,112,112,101,114, +    96,2,0,0,115,8,0,0,0,0,1,15,1,18,1,12, +    1,117,50,0,0,0,95,114,101,113,117,105,114,101,115,95, +    102,114,111,122,101,110,46,60,108,111,99,97,108,115,62,46, +    95,114,101,113,117,105,114,101,115,95,102,114,111,122,101,110, +    95,119,114,97,112,112,101,114,40,1,0,0,0,117,5,0, +    0,0,95,119,114,97,112,40,2,0,0,0,117,3,0,0, +    0,102,120,110,117,24,0,0,0,95,114,101,113,117,105,114, +    101,115,95,102,114,111,122,101,110,95,119,114,97,112,112,101, +    114,40,0,0,0,0,40,1,0,0,0,117,3,0,0,0, +    102,120,110,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,16,0,0,0,95,114,101,113,117,105, +    114,101,115,95,102,114,111,122,101,110,94,2,0,0,115,6, +    0,0,0,0,2,18,5,13,1,117,16,0,0,0,95,114, +    101,113,117,105,114,101,115,95,102,114,111,122,101,110,99,2, +    0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, +    0,0,0,115,87,0,0,0,124,0,0,106,0,0,124,1, +    0,131,1,0,92,2,0,125,2,0,125,3,0,124,2,0, +    100,3,0,107,8,0,114,83,0,116,2,0,124,3,0,131, +    1,0,114,83,0,100,1,0,125,4,0,116,3,0,106,4, +    0,124,4,0,106,5,0,124,3,0,100,2,0,25,131,1, +    0,116,6,0,131,2,0,1,110,0,0,124,2,0,83,40, +    4,0,0,0,117,86,0,0,0,84,114,121,32,116,111,32, +    102,105,110,100,32,97,32,108,111,97,100,101,114,32,102,111, +    114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, +    109,111,100,117,108,101,32,98,121,32,100,101,108,101,103,97, +    116,105,110,103,32,116,111,10,32,32,32,32,115,101,108,102, +    46,102,105,110,100,95,108,111,97,100,101,114,40,41,46,117, +    44,0,0,0,78,111,116,32,105,109,112,111,114,116,105,110, +    103,32,100,105,114,101,99,116,111,114,121,32,123,125,58,32, +    109,105,115,115,105,110,103,32,95,95,105,110,105,116,95,95, +    105,0,0,0,0,78,40,7,0,0,0,117,11,0,0,0, +    102,105,110,100,95,108,111,97,100,101,114,117,4,0,0,0, +    78,111,110,101,117,3,0,0,0,108,101,110,117,9,0,0, +    0,95,119,97,114,110,105,110,103,115,117,4,0,0,0,119, +    97,114,110,117,6,0,0,0,102,111,114,109,97,116,117,13, +    0,0,0,73,109,112,111,114,116,87,97,114,110,105,110,103, +    40,5,0,0,0,117,4,0,0,0,115,101,108,102,117,8, +    0,0,0,102,117,108,108,110,97,109,101,117,6,0,0,0, +    108,111,97,100,101,114,117,8,0,0,0,112,111,114,116,105, +    111,110,115,117,3,0,0,0,109,115,103,40,0,0,0,0, +    40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, +    110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, +    116,115,116,114,97,112,62,117,17,0,0,0,95,102,105,110, +    100,95,109,111,100,117,108,101,95,115,104,105,109,105,2,0, +    0,115,10,0,0,0,0,6,21,1,24,1,6,1,32,1, +    117,17,0,0,0,95,102,105,110,100,95,109,111,100,117,108, +    101,95,115,104,105,109,99,1,0,0,0,0,0,0,0,1, +    0,0,0,6,0,0,0,66,0,0,0,115,173,0,0,0, +    124,0,0,69,101,0,0,90,1,0,100,0,0,90,2,0, +    100,1,0,90,3,0,101,4,0,100,2,0,100,3,0,132, +    0,0,131,1,0,90,5,0,101,4,0,100,14,0,100,4, +    0,100,5,0,132,1,0,131,1,0,90,7,0,101,4,0, +    101,8,0,101,9,0,101,10,0,100,6,0,100,7,0,132, +    0,0,131,1,0,131,1,0,131,1,0,131,1,0,90,11, +    0,101,4,0,101,10,0,100,8,0,100,9,0,132,0,0, +    131,1,0,131,1,0,90,12,0,101,4,0,101,10,0,100, +    10,0,100,11,0,132,0,0,131,1,0,131,1,0,90,13, +    0,101,4,0,101,10,0,100,12,0,100,13,0,132,0,0, +    131,1,0,131,1,0,90,14,0,100,14,0,83,40,15,0, +    0,0,117,15,0,0,0,66,117,105,108,116,105,110,73,109, +    112,111,114,116,101,114,117,144,0,0,0,77,101,116,97,32, +    112,97,116,104,32,105,109,112,111,114,116,32,102,111,114,32, +    98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, +    46,10,10,32,32,32,32,65,108,108,32,109,101,116,104,111, +    100,115,32,97,114,101,32,101,105,116,104,101,114,32,99,108, +    97,115,115,32,111,114,32,115,116,97,116,105,99,32,109,101, +    116,104,111,100,115,32,116,111,32,97,118,111,105,100,32,116, +    104,101,32,110,101,101,100,32,116,111,10,32,32,32,32,105, +    110,115,116,97,110,116,105,97,116,101,32,116,104,101,32,99, +    108,97,115,115,46,10,10,32,32,32,32,99,2,0,0,0, +    0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, +    115,16,0,0,0,100,1,0,106,0,0,124,1,0,106,1, +    0,131,1,0,83,40,2,0,0,0,78,117,24,0,0,0, +    60,109,111,100,117,108,101,32,39,123,125,39,32,40,98,117, +    105,108,116,45,105,110,41,62,40,2,0,0,0,117,6,0, +    0,0,102,111,114,109,97,116,117,8,0,0,0,95,95,110, +    97,109,101,95,95,40,2,0,0,0,117,3,0,0,0,99, +    108,115,117,6,0,0,0,109,111,100,117,108,101,40,0,0, +    0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, +    122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, +    111,111,116,115,116,114,97,112,62,117,11,0,0,0,109,111, +    100,117,108,101,95,114,101,112,114,131,2,0,0,115,2,0, +    0,0,0,2,117,27,0,0,0,66,117,105,108,116,105,110, +    73,109,112,111,114,116,101,114,46,109,111,100,117,108,101,95, +    114,101,112,114,99,3,0,0,0,0,0,0,0,3,0,0, +    0,2,0,0,0,67,0,0,0,115,39,0,0,0,124,2, +    0,100,1,0,107,9,0,114,16,0,100,1,0,83,116,1, +    0,106,2,0,124,1,0,131,1,0,114,35,0,124,0,0, +    83,100,1,0,83,40,2,0,0,0,117,113,0,0,0,70, +    105,110,100,32,116,104,101,32,98,117,105,108,116,45,105,110, +    32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, +    32,32,73,102,32,39,112,97,116,104,39,32,105,115,32,101, +    118,101,114,32,115,112,101,99,105,102,105,101,100,32,116,104, +    101,110,32,116,104,101,32,115,101,97,114,99,104,32,105,115, +    32,99,111,110,115,105,100,101,114,101,100,32,97,32,102,97, +    105,108,117,114,101,46,10,10,32,32,32,32,32,32,32,32, +    78,40,3,0,0,0,117,4,0,0,0,78,111,110,101,117, +    4,0,0,0,95,105,109,112,117,10,0,0,0,105,115,95, +    98,117,105,108,116,105,110,40,3,0,0,0,117,3,0,0, +    0,99,108,115,117,8,0,0,0,102,117,108,108,110,97,109, +    101,117,4,0,0,0,112,97,116,104,40,0,0,0,0,40, +    0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, +    32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, +    115,116,114,97,112,62,117,11,0,0,0,102,105,110,100,95, +    109,111,100,117,108,101,135,2,0,0,115,6,0,0,0,0, +    7,12,1,4,1,117,27,0,0,0,66,117,105,108,116,105, +    110,73,109,112,111,114,116,101,114,46,102,105,110,100,95,109, +    111,100,117,108,101,99,2,0,0,0,0,0,0,0,3,0, +    0,0,9,0,0,0,67,0,0,0,115,88,0,0,0,124, +    1,0,116,0,0,106,1,0,107,6,0,125,2,0,121,20, +    0,116,2,0,116,3,0,106,4,0,124,1,0,131,2,0, +    83,87,110,46,0,1,1,1,124,2,0,12,114,76,0,124, +    1,0,116,0,0,106,1,0,107,6,0,114,76,0,116,0, +    0,106,1,0,124,1,0,61,110,0,0,130,0,0,89,110, +    1,0,88,100,1,0,83,40,2,0,0,0,117,23,0,0, +    0,76,111,97,100,32,97,32,98,117,105,108,116,45,105,110, +    32,109,111,100,117,108,101,46,78,40,5,0,0,0,117,3, +    0,0,0,115,121,115,117,7,0,0,0,109,111,100,117,108, +    101,115,117,25,0,0,0,95,99,97,108,108,95,119,105,116, +    104,95,102,114,97,109,101,115,95,114,101,109,111,118,101,100, +    117,4,0,0,0,95,105,109,112,117,12,0,0,0,105,110, +    105,116,95,98,117,105,108,116,105,110,40,3,0,0,0,117, +    3,0,0,0,99,108,115,117,8,0,0,0,102,117,108,108, +    110,97,109,101,117,9,0,0,0,105,115,95,114,101,108,111, +    97,100,40,0,0,0,0,40,0,0,0,0,117,29,0,0, +    0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, +    105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11, +    0,0,0,108,111,97,100,95,109,111,100,117,108,101,146,2, +    0,0,115,14,0,0,0,0,6,15,1,3,1,20,1,3, +    1,22,1,13,1,117,27,0,0,0,66,117,105,108,116,105, +    110,73,109,112,111,114,116,101,114,46,108,111,97,100,95,109, +    111,100,117,108,101,99,2,0,0,0,0,0,0,0,2,0, +    0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, +    1,0,83,40,2,0,0,0,117,57,0,0,0,82,101,116, +    117,114,110,32,78,111,110,101,32,97,115,32,98,117,105,108, +    116,45,105,110,32,109,111,100,117,108,101,115,32,100,111,32, +    110,111,116,32,104,97,118,101,32,99,111,100,101,32,111,98, +    106,101,99,116,115,46,78,40,1,0,0,0,117,4,0,0, +    0,78,111,110,101,40,2,0,0,0,117,3,0,0,0,99, +    108,115,117,8,0,0,0,102,117,108,108,110,97,109,101,40, +    0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, +    114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, +    95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,0, +    103,101,116,95,99,111,100,101,160,2,0,0,115,2,0,0, +    0,0,4,117,24,0,0,0,66,117,105,108,116,105,110,73, +    109,112,111,114,116,101,114,46,103,101,116,95,99,111,100,101, +    99,2,0,0,0,0,0,0,0,2,0,0,0,1,0,0, +    0,67,0,0,0,115,4,0,0,0,100,1,0,83,40,2, +    0,0,0,117,56,0,0,0,82,101,116,117,114,110,32,78, +    111,110,101,32,97,115,32,98,117,105,108,116,45,105,110,32, +    109,111,100,117,108,101,115,32,100,111,32,110,111,116,32,104, +    97,118,101,32,115,111,117,114,99,101,32,99,111,100,101,46, +    78,40,1,0,0,0,117,4,0,0,0,78,111,110,101,40, +    2,0,0,0,117,3,0,0,0,99,108,115,117,8,0,0, +    0,102,117,108,108,110,97,109,101,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,10,0,0,0,103,101,116,95,115,111, +    117,114,99,101,166,2,0,0,115,2,0,0,0,0,4,117, +    26,0,0,0,66,117,105,108,116,105,110,73,109,112,111,114, +    116,101,114,46,103,101,116,95,115,111,117,114,99,101,99,2, +    0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, +    0,0,0,115,4,0,0,0,100,1,0,83,40,2,0,0, +    0,117,52,0,0,0,82,101,116,117,114,110,32,70,97,108, +    115,101,32,97,115,32,98,117,105,108,116,45,105,110,32,109, +    111,100,117,108,101,115,32,97,114,101,32,110,101,118,101,114, +    32,112,97,99,107,97,103,101,115,46,70,40,1,0,0,0, +    117,5,0,0,0,70,97,108,115,101,40,2,0,0,0,117, +    3,0,0,0,99,108,115,117,8,0,0,0,102,117,108,108, +    110,97,109,101,40,0,0,0,0,40,0,0,0,0,117,29, +    0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, +    116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, +    117,10,0,0,0,105,115,95,112,97,99,107,97,103,101,172, +    2,0,0,115,2,0,0,0,0,4,117,26,0,0,0,66, +    117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,105, +    115,95,112,97,99,107,97,103,101,78,40,15,0,0,0,117, +    8,0,0,0,95,95,110,97,109,101,95,95,117,10,0,0, +    0,95,95,109,111,100,117,108,101,95,95,117,12,0,0,0, +    95,95,113,117,97,108,110,97,109,101,95,95,117,7,0,0, +    0,95,95,100,111,99,95,95,117,11,0,0,0,99,108,97, +    115,115,109,101,116,104,111,100,117,11,0,0,0,109,111,100, +    117,108,101,95,114,101,112,114,117,4,0,0,0,78,111,110, +    101,117,11,0,0,0,102,105,110,100,95,109,111,100,117,108, +    101,117,11,0,0,0,115,101,116,95,112,97,99,107,97,103, +    101,117,10,0,0,0,115,101,116,95,108,111,97,100,101,114, +    117,17,0,0,0,95,114,101,113,117,105,114,101,115,95,98, +    117,105,108,116,105,110,117,11,0,0,0,108,111,97,100,95, +    109,111,100,117,108,101,117,8,0,0,0,103,101,116,95,99, +    111,100,101,117,10,0,0,0,103,101,116,95,115,111,117,114, +    99,101,117,10,0,0,0,105,115,95,112,97,99,107,97,103, +    101,40,1,0,0,0,117,10,0,0,0,95,95,108,111,99, +    97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,117, +    29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, +    114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, +    62,117,15,0,0,0,66,117,105,108,116,105,110,73,109,112, +    111,114,116,101,114,122,2,0,0,115,28,0,0,0,16,7, +    6,2,18,4,3,1,18,10,3,1,3,1,3,1,27,11, +    3,1,21,5,3,1,21,5,3,1,117,15,0,0,0,66, +    117,105,108,116,105,110,73,109,112,111,114,116,101,114,99,1, +    0,0,0,0,0,0,0,1,0,0,0,6,0,0,0,66, +    0,0,0,115,173,0,0,0,124,0,0,69,101,0,0,90, +    1,0,100,0,0,90,2,0,100,1,0,90,3,0,101,4, +    0,100,2,0,100,3,0,132,0,0,131,1,0,90,5,0, +    101,4,0,100,14,0,100,4,0,100,5,0,132,1,0,131, +    1,0,90,7,0,101,4,0,101,8,0,101,9,0,101,10, +    0,100,6,0,100,7,0,132,0,0,131,1,0,131,1,0, +    131,1,0,131,1,0,90,11,0,101,4,0,101,10,0,100, +    8,0,100,9,0,132,0,0,131,1,0,131,1,0,90,12, +    0,101,4,0,101,10,0,100,10,0,100,11,0,132,0,0, +    131,1,0,131,1,0,90,13,0,101,4,0,101,10,0,100, +    12,0,100,13,0,132,0,0,131,1,0,131,1,0,90,14, +    0,100,14,0,83,40,15,0,0,0,117,14,0,0,0,70, +    114,111,122,101,110,73,109,112,111,114,116,101,114,117,142,0, +    0,0,77,101,116,97,32,112,97,116,104,32,105,109,112,111, +    114,116,32,102,111,114,32,102,114,111,122,101,110,32,109,111, +    100,117,108,101,115,46,10,10,32,32,32,32,65,108,108,32, +    109,101,116,104,111,100,115,32,97,114,101,32,101,105,116,104, +    101,114,32,99,108,97,115,115,32,111,114,32,115,116,97,116, +    105,99,32,109,101,116,104,111,100,115,32,116,111,32,97,118, +    111,105,100,32,116,104,101,32,110,101,101,100,32,116,111,10, +    32,32,32,32,105,110,115,116,97,110,116,105,97,116,101,32, +    116,104,101,32,99,108,97,115,115,46,10,10,32,32,32,32, +    99,2,0,0,0,0,0,0,0,2,0,0,0,2,0,0, +    0,67,0,0,0,115,16,0,0,0,100,1,0,106,0,0, +    124,1,0,106,1,0,131,1,0,83,40,2,0,0,0,78, +    117,22,0,0,0,60,109,111,100,117,108,101,32,39,123,125, +    39,32,40,102,114,111,122,101,110,41,62,40,2,0,0,0, +    117,6,0,0,0,102,111,114,109,97,116,117,8,0,0,0, +    95,95,110,97,109,101,95,95,40,2,0,0,0,117,3,0, +    0,0,99,108,115,117,1,0,0,0,109,40,0,0,0,0, +    40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, +    110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, +    116,115,116,114,97,112,62,117,11,0,0,0,109,111,100,117, +    108,101,95,114,101,112,114,188,2,0,0,115,2,0,0,0, +    0,2,117,26,0,0,0,70,114,111,122,101,110,73,109,112, +    111,114,116,101,114,46,109,111,100,117,108,101,95,114,101,112, +    114,99,3,0,0,0,0,0,0,0,3,0,0,0,2,0, +    0,0,67,0,0,0,115,23,0,0,0,116,0,0,106,1, +    0,124,1,0,131,1,0,114,19,0,124,0,0,83,100,1, +    0,83,40,2,0,0,0,117,21,0,0,0,70,105,110,100, +    32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101, +    46,78,40,3,0,0,0,117,4,0,0,0,95,105,109,112, +    117,9,0,0,0,105,115,95,102,114,111,122,101,110,117,4, +    0,0,0,78,111,110,101,40,3,0,0,0,117,3,0,0, +    0,99,108,115,117,8,0,0,0,102,117,108,108,110,97,109, +    101,117,4,0,0,0,112,97,116,104,40,0,0,0,0,40, +    0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, +    32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, +    115,116,114,97,112,62,117,11,0,0,0,102,105,110,100,95, +    109,111,100,117,108,101,192,2,0,0,115,2,0,0,0,0, +    3,117,26,0,0,0,70,114,111,122,101,110,73,109,112,111, +    114,116,101,114,46,102,105,110,100,95,109,111,100,117,108,101, +    99,2,0,0,0,0,0,0,0,4,0,0,0,9,0,0, +    0,67,0,0,0,115,100,0,0,0,124,1,0,116,0,0, +    106,1,0,107,6,0,125,2,0,121,32,0,116,2,0,116, +    3,0,106,4,0,124,1,0,131,2,0,125,3,0,124,3, +    0,96,5,0,124,3,0,83,87,110,46,0,1,1,1,124, +    2,0,12,114,88,0,124,1,0,116,0,0,106,1,0,107, +    6,0,114,88,0,116,0,0,106,1,0,124,1,0,61,110, +    0,0,130,0,0,89,110,1,0,88,100,1,0,83,40,2, +    0,0,0,117,21,0,0,0,76,111,97,100,32,97,32,102, +    114,111,122,101,110,32,109,111,100,117,108,101,46,78,40,6, +    0,0,0,117,3,0,0,0,115,121,115,117,7,0,0,0, +    109,111,100,117,108,101,115,117,25,0,0,0,95,99,97,108, +    108,95,119,105,116,104,95,102,114,97,109,101,115,95,114,101, +    109,111,118,101,100,117,4,0,0,0,95,105,109,112,117,11, +    0,0,0,105,110,105,116,95,102,114,111,122,101,110,117,8, +    0,0,0,95,95,102,105,108,101,95,95,40,4,0,0,0, +    117,3,0,0,0,99,108,115,117,8,0,0,0,102,117,108, +    108,110,97,109,101,117,9,0,0,0,105,115,95,114,101,108, +    111,97,100,117,1,0,0,0,109,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,11,0,0,0,108,111,97,100,95,109, +    111,100,117,108,101,197,2,0,0,115,18,0,0,0,0,6, +    15,1,3,1,18,2,6,1,8,1,3,1,22,1,13,1, +    117,26,0,0,0,70,114,111,122,101,110,73,109,112,111,114, +    116,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99, +    2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, +    67,0,0,0,115,13,0,0,0,116,0,0,106,1,0,124, +    1,0,131,1,0,83,40,1,0,0,0,117,45,0,0,0, +    82,101,116,117,114,110,32,116,104,101,32,99,111,100,101,32, +    111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,102, +    114,111,122,101,110,32,109,111,100,117,108,101,46,40,2,0, +    0,0,117,4,0,0,0,95,105,109,112,117,17,0,0,0, +    103,101,116,95,102,114,111,122,101,110,95,111,98,106,101,99, +    116,40,2,0,0,0,117,3,0,0,0,99,108,115,117,8, +    0,0,0,102,117,108,108,110,97,109,101,40,0,0,0,0, +    40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, +    110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, +    116,115,116,114,97,112,62,117,8,0,0,0,103,101,116,95, +    99,111,100,101,214,2,0,0,115,2,0,0,0,0,4,117, +    23,0,0,0,70,114,111,122,101,110,73,109,112,111,114,116, +    101,114,46,103,101,116,95,99,111,100,101,99,2,0,0,0, +    0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, +    115,4,0,0,0,100,1,0,83,40,2,0,0,0,117,54, +    0,0,0,82,101,116,117,114,110,32,78,111,110,101,32,97, +    115,32,102,114,111,122,101,110,32,109,111,100,117,108,101,115, +    32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, +    114,99,101,32,99,111,100,101,46,78,40,1,0,0,0,117, +    4,0,0,0,78,111,110,101,40,2,0,0,0,117,3,0, +    0,0,99,108,115,117,8,0,0,0,102,117,108,108,110,97, +    109,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0, +    0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, +    105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,10, +    0,0,0,103,101,116,95,115,111,117,114,99,101,220,2,0, +    0,115,2,0,0,0,0,4,117,25,0,0,0,70,114,111, +    122,101,110,73,109,112,111,114,116,101,114,46,103,101,116,95, +    115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,2, +    0,0,0,2,0,0,0,67,0,0,0,115,13,0,0,0, +    116,0,0,106,1,0,124,1,0,131,1,0,83,40,1,0, +    0,0,117,46,0,0,0,82,101,116,117,114,110,32,84,114, +    117,101,32,105,102,32,116,104,101,32,102,114,111,122,101,110, +    32,109,111,100,117,108,101,32,105,115,32,97,32,112,97,99, +    107,97,103,101,46,40,2,0,0,0,117,4,0,0,0,95, +    105,109,112,117,17,0,0,0,105,115,95,102,114,111,122,101, +    110,95,112,97,99,107,97,103,101,40,2,0,0,0,117,3, +    0,0,0,99,108,115,117,8,0,0,0,102,117,108,108,110, +    97,109,101,40,0,0,0,0,40,0,0,0,0,117,29,0, +    0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, +    108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, +    10,0,0,0,105,115,95,112,97,99,107,97,103,101,226,2, +    0,0,115,2,0,0,0,0,4,117,25,0,0,0,70,114, +    111,122,101,110,73,109,112,111,114,116,101,114,46,105,115,95, +    112,97,99,107,97,103,101,78,40,15,0,0,0,117,8,0, +    0,0,95,95,110,97,109,101,95,95,117,10,0,0,0,95, +    95,109,111,100,117,108,101,95,95,117,12,0,0,0,95,95, +    113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,95, +    95,100,111,99,95,95,117,11,0,0,0,99,108,97,115,115, +    109,101,116,104,111,100,117,11,0,0,0,109,111,100,117,108, +    101,95,114,101,112,114,117,4,0,0,0,78,111,110,101,117, +    11,0,0,0,102,105,110,100,95,109,111,100,117,108,101,117, +    11,0,0,0,115,101,116,95,112,97,99,107,97,103,101,117, +    10,0,0,0,115,101,116,95,108,111,97,100,101,114,117,16, +    0,0,0,95,114,101,113,117,105,114,101,115,95,102,114,111, +    122,101,110,117,11,0,0,0,108,111,97,100,95,109,111,100, +    117,108,101,117,8,0,0,0,103,101,116,95,99,111,100,101, +    117,10,0,0,0,103,101,116,95,115,111,117,114,99,101,117, +    10,0,0,0,105,115,95,112,97,99,107,97,103,101,40,1, +    0,0,0,117,10,0,0,0,95,95,108,111,99,97,108,115, +    95,95,40,0,0,0,0,40,0,0,0,0,117,29,0,0, +    0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, +    105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,14, +    0,0,0,70,114,111,122,101,110,73,109,112,111,114,116,101, +    114,179,2,0,0,115,28,0,0,0,16,7,6,2,18,4, +    3,1,18,4,3,1,3,1,3,1,27,14,3,1,21,5, +    3,1,21,5,3,1,117,14,0,0,0,70,114,111,122,101, +    110,73,109,112,111,114,116,101,114,99,1,0,0,0,0,0, +    0,0,1,0,0,0,4,0,0,0,66,0,0,0,115,101, +    0,0,0,124,0,0,69,101,0,0,90,1,0,100,0,0, +    90,2,0,100,1,0,90,3,0,100,2,0,90,4,0,100, +    3,0,90,5,0,100,11,0,90,7,0,101,8,0,100,4, +    0,100,5,0,132,0,0,131,1,0,90,9,0,101,8,0, +    100,6,0,100,7,0,132,0,0,131,1,0,90,10,0,101, +    8,0,100,10,0,100,8,0,100,9,0,132,1,0,131,1, +    0,90,12,0,100,10,0,83,40,12,0,0,0,117,21,0, +    0,0,87,105,110,100,111,119,115,82,101,103,105,115,116,114, +    121,70,105,110,100,101,114,117,67,0,0,0,77,101,116,97, +    32,112,97,116,104,32,102,105,110,100,101,114,32,102,111,114, +    32,109,111,100,117,108,101,115,32,100,101,99,108,97,114,101, +    100,32,105,110,32,116,104,101,32,87,105,110,100,111,119,115, +    32,114,101,103,105,115,116,114,121,46,10,32,32,32,32,117, +    59,0,0,0,83,111,102,116,119,97,114,101,92,80,121,116, +    104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123, +    115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100, +    117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,117, +    65,0,0,0,83,111,102,116,119,97,114,101,92,80,121,116, +    104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123, +    115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100, +    117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,92, +    68,101,98,117,103,99,2,0,0,0,0,0,0,0,2,0, +    0,0,11,0,0,0,67,0,0,0,115,67,0,0,0,121, +    23,0,116,0,0,106,1,0,116,0,0,106,2,0,124,1, +    0,131,2,0,83,87,110,37,0,4,116,3,0,107,10,0, +    114,62,0,1,1,1,116,0,0,106,1,0,116,0,0,106, +    4,0,124,1,0,131,2,0,83,89,110,1,0,88,100,0, +    0,83,40,1,0,0,0,78,40,5,0,0,0,117,7,0, +    0,0,95,119,105,110,114,101,103,117,7,0,0,0,79,112, +    101,110,75,101,121,117,17,0,0,0,72,75,69,89,95,67, +    85,82,82,69,78,84,95,85,83,69,82,117,12,0,0,0, +    87,105,110,100,111,119,115,69,114,114,111,114,117,18,0,0, +    0,72,75,69,89,95,76,79,67,65,76,95,77,65,67,72, +    73,78,69,40,2,0,0,0,117,3,0,0,0,99,108,115, +    117,3,0,0,0,107,101,121,40,0,0,0,0,40,0,0, +    0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, +    109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, +    114,97,112,62,117,14,0,0,0,95,111,112,101,110,95,114, +    101,103,105,115,116,114,121,246,2,0,0,115,8,0,0,0, +    0,2,3,1,23,1,13,1,117,36,0,0,0,87,105,110, +    100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, +    101,114,46,95,111,112,101,110,95,114,101,103,105,115,116,114, +    121,99,2,0,0,0,0,0,0,0,6,0,0,0,16,0, +    0,0,67,0,0,0,115,142,0,0,0,124,0,0,106,0, +    0,114,21,0,124,0,0,106,1,0,125,2,0,110,9,0, +    124,0,0,106,2,0,125,2,0,124,2,0,106,3,0,100, +    1,0,124,1,0,100,2,0,116,4,0,106,5,0,100,0, +    0,100,3,0,133,2,0,25,131,0,2,125,3,0,121,46, +    0,124,0,0,106,6,0,124,3,0,131,1,0,143,25,0, +    125,4,0,116,7,0,106,8,0,124,4,0,100,4,0,131, +    2,0,125,5,0,87,100,0,0,81,88,87,110,22,0,4, +    116,9,0,107,10,0,114,137,0,1,1,1,100,0,0,83, +    89,110,1,0,88,124,5,0,83,40,5,0,0,0,78,117, +    8,0,0,0,102,117,108,108,110,97,109,101,117,11,0,0, +    0,115,121,115,95,118,101,114,115,105,111,110,105,3,0,0, +    0,117,0,0,0,0,40,11,0,0,0,117,11,0,0,0, +    68,69,66,85,71,95,66,85,73,76,68,117,18,0,0,0, +    82,69,71,73,83,84,82,89,95,75,69,89,95,68,69,66, +    85,71,117,12,0,0,0,82,69,71,73,83,84,82,89,95, +    75,69,89,117,6,0,0,0,102,111,114,109,97,116,117,3, +    0,0,0,115,121,115,117,7,0,0,0,118,101,114,115,105, +    111,110,117,14,0,0,0,95,111,112,101,110,95,114,101,103, +    105,115,116,114,121,117,7,0,0,0,95,119,105,110,114,101, +    103,117,10,0,0,0,81,117,101,114,121,86,97,108,117,101, +    117,12,0,0,0,87,105,110,100,111,119,115,69,114,114,111, +    114,117,4,0,0,0,78,111,110,101,40,6,0,0,0,117, +    3,0,0,0,99,108,115,117,8,0,0,0,102,117,108,108, +    110,97,109,101,117,12,0,0,0,114,101,103,105,115,116,114, +    121,95,107,101,121,117,3,0,0,0,107,101,121,117,4,0, +    0,0,104,107,101,121,117,8,0,0,0,102,105,108,101,112, +    97,116,104,40,0,0,0,0,40,0,0,0,0,117,29,0, +    0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, +    108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, +    16,0,0,0,95,115,101,97,114,99,104,95,114,101,103,105, +    115,116,114,121,253,2,0,0,115,22,0,0,0,0,2,9, +    1,12,2,9,1,15,1,22,1,3,1,18,1,28,1,13, +    1,9,1,117,38,0,0,0,87,105,110,100,111,119,115,82, +    101,103,105,115,116,114,121,70,105,110,100,101,114,46,95,115, +    101,97,114,99,104,95,114,101,103,105,115,116,114,121,99,3, +    0,0,0,0,0,0,0,7,0,0,0,12,0,0,0,67, +    0,0,0,115,140,0,0,0,124,0,0,106,0,0,124,1, +    0,131,1,0,125,3,0,124,3,0,100,1,0,107,8,0, +    114,31,0,100,1,0,83,121,17,0,116,2,0,106,3,0, +    124,3,0,131,1,0,1,87,110,22,0,4,116,4,0,107, +    10,0,114,72,0,1,1,1,100,1,0,83,89,110,1,0, +    88,120,60,0,116,5,0,131,0,0,68,93,49,0,92,3, +    0,125,4,0,125,5,0,125,6,0,124,3,0,106,6,0, +    116,7,0,124,5,0,131,1,0,131,1,0,114,83,0,124, +    4,0,124,1,0,124,3,0,131,2,0,83,113,83,0,87, +    100,1,0,83,40,2,0,0,0,117,34,0,0,0,70,105, +    110,100,32,109,111,100,117,108,101,32,110,97,109,101,100,32, +    105,110,32,116,104,101,32,114,101,103,105,115,116,114,121,46, +    78,40,8,0,0,0,117,16,0,0,0,95,115,101,97,114, +    99,104,95,114,101,103,105,115,116,114,121,117,4,0,0,0, +    78,111,110,101,117,3,0,0,0,95,111,115,117,4,0,0, +    0,115,116,97,116,117,7,0,0,0,79,83,69,114,114,111, +    114,117,27,0,0,0,95,103,101,116,95,115,117,112,112,111, +    114,116,101,100,95,102,105,108,101,95,108,111,97,100,101,114, +    115,117,8,0,0,0,101,110,100,115,119,105,116,104,117,5, +    0,0,0,116,117,112,108,101,40,7,0,0,0,117,3,0, +    0,0,99,108,115,117,8,0,0,0,102,117,108,108,110,97, +    109,101,117,4,0,0,0,112,97,116,104,117,8,0,0,0, +    102,105,108,101,112,97,116,104,117,6,0,0,0,108,111,97, +    100,101,114,117,8,0,0,0,115,117,102,102,105,120,101,115, +    117,1,0,0,0,95,40,0,0,0,0,40,0,0,0,0, +    117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, +    111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, +    112,62,117,11,0,0,0,102,105,110,100,95,109,111,100,117, +    108,101,12,3,0,0,115,20,0,0,0,0,3,15,1,12, +    1,4,1,3,1,17,1,13,1,9,1,25,1,21,1,117, +    33,0,0,0,87,105,110,100,111,119,115,82,101,103,105,115, +    116,114,121,70,105,110,100,101,114,46,102,105,110,100,95,109, +    111,100,117,108,101,78,70,40,13,0,0,0,117,8,0,0, +    0,95,95,110,97,109,101,95,95,117,10,0,0,0,95,95, +    109,111,100,117,108,101,95,95,117,12,0,0,0,95,95,113, +    117,97,108,110,97,109,101,95,95,117,7,0,0,0,95,95, +    100,111,99,95,95,117,12,0,0,0,82,69,71,73,83,84, +    82,89,95,75,69,89,117,18,0,0,0,82,69,71,73,83, +    84,82,89,95,75,69,89,95,68,69,66,85,71,117,5,0, +    0,0,70,97,108,115,101,117,11,0,0,0,68,69,66,85, +    71,95,66,85,73,76,68,117,11,0,0,0,99,108,97,115, +    115,109,101,116,104,111,100,117,14,0,0,0,95,111,112,101, +    110,95,114,101,103,105,115,116,114,121,117,16,0,0,0,95, +    115,101,97,114,99,104,95,114,101,103,105,115,116,114,121,117, +    4,0,0,0,78,111,110,101,117,11,0,0,0,102,105,110, +    100,95,109,111,100,117,108,101,40,1,0,0,0,117,10,0, +    0,0,95,95,108,111,99,97,108,115,95,95,40,0,0,0, +    0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, +    101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, +    111,116,115,116,114,97,112,62,117,21,0,0,0,87,105,110, +    100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, +    101,114,233,2,0,0,115,16,0,0,0,16,3,6,3,6, +    3,6,2,6,2,18,7,18,15,3,1,117,21,0,0,0, +    87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, +    105,110,100,101,114,99,1,0,0,0,0,0,0,0,1,0, +    0,0,5,0,0,0,66,0,0,0,115,74,0,0,0,124, +    0,0,69,101,0,0,90,1,0,100,0,0,90,2,0,100, +    1,0,90,3,0,100,2,0,100,3,0,132,0,0,90,4, +    0,100,4,0,100,5,0,132,0,0,90,5,0,101,6,0, +    100,6,0,100,10,0,100,7,0,100,8,0,132,0,1,131, +    1,0,90,8,0,100,9,0,83,40,11,0,0,0,117,13, +    0,0,0,95,76,111,97,100,101,114,66,97,115,105,99,115, +    117,83,0,0,0,66,97,115,101,32,99,108,97,115,115,32, +    111,102,32,99,111,109,109,111,110,32,99,111,100,101,32,110, +    101,101,100,101,100,32,98,121,32,98,111,116,104,32,83,111, +    117,114,99,101,76,111,97,100,101,114,32,97,110,100,10,32, +    32,32,32,83,111,117,114,99,101,108,101,115,115,70,105,108, +    101,76,111,97,100,101,114,46,99,2,0,0,0,0,0,0, +    0,5,0,0,0,3,0,0,0,67,0,0,0,115,88,0, +    0,0,116,0,0,124,0,0,106,1,0,124,1,0,131,1, +    0,131,1,0,100,1,0,25,125,2,0,124,2,0,106,2, +    0,100,2,0,100,1,0,131,2,0,100,3,0,25,125,3, +    0,124,1,0,106,3,0,100,2,0,131,1,0,100,4,0, +    25,125,4,0,124,3,0,100,5,0,107,2,0,111,87,0, +    124,4,0,100,5,0,107,3,0,83,40,6,0,0,0,117, +    141,0,0,0,67,111,110,99,114,101,116,101,32,105,109,112, +    108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73, +    110,115,112,101,99,116,76,111,97,100,101,114,46,105,115,95, +    112,97,99,107,97,103,101,32,98,121,32,99,104,101,99,107, +    105,110,103,32,105,102,10,32,32,32,32,32,32,32,32,116, +    104,101,32,112,97,116,104,32,114,101,116,117,114,110,101,100, +    32,98,121,32,103,101,116,95,102,105,108,101,110,97,109,101, +    32,104,97,115,32,97,32,102,105,108,101,110,97,109,101,32, +    111,102,32,39,95,95,105,110,105,116,95,95,46,112,121,39, +    46,105,1,0,0,0,117,1,0,0,0,46,105,0,0,0, +    0,105,2,0,0,0,117,8,0,0,0,95,95,105,110,105, +    116,95,95,40,4,0,0,0,117,11,0,0,0,95,112,97, +    116,104,95,115,112,108,105,116,117,12,0,0,0,103,101,116, +    95,102,105,108,101,110,97,109,101,117,6,0,0,0,114,115, +    112,108,105,116,117,10,0,0,0,114,112,97,114,116,105,116, +    105,111,110,40,5,0,0,0,117,4,0,0,0,115,101,108, +    102,117,8,0,0,0,102,117,108,108,110,97,109,101,117,8, +    0,0,0,102,105,108,101,110,97,109,101,117,13,0,0,0, +    102,105,108,101,110,97,109,101,95,98,97,115,101,117,9,0, +    0,0,116,97,105,108,95,110,97,109,101,40,0,0,0,0, +    40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, +    110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, +    116,115,116,114,97,112,62,117,10,0,0,0,105,115,95,112, +    97,99,107,97,103,101,32,3,0,0,115,8,0,0,0,0, +    3,25,1,22,1,19,1,117,24,0,0,0,95,76,111,97, +    100,101,114,66,97,115,105,99,115,46,105,115,95,112,97,99, +    107,97,103,101,99,5,0,0,0,0,0,0,0,12,0,0, +    0,22,0,0,0,67,0,0,0,115,198,1,0,0,124,2, +    0,100,1,0,100,2,0,133,2,0,25,125,5,0,124,2, +    0,100,2,0,100,3,0,133,2,0,25,125,6,0,124,2, +    0,100,3,0,100,4,0,133,2,0,25,125,7,0,124,5, +    0,116,0,0,107,3,0,114,105,0,100,5,0,106,1,0, +    124,1,0,124,5,0,131,2,0,125,8,0,116,2,0,124, +    8,0,100,6,0,124,1,0,100,7,0,124,3,0,131,1, +    2,130,1,0,110,116,0,116,3,0,124,6,0,131,1,0, +    100,2,0,107,3,0,114,163,0,100,8,0,106,1,0,124, +    1,0,131,1,0,125,9,0,116,4,0,124,9,0,131,1, +    0,1,116,5,0,124,9,0,131,1,0,130,1,0,110,58, +    0,116,3,0,124,7,0,131,1,0,100,2,0,107,3,0, +    114,221,0,100,9,0,106,1,0,124,1,0,131,1,0,125, +    9,0,116,4,0,124,9,0,131,1,0,1,116,5,0,124, +    9,0,131,1,0,130,1,0,110,0,0,124,4,0,100,1, +    0,107,9,0,114,184,1,121,20,0,116,7,0,124,4,0, +    100,10,0,25,131,1,0,125,10,0,87,110,18,0,4,116, +    8,0,107,10,0,114,17,1,1,1,1,89,110,71,0,88, +    116,9,0,124,6,0,131,1,0,124,10,0,107,3,0,114, +    88,1,100,11,0,106,1,0,124,1,0,131,1,0,125,9, +    0,116,4,0,124,9,0,131,1,0,1,116,2,0,124,9, +    0,100,6,0,124,1,0,100,7,0,124,3,0,131,1,2, +    130,1,0,110,0,0,121,18,0,124,4,0,100,12,0,25, +    100,13,0,64,125,11,0,87,110,18,0,4,116,8,0,107, +    10,0,114,126,1,1,1,1,89,113,184,1,88,116,9,0, +    124,7,0,131,1,0,124,11,0,107,3,0,114,184,1,116, +    2,0,100,11,0,106,1,0,124,1,0,131,1,0,100,6, +    0,124,1,0,100,7,0,124,3,0,131,1,2,130,1,0, +    113,184,1,110,0,0,124,2,0,100,4,0,100,1,0,133, +    2,0,25,83,40,14,0,0,0,117,193,0,0,0,82,101, +    116,117,114,110,32,116,104,101,32,109,97,114,115,104,97,108, +    108,101,100,32,98,121,116,101,115,32,102,114,111,109,32,98, +    121,116,101,99,111,100,101,44,32,118,101,114,105,102,121,105, +    110,103,32,116,104,101,32,109,97,103,105,99,10,32,32,32, +    32,32,32,32,32,110,117,109,98,101,114,44,32,116,105,109, +    101,115,116,97,109,112,32,97,110,100,32,115,111,117,114,99, +    101,32,115,105,122,101,32,97,108,111,110,103,32,116,104,101, +    32,119,97,121,46,10,10,32,32,32,32,32,32,32,32,73, +    102,32,115,111,117,114,99,101,95,115,116,97,116,115,32,105, +    115,32,78,111,110,101,32,116,104,101,110,32,115,107,105,112, +    32,116,104,101,32,116,105,109,101,115,116,97,109,112,32,99, +    104,101,99,107,46,10,10,32,32,32,32,32,32,32,32,78, +    105,4,0,0,0,105,8,0,0,0,105,12,0,0,0,117, +    30,0,0,0,98,97,100,32,109,97,103,105,99,32,110,117, +    109,98,101,114,32,105,110,32,123,33,114,125,58,32,123,33, +    114,125,117,4,0,0,0,110,97,109,101,117,4,0,0,0, +    112,97,116,104,117,19,0,0,0,98,97,100,32,116,105,109, +    101,115,116,97,109,112,32,105,110,32,123,125,117,14,0,0, +    0,98,97,100,32,115,105,122,101,32,105,110,32,123,125,117, +    5,0,0,0,109,116,105,109,101,117,24,0,0,0,98,121, +    116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32, +    102,111,114,32,123,125,117,4,0,0,0,115,105,122,101,108, +    3,0,0,0,255,127,255,127,3,0,40,10,0,0,0,117, +    12,0,0,0,95,77,65,71,73,67,95,66,89,84,69,83, +    117,6,0,0,0,102,111,114,109,97,116,117,11,0,0,0, +    73,109,112,111,114,116,69,114,114,111,114,117,3,0,0,0, +    108,101,110,117,16,0,0,0,95,118,101,114,98,111,115,101, +    95,109,101,115,115,97,103,101,117,8,0,0,0,69,79,70, +    69,114,114,111,114,117,4,0,0,0,78,111,110,101,117,3, +    0,0,0,105,110,116,117,8,0,0,0,75,101,121,69,114, +    114,111,114,117,7,0,0,0,95,114,95,108,111,110,103,40, +    12,0,0,0,117,4,0,0,0,115,101,108,102,117,8,0, +    0,0,102,117,108,108,110,97,109,101,117,4,0,0,0,100, +    97,116,97,117,13,0,0,0,98,121,116,101,99,111,100,101, +    95,112,97,116,104,117,12,0,0,0,115,111,117,114,99,101, +    95,115,116,97,116,115,117,5,0,0,0,109,97,103,105,99, +    117,13,0,0,0,114,97,119,95,116,105,109,101,115,116,97, +    109,112,117,8,0,0,0,114,97,119,95,115,105,122,101,117, +    3,0,0,0,109,115,103,117,7,0,0,0,109,101,115,115, +    97,103,101,117,12,0,0,0,115,111,117,114,99,101,95,109, +    116,105,109,101,117,11,0,0,0,115,111,117,114,99,101,95, +    115,105,122,101,40,0,0,0,0,40,0,0,0,0,117,29, +    0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, +    116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, +    117,20,0,0,0,95,98,121,116,101,115,95,102,114,111,109, +    95,98,121,116,101,99,111,100,101,40,3,0,0,115,66,0, +    0,0,0,7,16,1,16,1,16,1,12,1,18,1,27,1, +    18,1,15,1,10,1,15,1,18,1,15,1,10,1,15,1, +    12,1,3,1,20,1,13,1,5,2,18,1,15,1,10,1, +    15,1,12,1,3,1,18,1,13,1,5,2,18,1,3,1, +    15,1,21,3,117,34,0,0,0,95,76,111,97,100,101,114, +    66,97,115,105,99,115,46,95,98,121,116,101,115,95,102,114, +    111,109,95,98,121,116,101,99,111,100,101,117,10,0,0,0, +    115,111,117,114,99,101,108,101,115,115,99,2,0,0,0,1, +    0,0,0,5,0,0,0,12,0,0,0,67,0,0,0,115, +    227,0,0,0,124,1,0,106,0,0,125,3,0,124,0,0, +    106,1,0,124,3,0,131,1,0,125,4,0,124,0,0,106, +    2,0,124,3,0,131,1,0,124,1,0,95,3,0,124,2, +    0,115,106,0,121,22,0,116,4,0,124,1,0,106,3,0, +    131,1,0,124,1,0,95,5,0,87,113,118,0,4,116,6, +    0,107,10,0,114,102,0,1,1,1,124,1,0,106,3,0, +    124,1,0,95,5,0,89,113,118,0,88,110,12,0,124,1, +    0,106,3,0,124,1,0,95,5,0,124,3,0,124,1,0, +    95,7,0,124,0,0,106,8,0,124,3,0,131,1,0,114, +    170,0,116,9,0,124,1,0,106,3,0,131,1,0,100,1, +    0,25,103,1,0,124,1,0,95,10,0,110,25,0,124,1, +    0,106,7,0,106,11,0,100,2,0,131,1,0,100,1,0, +    25,124,1,0,95,7,0,124,0,0,124,1,0,95,12,0, +    116,13,0,116,14,0,124,4,0,124,1,0,106,15,0,131, +    3,0,1,124,1,0,83,40,3,0,0,0,117,82,0,0, +    0,72,101,108,112,101,114,32,102,111,114,32,108,111,97,100, +    95,109,111,100,117,108,101,32,97,98,108,101,32,116,111,32, +    104,97,110,100,108,101,32,101,105,116,104,101,114,32,115,111, +    117,114,99,101,32,111,114,32,115,111,117,114,99,101,108,101, +    115,115,10,32,32,32,32,32,32,32,32,108,111,97,100,105, +    110,103,46,105,0,0,0,0,117,1,0,0,0,46,40,16, +    0,0,0,117,8,0,0,0,95,95,110,97,109,101,95,95, +    117,8,0,0,0,103,101,116,95,99,111,100,101,117,12,0, +    0,0,103,101,116,95,102,105,108,101,110,97,109,101,117,8, +    0,0,0,95,95,102,105,108,101,95,95,117,17,0,0,0, +    99,97,99,104,101,95,102,114,111,109,95,115,111,117,114,99, +    101,117,10,0,0,0,95,95,99,97,99,104,101,100,95,95, +    117,19,0,0,0,78,111,116,73,109,112,108,101,109,101,110, +    116,101,100,69,114,114,111,114,117,11,0,0,0,95,95,112, +    97,99,107,97,103,101,95,95,117,10,0,0,0,105,115,95, +    112,97,99,107,97,103,101,117,11,0,0,0,95,112,97,116, +    104,95,115,112,108,105,116,117,8,0,0,0,95,95,112,97, +    116,104,95,95,117,10,0,0,0,114,112,97,114,116,105,116, +    105,111,110,117,10,0,0,0,95,95,108,111,97,100,101,114, +    95,95,117,25,0,0,0,95,99,97,108,108,95,119,105,116, +    104,95,102,114,97,109,101,115,95,114,101,109,111,118,101,100, +    117,4,0,0,0,101,120,101,99,117,8,0,0,0,95,95, +    100,105,99,116,95,95,40,5,0,0,0,117,4,0,0,0, +    115,101,108,102,117,6,0,0,0,109,111,100,117,108,101,117, +    10,0,0,0,115,111,117,114,99,101,108,101,115,115,117,4, +    0,0,0,110,97,109,101,117,11,0,0,0,99,111,100,101, +    95,111,98,106,101,99,116,40,0,0,0,0,40,0,0,0, +    0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, +    112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, +    97,112,62,117,12,0,0,0,95,108,111,97,100,95,109,111, +    100,117,108,101,85,3,0,0,115,32,0,0,0,0,4,9, +    1,15,1,18,1,6,1,3,1,22,1,13,1,20,2,12, +    1,9,1,15,1,28,2,25,1,9,1,19,1,117,26,0, +    0,0,95,76,111,97,100,101,114,66,97,115,105,99,115,46, +    95,108,111,97,100,95,109,111,100,117,108,101,78,70,40,9, +    0,0,0,117,8,0,0,0,95,95,110,97,109,101,95,95, +    117,10,0,0,0,95,95,109,111,100,117,108,101,95,95,117, +    12,0,0,0,95,95,113,117,97,108,110,97,109,101,95,95, +    117,7,0,0,0,95,95,100,111,99,95,95,117,10,0,0, +    0,105,115,95,112,97,99,107,97,103,101,117,20,0,0,0, +    95,98,121,116,101,115,95,102,114,111,109,95,98,121,116,101, +    99,111,100,101,117,17,0,0,0,109,111,100,117,108,101,95, +    102,111,114,95,108,111,97,100,101,114,117,5,0,0,0,70, +    97,108,115,101,117,12,0,0,0,95,108,111,97,100,95,109, +    111,100,117,108,101,40,1,0,0,0,117,10,0,0,0,95, +    95,108,111,99,97,108,115,95,95,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,13,0,0,0,95,76,111,97,100,101, +    114,66,97,115,105,99,115,27,3,0,0,115,10,0,0,0, +    16,3,6,2,12,8,12,45,6,1,117,13,0,0,0,95, +    76,111,97,100,101,114,66,97,115,105,99,115,99,1,0,0, +    0,0,0,0,0,1,0,0,0,2,0,0,0,66,0,0, +    0,115,104,0,0,0,124,0,0,69,101,0,0,90,1,0, +    100,0,0,90,2,0,100,1,0,100,2,0,132,0,0,90, +    3,0,100,3,0,100,4,0,132,0,0,90,4,0,100,5, +    0,100,6,0,132,0,0,90,5,0,100,7,0,100,8,0, +    132,0,0,90,6,0,100,9,0,100,10,0,132,0,0,90, +    7,0,100,11,0,100,12,0,132,0,0,90,8,0,100,13, +    0,100,14,0,132,0,0,90,9,0,100,15,0,83,40,16, +    0,0,0,117,12,0,0,0,83,111,117,114,99,101,76,111, +    97,100,101,114,99,2,0,0,0,0,0,0,0,2,0,0, +    0,1,0,0,0,67,0,0,0,115,10,0,0,0,116,0, +    0,130,1,0,100,1,0,83,40,2,0,0,0,117,121,0, +    0,0,79,112,116,105,111,110,97,108,32,109,101,116,104,111, +    100,32,116,104,97,116,32,114,101,116,117,114,110,115,32,116, +    104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32, +    116,105,109,101,32,40,97,110,32,105,110,116,41,32,102,111, +    114,32,116,104,101,10,32,32,32,32,32,32,32,32,115,112, +    101,99,105,102,105,101,100,32,112,97,116,104,44,32,119,104, +    101,114,101,32,112,97,116,104,32,105,115,32,97,32,115,116, +    114,46,10,32,32,32,32,32,32,32,32,78,40,1,0,0, +    0,117,19,0,0,0,78,111,116,73,109,112,108,101,109,101, +    110,116,101,100,69,114,114,111,114,40,2,0,0,0,117,4, +    0,0,0,115,101,108,102,117,4,0,0,0,112,97,116,104, +    40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, +    102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, +    46,95,98,111,111,116,115,116,114,97,112,62,117,10,0,0, +    0,112,97,116,104,95,109,116,105,109,101,111,3,0,0,115, +    2,0,0,0,0,4,117,23,0,0,0,83,111,117,114,99, +    101,76,111,97,100,101,114,46,112,97,116,104,95,109,116,105, +    109,101,99,2,0,0,0,0,0,0,0,2,0,0,0,3, +    0,0,0,67,0,0,0,115,20,0,0,0,105,1,0,124, +    0,0,106,0,0,124,1,0,131,1,0,100,1,0,54,83, +    40,2,0,0,0,117,114,1,0,0,79,112,116,105,111,110, +    97,108,32,109,101,116,104,111,100,32,114,101,116,117,114,110, +    105,110,103,32,97,32,109,101,116,97,100,97,116,97,32,100, +    105,99,116,32,102,111,114,32,116,104,101,32,115,112,101,99, +    105,102,105,101,100,32,112,97,116,104,10,32,32,32,32,32, +    32,32,32,116,111,32,98,121,32,116,104,101,32,112,97,116, +    104,32,40,115,116,114,41,46,10,32,32,32,32,32,32,32, +    32,80,111,115,115,105,98,108,101,32,107,101,121,115,58,10, +    32,32,32,32,32,32,32,32,45,32,39,109,116,105,109,101, +    39,32,40,109,97,110,100,97,116,111,114,121,41,32,105,115, +    32,116,104,101,32,110,117,109,101,114,105,99,32,116,105,109, +    101,115,116,97,109,112,32,111,102,32,108,97,115,116,32,115, +    111,117,114,99,101,10,32,32,32,32,32,32,32,32,32,32, +    99,111,100,101,32,109,111,100,105,102,105,99,97,116,105,111, +    110,59,10,32,32,32,32,32,32,32,32,45,32,39,115,105, +    122,101,39,32,40,111,112,116,105,111,110,97,108,41,32,105, +    115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,121, +    116,101,115,32,111,102,32,116,104,101,32,115,111,117,114,99, +    101,32,99,111,100,101,46,10,10,32,32,32,32,32,32,32, +    32,73,109,112,108,101,109,101,110,116,105,110,103,32,116,104, +    105,115,32,109,101,116,104,111,100,32,97,108,108,111,119,115, +    32,116,104,101,32,108,111,97,100,101,114,32,116,111,32,114, +    101,97,100,32,98,121,116,101,99,111,100,101,32,102,105,108, +    101,115,46,10,32,32,32,32,32,32,32,32,117,5,0,0, +    0,109,116,105,109,101,40,1,0,0,0,117,10,0,0,0, +    112,97,116,104,95,109,116,105,109,101,40,2,0,0,0,117, +    4,0,0,0,115,101,108,102,117,4,0,0,0,112,97,116, +    104,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, +    60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, +    98,46,95,98,111,111,116,115,116,114,97,112,62,117,10,0, +    0,0,112,97,116,104,95,115,116,97,116,115,117,3,0,0, +    115,2,0,0,0,0,10,117,23,0,0,0,83,111,117,114, +    99,101,76,111,97,100,101,114,46,112,97,116,104,95,115,116, +    97,116,115,99,4,0,0,0,0,0,0,0,4,0,0,0, +    3,0,0,0,67,0,0,0,115,16,0,0,0,124,0,0, +    106,0,0,124,2,0,124,3,0,131,2,0,83,40,1,0, +    0,0,117,228,0,0,0,79,112,116,105,111,110,97,108,32, +    109,101,116,104,111,100,32,119,104,105,99,104,32,119,114,105, +    116,101,115,32,100,97,116,97,32,40,98,121,116,101,115,41, +    32,116,111,32,97,32,102,105,108,101,32,112,97,116,104,32, +    40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, +    32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, +    104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, +    115,32,102,111,114,32,116,104,101,32,119,114,105,116,105,110, +    103,32,111,102,32,98,121,116,101,99,111,100,101,32,102,105, +    108,101,115,46,10,10,32,32,32,32,32,32,32,32,84,104, +    101,32,115,111,117,114,99,101,32,112,97,116,104,32,105,115, +    32,110,101,101,100,101,100,32,105,110,32,111,114,100,101,114, +    32,116,111,32,99,111,114,114,101,99,116,108,121,32,116,114, +    97,110,115,102,101,114,32,112,101,114,109,105,115,115,105,111, +    110,115,10,32,32,32,32,32,32,32,32,40,1,0,0,0, +    117,8,0,0,0,115,101,116,95,100,97,116,97,40,4,0, +    0,0,117,4,0,0,0,115,101,108,102,117,11,0,0,0, +    115,111,117,114,99,101,95,112,97,116,104,117,10,0,0,0, +    99,97,99,104,101,95,112,97,116,104,117,4,0,0,0,100, +    97,116,97,40,0,0,0,0,40,0,0,0,0,117,29,0, +    0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, +    108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, +    15,0,0,0,95,99,97,99,104,101,95,98,121,116,101,99, +    111,100,101,129,3,0,0,115,2,0,0,0,0,8,117,28, +    0,0,0,83,111,117,114,99,101,76,111,97,100,101,114,46, +    95,99,97,99,104,101,95,98,121,116,101,99,111,100,101,99, +    3,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0, +    67,0,0,0,115,10,0,0,0,116,0,0,130,1,0,100, +    1,0,83,40,2,0,0,0,117,151,0,0,0,79,112,116, +    105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,105, +    99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,40, +    98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,101, +    32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,10, +    32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,110, +    116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,100, +    32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,32, +    119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,99, +    111,100,101,32,102,105,108,101,115,46,10,10,32,32,32,32, +    32,32,32,32,78,40,1,0,0,0,117,19,0,0,0,78, +    111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, +    111,114,40,3,0,0,0,117,4,0,0,0,115,101,108,102, +    117,4,0,0,0,112,97,116,104,117,4,0,0,0,100,97, +    116,97,40,0,0,0,0,40,0,0,0,0,117,29,0,0, +    0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, +    105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,8, +    0,0,0,115,101,116,95,100,97,116,97,139,3,0,0,115, +    2,0,0,0,0,6,117,21,0,0,0,83,111,117,114,99, +    101,76,111,97,100,101,114,46,115,101,116,95,100,97,116,97, +    99,2,0,0,0,0,0,0,0,9,0,0,0,44,0,0, +    0,67,0,0,0,115,62,1,0,0,100,1,0,100,2,0, +    108,0,0,125,2,0,124,0,0,106,1,0,124,1,0,131, +    1,0,125,3,0,121,19,0,124,0,0,106,2,0,124,3, +    0,131,1,0,125,4,0,87,110,58,0,4,116,3,0,107, +    10,0,114,106,0,1,125,5,0,1,122,26,0,116,4,0, +    100,3,0,100,4,0,124,1,0,131,1,1,124,5,0,130, +    2,0,87,89,100,2,0,100,2,0,125,5,0,126,5,0, +    88,110,1,0,88,116,5,0,106,6,0,124,4,0,131,1, +    0,106,7,0,125,6,0,121,19,0,124,2,0,106,8,0, +    124,6,0,131,1,0,125,7,0,87,110,58,0,4,116,9, +    0,107,10,0,114,204,0,1,125,5,0,1,122,26,0,116, +    4,0,100,5,0,100,4,0,124,1,0,131,1,1,124,5, +    0,130,2,0,87,89,100,2,0,100,2,0,125,5,0,126, +    5,0,88,110,1,0,88,116,5,0,106,10,0,100,2,0, +    100,7,0,131,2,0,125,8,0,121,30,0,124,8,0,106, +    13,0,124,4,0,106,13,0,124,7,0,100,1,0,25,131, +    1,0,131,1,0,83,87,110,58,0,4,116,14,0,107,10, +    0,114,57,1,1,125,5,0,1,122,26,0,116,4,0,100, +    6,0,100,4,0,124,1,0,131,1,1,124,5,0,130,2, +    0,87,89,100,2,0,100,2,0,125,5,0,126,5,0,88, +    110,1,0,88,100,2,0,83,40,8,0,0,0,117,52,0, +    0,0,67,111,110,99,114,101,116,101,32,105,109,112,108,101, +    109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,115, +    112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,115, +    111,117,114,99,101,46,105,0,0,0,0,78,117,39,0,0, +    0,115,111,117,114,99,101,32,110,111,116,32,97,118,97,105, +    108,97,98,108,101,32,116,104,114,111,117,103,104,32,103,101, +    116,95,100,97,116,97,40,41,117,4,0,0,0,110,97,109, +    101,117,25,0,0,0,70,97,105,108,101,100,32,116,111,32, +    100,101,116,101,99,116,32,101,110,99,111,100,105,110,103,117, +    28,0,0,0,70,97,105,108,101,100,32,116,111,32,100,101, +    99,111,100,101,32,115,111,117,114,99,101,32,102,105,108,101, +    84,40,15,0,0,0,117,8,0,0,0,116,111,107,101,110, +    105,122,101,117,12,0,0,0,103,101,116,95,102,105,108,101, +    110,97,109,101,117,8,0,0,0,103,101,116,95,100,97,116, +    97,117,7,0,0,0,73,79,69,114,114,111,114,117,11,0, +    0,0,73,109,112,111,114,116,69,114,114,111,114,117,3,0, +    0,0,95,105,111,117,7,0,0,0,66,121,116,101,115,73, +    79,117,8,0,0,0,114,101,97,100,108,105,110,101,117,15, +    0,0,0,100,101,116,101,99,116,95,101,110,99,111,100,105, +    110,103,117,11,0,0,0,83,121,110,116,97,120,69,114,114, +    111,114,117,25,0,0,0,73,110,99,114,101,109,101,110,116, +    97,108,78,101,119,108,105,110,101,68,101,99,111,100,101,114, +    117,4,0,0,0,78,111,110,101,117,4,0,0,0,84,114, +    117,101,117,6,0,0,0,100,101,99,111,100,101,117,18,0, +    0,0,85,110,105,99,111,100,101,68,101,99,111,100,101,69, +    114,114,111,114,40,9,0,0,0,117,4,0,0,0,115,101, +    108,102,117,8,0,0,0,102,117,108,108,110,97,109,101,117, +    8,0,0,0,116,111,107,101,110,105,122,101,117,4,0,0, +    0,112,97,116,104,117,12,0,0,0,115,111,117,114,99,101, +    95,98,121,116,101,115,117,3,0,0,0,101,120,99,117,10, +    0,0,0,114,101,97,100,115,111,117,114,99,101,117,8,0, +    0,0,101,110,99,111,100,105,110,103,117,15,0,0,0,110, +    101,119,108,105,110,101,95,100,101,99,111,100,101,114,40,0, +    0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, +    111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, +    98,111,111,116,115,116,114,97,112,62,117,10,0,0,0,103, +    101,116,95,115,111,117,114,99,101,148,3,0,0,115,38,0, +    0,0,0,2,12,1,15,1,3,1,19,1,18,1,9,1, +    31,1,18,1,3,1,19,1,18,1,9,1,31,1,18,1, +    3,1,30,1,18,1,9,1,117,23,0,0,0,83,111,117, +    114,99,101,76,111,97,100,101,114,46,103,101,116,95,115,111, +    117,114,99,101,99,2,0,0,0,0,0,0,0,12,0,0, +    0,45,0,0,0,67,0,0,0,115,52,2,0,0,124,0, +    0,106,0,0,124,1,0,131,1,0,125,2,0,100,10,0, +    125,3,0,121,16,0,116,2,0,124,2,0,131,1,0,125, +    4,0,87,110,24,0,4,116,3,0,107,10,0,114,63,0, +    1,1,1,100,10,0,125,4,0,89,110,14,1,88,121,19, +    0,124,0,0,106,4,0,124,2,0,131,1,0,125,5,0, +    87,110,18,0,4,116,3,0,107,10,0,114,103,0,1,1, +    1,89,110,230,0,88,116,5,0,124,5,0,100,1,0,25, +    131,1,0,125,3,0,121,19,0,124,0,0,106,6,0,124, +    4,0,131,1,0,125,6,0,87,110,18,0,4,116,7,0, +    107,10,0,114,159,0,1,1,1,89,110,174,0,88,121,28, +    0,124,0,0,106,8,0,124,1,0,124,6,0,124,4,0, +    124,5,0,131,4,0,125,7,0,87,110,24,0,4,116,9, +    0,116,10,0,102,2,0,107,10,0,114,214,0,1,1,1, +    89,110,119,0,88,116,11,0,100,2,0,124,4,0,124,2, +    0,131,3,0,1,116,12,0,106,13,0,124,7,0,131,1, +    0,125,8,0,116,14,0,124,8,0,116,15,0,131,2,0, +    114,38,1,116,16,0,106,17,0,124,8,0,124,2,0,131, +    2,0,1,116,11,0,100,3,0,124,4,0,131,2,0,1, +    124,8,0,83,100,4,0,125,9,0,116,9,0,124,9,0, +    106,18,0,124,4,0,131,1,0,100,5,0,124,1,0,100, +    6,0,124,4,0,131,1,2,130,1,0,124,0,0,106,6, +    0,124,2,0,131,1,0,125,10,0,116,19,0,116,20,0, +    124,10,0,124,2,0,100,7,0,100,8,0,100,11,0,131, +    4,1,125,11,0,116,11,0,100,3,0,124,2,0,131,2, +    0,1,116,22,0,106,23,0,12,114,48,2,124,4,0,100, +    10,0,107,9,0,114,48,2,124,3,0,100,10,0,107,9, +    0,114,48,2,116,24,0,116,25,0,131,1,0,125,6,0, +    124,6,0,106,26,0,116,27,0,124,3,0,131,1,0,131, +    1,0,1,124,6,0,106,26,0,116,27,0,116,28,0,124, +    10,0,131,1,0,131,1,0,131,1,0,1,124,6,0,106, +    26,0,116,12,0,106,29,0,124,11,0,131,1,0,131,1, +    0,1,121,36,0,124,0,0,106,30,0,124,2,0,124,4, +    0,124,6,0,131,3,0,1,116,11,0,100,9,0,124,4, +    0,131,2,0,1,87,113,48,2,4,116,3,0,107,10,0, +    114,44,2,1,1,1,89,113,48,2,88,110,0,0,124,11, +    0,83,40,12,0,0,0,117,190,0,0,0,67,111,110,99, +    114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116, +    105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111, +    97,100,101,114,46,103,101,116,95,99,111,100,101,46,10,10, +    32,32,32,32,32,32,32,32,82,101,97,100,105,110,103,32, +    111,102,32,98,121,116,101,99,111,100,101,32,114,101,113,117, +    105,114,101,115,32,112,97,116,104,95,115,116,97,116,115,32, +    116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101, +    100,46,32,84,111,32,119,114,105,116,101,10,32,32,32,32, +    32,32,32,32,98,121,116,101,99,111,100,101,44,32,115,101, +    116,95,100,97,116,97,32,109,117,115,116,32,97,108,115,111, +    32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,46, +    10,10,32,32,32,32,32,32,32,32,117,5,0,0,0,109, +    116,105,109,101,117,13,0,0,0,123,125,32,109,97,116,99, +    104,101,115,32,123,125,117,19,0,0,0,99,111,100,101,32, +    111,98,106,101,99,116,32,102,114,111,109,32,123,125,117,21, +    0,0,0,78,111,110,45,99,111,100,101,32,111,98,106,101, +    99,116,32,105,110,32,123,125,117,4,0,0,0,110,97,109, +    101,117,4,0,0,0,112,97,116,104,117,4,0,0,0,101, +    120,101,99,117,12,0,0,0,100,111,110,116,95,105,110,104, +    101,114,105,116,117,10,0,0,0,119,114,111,116,101,32,123, +    33,114,125,78,84,40,31,0,0,0,117,12,0,0,0,103, +    101,116,95,102,105,108,101,110,97,109,101,117,4,0,0,0, +    78,111,110,101,117,17,0,0,0,99,97,99,104,101,95,102, +    114,111,109,95,115,111,117,114,99,101,117,19,0,0,0,78, +    111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, +    111,114,117,10,0,0,0,112,97,116,104,95,115,116,97,116, +    115,117,3,0,0,0,105,110,116,117,8,0,0,0,103,101, +    116,95,100,97,116,97,117,7,0,0,0,73,79,69,114,114, +    111,114,117,20,0,0,0,95,98,121,116,101,115,95,102,114, +    111,109,95,98,121,116,101,99,111,100,101,117,11,0,0,0, +    73,109,112,111,114,116,69,114,114,111,114,117,8,0,0,0, +    69,79,70,69,114,114,111,114,117,16,0,0,0,95,118,101, +    114,98,111,115,101,95,109,101,115,115,97,103,101,117,7,0, +    0,0,109,97,114,115,104,97,108,117,5,0,0,0,108,111, +    97,100,115,117,10,0,0,0,105,115,105,110,115,116,97,110, +    99,101,117,10,0,0,0,95,99,111,100,101,95,116,121,112, +    101,117,4,0,0,0,95,105,109,112,117,16,0,0,0,95, +    102,105,120,95,99,111,95,102,105,108,101,110,97,109,101,117, +    6,0,0,0,102,111,114,109,97,116,117,25,0,0,0,95, +    99,97,108,108,95,119,105,116,104,95,102,114,97,109,101,115, +    95,114,101,109,111,118,101,100,117,7,0,0,0,99,111,109, +    112,105,108,101,117,4,0,0,0,84,114,117,101,117,3,0, +    0,0,115,121,115,117,19,0,0,0,100,111,110,116,95,119, +    114,105,116,101,95,98,121,116,101,99,111,100,101,117,9,0, +    0,0,98,121,116,101,97,114,114,97,121,117,12,0,0,0, +    95,77,65,71,73,67,95,66,89,84,69,83,117,6,0,0, +    0,101,120,116,101,110,100,117,7,0,0,0,95,119,95,108, +    111,110,103,117,3,0,0,0,108,101,110,117,5,0,0,0, +    100,117,109,112,115,117,15,0,0,0,95,99,97,99,104,101, +    95,98,121,116,101,99,111,100,101,40,12,0,0,0,117,4, +    0,0,0,115,101,108,102,117,8,0,0,0,102,117,108,108, +    110,97,109,101,117,11,0,0,0,115,111,117,114,99,101,95, +    112,97,116,104,117,12,0,0,0,115,111,117,114,99,101,95, +    109,116,105,109,101,117,13,0,0,0,98,121,116,101,99,111, +    100,101,95,112,97,116,104,117,2,0,0,0,115,116,117,4, +    0,0,0,100,97,116,97,117,10,0,0,0,98,121,116,101, +    115,95,100,97,116,97,117,5,0,0,0,102,111,117,110,100, +    117,3,0,0,0,109,115,103,117,12,0,0,0,115,111,117, +    114,99,101,95,98,121,116,101,115,117,11,0,0,0,99,111, +    100,101,95,111,98,106,101,99,116,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,8,0,0,0,103,101,116,95,99,111, +    100,101,170,3,0,0,115,98,0,0,0,0,7,15,1,6, +    1,3,1,16,1,13,1,11,2,3,1,19,1,13,1,5, +    2,16,1,3,1,19,1,13,1,5,2,3,1,12,1,3, +    1,13,1,19,1,5,2,9,1,7,1,15,1,15,1,16, +    1,6,1,7,1,4,2,6,1,18,1,15,1,15,1,6, +    1,12,1,9,1,13,1,22,1,12,1,12,1,19,1,25, +    1,22,1,3,1,19,1,17,1,13,1,8,1,117,21,0, +    0,0,83,111,117,114,99,101,76,111,97,100,101,114,46,103, +    101,116,95,99,111,100,101,99,2,0,0,0,0,0,0,0, +    2,0,0,0,2,0,0,0,67,0,0,0,115,13,0,0, +    0,124,0,0,106,0,0,124,1,0,131,1,0,83,40,1, +    0,0,0,117,0,1,0,0,67,111,110,99,114,101,116,101, +    32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, +    111,102,32,76,111,97,100,101,114,46,108,111,97,100,95,109, +    111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, +    82,101,113,117,105,114,101,115,32,69,120,101,99,117,116,105, +    111,110,76,111,97,100,101,114,46,103,101,116,95,102,105,108, +    101,110,97,109,101,32,97,110,100,32,82,101,115,111,117,114, +    99,101,76,111,97,100,101,114,46,103,101,116,95,100,97,116, +    97,32,116,111,32,98,101,10,32,32,32,32,32,32,32,32, +    105,109,112,108,101,109,101,110,116,101,100,32,116,111,32,108, +    111,97,100,32,115,111,117,114,99,101,32,99,111,100,101,46, +    32,85,115,101,32,111,102,32,98,121,116,101,99,111,100,101, +    32,105,115,32,100,105,99,116,97,116,101,100,32,98,121,32, +    119,104,101,116,104,101,114,10,32,32,32,32,32,32,32,32, +    103,101,116,95,99,111,100,101,32,117,115,101,115,47,119,114, +    105,116,101,115,32,98,121,116,101,99,111,100,101,46,10,10, +    32,32,32,32,32,32,32,32,40,1,0,0,0,117,12,0, +    0,0,95,108,111,97,100,95,109,111,100,117,108,101,40,2, +    0,0,0,117,4,0,0,0,115,101,108,102,117,8,0,0, +    0,102,117,108,108,110,97,109,101,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,11,0,0,0,108,111,97,100,95,109, +    111,100,117,108,101,232,3,0,0,115,2,0,0,0,0,8, +    117,24,0,0,0,83,111,117,114,99,101,76,111,97,100,101, +    114,46,108,111,97,100,95,109,111,100,117,108,101,78,40,10, +    0,0,0,117,8,0,0,0,95,95,110,97,109,101,95,95, +    117,10,0,0,0,95,95,109,111,100,117,108,101,95,95,117, +    12,0,0,0,95,95,113,117,97,108,110,97,109,101,95,95, +    117,10,0,0,0,112,97,116,104,95,109,116,105,109,101,117, +    10,0,0,0,112,97,116,104,95,115,116,97,116,115,117,15, +    0,0,0,95,99,97,99,104,101,95,98,121,116,101,99,111, +    100,101,117,8,0,0,0,115,101,116,95,100,97,116,97,117, +    10,0,0,0,103,101,116,95,115,111,117,114,99,101,117,8, +    0,0,0,103,101,116,95,99,111,100,101,117,11,0,0,0, +    108,111,97,100,95,109,111,100,117,108,101,40,1,0,0,0, +    117,10,0,0,0,95,95,108,111,99,97,108,115,95,95,40, +    0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, +    114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, +    95,98,111,111,116,115,116,114,97,112,62,117,12,0,0,0, +    83,111,117,114,99,101,76,111,97,100,101,114,109,3,0,0, +    115,14,0,0,0,16,2,12,6,12,12,12,10,12,9,12, +    22,12,62,117,12,0,0,0,83,111,117,114,99,101,76,111, +    97,100,101,114,99,1,0,0,0,0,0,0,0,1,0,0, +    0,4,0,0,0,2,0,0,0,115,92,0,0,0,124,0, +    0,69,101,0,0,90,1,0,100,0,0,90,2,0,100,1, +    0,90,3,0,100,2,0,100,3,0,132,0,0,90,4,0, +    101,5,0,135,0,0,102,1,0,100,4,0,100,5,0,134, +    0,0,131,1,0,90,6,0,101,5,0,100,6,0,100,7, +    0,132,0,0,131,1,0,90,7,0,100,8,0,100,9,0, +    132,0,0,90,8,0,135,0,0,83,40,10,0,0,0,117, +    10,0,0,0,70,105,108,101,76,111,97,100,101,114,117,103, +    0,0,0,66,97,115,101,32,102,105,108,101,32,108,111,97, +    100,101,114,32,99,108,97,115,115,32,119,104,105,99,104,32, +    105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,108, +    111,97,100,101,114,32,112,114,111,116,111,99,111,108,32,109, +    101,116,104,111,100,115,32,116,104,97,116,10,32,32,32,32, +    114,101,113,117,105,114,101,32,102,105,108,101,32,115,121,115, +    116,101,109,32,117,115,97,103,101,46,99,3,0,0,0,0, +    0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, +    22,0,0,0,124,1,0,124,0,0,95,0,0,124,2,0, +    124,0,0,95,1,0,100,1,0,83,40,2,0,0,0,117, +    75,0,0,0,67,97,99,104,101,32,116,104,101,32,109,111, +    100,117,108,101,32,110,97,109,101,32,97,110,100,32,116,104, +    101,32,112,97,116,104,32,116,111,32,116,104,101,32,102,105, +    108,101,32,102,111,117,110,100,32,98,121,32,116,104,101,10, +    32,32,32,32,32,32,32,32,102,105,110,100,101,114,46,78, +    40,2,0,0,0,117,4,0,0,0,110,97,109,101,117,4, +    0,0,0,112,97,116,104,40,3,0,0,0,117,4,0,0, +    0,115,101,108,102,117,8,0,0,0,102,117,108,108,110,97, +    109,101,117,4,0,0,0,112,97,116,104,40,0,0,0,0, +    40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, +    110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, +    116,115,116,114,97,112,62,117,8,0,0,0,95,95,105,110, +    105,116,95,95,248,3,0,0,115,4,0,0,0,0,3,9, +    1,117,19,0,0,0,70,105,108,101,76,111,97,100,101,114, +    46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,0, +    0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,22, +    0,0,0,116,0,0,116,1,0,124,0,0,131,2,0,106, +    2,0,124,1,0,131,1,0,83,40,1,0,0,0,117,26, +    0,0,0,76,111,97,100,32,97,32,109,111,100,117,108,101, +    32,102,114,111,109,32,97,32,102,105,108,101,46,40,3,0, +    0,0,117,5,0,0,0,115,117,112,101,114,117,10,0,0, +    0,70,105,108,101,76,111,97,100,101,114,117,11,0,0,0, +    108,111,97,100,95,109,111,100,117,108,101,40,2,0,0,0, +    117,4,0,0,0,115,101,108,102,117,8,0,0,0,102,117, +    108,108,110,97,109,101,40,1,0,0,0,117,9,0,0,0, +    95,95,99,108,97,115,115,95,95,40,0,0,0,0,117,29, +    0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, +    116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, +    117,11,0,0,0,108,111,97,100,95,109,111,100,117,108,101, +    254,3,0,0,115,2,0,0,0,0,5,117,22,0,0,0, +    70,105,108,101,76,111,97,100,101,114,46,108,111,97,100,95, +    109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,2, +    0,0,0,1,0,0,0,67,0,0,0,115,7,0,0,0, +    124,0,0,106,0,0,83,40,1,0,0,0,117,58,0,0, +    0,82,101,116,117,114,110,32,116,104,101,32,112,97,116,104, +    32,116,111,32,116,104,101,32,115,111,117,114,99,101,32,102, +    105,108,101,32,97,115,32,102,111,117,110,100,32,98,121,32, +    116,104,101,32,102,105,110,100,101,114,46,40,1,0,0,0, +    117,4,0,0,0,112,97,116,104,40,2,0,0,0,117,4, +    0,0,0,115,101,108,102,117,8,0,0,0,102,117,108,108, +    110,97,109,101,40,0,0,0,0,40,0,0,0,0,117,29, +    0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, +    116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, +    117,12,0,0,0,103,101,116,95,102,105,108,101,110,97,109, +    101,5,4,0,0,115,2,0,0,0,0,3,117,23,0,0, +    0,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, +    102,105,108,101,110,97,109,101,99,2,0,0,0,0,0,0, +    0,3,0,0,0,8,0,0,0,67,0,0,0,115,41,0, +    0,0,116,0,0,106,1,0,124,1,0,100,1,0,131,2, +    0,143,17,0,125,2,0,124,2,0,106,2,0,131,0,0, +    83,87,100,2,0,81,88,100,2,0,83,40,3,0,0,0, +    117,39,0,0,0,82,101,116,117,114,110,32,116,104,101,32, +    100,97,116,97,32,102,114,111,109,32,112,97,116,104,32,97, +    115,32,114,97,119,32,98,121,116,101,115,46,117,1,0,0, +    0,114,78,40,3,0,0,0,117,3,0,0,0,95,105,111, +    117,6,0,0,0,70,105,108,101,73,79,117,4,0,0,0, +    114,101,97,100,40,3,0,0,0,117,4,0,0,0,115,101, +    108,102,117,4,0,0,0,112,97,116,104,117,4,0,0,0, +    102,105,108,101,40,0,0,0,0,40,0,0,0,0,117,29, +    0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, +    116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, +    117,8,0,0,0,103,101,116,95,100,97,116,97,10,4,0, +    0,115,4,0,0,0,0,2,21,1,117,19,0,0,0,70, +    105,108,101,76,111,97,100,101,114,46,103,101,116,95,100,97, +    116,97,40,9,0,0,0,117,8,0,0,0,95,95,110,97, +    109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,108, +    101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,97, +    109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,95, +    117,8,0,0,0,95,95,105,110,105,116,95,95,117,11,0, +    0,0,95,99,104,101,99,107,95,110,97,109,101,117,11,0, +    0,0,108,111,97,100,95,109,111,100,117,108,101,117,12,0, +    0,0,103,101,116,95,102,105,108,101,110,97,109,101,117,8, +    0,0,0,103,101,116,95,100,97,116,97,40,1,0,0,0, +    117,10,0,0,0,95,95,108,111,99,97,108,115,95,95,40, +    0,0,0,0,40,1,0,0,0,117,9,0,0,0,95,95, +    99,108,97,115,115,95,95,117,29,0,0,0,60,102,114,111, +    122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, +    111,111,116,115,116,114,97,112,62,117,10,0,0,0,70,105, +    108,101,76,111,97,100,101,114,243,3,0,0,115,10,0,0, +    0,16,3,6,2,12,6,24,7,18,5,117,10,0,0,0, +    70,105,108,101,76,111,97,100,101,114,99,1,0,0,0,0, +    0,0,0,1,0,0,0,4,0,0,0,66,0,0,0,115, +    68,0,0,0,124,0,0,69,101,0,0,90,1,0,100,0, +    0,90,2,0,100,1,0,90,3,0,100,2,0,100,3,0, +    132,0,0,90,4,0,100,4,0,100,5,0,132,0,0,90, +    5,0,100,6,0,100,7,0,100,8,0,100,9,0,132,0, +    1,90,6,0,100,10,0,83,40,11,0,0,0,117,16,0, +    0,0,83,111,117,114,99,101,70,105,108,101,76,111,97,100, +    101,114,117,62,0,0,0,67,111,110,99,114,101,116,101,32, +    105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111, +    102,32,83,111,117,114,99,101,76,111,97,100,101,114,32,117, +    115,105,110,103,32,116,104,101,32,102,105,108,101,32,115,121, +    115,116,101,109,46,99,2,0,0,0,0,0,0,0,3,0, +    0,0,3,0,0,0,67,0,0,0,115,39,0,0,0,116, +    0,0,106,1,0,124,1,0,131,1,0,125,2,0,105,2, +    0,124,2,0,106,2,0,100,1,0,54,124,2,0,106,3, +    0,100,2,0,54,83,40,3,0,0,0,117,33,0,0,0, +    82,101,116,117,114,110,32,116,104,101,32,109,101,116,97,100, +    97,116,97,32,102,111,114,32,116,104,101,32,112,97,116,104, +    46,117,5,0,0,0,109,116,105,109,101,117,4,0,0,0, +    115,105,122,101,40,4,0,0,0,117,3,0,0,0,95,111, +    115,117,4,0,0,0,115,116,97,116,117,8,0,0,0,115, +    116,95,109,116,105,109,101,117,7,0,0,0,115,116,95,115, +    105,122,101,40,3,0,0,0,117,4,0,0,0,115,101,108, +    102,117,4,0,0,0,112,97,116,104,117,2,0,0,0,115, +    116,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, +    60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, +    98,46,95,98,111,111,116,115,116,114,97,112,62,117,10,0, +    0,0,112,97,116,104,95,115,116,97,116,115,20,4,0,0, +    115,4,0,0,0,0,2,15,1,117,27,0,0,0,83,111, +    117,114,99,101,70,105,108,101,76,111,97,100,101,114,46,112, +    97,116,104,95,115,116,97,116,115,99,4,0,0,0,0,0, +    0,0,5,0,0,0,13,0,0,0,67,0,0,0,115,71, +    0,0,0,121,22,0,116,0,0,106,1,0,124,1,0,131, +    1,0,106,2,0,125,4,0,87,110,24,0,4,116,3,0, +    107,10,0,114,48,0,1,1,1,100,1,0,125,4,0,89, +    110,1,0,88,124,0,0,106,4,0,124,2,0,124,3,0, +    100,2,0,124,4,0,131,2,1,83,40,3,0,0,0,78, +    105,182,1,0,0,117,5,0,0,0,95,109,111,100,101,40, +    5,0,0,0,117,3,0,0,0,95,111,115,117,4,0,0, +    0,115,116,97,116,117,7,0,0,0,115,116,95,109,111,100, +    101,117,7,0,0,0,79,83,69,114,114,111,114,117,8,0, +    0,0,115,101,116,95,100,97,116,97,40,5,0,0,0,117, +    4,0,0,0,115,101,108,102,117,11,0,0,0,115,111,117, +    114,99,101,95,112,97,116,104,117,13,0,0,0,98,121,116, +    101,99,111,100,101,95,112,97,116,104,117,4,0,0,0,100, +    97,116,97,117,4,0,0,0,109,111,100,101,40,0,0,0, +    0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, +    101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, +    111,116,115,116,114,97,112,62,117,15,0,0,0,95,99,97, +    99,104,101,95,98,121,116,101,99,111,100,101,25,4,0,0, +    115,10,0,0,0,0,2,3,1,22,1,13,1,11,1,117, +    32,0,0,0,83,111,117,114,99,101,70,105,108,101,76,111, +    97,100,101,114,46,95,99,97,99,104,101,95,98,121,116,101, +    99,111,100,101,117,5,0,0,0,95,109,111,100,101,105,182, +    1,0,0,99,3,0,0,0,1,0,0,0,8,0,0,0, +    13,0,0,0,67,0,0,0,115,245,0,0,0,116,0,0, +    124,1,0,131,1,0,92,2,0,125,4,0,125,5,0,103, +    0,0,125,6,0,120,54,0,124,4,0,114,80,0,116,1, +    0,124,4,0,131,1,0,12,114,80,0,116,0,0,124,4, +    0,131,1,0,92,2,0,125,4,0,125,7,0,124,6,0, +    106,2,0,124,7,0,131,1,0,1,113,27,0,87,120,97, +    0,116,3,0,124,6,0,131,1,0,68,93,83,0,125,7, +    0,116,4,0,124,4,0,124,7,0,131,2,0,125,4,0, +    121,17,0,116,5,0,106,6,0,124,4,0,131,1,0,1, +    87,113,94,0,4,116,7,0,107,10,0,114,155,0,1,1, +    1,119,94,0,89,113,94,0,4,116,8,0,107,10,0,114, +    176,0,1,1,1,100,1,0,83,89,113,94,0,88,113,94, +    0,87,121,33,0,116,9,0,124,1,0,124,2,0,124,3, +    0,131,3,0,1,116,10,0,100,2,0,124,1,0,131,2, +    0,1,87,110,24,0,4,116,8,0,116,7,0,102,2,0, +    107,10,0,114,240,0,1,1,1,89,110,1,0,88,100,1, +    0,83,40,3,0,0,0,117,27,0,0,0,87,114,105,116, +    101,32,98,121,116,101,115,32,100,97,116,97,32,116,111,32, +    97,32,102,105,108,101,46,78,117,12,0,0,0,99,114,101, +    97,116,101,100,32,123,33,114,125,40,11,0,0,0,117,11, +    0,0,0,95,112,97,116,104,95,115,112,108,105,116,117,11, +    0,0,0,95,112,97,116,104,95,105,115,100,105,114,117,6, +    0,0,0,97,112,112,101,110,100,117,8,0,0,0,114,101, +    118,101,114,115,101,100,117,10,0,0,0,95,112,97,116,104, +    95,106,111,105,110,117,3,0,0,0,95,111,115,117,5,0, +    0,0,109,107,100,105,114,117,15,0,0,0,70,105,108,101, +    69,120,105,115,116,115,69,114,114,111,114,117,15,0,0,0, +    80,101,114,109,105,115,115,105,111,110,69,114,114,111,114,117, +    13,0,0,0,95,119,114,105,116,101,95,97,116,111,109,105, +    99,117,16,0,0,0,95,118,101,114,98,111,115,101,95,109, +    101,115,115,97,103,101,40,8,0,0,0,117,4,0,0,0, +    115,101,108,102,117,4,0,0,0,112,97,116,104,117,4,0, +    0,0,100,97,116,97,117,5,0,0,0,95,109,111,100,101, +    117,6,0,0,0,112,97,114,101,110,116,117,8,0,0,0, +    102,105,108,101,110,97,109,101,117,10,0,0,0,112,97,116, +    104,95,112,97,114,116,115,117,4,0,0,0,112,97,114,116, +    40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, +    102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, +    46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0, +    0,115,101,116,95,100,97,116,97,33,4,0,0,115,36,0, +    0,0,0,2,18,1,6,2,22,1,18,1,17,2,19,1, +    15,1,3,1,17,1,13,2,7,1,13,3,13,1,3,1, +    16,1,17,1,19,3,117,25,0,0,0,83,111,117,114,99, +    101,70,105,108,101,76,111,97,100,101,114,46,115,101,116,95, +    100,97,116,97,78,40,7,0,0,0,117,8,0,0,0,95, +    95,110,97,109,101,95,95,117,10,0,0,0,95,95,109,111, +    100,117,108,101,95,95,117,12,0,0,0,95,95,113,117,97, +    108,110,97,109,101,95,95,117,7,0,0,0,95,95,100,111, +    99,95,95,117,10,0,0,0,112,97,116,104,95,115,116,97, +    116,115,117,15,0,0,0,95,99,97,99,104,101,95,98,121, +    116,101,99,111,100,101,117,8,0,0,0,115,101,116,95,100, +    97,116,97,40,1,0,0,0,117,10,0,0,0,95,95,108, +    111,99,97,108,115,95,95,40,0,0,0,0,40,0,0,0, +    0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, +    112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, +    97,112,62,117,16,0,0,0,83,111,117,114,99,101,70,105, +    108,101,76,111,97,100,101,114,16,4,0,0,115,8,0,0, +    0,16,2,6,2,12,5,12,8,117,16,0,0,0,83,111, +    117,114,99,101,70,105,108,101,76,111,97,100,101,114,99,1, +    0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,66, +    0,0,0,115,62,0,0,0,124,0,0,69,101,0,0,90, +    1,0,100,0,0,90,2,0,100,1,0,90,3,0,100,2, +    0,100,3,0,132,0,0,90,4,0,100,4,0,100,5,0, +    132,0,0,90,5,0,100,6,0,100,7,0,132,0,0,90, +    6,0,100,8,0,83,40,9,0,0,0,117,20,0,0,0, +    83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111, +    97,100,101,114,117,45,0,0,0,76,111,97,100,101,114,32, +    119,104,105,99,104,32,104,97,110,100,108,101,115,32,115,111, +    117,114,99,101,108,101,115,115,32,102,105,108,101,32,105,109, +    112,111,114,116,115,46,99,2,0,0,0,0,0,0,0,2, +    0,0,0,4,0,0,0,67,0,0,0,115,19,0,0,0, +    124,0,0,106,0,0,124,1,0,100,1,0,100,2,0,131, +    1,1,83,40,3,0,0,0,78,117,10,0,0,0,115,111, +    117,114,99,101,108,101,115,115,84,40,2,0,0,0,117,12, +    0,0,0,95,108,111,97,100,95,109,111,100,117,108,101,117, +    4,0,0,0,84,114,117,101,40,2,0,0,0,117,4,0, +    0,0,115,101,108,102,117,8,0,0,0,102,117,108,108,110, +    97,109,101,40,0,0,0,0,40,0,0,0,0,117,29,0, +    0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, +    108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, +    11,0,0,0,108,111,97,100,95,109,111,100,117,108,101,66, +    4,0,0,115,2,0,0,0,0,1,117,32,0,0,0,83, +    111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97, +    100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99, +    2,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0, +    67,0,0,0,115,138,0,0,0,124,0,0,106,0,0,124, +    1,0,131,1,0,125,2,0,124,0,0,106,1,0,124,2, +    0,131,1,0,125,3,0,124,0,0,106,2,0,124,1,0, +    124,3,0,124,2,0,100,0,0,131,4,0,125,4,0,116, +    4,0,106,5,0,124,4,0,131,1,0,125,5,0,116,6, +    0,124,5,0,116,7,0,131,2,0,114,101,0,116,8,0, +    100,1,0,124,2,0,131,2,0,1,124,5,0,83,116,9, +    0,100,2,0,106,10,0,124,2,0,131,1,0,100,3,0, +    124,1,0,100,4,0,124,2,0,131,1,2,130,1,0,100, +    0,0,83,40,5,0,0,0,78,117,21,0,0,0,99,111, +    100,101,32,111,98,106,101,99,116,32,102,114,111,109,32,123, +    33,114,125,117,21,0,0,0,78,111,110,45,99,111,100,101, +    32,111,98,106,101,99,116,32,105,110,32,123,125,117,4,0, +    0,0,110,97,109,101,117,4,0,0,0,112,97,116,104,40, +    11,0,0,0,117,12,0,0,0,103,101,116,95,102,105,108, +    101,110,97,109,101,117,8,0,0,0,103,101,116,95,100,97, +    116,97,117,20,0,0,0,95,98,121,116,101,115,95,102,114, +    111,109,95,98,121,116,101,99,111,100,101,117,4,0,0,0, +    78,111,110,101,117,7,0,0,0,109,97,114,115,104,97,108, +    117,5,0,0,0,108,111,97,100,115,117,10,0,0,0,105, +    115,105,110,115,116,97,110,99,101,117,10,0,0,0,95,99, +    111,100,101,95,116,121,112,101,117,16,0,0,0,95,118,101, +    114,98,111,115,101,95,109,101,115,115,97,103,101,117,11,0, +    0,0,73,109,112,111,114,116,69,114,114,111,114,117,6,0, +    0,0,102,111,114,109,97,116,40,6,0,0,0,117,4,0, +    0,0,115,101,108,102,117,8,0,0,0,102,117,108,108,110, +    97,109,101,117,4,0,0,0,112,97,116,104,117,4,0,0, +    0,100,97,116,97,117,10,0,0,0,98,121,116,101,115,95, +    100,97,116,97,117,5,0,0,0,102,111,117,110,100,40,0, +    0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, +    111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, +    98,111,111,116,115,116,114,97,112,62,117,8,0,0,0,103, +    101,116,95,99,111,100,101,69,4,0,0,115,18,0,0,0, +    0,1,15,1,15,1,24,1,15,1,15,1,13,1,4,2, +    18,1,117,29,0,0,0,83,111,117,114,99,101,108,101,115, +    115,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95, +    99,111,100,101,99,2,0,0,0,0,0,0,0,2,0,0, +    0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, +    0,83,40,2,0,0,0,117,39,0,0,0,82,101,116,117, +    114,110,32,78,111,110,101,32,97,115,32,116,104,101,114,101, +    32,105,115,32,110,111,32,115,111,117,114,99,101,32,99,111, +    100,101,46,78,40,1,0,0,0,117,4,0,0,0,78,111, +    110,101,40,2,0,0,0,117,4,0,0,0,115,101,108,102, +    117,8,0,0,0,102,117,108,108,110,97,109,101,40,0,0, +    0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, +    122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, +    111,111,116,115,116,114,97,112,62,117,10,0,0,0,103,101, +    116,95,115,111,117,114,99,101,81,4,0,0,115,2,0,0, +    0,0,2,117,31,0,0,0,83,111,117,114,99,101,108,101, +    115,115,70,105,108,101,76,111,97,100,101,114,46,103,101,116, +    95,115,111,117,114,99,101,78,40,7,0,0,0,117,8,0, +    0,0,95,95,110,97,109,101,95,95,117,10,0,0,0,95, +    95,109,111,100,117,108,101,95,95,117,12,0,0,0,95,95, +    113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,95, +    95,100,111,99,95,95,117,11,0,0,0,108,111,97,100,95, +    109,111,100,117,108,101,117,8,0,0,0,103,101,116,95,99, +    111,100,101,117,10,0,0,0,103,101,116,95,115,111,117,114, +    99,101,40,1,0,0,0,117,10,0,0,0,95,95,108,111, +    99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0, +    117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, +    111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, +    112,62,117,20,0,0,0,83,111,117,114,99,101,108,101,115, +    115,70,105,108,101,76,111,97,100,101,114,62,4,0,0,115, +    8,0,0,0,16,2,6,2,12,3,12,12,117,20,0,0, +    0,83,111,117,114,99,101,108,101,115,115,70,105,108,101,76, +    111,97,100,101,114,99,1,0,0,0,0,0,0,0,1,0, +    0,0,5,0,0,0,66,0,0,0,115,104,0,0,0,124, +    0,0,69,101,0,0,90,1,0,100,0,0,90,2,0,100, +    1,0,90,3,0,100,2,0,100,3,0,132,0,0,90,4, +    0,101,5,0,101,6,0,101,7,0,100,4,0,100,5,0, +    132,0,0,131,1,0,131,1,0,131,1,0,90,8,0,100, +    6,0,100,7,0,132,0,0,90,9,0,100,8,0,100,9, +    0,132,0,0,90,10,0,100,10,0,100,11,0,132,0,0, +    90,11,0,100,12,0,83,40,13,0,0,0,117,19,0,0, +    0,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, +    97,100,101,114,117,93,0,0,0,76,111,97,100,101,114,32, +    102,111,114,32,101,120,116,101,110,115,105,111,110,32,109,111, +    100,117,108,101,115,46,10,10,32,32,32,32,84,104,101,32, +    99,111,110,115,116,114,117,99,116,111,114,32,105,115,32,100, +    101,115,105,103,110,101,100,32,116,111,32,119,111,114,107,32, +    119,105,116,104,32,70,105,108,101,70,105,110,100,101,114,46, +    10,10,32,32,32,32,99,3,0,0,0,0,0,0,0,3, +    0,0,0,2,0,0,0,67,0,0,0,115,22,0,0,0, +    124,1,0,124,0,0,95,0,0,124,2,0,124,0,0,95, +    1,0,100,0,0,83,40,1,0,0,0,78,40,2,0,0, +    0,117,4,0,0,0,110,97,109,101,117,4,0,0,0,112, +    97,116,104,40,3,0,0,0,117,4,0,0,0,115,101,108, +    102,117,4,0,0,0,110,97,109,101,117,4,0,0,0,112, +    97,116,104,40,0,0,0,0,40,0,0,0,0,117,29,0, +    0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, +    108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, +    8,0,0,0,95,95,105,110,105,116,95,95,98,4,0,0, +    115,4,0,0,0,0,1,9,1,117,28,0,0,0,69,120, +    116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101, +    114,46,95,95,105,110,105,116,95,95,99,2,0,0,0,0, +    0,0,0,4,0,0,0,10,0,0,0,67,0,0,0,115, +    175,0,0,0,124,1,0,116,0,0,106,1,0,107,6,0, +    125,2,0,121,107,0,116,2,0,116,3,0,106,4,0,124, +    1,0,124,0,0,106,5,0,131,3,0,125,3,0,116,6, +    0,100,1,0,124,0,0,106,5,0,131,2,0,1,124,0, +    0,106,7,0,124,1,0,131,1,0,114,117,0,116,8,0, +    124,3,0,100,2,0,131,2,0,12,114,117,0,116,9,0, +    124,0,0,106,5,0,131,1,0,100,3,0,25,103,1,0, +    124,3,0,95,10,0,110,0,0,124,3,0,83,87,110,46, +    0,1,1,1,124,2,0,12,114,163,0,124,1,0,116,0, +    0,106,1,0,107,6,0,114,163,0,116,0,0,106,1,0, +    124,1,0,61,110,0,0,130,0,0,89,110,1,0,88,100, +    4,0,83,40,5,0,0,0,117,25,0,0,0,76,111,97, +    100,32,97,110,32,101,120,116,101,110,115,105,111,110,32,109, +    111,100,117,108,101,46,117,33,0,0,0,101,120,116,101,110, +    115,105,111,110,32,109,111,100,117,108,101,32,108,111,97,100, +    101,100,32,102,114,111,109,32,123,33,114,125,117,8,0,0, +    0,95,95,112,97,116,104,95,95,105,0,0,0,0,78,40, +    11,0,0,0,117,3,0,0,0,115,121,115,117,7,0,0, +    0,109,111,100,117,108,101,115,117,25,0,0,0,95,99,97, +    108,108,95,119,105,116,104,95,102,114,97,109,101,115,95,114, +    101,109,111,118,101,100,117,4,0,0,0,95,105,109,112,117, +    12,0,0,0,108,111,97,100,95,100,121,110,97,109,105,99, +    117,4,0,0,0,112,97,116,104,117,16,0,0,0,95,118, +    101,114,98,111,115,101,95,109,101,115,115,97,103,101,117,10, +    0,0,0,105,115,95,112,97,99,107,97,103,101,117,7,0, +    0,0,104,97,115,97,116,116,114,117,11,0,0,0,95,112, +    97,116,104,95,115,112,108,105,116,117,8,0,0,0,95,95, +    112,97,116,104,95,95,40,4,0,0,0,117,4,0,0,0, +    115,101,108,102,117,8,0,0,0,102,117,108,108,110,97,109, +    101,117,9,0,0,0,105,115,95,114,101,108,111,97,100,117, +    6,0,0,0,109,111,100,117,108,101,40,0,0,0,0,40, +    0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, +    32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, +    115,116,114,97,112,62,117,11,0,0,0,108,111,97,100,95, +    109,111,100,117,108,101,102,4,0,0,115,24,0,0,0,0, +    5,15,1,3,1,9,1,15,1,16,1,31,1,28,1,8, +    1,3,1,22,1,13,1,117,31,0,0,0,69,120,116,101, +    110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, +    108,111,97,100,95,109,111,100,117,108,101,99,2,0,0,0, +    0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0, +    115,48,0,0,0,116,0,0,124,0,0,106,1,0,131,1, +    0,100,1,0,25,137,0,0,116,2,0,135,0,0,102,1, +    0,100,2,0,100,3,0,134,0,0,116,3,0,68,131,1, +    0,131,1,0,83,40,4,0,0,0,117,49,0,0,0,82, +    101,116,117,114,110,32,84,114,117,101,32,105,102,32,116,104, +    101,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, +    108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,46, +    105,1,0,0,0,99,1,0,0,0,0,0,0,0,2,0, +    0,0,4,0,0,0,51,0,0,0,115,31,0,0,0,124, +    0,0,93,21,0,125,1,0,136,0,0,100,0,0,124,1, +    0,23,107,2,0,86,1,113,3,0,100,1,0,83,40,2, +    0,0,0,117,8,0,0,0,95,95,105,110,105,116,95,95, +    78,40,0,0,0,0,40,2,0,0,0,117,2,0,0,0, +    46,48,117,6,0,0,0,115,117,102,102,105,120,40,1,0, +    0,0,117,9,0,0,0,102,105,108,101,95,110,97,109,101, +    40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, +    110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, +    116,115,116,114,97,112,62,117,9,0,0,0,60,103,101,110, +    101,120,112,114,62,123,4,0,0,115,2,0,0,0,6,1, +    117,49,0,0,0,69,120,116,101,110,115,105,111,110,70,105, +    108,101,76,111,97,100,101,114,46,105,115,95,112,97,99,107, +    97,103,101,46,60,108,111,99,97,108,115,62,46,60,103,101, +    110,101,120,112,114,62,40,4,0,0,0,117,11,0,0,0, +    95,112,97,116,104,95,115,112,108,105,116,117,4,0,0,0, +    112,97,116,104,117,3,0,0,0,97,110,121,117,18,0,0, +    0,69,88,84,69,78,83,73,79,78,95,83,85,70,70,73, +    88,69,83,40,2,0,0,0,117,4,0,0,0,115,101,108, +    102,117,8,0,0,0,102,117,108,108,110,97,109,101,40,0, +    0,0,0,40,1,0,0,0,117,9,0,0,0,102,105,108, +    101,95,110,97,109,101,117,29,0,0,0,60,102,114,111,122, +    101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, +    111,116,115,116,114,97,112,62,117,10,0,0,0,105,115,95, +    112,97,99,107,97,103,101,120,4,0,0,115,6,0,0,0, +    0,2,19,1,18,1,117,30,0,0,0,69,120,116,101,110, +    115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105, +    115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0, +    0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, +    0,0,0,100,1,0,83,40,2,0,0,0,117,63,0,0, +    0,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, +    97,110,32,101,120,116,101,110,115,105,111,110,32,109,111,100, +    117,108,101,32,99,97,110,110,111,116,32,99,114,101,97,116, +    101,32,97,32,99,111,100,101,32,111,98,106,101,99,116,46, +    78,40,1,0,0,0,117,4,0,0,0,78,111,110,101,40, +    2,0,0,0,117,4,0,0,0,115,101,108,102,117,8,0, +    0,0,102,117,108,108,110,97,109,101,40,0,0,0,0,40, +    0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, +    32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, +    115,116,114,97,112,62,117,8,0,0,0,103,101,116,95,99, +    111,100,101,126,4,0,0,115,2,0,0,0,0,2,117,28, +    0,0,0,69,120,116,101,110,115,105,111,110,70,105,108,101, +    76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,99, +    2,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, +    67,0,0,0,115,4,0,0,0,100,1,0,83,40,2,0, +    0,0,117,53,0,0,0,82,101,116,117,114,110,32,78,111, +    110,101,32,97,115,32,101,120,116,101,110,115,105,111,110,32, +    109,111,100,117,108,101,115,32,104,97,118,101,32,110,111,32, +    115,111,117,114,99,101,32,99,111,100,101,46,78,40,1,0, +    0,0,117,4,0,0,0,78,111,110,101,40,2,0,0,0, +    117,4,0,0,0,115,101,108,102,117,8,0,0,0,102,117, +    108,108,110,97,109,101,40,0,0,0,0,40,0,0,0,0, +    117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, +    111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, +    112,62,117,10,0,0,0,103,101,116,95,115,111,117,114,99, +    101,130,4,0,0,115,2,0,0,0,0,2,117,30,0,0, +    0,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, +    97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,78, +    40,12,0,0,0,117,8,0,0,0,95,95,110,97,109,101, +    95,95,117,10,0,0,0,95,95,109,111,100,117,108,101,95, +    95,117,12,0,0,0,95,95,113,117,97,108,110,97,109,101, +    95,95,117,7,0,0,0,95,95,100,111,99,95,95,117,8, +    0,0,0,95,95,105,110,105,116,95,95,117,11,0,0,0, +    95,99,104,101,99,107,95,110,97,109,101,117,11,0,0,0, +    115,101,116,95,112,97,99,107,97,103,101,117,10,0,0,0, +    115,101,116,95,108,111,97,100,101,114,117,11,0,0,0,108, +    111,97,100,95,109,111,100,117,108,101,117,10,0,0,0,105, +    115,95,112,97,99,107,97,103,101,117,8,0,0,0,103,101, +    116,95,99,111,100,101,117,10,0,0,0,103,101,116,95,115, +    111,117,114,99,101,40,1,0,0,0,117,10,0,0,0,95, +    95,108,111,99,97,108,115,95,95,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,19,0,0,0,69,120,116,101,110,115, +    105,111,110,70,105,108,101,76,111,97,100,101,114,90,4,0, +    0,115,16,0,0,0,16,6,6,2,12,4,3,1,3,1, +    24,16,12,6,12,4,117,19,0,0,0,69,120,116,101,110, +    115,105,111,110,70,105,108,101,76,111,97,100,101,114,99,1, +    0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,66, +    0,0,0,115,134,0,0,0,124,0,0,69,101,0,0,90, +    1,0,100,0,0,90,2,0,100,1,0,90,3,0,100,2, +    0,100,3,0,132,0,0,90,4,0,100,4,0,100,5,0, +    132,0,0,90,5,0,100,6,0,100,7,0,132,0,0,90, +    6,0,100,8,0,100,9,0,132,0,0,90,7,0,100,10, +    0,100,11,0,132,0,0,90,8,0,100,12,0,100,13,0, +    132,0,0,90,9,0,100,14,0,100,15,0,132,0,0,90, +    10,0,100,16,0,100,17,0,132,0,0,90,11,0,100,18, +    0,100,19,0,132,0,0,90,12,0,100,20,0,83,40,21, +    0,0,0,117,14,0,0,0,95,78,97,109,101,115,112,97, +    99,101,80,97,116,104,117,37,1,0,0,82,101,112,114,101, +    115,101,110,116,115,32,97,32,110,97,109,101,115,112,97,99, +    101,32,112,97,99,107,97,103,101,39,115,32,112,97,116,104, +    46,32,32,73,116,32,117,115,101,115,32,116,104,101,32,109, +    111,100,117,108,101,32,110,97,109,101,10,32,32,32,32,116, +    111,32,102,105,110,100,32,105,116,115,32,112,97,114,101,110, +    116,32,109,111,100,117,108,101,44,32,97,110,100,32,102,114, +    111,109,32,116,104,101,114,101,32,105,116,32,108,111,111,107, +    115,32,117,112,32,116,104,101,32,112,97,114,101,110,116,39, +    115,10,32,32,32,32,95,95,112,97,116,104,95,95,46,32, +    32,87,104,101,110,32,116,104,105,115,32,99,104,97,110,103, +    101,115,44,32,116,104,101,32,109,111,100,117,108,101,39,115, +    32,111,119,110,32,112,97,116,104,32,105,115,32,114,101,99, +    111,109,112,117,116,101,100,44,10,32,32,32,32,117,115,105, +    110,103,32,112,97,116,104,95,102,105,110,100,101,114,46,32, +    32,70,111,114,32,116,111,112,45,108,101,118,101,32,109,111, +    100,117,108,101,115,44,32,116,104,101,32,112,97,114,101,110, +    116,32,109,111,100,117,108,101,39,115,32,112,97,116,104,10, +    32,32,32,32,105,115,32,115,121,115,46,112,97,116,104,46, +    99,4,0,0,0,0,0,0,0,4,0,0,0,2,0,0, +    0,67,0,0,0,115,52,0,0,0,124,1,0,124,0,0, +    95,0,0,124,2,0,124,0,0,95,1,0,116,2,0,124, +    0,0,106,3,0,131,0,0,131,1,0,124,0,0,95,4, +    0,124,3,0,124,0,0,95,5,0,100,0,0,83,40,1, +    0,0,0,78,40,6,0,0,0,117,5,0,0,0,95,110, +    97,109,101,117,5,0,0,0,95,112,97,116,104,117,5,0, +    0,0,116,117,112,108,101,117,16,0,0,0,95,103,101,116, +    95,112,97,114,101,110,116,95,112,97,116,104,117,17,0,0, +    0,95,108,97,115,116,95,112,97,114,101,110,116,95,112,97, +    116,104,117,12,0,0,0,95,112,97,116,104,95,102,105,110, +    100,101,114,40,4,0,0,0,117,4,0,0,0,115,101,108, +    102,117,4,0,0,0,110,97,109,101,117,4,0,0,0,112, +    97,116,104,117,11,0,0,0,112,97,116,104,95,102,105,110, +    100,101,114,40,0,0,0,0,40,0,0,0,0,117,29,0, +    0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, +    108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, +    8,0,0,0,95,95,105,110,105,116,95,95,142,4,0,0, +    115,8,0,0,0,0,1,9,1,9,1,21,1,117,23,0, +    0,0,95,78,97,109,101,115,112,97,99,101,80,97,116,104, +    46,95,95,105,110,105,116,95,95,99,1,0,0,0,0,0, +    0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,53, +    0,0,0,124,0,0,106,0,0,106,1,0,100,1,0,131, +    1,0,92,3,0,125,1,0,125,2,0,125,3,0,124,2, +    0,100,2,0,107,2,0,114,43,0,100,6,0,83,124,1, +    0,100,5,0,102,2,0,83,40,7,0,0,0,117,62,0, +    0,0,82,101,116,117,114,110,115,32,97,32,116,117,112,108, +    101,32,111,102,32,40,112,97,114,101,110,116,45,109,111,100, +    117,108,101,45,110,97,109,101,44,32,112,97,114,101,110,116, +    45,112,97,116,104,45,97,116,116,114,45,110,97,109,101,41, +    117,1,0,0,0,46,117,0,0,0,0,117,3,0,0,0, +    115,121,115,117,4,0,0,0,112,97,116,104,117,8,0,0, +    0,95,95,112,97,116,104,95,95,40,2,0,0,0,117,3, +    0,0,0,115,121,115,117,4,0,0,0,112,97,116,104,40, +    2,0,0,0,117,5,0,0,0,95,110,97,109,101,117,10, +    0,0,0,114,112,97,114,116,105,116,105,111,110,40,4,0, +    0,0,117,4,0,0,0,115,101,108,102,117,6,0,0,0, +    112,97,114,101,110,116,117,3,0,0,0,100,111,116,117,2, +    0,0,0,109,101,40,0,0,0,0,40,0,0,0,0,117, +    29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, +    114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, +    62,117,23,0,0,0,95,102,105,110,100,95,112,97,114,101, +    110,116,95,112,97,116,104,95,110,97,109,101,115,148,4,0, +    0,115,8,0,0,0,0,2,27,1,12,2,4,3,117,38, +    0,0,0,95,78,97,109,101,115,112,97,99,101,80,97,116, +    104,46,95,102,105,110,100,95,112,97,114,101,110,116,95,112, +    97,116,104,95,110,97,109,101,115,99,1,0,0,0,0,0, +    0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,38, +    0,0,0,124,0,0,106,0,0,131,0,0,92,2,0,125, +    1,0,125,2,0,116,1,0,116,2,0,106,3,0,124,1, +    0,25,124,2,0,131,2,0,83,40,1,0,0,0,78,40, +    4,0,0,0,117,23,0,0,0,95,102,105,110,100,95,112, +    97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,115, +    117,7,0,0,0,103,101,116,97,116,116,114,117,3,0,0, +    0,115,121,115,117,7,0,0,0,109,111,100,117,108,101,115, +    40,3,0,0,0,117,4,0,0,0,115,101,108,102,117,18, +    0,0,0,112,97,114,101,110,116,95,109,111,100,117,108,101, +    95,110,97,109,101,117,14,0,0,0,112,97,116,104,95,97, +    116,116,114,95,110,97,109,101,40,0,0,0,0,40,0,0, +    0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, +    109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, +    114,97,112,62,117,16,0,0,0,95,103,101,116,95,112,97, +    114,101,110,116,95,112,97,116,104,158,4,0,0,115,4,0, +    0,0,0,1,18,1,117,31,0,0,0,95,78,97,109,101, +    115,112,97,99,101,80,97,116,104,46,95,103,101,116,95,112, +    97,114,101,110,116,95,112,97,116,104,99,1,0,0,0,0, +    0,0,0,4,0,0,0,3,0,0,0,67,0,0,0,115, +    103,0,0,0,116,0,0,124,0,0,106,1,0,131,0,0, +    131,1,0,125,1,0,124,1,0,124,0,0,106,2,0,107, +    3,0,114,96,0,124,0,0,106,3,0,124,0,0,106,4, +    0,124,1,0,131,2,0,92,2,0,125,2,0,125,3,0, +    124,2,0,100,0,0,107,8,0,114,84,0,124,3,0,124, +    0,0,95,6,0,110,0,0,124,1,0,124,0,0,95,2, +    0,110,0,0,124,0,0,106,6,0,83,40,1,0,0,0, +    78,40,7,0,0,0,117,5,0,0,0,116,117,112,108,101, +    117,16,0,0,0,95,103,101,116,95,112,97,114,101,110,116, +    95,112,97,116,104,117,17,0,0,0,95,108,97,115,116,95, +    112,97,114,101,110,116,95,112,97,116,104,117,12,0,0,0, +    95,112,97,116,104,95,102,105,110,100,101,114,117,5,0,0, +    0,95,110,97,109,101,117,4,0,0,0,78,111,110,101,117, +    5,0,0,0,95,112,97,116,104,40,4,0,0,0,117,4, +    0,0,0,115,101,108,102,117,11,0,0,0,112,97,114,101, +    110,116,95,112,97,116,104,117,6,0,0,0,108,111,97,100, +    101,114,117,8,0,0,0,110,101,119,95,112,97,116,104,40, +    0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, +    114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, +    95,98,111,111,116,115,116,114,97,112,62,117,12,0,0,0, +    95,114,101,99,97,108,99,117,108,97,116,101,162,4,0,0, +    115,14,0,0,0,0,2,18,1,15,1,27,3,12,1,12, +    1,12,1,117,27,0,0,0,95,78,97,109,101,115,112,97, +    99,101,80,97,116,104,46,95,114,101,99,97,108,99,117,108, +    97,116,101,99,1,0,0,0,0,0,0,0,1,0,0,0, +    2,0,0,0,67,0,0,0,115,16,0,0,0,116,0,0, +    124,0,0,106,1,0,131,0,0,131,1,0,83,40,1,0, +    0,0,78,40,2,0,0,0,117,4,0,0,0,105,116,101, +    114,117,12,0,0,0,95,114,101,99,97,108,99,117,108,97, +    116,101,40,1,0,0,0,117,4,0,0,0,115,101,108,102, +    40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, +    102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, +    46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0, +    0,95,95,105,116,101,114,95,95,174,4,0,0,115,2,0, +    0,0,0,1,117,23,0,0,0,95,78,97,109,101,115,112, +    97,99,101,80,97,116,104,46,95,95,105,116,101,114,95,95, +    99,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0, +    0,67,0,0,0,115,16,0,0,0,116,0,0,124,0,0, +    106,1,0,131,0,0,131,1,0,83,40,1,0,0,0,78, +    40,2,0,0,0,117,3,0,0,0,108,101,110,117,12,0, +    0,0,95,114,101,99,97,108,99,117,108,97,116,101,40,1, +    0,0,0,117,4,0,0,0,115,101,108,102,40,0,0,0, +    0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, +    101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, +    111,116,115,116,114,97,112,62,117,7,0,0,0,95,95,108, +    101,110,95,95,177,4,0,0,115,2,0,0,0,0,1,117, +    22,0,0,0,95,78,97,109,101,115,112,97,99,101,80,97, +    116,104,46,95,95,108,101,110,95,95,99,1,0,0,0,0, +    0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, +    16,0,0,0,100,1,0,106,0,0,124,0,0,106,1,0, +    131,1,0,83,40,2,0,0,0,78,117,20,0,0,0,95, +    78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, +    114,125,41,40,2,0,0,0,117,6,0,0,0,102,111,114, +    109,97,116,117,5,0,0,0,95,112,97,116,104,40,1,0, +    0,0,117,4,0,0,0,115,101,108,102,40,0,0,0,0, +    40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, +    110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, +    116,115,116,114,97,112,62,117,8,0,0,0,95,95,114,101, +    112,114,95,95,180,4,0,0,115,2,0,0,0,0,1,117, +    23,0,0,0,95,78,97,109,101,115,112,97,99,101,80,97, +    116,104,46,95,95,114,101,112,114,95,95,99,2,0,0,0, +    0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, +    115,16,0,0,0,124,1,0,124,0,0,106,0,0,131,0, +    0,107,6,0,83,40,1,0,0,0,78,40,1,0,0,0, +    117,12,0,0,0,95,114,101,99,97,108,99,117,108,97,116, +    101,40,2,0,0,0,117,4,0,0,0,115,101,108,102,117, +    4,0,0,0,105,116,101,109,40,0,0,0,0,40,0,0, +    0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, +    109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, +    114,97,112,62,117,12,0,0,0,95,95,99,111,110,116,97, +    105,110,115,95,95,183,4,0,0,115,2,0,0,0,0,1, +    117,27,0,0,0,95,78,97,109,101,115,112,97,99,101,80, +    97,116,104,46,95,95,99,111,110,116,97,105,110,115,95,95, +    99,2,0,0,0,0,0,0,0,2,0,0,0,2,0,0, +    0,67,0,0,0,115,20,0,0,0,124,0,0,106,0,0, +    106,1,0,124,1,0,131,1,0,1,100,0,0,83,40,1, +    0,0,0,78,40,2,0,0,0,117,5,0,0,0,95,112, +    97,116,104,117,6,0,0,0,97,112,112,101,110,100,40,2, +    0,0,0,117,4,0,0,0,115,101,108,102,117,4,0,0, +    0,105,116,101,109,40,0,0,0,0,40,0,0,0,0,117, +    29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, +    114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, +    62,117,6,0,0,0,97,112,112,101,110,100,186,4,0,0, +    115,2,0,0,0,0,1,117,21,0,0,0,95,78,97,109, +    101,115,112,97,99,101,80,97,116,104,46,97,112,112,101,110, +    100,78,40,13,0,0,0,117,8,0,0,0,95,95,110,97, +    109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,108, +    101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,97, +    109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,95, +    117,8,0,0,0,95,95,105,110,105,116,95,95,117,23,0, +    0,0,95,102,105,110,100,95,112,97,114,101,110,116,95,112, +    97,116,104,95,110,97,109,101,115,117,16,0,0,0,95,103, +    101,116,95,112,97,114,101,110,116,95,112,97,116,104,117,12, +    0,0,0,95,114,101,99,97,108,99,117,108,97,116,101,117, +    8,0,0,0,95,95,105,116,101,114,95,95,117,7,0,0, +    0,95,95,108,101,110,95,95,117,8,0,0,0,95,95,114, +    101,112,114,95,95,117,12,0,0,0,95,95,99,111,110,116, +    97,105,110,115,95,95,117,6,0,0,0,97,112,112,101,110, +    100,40,1,0,0,0,117,10,0,0,0,95,95,108,111,99, +    97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,117, +    29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, +    114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, +    62,117,14,0,0,0,95,78,97,109,101,115,112,97,99,101, +    80,97,116,104,135,4,0,0,115,20,0,0,0,16,5,6, +    2,12,6,12,10,12,4,12,12,12,3,12,3,12,3,12, +    3,117,14,0,0,0,95,78,97,109,101,115,112,97,99,101, +    80,97,116,104,99,1,0,0,0,0,0,0,0,1,0,0, +    0,3,0,0,0,66,0,0,0,115,68,0,0,0,124,0, +    0,69,101,0,0,90,1,0,100,0,0,90,2,0,100,1, +    0,100,2,0,132,0,0,90,3,0,101,4,0,100,3,0, +    100,4,0,132,0,0,131,1,0,90,5,0,101,6,0,100, +    5,0,100,6,0,132,0,0,131,1,0,90,7,0,100,7, +    0,83,40,8,0,0,0,117,15,0,0,0,78,97,109,101, +    115,112,97,99,101,76,111,97,100,101,114,99,4,0,0,0, +    0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0, +    115,25,0,0,0,116,0,0,124,1,0,124,2,0,124,3, +    0,131,3,0,124,0,0,95,1,0,100,0,0,83,40,1, +    0,0,0,78,40,2,0,0,0,117,14,0,0,0,95,78, +    97,109,101,115,112,97,99,101,80,97,116,104,117,5,0,0, +    0,95,112,97,116,104,40,4,0,0,0,117,4,0,0,0, +    115,101,108,102,117,4,0,0,0,110,97,109,101,117,4,0, +    0,0,112,97,116,104,117,11,0,0,0,112,97,116,104,95, +    102,105,110,100,101,114,40,0,0,0,0,40,0,0,0,0, +    117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, +    111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, +    112,62,117,8,0,0,0,95,95,105,110,105,116,95,95,191, +    4,0,0,115,2,0,0,0,0,1,117,24,0,0,0,78, +    97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,95, +    95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,0, +    2,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0, +    0,100,1,0,106,0,0,124,1,0,106,1,0,131,1,0, +    83,40,2,0,0,0,78,117,25,0,0,0,60,109,111,100, +    117,108,101,32,39,123,125,39,32,40,110,97,109,101,115,112, +    97,99,101,41,62,40,2,0,0,0,117,6,0,0,0,102, +    111,114,109,97,116,117,8,0,0,0,95,95,110,97,109,101, +    95,95,40,2,0,0,0,117,3,0,0,0,99,108,115,117, +    6,0,0,0,109,111,100,117,108,101,40,0,0,0,0,40, +    0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, +    32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, +    115,116,114,97,112,62,117,11,0,0,0,109,111,100,117,108, +    101,95,114,101,112,114,194,4,0,0,115,2,0,0,0,0, +    2,117,27,0,0,0,78,97,109,101,115,112,97,99,101,76, +    111,97,100,101,114,46,109,111,100,117,108,101,95,114,101,112, +    114,99,2,0,0,0,0,0,0,0,2,0,0,0,3,0, +    0,0,67,0,0,0,115,32,0,0,0,116,0,0,100,1, +    0,124,0,0,106,1,0,131,2,0,1,124,0,0,106,1, +    0,124,1,0,95,2,0,124,1,0,83,40,2,0,0,0, +    117,24,0,0,0,76,111,97,100,32,97,32,110,97,109,101, +    115,112,97,99,101,32,109,111,100,117,108,101,46,117,38,0, +    0,0,110,97,109,101,115,112,97,99,101,32,109,111,100,117, +    108,101,32,108,111,97,100,101,100,32,119,105,116,104,32,112, +    97,116,104,32,123,33,114,125,40,3,0,0,0,117,16,0, +    0,0,95,118,101,114,98,111,115,101,95,109,101,115,115,97, +    103,101,117,5,0,0,0,95,112,97,116,104,117,8,0,0, +    0,95,95,112,97,116,104,95,95,40,2,0,0,0,117,4, +    0,0,0,115,101,108,102,117,6,0,0,0,109,111,100,117, +    108,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0, +    0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, +    105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11, +    0,0,0,108,111,97,100,95,109,111,100,117,108,101,198,4, +    0,0,115,6,0,0,0,0,3,16,1,12,1,117,27,0, +    0,0,78,97,109,101,115,112,97,99,101,76,111,97,100,101, +    114,46,108,111,97,100,95,109,111,100,117,108,101,78,40,8, +    0,0,0,117,8,0,0,0,95,95,110,97,109,101,95,95, +    117,10,0,0,0,95,95,109,111,100,117,108,101,95,95,117, +    12,0,0,0,95,95,113,117,97,108,110,97,109,101,95,95, +    117,8,0,0,0,95,95,105,110,105,116,95,95,117,11,0, +    0,0,99,108,97,115,115,109,101,116,104,111,100,117,11,0, +    0,0,109,111,100,117,108,101,95,114,101,112,114,117,17,0, +    0,0,109,111,100,117,108,101,95,102,111,114,95,108,111,97, +    100,101,114,117,11,0,0,0,108,111,97,100,95,109,111,100, +    117,108,101,40,1,0,0,0,117,10,0,0,0,95,95,108, +    111,99,97,108,115,95,95,40,0,0,0,0,40,0,0,0, +    0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, +    112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, +    97,112,62,117,15,0,0,0,78,97,109,101,115,112,97,99, +    101,76,111,97,100,101,114,190,4,0,0,115,6,0,0,0, +    16,1,12,3,18,4,117,15,0,0,0,78,97,109,101,115, +    112,97,99,101,76,111,97,100,101,114,99,1,0,0,0,0, +    0,0,0,1,0,0,0,4,0,0,0,66,0,0,0,115, +    119,0,0,0,124,0,0,69,101,0,0,90,1,0,100,0, +    0,90,2,0,100,1,0,90,3,0,101,4,0,100,2,0, +    100,3,0,132,0,0,131,1,0,90,5,0,101,4,0,100, +    4,0,100,5,0,132,0,0,131,1,0,90,6,0,101,4, +    0,100,6,0,100,7,0,132,0,0,131,1,0,90,7,0, +    101,4,0,100,8,0,100,9,0,132,0,0,131,1,0,90, +    8,0,101,4,0,100,12,0,100,10,0,100,11,0,132,1, +    0,131,1,0,90,10,0,100,12,0,83,40,13,0,0,0, +    117,10,0,0,0,80,97,116,104,70,105,110,100,101,114,117, +    62,0,0,0,77,101,116,97,32,112,97,116,104,32,102,105, +    110,100,101,114,32,102,111,114,32,115,121,115,46,112,97,116, +    104,32,97,110,100,32,112,97,99,107,97,103,101,32,95,95, +    112,97,116,104,95,95,32,97,116,116,114,105,98,117,116,101, +    115,46,99,1,0,0,0,0,0,0,0,2,0,0,0,4, +    0,0,0,67,0,0,0,115,58,0,0,0,120,51,0,116, +    0,0,106,1,0,106,2,0,131,0,0,68,93,34,0,125, +    1,0,116,3,0,124,1,0,100,1,0,131,2,0,114,16, +    0,124,1,0,106,4,0,131,0,0,1,113,16,0,113,16, +    0,87,100,2,0,83,40,3,0,0,0,117,125,0,0,0, +    67,97,108,108,32,116,104,101,32,105,110,118,97,108,105,100, +    97,116,101,95,99,97,99,104,101,115,40,41,32,109,101,116, +    104,111,100,32,111,110,32,97,108,108,32,112,97,116,104,32, +    101,110,116,114,121,32,102,105,110,100,101,114,115,10,32,32, +    32,32,32,32,32,32,115,116,111,114,101,100,32,105,110,32, +    115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101, +    114,95,99,97,99,104,101,115,32,40,119,104,101,114,101,32, +    105,109,112,108,101,109,101,110,116,101,100,41,46,117,17,0, +    0,0,105,110,118,97,108,105,100,97,116,101,95,99,97,99, +    104,101,115,78,40,5,0,0,0,117,3,0,0,0,115,121, +    115,117,19,0,0,0,112,97,116,104,95,105,109,112,111,114, +    116,101,114,95,99,97,99,104,101,117,6,0,0,0,118,97, +    108,117,101,115,117,7,0,0,0,104,97,115,97,116,116,114, +    117,17,0,0,0,105,110,118,97,108,105,100,97,116,101,95, +    99,97,99,104,101,115,40,2,0,0,0,117,3,0,0,0, +    99,108,115,117,6,0,0,0,102,105,110,100,101,114,40,0, +    0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, +    111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, +    98,111,111,116,115,116,114,97,112,62,117,17,0,0,0,105, +    110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115, +    212,4,0,0,115,6,0,0,0,0,4,22,1,15,1,117, +    28,0,0,0,80,97,116,104,70,105,110,100,101,114,46,105, +    110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115, +    99,2,0,0,0,0,0,0,0,3,0,0,0,12,0,0, +    0,67,0,0,0,115,94,0,0,0,116,0,0,106,1,0, +    115,28,0,116,2,0,106,3,0,100,1,0,116,4,0,131, +    2,0,1,110,0,0,120,59,0,116,0,0,106,1,0,68, +    93,44,0,125,2,0,121,14,0,124,2,0,124,1,0,131, +    1,0,83,87,113,38,0,4,116,5,0,107,10,0,114,81, +    0,1,1,1,119,38,0,89,113,38,0,88,113,38,0,87, +    100,2,0,83,100,2,0,83,40,3,0,0,0,117,113,0, +    0,0,83,101,97,114,99,104,32,115,101,113,117,101,110,99, +    101,32,111,102,32,104,111,111,107,115,32,102,111,114,32,97, +    32,102,105,110,100,101,114,32,102,111,114,32,39,112,97,116, +    104,39,46,10,10,32,32,32,32,32,32,32,32,73,102,32, +    39,104,111,111,107,115,39,32,105,115,32,102,97,108,115,101, +    32,116,104,101,110,32,117,115,101,32,115,121,115,46,112,97, +    116,104,95,104,111,111,107,115,46,10,10,32,32,32,32,32, +    32,32,32,117,23,0,0,0,115,121,115,46,112,97,116,104, +    95,104,111,111,107,115,32,105,115,32,101,109,112,116,121,78, +    40,7,0,0,0,117,3,0,0,0,115,121,115,117,10,0, +    0,0,112,97,116,104,95,104,111,111,107,115,117,9,0,0, +    0,95,119,97,114,110,105,110,103,115,117,4,0,0,0,119, +    97,114,110,117,13,0,0,0,73,109,112,111,114,116,87,97, +    114,110,105,110,103,117,11,0,0,0,73,109,112,111,114,116, +    69,114,114,111,114,117,4,0,0,0,78,111,110,101,40,3, +    0,0,0,117,3,0,0,0,99,108,115,117,4,0,0,0, +    112,97,116,104,117,4,0,0,0,104,111,111,107,40,0,0, +    0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, +    122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, +    111,111,116,115,116,114,97,112,62,117,11,0,0,0,95,112, +    97,116,104,95,104,111,111,107,115,220,4,0,0,115,16,0, +    0,0,0,7,9,1,19,1,16,1,3,1,14,1,13,1, +    12,2,117,22,0,0,0,80,97,116,104,70,105,110,100,101, +    114,46,95,112,97,116,104,95,104,111,111,107,115,99,2,0, +    0,0,0,0,0,0,3,0,0,0,11,0,0,0,67,0, +    0,0,115,91,0,0,0,124,1,0,100,1,0,107,2,0, +    114,21,0,100,2,0,125,1,0,110,0,0,121,17,0,116, +    0,0,106,1,0,124,1,0,25,125,2,0,87,110,46,0, +    4,116,2,0,107,10,0,114,86,0,1,1,1,124,0,0, +    106,3,0,124,1,0,131,1,0,125,2,0,124,2,0,116, +    0,0,106,1,0,124,1,0,60,89,110,1,0,88,124,2, +    0,83,40,3,0,0,0,117,210,0,0,0,71,101,116,32, +    116,104,101,32,102,105,110,100,101,114,32,102,111,114,32,116, +    104,101,32,112,97,116,104,32,101,110,116,114,121,32,102,114, +    111,109,32,115,121,115,46,112,97,116,104,95,105,109,112,111, +    114,116,101,114,95,99,97,99,104,101,46,10,10,32,32,32, +    32,32,32,32,32,73,102,32,116,104,101,32,112,97,116,104, +    32,101,110,116,114,121,32,105,115,32,110,111,116,32,105,110, +    32,116,104,101,32,99,97,99,104,101,44,32,102,105,110,100, +    32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101, +    32,102,105,110,100,101,114,10,32,32,32,32,32,32,32,32, +    97,110,100,32,99,97,99,104,101,32,105,116,46,32,73,102, +    32,110,111,32,102,105,110,100,101,114,32,105,115,32,97,118, +    97,105,108,97,98,108,101,44,32,115,116,111,114,101,32,78, +    111,110,101,46,10,10,32,32,32,32,32,32,32,32,117,0, +    0,0,0,117,1,0,0,0,46,40,4,0,0,0,117,3, +    0,0,0,115,121,115,117,19,0,0,0,112,97,116,104,95, +    105,109,112,111,114,116,101,114,95,99,97,99,104,101,117,8, +    0,0,0,75,101,121,69,114,114,111,114,117,11,0,0,0, +    95,112,97,116,104,95,104,111,111,107,115,40,3,0,0,0, +    117,3,0,0,0,99,108,115,117,4,0,0,0,112,97,116, +    104,117,6,0,0,0,102,105,110,100,101,114,40,0,0,0, +    0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, +    101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, +    111,116,115,116,114,97,112,62,117,20,0,0,0,95,112,97, +    116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, +    101,237,4,0,0,115,16,0,0,0,0,8,12,1,9,1, +    3,1,17,1,13,1,15,1,18,1,117,31,0,0,0,80, +    97,116,104,70,105,110,100,101,114,46,95,112,97,116,104,95, +    105,109,112,111,114,116,101,114,95,99,97,99,104,101,99,3, +    0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,67, +    0,0,0,115,162,0,0,0,103,0,0,125,3,0,120,149, +    0,124,2,0,68,93,131,0,125,4,0,124,0,0,106,0, +    0,124,4,0,131,1,0,125,5,0,124,5,0,100,2,0, +    107,9,0,114,13,0,116,2,0,124,5,0,100,1,0,131, +    2,0,114,85,0,124,5,0,106,3,0,124,1,0,131,1, +    0,92,2,0,125,6,0,125,7,0,110,21,0,124,5,0, +    106,4,0,124,1,0,131,1,0,125,6,0,103,0,0,125, +    7,0,124,6,0,100,2,0,107,9,0,114,128,0,124,6, +    0,124,3,0,102,2,0,83,124,3,0,106,5,0,124,7, +    0,131,1,0,1,113,13,0,113,13,0,87,100,2,0,124, +    3,0,102,2,0,83,100,2,0,83,40,3,0,0,0,117, +    63,0,0,0,70,105,110,100,32,116,104,101,32,108,111,97, +    100,101,114,32,111,114,32,110,97,109,101,115,112,97,99,101, +    95,112,97,116,104,32,102,111,114,32,116,104,105,115,32,109, +    111,100,117,108,101,47,112,97,99,107,97,103,101,32,110,97, +    109,101,46,117,11,0,0,0,102,105,110,100,95,108,111,97, +    100,101,114,78,40,6,0,0,0,117,20,0,0,0,95,112, +    97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99, +    104,101,117,4,0,0,0,78,111,110,101,117,7,0,0,0, +    104,97,115,97,116,116,114,117,11,0,0,0,102,105,110,100, +    95,108,111,97,100,101,114,117,11,0,0,0,102,105,110,100, +    95,109,111,100,117,108,101,117,6,0,0,0,101,120,116,101, +    110,100,40,8,0,0,0,117,3,0,0,0,99,108,115,117, +    8,0,0,0,102,117,108,108,110,97,109,101,117,4,0,0, +    0,112,97,116,104,117,14,0,0,0,110,97,109,101,115,112, +    97,99,101,95,112,97,116,104,117,5,0,0,0,101,110,116, +    114,121,117,6,0,0,0,102,105,110,100,101,114,117,6,0, +    0,0,108,111,97,100,101,114,117,8,0,0,0,112,111,114, +    116,105,111,110,115,40,0,0,0,0,40,0,0,0,0,117, +    29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, +    114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, +    62,117,11,0,0,0,95,103,101,116,95,108,111,97,100,101, +    114,254,4,0,0,115,24,0,0,0,0,5,6,1,13,1, +    15,1,12,1,15,1,24,2,15,1,6,1,12,2,10,5, +    20,2,117,22,0,0,0,80,97,116,104,70,105,110,100,101, +    114,46,95,103,101,116,95,108,111,97,100,101,114,99,3,0, +    0,0,0,0,0,0,5,0,0,0,4,0,0,0,67,0, +    0,0,115,97,0,0,0,124,2,0,100,1,0,107,8,0, +    114,24,0,116,1,0,106,2,0,125,2,0,110,0,0,124, +    0,0,106,3,0,124,1,0,124,2,0,131,2,0,92,2, +    0,125,3,0,125,4,0,124,3,0,100,1,0,107,9,0, +    114,64,0,124,3,0,83,124,4,0,114,89,0,116,4,0, +    124,1,0,124,4,0,124,0,0,106,3,0,131,3,0,83, +    100,1,0,83,100,1,0,83,40,2,0,0,0,117,98,0, +    0,0,70,105,110,100,32,116,104,101,32,109,111,100,117,108, +    101,32,111,110,32,115,121,115,46,112,97,116,104,32,111,114, +    32,39,112,97,116,104,39,32,98,97,115,101,100,32,111,110, +    32,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32, +    97,110,100,10,32,32,32,32,32,32,32,32,115,121,115,46, +    112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97, +    99,104,101,46,78,40,5,0,0,0,117,4,0,0,0,78, +    111,110,101,117,3,0,0,0,115,121,115,117,4,0,0,0, +    112,97,116,104,117,11,0,0,0,95,103,101,116,95,108,111, +    97,100,101,114,117,15,0,0,0,78,97,109,101,115,112,97, +    99,101,76,111,97,100,101,114,40,5,0,0,0,117,3,0, +    0,0,99,108,115,117,8,0,0,0,102,117,108,108,110,97, +    109,101,117,4,0,0,0,112,97,116,104,117,6,0,0,0, +    108,111,97,100,101,114,117,14,0,0,0,110,97,109,101,115, +    112,97,99,101,95,112,97,116,104,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,11,0,0,0,102,105,110,100,95,109, +    111,100,117,108,101,23,5,0,0,115,16,0,0,0,0,4, +    12,1,12,1,24,1,12,1,4,2,6,3,19,2,117,22, +    0,0,0,80,97,116,104,70,105,110,100,101,114,46,102,105, +    110,100,95,109,111,100,117,108,101,78,40,11,0,0,0,117, +    8,0,0,0,95,95,110,97,109,101,95,95,117,10,0,0, +    0,95,95,109,111,100,117,108,101,95,95,117,12,0,0,0, +    95,95,113,117,97,108,110,97,109,101,95,95,117,7,0,0, +    0,95,95,100,111,99,95,95,117,11,0,0,0,99,108,97, +    115,115,109,101,116,104,111,100,117,17,0,0,0,105,110,118, +    97,108,105,100,97,116,101,95,99,97,99,104,101,115,117,11, +    0,0,0,95,112,97,116,104,95,104,111,111,107,115,117,20, +    0,0,0,95,112,97,116,104,95,105,109,112,111,114,116,101, +    114,95,99,97,99,104,101,117,11,0,0,0,95,103,101,116, +    95,108,111,97,100,101,114,117,4,0,0,0,78,111,110,101, +    117,11,0,0,0,102,105,110,100,95,109,111,100,117,108,101, +    40,1,0,0,0,117,10,0,0,0,95,95,108,111,99,97, +    108,115,95,95,40,0,0,0,0,40,0,0,0,0,117,29, +    0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, +    116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, +    117,10,0,0,0,80,97,116,104,70,105,110,100,101,114,208, +    4,0,0,115,14,0,0,0,16,2,6,2,18,8,18,17, +    18,17,18,25,3,1,117,10,0,0,0,80,97,116,104,70, +    105,110,100,101,114,99,1,0,0,0,0,0,0,0,1,0, +    0,0,3,0,0,0,66,0,0,0,115,110,0,0,0,124, +    0,0,69,101,0,0,90,1,0,100,0,0,90,2,0,100, +    1,0,90,3,0,100,2,0,100,3,0,132,0,0,90,4, +    0,100,4,0,100,5,0,132,0,0,90,5,0,101,6,0, +    90,7,0,100,6,0,100,7,0,132,0,0,90,8,0,100, +    8,0,100,9,0,132,0,0,90,9,0,101,10,0,100,10, +    0,100,11,0,132,0,0,131,1,0,90,11,0,100,12,0, +    100,13,0,132,0,0,90,12,0,100,14,0,83,40,15,0, +    0,0,117,10,0,0,0,70,105,108,101,70,105,110,100,101, +    114,117,172,0,0,0,70,105,108,101,45,98,97,115,101,100, +    32,102,105,110,100,101,114,46,10,10,32,32,32,32,73,110, +    116,101,114,97,99,116,105,111,110,115,32,119,105,116,104,32, +    116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32, +    97,114,101,32,99,97,99,104,101,100,32,102,111,114,32,112, +    101,114,102,111,114,109,97,110,99,101,44,32,98,101,105,110, +    103,10,32,32,32,32,114,101,102,114,101,115,104,101,100,32, +    119,104,101,110,32,116,104,101,32,100,105,114,101,99,116,111, +    114,121,32,116,104,101,32,102,105,110,100,101,114,32,105,115, +    32,104,97,110,100,108,105,110,103,32,104,97,115,32,98,101, +    101,110,32,109,111,100,105,102,105,101,100,46,10,10,32,32, +    32,32,99,2,0,0,0,0,0,0,0,5,0,0,0,5, +    0,0,0,7,0,0,0,115,122,0,0,0,103,0,0,125, +    3,0,120,52,0,124,2,0,68,93,44,0,92,2,0,137, +    0,0,125,4,0,124,3,0,106,0,0,135,0,0,102,1, +    0,100,1,0,100,2,0,134,0,0,124,4,0,68,131,1, +    0,131,1,0,1,113,13,0,87,124,3,0,124,0,0,95, +    1,0,124,1,0,112,79,0,100,3,0,124,0,0,95,2, +    0,100,6,0,124,0,0,95,3,0,116,4,0,131,0,0, +    124,0,0,95,5,0,116,4,0,131,0,0,124,0,0,95, +    6,0,100,5,0,83,40,7,0,0,0,117,201,0,0,0, +    73,110,105,116,105,97,108,105,122,101,32,119,105,116,104,32, +    116,104,101,32,112,97,116,104,32,116,111,32,115,101,97,114, +    99,104,32,111,110,32,97,110,100,32,97,32,118,97,114,105, +    97,98,108,101,32,110,117,109,98,101,114,32,111,102,10,32, +    32,32,32,32,32,32,32,51,45,116,117,112,108,101,115,32, +    99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,108, +    111,97,100,101,114,44,32,102,105,108,101,32,115,117,102,102, +    105,120,101,115,32,116,104,101,32,108,111,97,100,101,114,32, +    114,101,99,111,103,110,105,122,101,115,44,10,32,32,32,32, +    32,32,32,32,97,110,100,32,97,32,98,111,111,108,101,97, +    110,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101, +    32,108,111,97,100,101,114,32,104,97,110,100,108,101,115,32, +    112,97,99,107,97,103,101,115,46,99,1,0,0,0,0,0, +    0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,27, +    0,0,0,124,0,0,93,17,0,125,1,0,124,1,0,136, +    0,0,102,2,0,86,1,113,3,0,100,0,0,83,40,1, +    0,0,0,78,40,0,0,0,0,40,2,0,0,0,117,2, +    0,0,0,46,48,117,6,0,0,0,115,117,102,102,105,120, +    40,1,0,0,0,117,6,0,0,0,108,111,97,100,101,114, +    40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, +    110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, +    116,115,116,114,97,112,62,117,9,0,0,0,60,103,101,110, +    101,120,112,114,62,56,5,0,0,115,2,0,0,0,6,0, +    117,38,0,0,0,70,105,108,101,70,105,110,100,101,114,46, +    95,95,105,110,105,116,95,95,46,60,108,111,99,97,108,115, +    62,46,60,103,101,110,101,120,112,114,62,117,1,0,0,0, +    46,105,1,0,0,0,78,105,255,255,255,255,40,7,0,0, +    0,117,6,0,0,0,101,120,116,101,110,100,117,8,0,0, +    0,95,108,111,97,100,101,114,115,117,4,0,0,0,112,97, +    116,104,117,11,0,0,0,95,112,97,116,104,95,109,116,105, +    109,101,117,3,0,0,0,115,101,116,117,11,0,0,0,95, +    112,97,116,104,95,99,97,99,104,101,117,19,0,0,0,95, +    114,101,108,97,120,101,100,95,112,97,116,104,95,99,97,99, +    104,101,40,5,0,0,0,117,4,0,0,0,115,101,108,102, +    117,4,0,0,0,112,97,116,104,117,7,0,0,0,100,101, +    116,97,105,108,115,117,7,0,0,0,108,111,97,100,101,114, +    115,117,8,0,0,0,115,117,102,102,105,120,101,115,40,0, +    0,0,0,40,1,0,0,0,117,6,0,0,0,108,111,97, +    100,101,114,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,8,0,0,0,95,95,105,110,105,116, +    95,95,50,5,0,0,115,16,0,0,0,0,4,6,1,19, +    1,36,1,9,2,15,1,9,1,12,1,117,19,0,0,0, +    70,105,108,101,70,105,110,100,101,114,46,95,95,105,110,105, +    116,95,95,99,1,0,0,0,0,0,0,0,1,0,0,0, +    2,0,0,0,67,0,0,0,115,13,0,0,0,100,3,0, +    124,0,0,95,0,0,100,2,0,83,40,4,0,0,0,117, +    31,0,0,0,73,110,118,97,108,105,100,97,116,101,32,116, +    104,101,32,100,105,114,101,99,116,111,114,121,32,109,116,105, +    109,101,46,105,1,0,0,0,78,105,255,255,255,255,40,1, +    0,0,0,117,11,0,0,0,95,112,97,116,104,95,109,116, +    105,109,101,40,1,0,0,0,117,4,0,0,0,115,101,108, +    102,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, +    60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, +    98,46,95,98,111,111,116,115,116,114,97,112,62,117,17,0, +    0,0,105,110,118,97,108,105,100,97,116,101,95,99,97,99, +    104,101,115,64,5,0,0,115,2,0,0,0,0,2,117,28, +    0,0,0,70,105,108,101,70,105,110,100,101,114,46,105,110, +    118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,99, +    2,0,0,0,0,0,0,0,12,0,0,0,13,0,0,0, +    67,0,0,0,115,172,1,0,0,100,5,0,125,2,0,124, +    1,0,106,1,0,100,1,0,131,1,0,100,2,0,25,125, +    3,0,121,25,0,116,2,0,106,3,0,124,0,0,106,4, +    0,131,1,0,106,5,0,125,4,0,87,110,24,0,4,116, +    6,0,107,10,0,114,76,0,1,1,1,100,6,0,125,4, +    0,89,110,1,0,88,124,4,0,124,0,0,106,7,0,107, +    3,0,114,114,0,124,0,0,106,8,0,131,0,0,1,124, +    4,0,124,0,0,95,7,0,110,0,0,116,9,0,131,0, +    0,114,147,0,124,0,0,106,10,0,125,5,0,124,3,0, +    106,11,0,131,0,0,125,6,0,110,15,0,124,0,0,106, +    12,0,125,5,0,124,3,0,125,6,0,124,6,0,124,5, +    0,107,6,0,114,45,1,116,13,0,124,0,0,106,4,0, +    124,3,0,131,2,0,125,7,0,116,14,0,124,7,0,131, +    1,0,114,45,1,120,91,0,124,0,0,106,15,0,68,93, +    71,0,92,2,0,125,8,0,125,9,0,100,4,0,124,8, +    0,23,125,10,0,116,13,0,124,7,0,124,10,0,131,2, +    0,125,11,0,116,16,0,124,11,0,131,1,0,114,214,0, +    124,9,0,124,1,0,124,11,0,131,2,0,124,7,0,103, +    1,0,102,2,0,83,113,214,0,87,100,7,0,125,2,0, +    113,45,1,110,0,0,120,95,0,124,0,0,106,15,0,68, +    93,84,0,92,2,0,125,8,0,125,9,0,124,6,0,124, +    8,0,23,124,5,0,107,6,0,114,55,1,116,13,0,124, +    0,0,106,4,0,124,3,0,124,8,0,23,131,2,0,125, +    11,0,116,16,0,124,11,0,131,1,0,114,139,1,124,9, +    0,124,1,0,124,11,0,131,2,0,103,0,0,102,2,0, +    83,113,55,1,113,55,1,87,124,2,0,114,162,1,100,8, +    0,124,7,0,103,1,0,102,2,0,83,100,8,0,103,0, +    0,102,2,0,83,40,9,0,0,0,117,125,0,0,0,84, +    114,121,32,116,111,32,102,105,110,100,32,97,32,108,111,97, +    100,101,114,32,102,111,114,32,116,104,101,32,115,112,101,99, +    105,102,105,101,100,32,109,111,100,117,108,101,44,32,111,114, +    32,116,104,101,32,110,97,109,101,115,112,97,99,101,10,32, +    32,32,32,32,32,32,32,112,97,99,107,97,103,101,32,112, +    111,114,116,105,111,110,115,46,32,82,101,116,117,114,110,115, +    32,40,108,111,97,100,101,114,44,32,108,105,115,116,45,111, +    102,45,112,111,114,116,105,111,110,115,41,46,117,1,0,0, +    0,46,105,2,0,0,0,105,1,0,0,0,117,8,0,0, +    0,95,95,105,110,105,116,95,95,70,105,255,255,255,255,84, +    78,40,19,0,0,0,117,5,0,0,0,70,97,108,115,101, +    117,10,0,0,0,114,112,97,114,116,105,116,105,111,110,117, +    3,0,0,0,95,111,115,117,4,0,0,0,115,116,97,116, +    117,4,0,0,0,112,97,116,104,117,8,0,0,0,115,116, +    95,109,116,105,109,101,117,7,0,0,0,79,83,69,114,114, +    111,114,117,11,0,0,0,95,112,97,116,104,95,109,116,105, +    109,101,117,11,0,0,0,95,102,105,108,108,95,99,97,99, +    104,101,117,11,0,0,0,95,114,101,108,97,120,95,99,97, +    115,101,117,19,0,0,0,95,114,101,108,97,120,101,100,95, +    112,97,116,104,95,99,97,99,104,101,117,5,0,0,0,108, +    111,119,101,114,117,11,0,0,0,95,112,97,116,104,95,99, +    97,99,104,101,117,10,0,0,0,95,112,97,116,104,95,106, +    111,105,110,117,11,0,0,0,95,112,97,116,104,95,105,115, +    100,105,114,117,8,0,0,0,95,108,111,97,100,101,114,115, +    117,12,0,0,0,95,112,97,116,104,95,105,115,102,105,108, +    101,117,4,0,0,0,84,114,117,101,117,4,0,0,0,78, +    111,110,101,40,12,0,0,0,117,4,0,0,0,115,101,108, +    102,117,8,0,0,0,102,117,108,108,110,97,109,101,117,12, +    0,0,0,105,115,95,110,97,109,101,115,112,97,99,101,117, +    11,0,0,0,116,97,105,108,95,109,111,100,117,108,101,117, +    5,0,0,0,109,116,105,109,101,117,5,0,0,0,99,97, +    99,104,101,117,12,0,0,0,99,97,99,104,101,95,109,111, +    100,117,108,101,117,9,0,0,0,98,97,115,101,95,112,97, +    116,104,117,6,0,0,0,115,117,102,102,105,120,117,6,0, +    0,0,108,111,97,100,101,114,117,13,0,0,0,105,110,105, +    116,95,102,105,108,101,110,97,109,101,117,9,0,0,0,102, +    117,108,108,95,112,97,116,104,40,0,0,0,0,40,0,0, +    0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, +    109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, +    114,97,112,62,117,11,0,0,0,102,105,110,100,95,108,111, +    97,100,101,114,70,5,0,0,115,62,0,0,0,0,3,6, +    1,19,1,3,1,25,1,13,1,11,1,15,1,10,1,12, +    2,9,1,9,1,15,2,9,1,6,2,12,1,18,1,12, +    1,22,1,10,1,15,1,12,1,26,4,12,2,22,1,16, +    1,22,1,12,1,26,1,6,1,13,1,117,22,0,0,0, +    70,105,108,101,70,105,110,100,101,114,46,102,105,110,100,95, +    108,111,97,100,101,114,99,1,0,0,0,0,0,0,0,9, +    0,0,0,12,0,0,0,67,0,0,0,115,255,0,0,0, +    124,0,0,106,0,0,125,1,0,121,19,0,116,1,0,106, +    2,0,124,1,0,131,1,0,125,2,0,87,110,24,0,4, +    116,3,0,107,10,0,114,54,0,1,1,1,103,0,0,125, +    2,0,89,110,1,0,88,116,4,0,106,5,0,106,6,0, +    100,1,0,131,1,0,115,91,0,116,7,0,124,2,0,131, +    1,0,124,0,0,95,8,0,110,111,0,116,7,0,131,0, +    0,125,3,0,120,90,0,124,2,0,68,93,82,0,125,4, +    0,124,4,0,106,9,0,100,2,0,131,1,0,92,3,0, +    125,5,0,125,6,0,125,7,0,124,6,0,114,170,0,100, +    3,0,106,10,0,124,5,0,124,7,0,106,11,0,131,0, +    0,131,2,0,125,8,0,110,6,0,124,5,0,125,8,0, +    124,3,0,106,12,0,124,8,0,131,1,0,1,113,107,0, +    87,124,3,0,124,0,0,95,8,0,116,4,0,106,5,0, +    106,6,0,116,13,0,131,1,0,114,251,0,116,7,0,100, +    4,0,100,5,0,132,0,0,124,2,0,68,131,1,0,131, +    1,0,124,0,0,95,14,0,110,0,0,100,6,0,83,40, +    7,0,0,0,117,68,0,0,0,70,105,108,108,32,116,104, +    101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110, +    116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100, +    32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104, +    105,115,32,100,105,114,101,99,116,111,114,121,46,117,3,0, +    0,0,119,105,110,117,1,0,0,0,46,117,5,0,0,0, +    123,125,46,123,125,99,1,0,0,0,0,0,0,0,2,0, +    0,0,2,0,0,0,115,0,0,0,115,27,0,0,0,124, +    0,0,93,17,0,125,1,0,124,1,0,106,0,0,131,0, +    0,86,1,113,3,0,100,0,0,83,40,1,0,0,0,78, +    40,1,0,0,0,117,5,0,0,0,108,111,119,101,114,40, +    2,0,0,0,117,2,0,0,0,46,48,117,2,0,0,0, +    102,110,40,0,0,0,0,40,0,0,0,0,117,29,0,0, +    0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, +    105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,9, +    0,0,0,60,103,101,110,101,120,112,114,62,140,5,0,0, +    115,2,0,0,0,6,0,117,41,0,0,0,70,105,108,101, +    70,105,110,100,101,114,46,95,102,105,108,108,95,99,97,99, +    104,101,46,60,108,111,99,97,108,115,62,46,60,103,101,110, +    101,120,112,114,62,78,40,15,0,0,0,117,4,0,0,0, +    112,97,116,104,117,3,0,0,0,95,111,115,117,7,0,0, +    0,108,105,115,116,100,105,114,117,17,0,0,0,70,105,108, +    101,78,111,116,70,111,117,110,100,69,114,114,111,114,117,3, +    0,0,0,115,121,115,117,8,0,0,0,112,108,97,116,102, +    111,114,109,117,10,0,0,0,115,116,97,114,116,115,119,105, +    116,104,117,3,0,0,0,115,101,116,117,11,0,0,0,95, +    112,97,116,104,95,99,97,99,104,101,117,9,0,0,0,112, +    97,114,116,105,116,105,111,110,117,6,0,0,0,102,111,114, +    109,97,116,117,5,0,0,0,108,111,119,101,114,117,3,0, +    0,0,97,100,100,117,27,0,0,0,95,67,65,83,69,95, +    73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,84, +    70,79,82,77,83,117,19,0,0,0,95,114,101,108,97,120, +    101,100,95,112,97,116,104,95,99,97,99,104,101,40,9,0, +    0,0,117,4,0,0,0,115,101,108,102,117,4,0,0,0, +    112,97,116,104,117,8,0,0,0,99,111,110,116,101,110,116, +    115,117,21,0,0,0,108,111,119,101,114,95,115,117,102,102, +    105,120,95,99,111,110,116,101,110,116,115,117,4,0,0,0, +    105,116,101,109,117,4,0,0,0,110,97,109,101,117,3,0, +    0,0,100,111,116,117,6,0,0,0,115,117,102,102,105,120, +    117,8,0,0,0,110,101,119,95,110,97,109,101,40,0,0, +    0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, +    122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, +    111,111,116,115,116,114,97,112,62,117,11,0,0,0,95,102, +    105,108,108,95,99,97,99,104,101,112,5,0,0,115,34,0, +    0,0,0,2,9,1,3,1,19,1,13,2,11,3,18,1, +    18,7,9,1,13,1,24,1,6,1,27,2,6,1,17,1, +    9,1,18,1,117,22,0,0,0,70,105,108,101,70,105,110, +    100,101,114,46,95,102,105,108,108,95,99,97,99,104,101,99, +    1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, +    7,0,0,0,115,25,0,0,0,135,0,0,135,1,0,102, +    2,0,100,1,0,100,2,0,134,0,0,125,2,0,124,2, +    0,83,40,3,0,0,0,117,20,1,0,0,65,32,99,108, +    97,115,115,32,109,101,116,104,111,100,32,119,104,105,99,104, +    32,114,101,116,117,114,110,115,32,97,32,99,108,111,115,117, +    114,101,32,116,111,32,117,115,101,32,111,110,32,115,121,115, +    46,112,97,116,104,95,104,111,111,107,10,32,32,32,32,32, +    32,32,32,119,104,105,99,104,32,119,105,108,108,32,114,101, +    116,117,114,110,32,97,110,32,105,110,115,116,97,110,99,101, +    32,117,115,105,110,103,32,116,104,101,32,115,112,101,99,105, +    102,105,101,100,32,108,111,97,100,101,114,115,32,97,110,100, +    32,116,104,101,32,112,97,116,104,10,32,32,32,32,32,32, +    32,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32, +    99,108,111,115,117,114,101,46,10,10,32,32,32,32,32,32, +    32,32,73,102,32,116,104,101,32,112,97,116,104,32,99,97, +    108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115, +    117,114,101,32,105,115,32,110,111,116,32,97,32,100,105,114, +    101,99,116,111,114,121,44,32,73,109,112,111,114,116,69,114, +    114,111,114,32,105,115,10,32,32,32,32,32,32,32,32,114, +    97,105,115,101,100,46,10,10,32,32,32,32,32,32,32,32, +    99,1,0,0,0,0,0,0,0,1,0,0,0,4,0,0, +    0,19,0,0,0,115,46,0,0,0,116,0,0,124,0,0, +    131,1,0,115,33,0,116,1,0,100,1,0,100,2,0,124, +    0,0,131,1,1,130,1,0,110,0,0,136,0,0,124,0, +    0,136,1,0,140,1,0,83,40,3,0,0,0,117,45,0, +    0,0,80,97,116,104,32,104,111,111,107,32,102,111,114,32, +    105,109,112,111,114,116,108,105,98,46,109,97,99,104,105,110, +    101,114,121,46,70,105,108,101,70,105,110,100,101,114,46,117, +    30,0,0,0,111,110,108,121,32,100,105,114,101,99,116,111, +    114,105,101,115,32,97,114,101,32,115,117,112,112,111,114,116, +    101,100,117,4,0,0,0,112,97,116,104,40,2,0,0,0, +    117,11,0,0,0,95,112,97,116,104,95,105,115,100,105,114, +    117,11,0,0,0,73,109,112,111,114,116,69,114,114,111,114, +    40,1,0,0,0,117,4,0,0,0,112,97,116,104,40,2, +    0,0,0,117,3,0,0,0,99,108,115,117,14,0,0,0, +    108,111,97,100,101,114,95,100,101,116,97,105,108,115,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,24,0,0,0,112,97,116,104,95,104, +    111,111,107,95,102,111,114,95,70,105,108,101,70,105,110,100, +    101,114,152,5,0,0,115,6,0,0,0,0,2,12,1,21, +    1,117,54,0,0,0,70,105,108,101,70,105,110,100,101,114, +    46,112,97,116,104,95,104,111,111,107,46,60,108,111,99,97, +    108,115,62,46,112,97,116,104,95,104,111,111,107,95,102,111, +    114,95,70,105,108,101,70,105,110,100,101,114,40,0,0,0, +    0,40,3,0,0,0,117,3,0,0,0,99,108,115,117,14, +    0,0,0,108,111,97,100,101,114,95,100,101,116,97,105,108, +    115,117,24,0,0,0,112,97,116,104,95,104,111,111,107,95, +    102,111,114,95,70,105,108,101,70,105,110,100,101,114,40,0, +    0,0,0,40,2,0,0,0,117,3,0,0,0,99,108,115, +    117,14,0,0,0,108,111,97,100,101,114,95,100,101,116,97, +    105,108,115,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,9,0,0,0,112,97,116,104,95,104, +    111,111,107,142,5,0,0,115,4,0,0,0,0,10,21,6, +    117,20,0,0,0,70,105,108,101,70,105,110,100,101,114,46, +    112,97,116,104,95,104,111,111,107,99,1,0,0,0,0,0, +    0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,14, +    0,0,0,100,1,0,124,0,0,106,0,0,102,1,0,22, +    83,40,2,0,0,0,78,117,14,0,0,0,70,105,108,101, +    70,105,110,100,101,114,40,37,114,41,40,1,0,0,0,117, +    4,0,0,0,112,97,116,104,40,1,0,0,0,117,4,0, +    0,0,115,101,108,102,40,0,0,0,0,40,0,0,0,0, +    117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, +    111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, +    112,62,117,8,0,0,0,95,95,114,101,112,114,95,95,160, +    5,0,0,115,2,0,0,0,0,1,117,19,0,0,0,70, +    105,108,101,70,105,110,100,101,114,46,95,95,114,101,112,114, +    95,95,78,40,13,0,0,0,117,8,0,0,0,95,95,110, +    97,109,101,95,95,117,10,0,0,0,95,95,109,111,100,117, +    108,101,95,95,117,12,0,0,0,95,95,113,117,97,108,110, +    97,109,101,95,95,117,7,0,0,0,95,95,100,111,99,95, +    95,117,8,0,0,0,95,95,105,110,105,116,95,95,117,17, +    0,0,0,105,110,118,97,108,105,100,97,116,101,95,99,97, +    99,104,101,115,117,17,0,0,0,95,102,105,110,100,95,109, +    111,100,117,108,101,95,115,104,105,109,117,11,0,0,0,102, +    105,110,100,95,109,111,100,117,108,101,117,11,0,0,0,102, +    105,110,100,95,108,111,97,100,101,114,117,11,0,0,0,95, +    102,105,108,108,95,99,97,99,104,101,117,11,0,0,0,99, +    108,97,115,115,109,101,116,104,111,100,117,9,0,0,0,112, +    97,116,104,95,104,111,111,107,117,8,0,0,0,95,95,114, +    101,112,114,95,95,40,1,0,0,0,117,10,0,0,0,95, +    95,108,111,99,97,108,115,95,95,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,10,0,0,0,70,105,108,101,70,105, +    110,100,101,114,41,5,0,0,115,16,0,0,0,16,7,6, +    2,12,14,12,4,6,2,12,42,12,30,18,18,117,10,0, +    0,0,70,105,108,101,70,105,110,100,101,114,99,1,0,0, +    0,0,0,0,0,1,0,0,0,2,0,0,0,66,0,0, +    0,115,50,0,0,0,124,0,0,69,101,0,0,90,1,0, +    100,0,0,90,2,0,100,1,0,90,3,0,100,2,0,100, +    3,0,132,0,0,90,4,0,100,4,0,100,5,0,132,0, +    0,90,5,0,100,6,0,83,40,7,0,0,0,117,18,0, +    0,0,95,73,109,112,111,114,116,76,111,99,107,67,111,110, +    116,101,120,116,117,36,0,0,0,67,111,110,116,101,120,116, +    32,109,97,110,97,103,101,114,32,102,111,114,32,116,104,101, +    32,105,109,112,111,114,116,32,108,111,99,107,46,99,1,0, +    0,0,0,0,0,0,1,0,0,0,1,0,0,0,67,0, +    0,0,115,14,0,0,0,116,0,0,106,1,0,131,0,0, +    1,100,1,0,83,40,2,0,0,0,117,24,0,0,0,65, +    99,113,117,105,114,101,32,116,104,101,32,105,109,112,111,114, +    116,32,108,111,99,107,46,78,40,2,0,0,0,117,4,0, +    0,0,95,105,109,112,117,12,0,0,0,97,99,113,117,105, +    114,101,95,108,111,99,107,40,1,0,0,0,117,4,0,0, +    0,115,101,108,102,40,0,0,0,0,40,0,0,0,0,117, +    29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, +    114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, +    62,117,9,0,0,0,95,95,101,110,116,101,114,95,95,170, +    5,0,0,115,2,0,0,0,0,2,117,28,0,0,0,95, +    73,109,112,111,114,116,76,111,99,107,67,111,110,116,101,120, +    116,46,95,95,101,110,116,101,114,95,95,99,4,0,0,0, +    0,0,0,0,4,0,0,0,1,0,0,0,67,0,0,0, +    115,14,0,0,0,116,0,0,106,1,0,131,0,0,1,100, +    1,0,83,40,2,0,0,0,117,60,0,0,0,82,101,108, +    101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32, +    108,111,99,107,32,114,101,103,97,114,100,108,101,115,115,32, +    111,102,32,97,110,121,32,114,97,105,115,101,100,32,101,120, +    99,101,112,116,105,111,110,115,46,78,40,2,0,0,0,117, +    4,0,0,0,95,105,109,112,117,12,0,0,0,114,101,108, +    101,97,115,101,95,108,111,99,107,40,4,0,0,0,117,4, +    0,0,0,115,101,108,102,117,8,0,0,0,101,120,99,95, +    116,121,112,101,117,9,0,0,0,101,120,99,95,118,97,108, +    117,101,117,13,0,0,0,101,120,99,95,116,114,97,99,101, +    98,97,99,107,40,0,0,0,0,40,0,0,0,0,117,29, +    0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, +    116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, +    117,8,0,0,0,95,95,101,120,105,116,95,95,174,5,0, +    0,115,2,0,0,0,0,2,117,27,0,0,0,95,73,109, +    112,111,114,116,76,111,99,107,67,111,110,116,101,120,116,46, +    95,95,101,120,105,116,95,95,78,40,6,0,0,0,117,8, +    0,0,0,95,95,110,97,109,101,95,95,117,10,0,0,0, +    95,95,109,111,100,117,108,101,95,95,117,12,0,0,0,95, +    95,113,117,97,108,110,97,109,101,95,95,117,7,0,0,0, +    95,95,100,111,99,95,95,117,9,0,0,0,95,95,101,110, +    116,101,114,95,95,117,8,0,0,0,95,95,101,120,105,116, +    95,95,40,1,0,0,0,117,10,0,0,0,95,95,108,111, +    99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0, +    117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, +    111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, +    112,62,117,18,0,0,0,95,73,109,112,111,114,116,76,111, +    99,107,67,111,110,116,101,120,116,166,5,0,0,115,6,0, +    0,0,16,2,6,2,12,4,117,18,0,0,0,95,73,109, +    112,111,114,116,76,111,99,107,67,111,110,116,101,120,116,99, +    3,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0, +    67,0,0,0,115,91,0,0,0,124,1,0,106,0,0,100, +    1,0,124,2,0,100,2,0,24,131,2,0,125,3,0,116, +    1,0,124,3,0,131,1,0,124,2,0,107,0,0,114,55, +    0,116,2,0,100,3,0,131,1,0,130,1,0,110,0,0, +    124,3,0,100,4,0,25,125,4,0,124,0,0,114,87,0, +    100,5,0,106,3,0,124,4,0,124,0,0,131,2,0,83, +    124,4,0,83,40,6,0,0,0,117,50,0,0,0,82,101, +    115,111,108,118,101,32,97,32,114,101,108,97,116,105,118,101, +    32,109,111,100,117,108,101,32,110,97,109,101,32,116,111,32, +    97,110,32,97,98,115,111,108,117,116,101,32,111,110,101,46, +    117,1,0,0,0,46,105,1,0,0,0,117,50,0,0,0, +    97,116,116,101,109,112,116,101,100,32,114,101,108,97,116,105, +    118,101,32,105,109,112,111,114,116,32,98,101,121,111,110,100, +    32,116,111,112,45,108,101,118,101,108,32,112,97,99,107,97, +    103,101,105,0,0,0,0,117,5,0,0,0,123,125,46,123, +    125,40,4,0,0,0,117,6,0,0,0,114,115,112,108,105, +    116,117,3,0,0,0,108,101,110,117,10,0,0,0,86,97, +    108,117,101,69,114,114,111,114,117,6,0,0,0,102,111,114, +    109,97,116,40,5,0,0,0,117,4,0,0,0,110,97,109, +    101,117,7,0,0,0,112,97,99,107,97,103,101,117,5,0, +    0,0,108,101,118,101,108,117,4,0,0,0,98,105,116,115, +    117,4,0,0,0,98,97,115,101,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,13,0,0,0,95,114,101,115,111,108, +    118,101,95,110,97,109,101,179,5,0,0,115,10,0,0,0, +    0,2,22,1,18,1,15,1,10,1,117,13,0,0,0,95, +    114,101,115,111,108,118,101,95,110,97,109,101,99,2,0,0, +    0,0,0,0,0,4,0,0,0,11,0,0,0,67,0,0, +    0,115,138,0,0,0,116,0,0,106,1,0,115,28,0,116, +    2,0,106,3,0,100,1,0,116,4,0,131,2,0,1,110, +    0,0,120,103,0,116,0,0,106,1,0,68,93,88,0,125, +    2,0,116,5,0,131,0,0,143,23,0,1,124,2,0,106, +    6,0,124,0,0,124,1,0,131,2,0,125,3,0,87,100, +    2,0,81,88,124,3,0,100,2,0,107,9,0,114,38,0, +    124,0,0,116,0,0,106,8,0,107,7,0,114,109,0,124, +    3,0,83,116,0,0,106,8,0,124,0,0,25,106,9,0, +    83,113,38,0,113,38,0,87,100,2,0,83,100,2,0,83, +    40,3,0,0,0,117,23,0,0,0,70,105,110,100,32,97, +    32,109,111,100,117,108,101,39,115,32,108,111,97,100,101,114, +    46,117,22,0,0,0,115,121,115,46,109,101,116,97,95,112, +    97,116,104,32,105,115,32,101,109,112,116,121,78,40,10,0, +    0,0,117,3,0,0,0,115,121,115,117,9,0,0,0,109, +    101,116,97,95,112,97,116,104,117,9,0,0,0,95,119,97, +    114,110,105,110,103,115,117,4,0,0,0,119,97,114,110,117, +    13,0,0,0,73,109,112,111,114,116,87,97,114,110,105,110, +    103,117,18,0,0,0,95,73,109,112,111,114,116,76,111,99, +    107,67,111,110,116,101,120,116,117,11,0,0,0,102,105,110, +    100,95,109,111,100,117,108,101,117,4,0,0,0,78,111,110, +    101,117,7,0,0,0,109,111,100,117,108,101,115,117,10,0, +    0,0,95,95,108,111,97,100,101,114,95,95,40,4,0,0, +    0,117,4,0,0,0,110,97,109,101,117,4,0,0,0,112, +    97,116,104,117,6,0,0,0,102,105,110,100,101,114,117,6, +    0,0,0,108,111,97,100,101,114,40,0,0,0,0,40,0, +    0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, +    105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, +    116,114,97,112,62,117,12,0,0,0,95,102,105,110,100,95, +    109,111,100,117,108,101,188,5,0,0,115,20,0,0,0,0, +    2,9,1,19,1,16,1,10,1,24,1,12,2,15,1,4, +    2,21,2,117,12,0,0,0,95,102,105,110,100,95,109,111, +    100,117,108,101,99,3,0,0,0,0,0,0,0,4,0,0, +    0,4,0,0,0,67,0,0,0,115,194,0,0,0,116,0, +    0,124,0,0,116,1,0,131,2,0,115,45,0,116,2,0, +    100,1,0,106,3,0,116,4,0,124,0,0,131,1,0,131, +    1,0,131,1,0,130,1,0,110,0,0,124,2,0,100,2, +    0,107,0,0,114,72,0,116,5,0,100,3,0,131,1,0, +    130,1,0,110,0,0,124,1,0,114,156,0,116,0,0,124, +    1,0,116,1,0,131,2,0,115,108,0,116,2,0,100,4, +    0,131,1,0,130,1,0,113,156,0,124,1,0,116,6,0, +    106,7,0,107,7,0,114,156,0,100,5,0,125,3,0,116, +    8,0,124,3,0,106,3,0,124,1,0,131,1,0,131,1, +    0,130,1,0,113,156,0,110,0,0,124,0,0,12,114,190, +    0,124,2,0,100,2,0,107,2,0,114,190,0,116,5,0, +    100,6,0,131,1,0,130,1,0,110,0,0,100,7,0,83, +    40,8,0,0,0,117,28,0,0,0,86,101,114,105,102,121, +    32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,34, +    115,97,110,101,34,46,117,31,0,0,0,109,111,100,117,108, +    101,32,110,97,109,101,32,109,117,115,116,32,98,101,32,115, +    116,114,44,32,110,111,116,32,123,125,105,0,0,0,0,117, +    18,0,0,0,108,101,118,101,108,32,109,117,115,116,32,98, +    101,32,62,61,32,48,117,31,0,0,0,95,95,112,97,99, +    107,97,103,101,95,95,32,110,111,116,32,115,101,116,32,116, +    111,32,97,32,115,116,114,105,110,103,117,61,0,0,0,80, +    97,114,101,110,116,32,109,111,100,117,108,101,32,123,33,114, +    125,32,110,111,116,32,108,111,97,100,101,100,44,32,99,97, +    110,110,111,116,32,112,101,114,102,111,114,109,32,114,101,108, +    97,116,105,118,101,32,105,109,112,111,114,116,117,17,0,0, +    0,69,109,112,116,121,32,109,111,100,117,108,101,32,110,97, +    109,101,78,40,9,0,0,0,117,10,0,0,0,105,115,105, +    110,115,116,97,110,99,101,117,3,0,0,0,115,116,114,117, +    9,0,0,0,84,121,112,101,69,114,114,111,114,117,6,0, +    0,0,102,111,114,109,97,116,117,4,0,0,0,116,121,112, +    101,117,10,0,0,0,86,97,108,117,101,69,114,114,111,114, +    117,3,0,0,0,115,121,115,117,7,0,0,0,109,111,100, +    117,108,101,115,117,11,0,0,0,83,121,115,116,101,109,69, +    114,114,111,114,40,4,0,0,0,117,4,0,0,0,110,97, +    109,101,117,7,0,0,0,112,97,99,107,97,103,101,117,5, +    0,0,0,108,101,118,101,108,117,3,0,0,0,109,115,103, +    40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, +    102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, +    46,95,98,111,111,116,115,116,114,97,112,62,117,13,0,0, +    0,95,115,97,110,105,116,121,95,99,104,101,99,107,205,5, +    0,0,115,24,0,0,0,0,2,15,1,30,1,12,1,15, +    1,6,1,15,1,15,1,15,1,6,2,27,1,19,1,117, +    13,0,0,0,95,115,97,110,105,116,121,95,99,104,101,99, +    107,117,20,0,0,0,78,111,32,109,111,100,117,108,101,32, +    110,97,109,101,100,32,123,33,114,125,99,2,0,0,0,0, +    0,0,0,9,0,0,0,27,0,0,0,67,0,0,0,115, +    12,2,0,0,100,0,0,125,2,0,124,0,0,106,1,0, +    100,1,0,131,1,0,100,2,0,25,125,3,0,124,3,0, +    114,178,0,124,3,0,116,2,0,106,3,0,107,7,0,114, +    62,0,116,4,0,124,1,0,124,3,0,131,2,0,1,110, +    0,0,124,0,0,116,2,0,106,3,0,107,6,0,114,88, +    0,116,2,0,106,3,0,124,0,0,25,83,116,2,0,106, +    3,0,124,3,0,25,125,4,0,121,13,0,124,4,0,106, +    5,0,125,2,0,87,113,178,0,4,116,6,0,107,10,0, +    114,174,0,1,1,1,116,7,0,100,3,0,23,106,8,0, +    124,0,0,124,3,0,131,2,0,125,5,0,116,9,0,124, +    5,0,100,4,0,124,0,0,131,1,1,130,1,0,89,113, +    178,0,88,110,0,0,116,10,0,124,0,0,124,2,0,131, +    2,0,125,6,0,124,6,0,100,0,0,107,8,0,114,250, +    0,116,9,0,116,7,0,106,8,0,124,0,0,131,1,0, +    100,4,0,124,0,0,131,1,1,125,7,0,100,10,0,124, +    7,0,95,12,0,124,7,0,130,1,0,110,47,0,124,0, +    0,116,2,0,106,3,0,107,7,0,114,41,1,124,6,0, +    106,13,0,124,0,0,131,1,0,1,116,14,0,100,5,0, +    124,0,0,124,6,0,131,3,0,1,110,0,0,116,2,0, +    106,3,0,124,0,0,25,125,8,0,124,3,0,114,105,1, +    116,2,0,106,3,0,124,3,0,25,125,4,0,116,15,0, +    124,4,0,124,0,0,106,1,0,100,1,0,131,1,0,100, +    6,0,25,124,8,0,131,3,0,1,110,0,0,116,16,0, +    124,8,0,100,7,0,100,0,0,131,3,0,100,0,0,107, +    8,0,114,212,1,121,59,0,124,8,0,106,17,0,124,8, +    0,95,18,0,116,19,0,124,8,0,100,8,0,131,2,0, +    115,187,1,124,8,0,106,18,0,106,1,0,100,1,0,131, +    1,0,100,2,0,25,124,8,0,95,18,0,110,0,0,87, +    113,212,1,4,116,6,0,107,10,0,114,208,1,1,1,1, +    89,113,212,1,88,110,0,0,116,19,0,124,8,0,100,9, +    0,131,2,0,115,8,2,121,13,0,124,6,0,124,8,0, +    95,20,0,87,113,8,2,4,116,6,0,107,10,0,114,4, +    2,1,1,1,89,113,8,2,88,110,0,0,124,8,0,83, +    40,11,0,0,0,78,117,1,0,0,0,46,105,0,0,0, +    0,117,21,0,0,0,59,32,123,125,32,105,115,32,110,111, +    116,32,97,32,112,97,99,107,97,103,101,117,4,0,0,0, +    110,97,109,101,117,18,0,0,0,105,109,112,111,114,116,32, +    123,33,114,125,32,35,32,123,33,114,125,105,2,0,0,0, +    117,11,0,0,0,95,95,112,97,99,107,97,103,101,95,95, +    117,8,0,0,0,95,95,112,97,116,104,95,95,117,10,0, +    0,0,95,95,108,111,97,100,101,114,95,95,84,40,21,0, +    0,0,117,4,0,0,0,78,111,110,101,117,10,0,0,0, +    114,112,97,114,116,105,116,105,111,110,117,3,0,0,0,115, +    121,115,117,7,0,0,0,109,111,100,117,108,101,115,117,25, +    0,0,0,95,99,97,108,108,95,119,105,116,104,95,102,114, +    97,109,101,115,95,114,101,109,111,118,101,100,117,8,0,0, +    0,95,95,112,97,116,104,95,95,117,14,0,0,0,65,116, +    116,114,105,98,117,116,101,69,114,114,111,114,117,8,0,0, +    0,95,69,82,82,95,77,83,71,117,6,0,0,0,102,111, +    114,109,97,116,117,11,0,0,0,73,109,112,111,114,116,69, +    114,114,111,114,117,12,0,0,0,95,102,105,110,100,95,109, +    111,100,117,108,101,117,4,0,0,0,84,114,117,101,117,10, +    0,0,0,95,110,111,116,95,102,111,117,110,100,117,11,0, +    0,0,108,111,97,100,95,109,111,100,117,108,101,117,16,0, +    0,0,95,118,101,114,98,111,115,101,95,109,101,115,115,97, +    103,101,117,7,0,0,0,115,101,116,97,116,116,114,117,7, +    0,0,0,103,101,116,97,116,116,114,117,8,0,0,0,95, +    95,110,97,109,101,95,95,117,11,0,0,0,95,95,112,97, +    99,107,97,103,101,95,95,117,7,0,0,0,104,97,115,97, +    116,116,114,117,10,0,0,0,95,95,108,111,97,100,101,114, +    95,95,40,9,0,0,0,117,4,0,0,0,110,97,109,101, +    117,7,0,0,0,105,109,112,111,114,116,95,117,4,0,0, +    0,112,97,116,104,117,6,0,0,0,112,97,114,101,110,116, +    117,13,0,0,0,112,97,114,101,110,116,95,109,111,100,117, +    108,101,117,3,0,0,0,109,115,103,117,6,0,0,0,108, +    111,97,100,101,114,117,3,0,0,0,101,120,99,117,6,0, +    0,0,109,111,100,117,108,101,40,0,0,0,0,40,0,0, +    0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, +    109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, +    114,97,112,62,117,23,0,0,0,95,102,105,110,100,95,97, +    110,100,95,108,111,97,100,95,117,110,108,111,99,107,101,100, +    224,5,0,0,115,76,0,0,0,0,1,6,1,19,1,6, +    1,15,1,16,2,15,1,11,2,13,1,3,1,13,1,13, +    1,22,1,26,1,15,1,12,1,27,3,9,1,9,1,15, +    2,13,1,19,2,13,1,6,2,13,1,32,2,24,1,3, +    1,12,1,15,1,32,1,13,1,8,2,15,1,3,1,13, +    1,13,1,8,1,117,23,0,0,0,95,102,105,110,100,95, +    97,110,100,95,108,111,97,100,95,117,110,108,111,99,107,101, +    100,99,2,0,0,0,0,0,0,0,3,0,0,0,18,0, +    0,0,67,0,0,0,115,75,0,0,0,122,16,0,116,0, +    0,124,0,0,131,1,0,125,2,0,87,100,1,0,116,1, +    0,106,2,0,131,0,0,1,88,124,2,0,106,3,0,131, +    0,0,1,122,17,0,116,4,0,124,0,0,124,1,0,131, +    2,0,83,87,100,1,0,124,2,0,106,5,0,131,0,0, +    1,88,100,1,0,83,40,2,0,0,0,117,54,0,0,0, +    70,105,110,100,32,97,110,100,32,108,111,97,100,32,116,104, +    101,32,109,111,100,117,108,101,44,32,97,110,100,32,114,101, +    108,101,97,115,101,32,116,104,101,32,105,109,112,111,114,116, +    32,108,111,99,107,46,78,40,6,0,0,0,117,16,0,0, +    0,95,103,101,116,95,109,111,100,117,108,101,95,108,111,99, +    107,117,4,0,0,0,95,105,109,112,117,12,0,0,0,114, +    101,108,101,97,115,101,95,108,111,99,107,117,7,0,0,0, +    97,99,113,117,105,114,101,117,23,0,0,0,95,102,105,110, +    100,95,97,110,100,95,108,111,97,100,95,117,110,108,111,99, +    107,101,100,117,7,0,0,0,114,101,108,101,97,115,101,40, +    3,0,0,0,117,4,0,0,0,110,97,109,101,117,7,0, +    0,0,105,109,112,111,114,116,95,117,4,0,0,0,108,111, +    99,107,40,0,0,0,0,40,0,0,0,0,117,29,0,0, +    0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, +    105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,14, +    0,0,0,95,102,105,110,100,95,97,110,100,95,108,111,97, +    100,18,6,0,0,115,14,0,0,0,0,2,3,1,16,2, +    11,1,10,1,3,1,17,2,117,14,0,0,0,95,102,105, +    110,100,95,97,110,100,95,108,111,97,100,99,3,0,0,0, +    0,0,0,0,5,0,0,0,4,0,0,0,67,0,0,0, +    115,172,0,0,0,116,0,0,124,0,0,124,1,0,124,2, +    0,131,3,0,1,124,2,0,100,1,0,107,4,0,114,49, +    0,116,1,0,124,0,0,124,1,0,124,2,0,131,3,0, +    125,0,0,110,0,0,116,2,0,106,3,0,131,0,0,1, +    124,0,0,116,4,0,106,5,0,107,7,0,114,87,0,116, +    6,0,124,0,0,116,7,0,131,2,0,83,116,4,0,106, +    5,0,124,0,0,25,125,3,0,124,3,0,100,4,0,107, +    8,0,114,158,0,116,2,0,106,9,0,131,0,0,1,100, +    2,0,106,10,0,124,0,0,131,1,0,125,4,0,116,11, +    0,124,4,0,100,3,0,124,0,0,131,1,1,130,1,0, +    110,0,0,116,12,0,124,0,0,131,1,0,1,124,3,0, +    83,40,5,0,0,0,117,50,1,0,0,73,109,112,111,114, +    116,32,97,110,100,32,114,101,116,117,114,110,32,116,104,101, +    32,109,111,100,117,108,101,32,98,97,115,101,100,32,111,110, +    32,105,116,115,32,110,97,109,101,44,32,116,104,101,32,112, +    97,99,107,97,103,101,32,116,104,101,32,99,97,108,108,32, +    105,115,10,32,32,32,32,98,101,105,110,103,32,109,97,100, +    101,32,102,114,111,109,44,32,97,110,100,32,116,104,101,32, +    108,101,118,101,108,32,97,100,106,117,115,116,109,101,110,116, +    46,10,10,32,32,32,32,84,104,105,115,32,102,117,110,99, +    116,105,111,110,32,114,101,112,114,101,115,101,110,116,115,32, +    116,104,101,32,103,114,101,97,116,101,115,116,32,99,111,109, +    109,111,110,32,100,101,110,111,109,105,110,97,116,111,114,32, +    111,102,32,102,117,110,99,116,105,111,110,97,108,105,116,121, +    10,32,32,32,32,98,101,116,119,101,101,110,32,105,109,112, +    111,114,116,95,109,111,100,117,108,101,32,97,110,100,32,95, +    95,105,109,112,111,114,116,95,95,46,32,84,104,105,115,32, +    105,110,99,108,117,100,101,115,32,115,101,116,116,105,110,103, +    32,95,95,112,97,99,107,97,103,101,95,95,32,105,102,10, +    32,32,32,32,116,104,101,32,108,111,97,100,101,114,32,100, +    105,100,32,110,111,116,46,10,10,32,32,32,32,105,0,0, +    0,0,117,40,0,0,0,105,109,112,111,114,116,32,111,102, +    32,123,125,32,104,97,108,116,101,100,59,32,78,111,110,101, +    32,105,110,32,115,121,115,46,109,111,100,117,108,101,115,117, +    4,0,0,0,110,97,109,101,78,40,13,0,0,0,117,13, +    0,0,0,95,115,97,110,105,116,121,95,99,104,101,99,107, +    117,13,0,0,0,95,114,101,115,111,108,118,101,95,110,97, +    109,101,117,4,0,0,0,95,105,109,112,117,12,0,0,0, +    97,99,113,117,105,114,101,95,108,111,99,107,117,3,0,0, +    0,115,121,115,117,7,0,0,0,109,111,100,117,108,101,115, +    117,14,0,0,0,95,102,105,110,100,95,97,110,100,95,108, +    111,97,100,117,11,0,0,0,95,103,99,100,95,105,109,112, +    111,114,116,117,4,0,0,0,78,111,110,101,117,12,0,0, +    0,114,101,108,101,97,115,101,95,108,111,99,107,117,6,0, +    0,0,102,111,114,109,97,116,117,11,0,0,0,73,109,112, +    111,114,116,69,114,114,111,114,117,19,0,0,0,95,108,111, +    99,107,95,117,110,108,111,99,107,95,109,111,100,117,108,101, +    40,5,0,0,0,117,4,0,0,0,110,97,109,101,117,7, +    0,0,0,112,97,99,107,97,103,101,117,5,0,0,0,108, +    101,118,101,108,117,6,0,0,0,109,111,100,117,108,101,117, +    7,0,0,0,109,101,115,115,97,103,101,40,0,0,0,0, +    40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, +    110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, +    116,115,116,114,97,112,62,117,11,0,0,0,95,103,99,100, +    95,105,109,112,111,114,116,31,6,0,0,115,28,0,0,0, +    0,9,16,1,12,1,21,1,10,1,15,1,13,1,13,1, +    12,1,10,1,6,1,9,1,21,1,10,1,117,11,0,0, +    0,95,103,99,100,95,105,109,112,111,114,116,99,3,0,0, +    0,0,0,0,0,5,0,0,0,17,0,0,0,67,0,0, +    0,115,233,0,0,0,116,0,0,124,0,0,100,1,0,131, +    2,0,114,229,0,100,2,0,124,1,0,107,6,0,114,89, +    0,116,1,0,124,1,0,131,1,0,125,1,0,124,1,0, +    106,2,0,100,2,0,131,1,0,1,116,0,0,124,0,0, +    100,3,0,131,2,0,114,89,0,124,1,0,106,3,0,124, +    0,0,106,4,0,131,1,0,1,113,89,0,110,0,0,120, +    137,0,124,1,0,68,93,126,0,125,3,0,116,0,0,124, +    0,0,124,3,0,131,2,0,115,96,0,121,32,0,116,5, +    0,124,2,0,100,4,0,106,6,0,124,0,0,106,7,0, +    124,3,0,131,2,0,131,2,0,1,87,113,222,0,4,116, +    8,0,107,10,0,114,218,0,1,125,4,0,1,122,35,0, +    116,0,0,124,4,0,100,5,0,131,2,0,114,197,0,124, +    4,0,106,9,0,114,197,0,110,3,0,130,0,0,87,89, +    100,6,0,100,6,0,125,4,0,126,4,0,88,113,222,0, +    88,113,96,0,113,96,0,87,110,0,0,124,0,0,83,40, +    7,0,0,0,117,238,0,0,0,70,105,103,117,114,101,32, +    111,117,116,32,119,104,97,116,32,95,95,105,109,112,111,114, +    116,95,95,32,115,104,111,117,108,100,32,114,101,116,117,114, +    110,46,10,10,32,32,32,32,84,104,101,32,105,109,112,111, +    114,116,95,32,112,97,114,97,109,101,116,101,114,32,105,115, +    32,97,32,99,97,108,108,97,98,108,101,32,119,104,105,99, +    104,32,116,97,107,101,115,32,116,104,101,32,110,97,109,101, +    32,111,102,32,109,111,100,117,108,101,32,116,111,10,32,32, +    32,32,105,109,112,111,114,116,46,32,73,116,32,105,115,32, +    114,101,113,117,105,114,101,100,32,116,111,32,100,101,99,111, +    117,112,108,101,32,116,104,101,32,102,117,110,99,116,105,111, +    110,32,102,114,111,109,32,97,115,115,117,109,105,110,103,32, +    105,109,112,111,114,116,108,105,98,39,115,10,32,32,32,32, +    105,109,112,111,114,116,32,105,109,112,108,101,109,101,110,116, +    97,116,105,111,110,32,105,115,32,100,101,115,105,114,101,100, +    46,10,10,32,32,32,32,117,8,0,0,0,95,95,112,97, +    116,104,95,95,117,1,0,0,0,42,117,7,0,0,0,95, +    95,97,108,108,95,95,117,5,0,0,0,123,125,46,123,125, +    117,10,0,0,0,95,110,111,116,95,102,111,117,110,100,78, +    40,10,0,0,0,117,7,0,0,0,104,97,115,97,116,116, +    114,117,4,0,0,0,108,105,115,116,117,6,0,0,0,114, +    101,109,111,118,101,117,6,0,0,0,101,120,116,101,110,100, +    117,7,0,0,0,95,95,97,108,108,95,95,117,25,0,0, +    0,95,99,97,108,108,95,119,105,116,104,95,102,114,97,109, +    101,115,95,114,101,109,111,118,101,100,117,6,0,0,0,102, +    111,114,109,97,116,117,8,0,0,0,95,95,110,97,109,101, +    95,95,117,11,0,0,0,73,109,112,111,114,116,69,114,114, +    111,114,117,10,0,0,0,95,110,111,116,95,102,111,117,110, +    100,40,5,0,0,0,117,6,0,0,0,109,111,100,117,108, +    101,117,8,0,0,0,102,114,111,109,108,105,115,116,117,7, +    0,0,0,105,109,112,111,114,116,95,117,1,0,0,0,120, +    117,3,0,0,0,101,120,99,40,0,0,0,0,40,0,0, +    0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, +    109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, +    114,97,112,62,117,16,0,0,0,95,104,97,110,100,108,101, +    95,102,114,111,109,108,105,115,116,55,6,0,0,115,32,0, +    0,0,0,10,15,1,12,1,12,1,13,1,15,1,22,1, +    13,1,15,1,3,1,6,1,26,1,18,6,24,1,3,2, +    32,1,117,16,0,0,0,95,104,97,110,100,108,101,95,102, +    114,111,109,108,105,115,116,99,1,0,0,0,0,0,0,0, +    2,0,0,0,2,0,0,0,67,0,0,0,115,78,0,0, +    0,124,0,0,106,0,0,100,1,0,131,1,0,125,1,0, +    124,1,0,100,6,0,107,8,0,114,74,0,124,0,0,100, +    2,0,25,125,1,0,100,3,0,124,0,0,107,7,0,114, +    74,0,124,1,0,106,2,0,100,4,0,131,1,0,100,5, +    0,25,125,1,0,113,74,0,110,0,0,124,1,0,83,40, +    7,0,0,0,117,167,0,0,0,67,97,108,99,117,108,97, +    116,101,32,119,104,97,116,32,95,95,112,97,99,107,97,103, +    101,95,95,32,115,104,111,117,108,100,32,98,101,46,10,10, +    32,32,32,32,95,95,112,97,99,107,97,103,101,95,95,32, +    105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101, +    100,32,116,111,32,98,101,32,100,101,102,105,110,101,100,32, +    111,114,32,99,111,117,108,100,32,98,101,32,115,101,116,32, +    116,111,32,78,111,110,101,10,32,32,32,32,116,111,32,114, +    101,112,114,101,115,101,110,116,32,116,104,97,116,32,105,116, +    115,32,112,114,111,112,101,114,32,118,97,108,117,101,32,105, +    115,32,117,110,107,110,111,119,110,46,10,10,32,32,32,32, +    117,11,0,0,0,95,95,112,97,99,107,97,103,101,95,95, +    117,8,0,0,0,95,95,110,97,109,101,95,95,117,8,0, +    0,0,95,95,112,97,116,104,95,95,117,1,0,0,0,46, +    105,0,0,0,0,78,40,3,0,0,0,117,3,0,0,0, +    103,101,116,117,4,0,0,0,78,111,110,101,117,10,0,0, +    0,114,112,97,114,116,105,116,105,111,110,40,2,0,0,0, +    117,7,0,0,0,103,108,111,98,97,108,115,117,7,0,0, +    0,112,97,99,107,97,103,101,40,0,0,0,0,40,0,0, +    0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, +    109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, +    114,97,112,62,117,17,0,0,0,95,99,97,108,99,95,95, +    95,112,97,99,107,97,103,101,95,95,89,6,0,0,115,12, +    0,0,0,0,7,15,1,12,1,10,1,12,1,25,1,117, +    17,0,0,0,95,99,97,108,99,95,95,95,112,97,99,107, +    97,103,101,95,95,99,0,0,0,0,0,0,0,0,3,0, +    0,0,3,0,0,0,67,0,0,0,115,55,0,0,0,116, +    0,0,116,1,0,106,2,0,131,0,0,102,2,0,125,0, +    0,116,3,0,116,4,0,102,2,0,125,1,0,116,5,0, +    116,6,0,102,2,0,125,2,0,124,0,0,124,1,0,124, +    2,0,103,3,0,83,40,1,0,0,0,117,111,0,0,0, +    82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111, +    102,32,102,105,108,101,45,98,97,115,101,100,32,109,111,100, +    117,108,101,32,108,111,97,100,101,114,115,46,10,10,32,32, +    32,32,69,97,99,104,32,105,116,101,109,32,105,115,32,97, +    32,116,117,112,108,101,32,40,108,111,97,100,101,114,44,32, +    115,117,102,102,105,120,101,115,44,32,97,108,108,111,119,95, +    112,97,99,107,97,103,101,115,41,46,10,32,32,32,32,40, +    7,0,0,0,117,19,0,0,0,69,120,116,101,110,115,105, +    111,110,70,105,108,101,76,111,97,100,101,114,117,4,0,0, +    0,95,105,109,112,117,18,0,0,0,101,120,116,101,110,115, +    105,111,110,95,115,117,102,102,105,120,101,115,117,16,0,0, +    0,83,111,117,114,99,101,70,105,108,101,76,111,97,100,101, +    114,117,15,0,0,0,83,79,85,82,67,69,95,83,85,70, +    70,73,88,69,83,117,20,0,0,0,83,111,117,114,99,101, +    108,101,115,115,70,105,108,101,76,111,97,100,101,114,117,17, +    0,0,0,66,89,84,69,67,79,68,69,95,83,85,70,70, +    73,88,69,83,40,3,0,0,0,117,10,0,0,0,101,120, +    116,101,110,115,105,111,110,115,117,6,0,0,0,115,111,117, +    114,99,101,117,8,0,0,0,98,121,116,101,99,111,100,101, +    40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, +    102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, +    46,95,98,111,111,116,115,116,114,97,112,62,117,27,0,0, +    0,95,103,101,116,95,115,117,112,112,111,114,116,101,100,95, +    102,105,108,101,95,108,111,97,100,101,114,115,104,6,0,0, +    115,8,0,0,0,0,5,18,1,12,1,12,1,117,27,0, +    0,0,95,103,101,116,95,115,117,112,112,111,114,116,101,100, +    95,102,105,108,101,95,108,111,97,100,101,114,115,99,5,0, +    0,0,0,0,0,0,9,0,0,0,5,0,0,0,67,0, +    0,0,115,227,0,0,0,124,4,0,100,1,0,107,2,0, +    114,27,0,116,0,0,124,0,0,131,1,0,125,5,0,110, +    54,0,124,1,0,100,3,0,107,9,0,114,45,0,124,1, +    0,110,3,0,105,0,0,125,6,0,116,2,0,124,6,0, +    131,1,0,125,7,0,116,0,0,124,0,0,124,7,0,124, +    4,0,131,3,0,125,5,0,124,3,0,115,207,0,124,4, +    0,100,1,0,107,2,0,114,122,0,116,0,0,124,0,0, +    106,3,0,100,2,0,131,1,0,100,1,0,25,131,1,0, +    83,124,0,0,115,132,0,124,5,0,83,116,4,0,124,0, +    0,131,1,0,116,4,0,124,0,0,106,3,0,100,2,0, +    131,1,0,100,1,0,25,131,1,0,24,125,8,0,116,5, +    0,106,6,0,124,5,0,106,7,0,100,3,0,116,4,0, +    124,5,0,106,7,0,131,1,0,124,8,0,24,133,2,0, +    25,25,83,110,16,0,116,8,0,124,5,0,124,3,0,116, +    0,0,131,3,0,83,100,3,0,83,40,4,0,0,0,117, +    214,1,0,0,73,109,112,111,114,116,32,97,32,109,111,100, +    117,108,101,46,10,10,32,32,32,32,84,104,101,32,39,103, +    108,111,98,97,108,115,39,32,97,114,103,117,109,101,110,116, +    32,105,115,32,117,115,101,100,32,116,111,32,105,110,102,101, +    114,32,119,104,101,114,101,32,116,104,101,32,105,109,112,111, +    114,116,32,105,115,32,111,99,99,117,114,105,110,103,32,102, +    114,111,109,10,32,32,32,32,116,111,32,104,97,110,100,108, +    101,32,114,101,108,97,116,105,118,101,32,105,109,112,111,114, +    116,115,46,32,84,104,101,32,39,108,111,99,97,108,115,39, +    32,97,114,103,117,109,101,110,116,32,105,115,32,105,103,110, +    111,114,101,100,46,32,84,104,101,10,32,32,32,32,39,102, +    114,111,109,108,105,115,116,39,32,97,114,103,117,109,101,110, +    116,32,115,112,101,99,105,102,105,101,115,32,119,104,97,116, +    32,115,104,111,117,108,100,32,101,120,105,115,116,32,97,115, +    32,97,116,116,114,105,98,117,116,101,115,32,111,110,32,116, +    104,101,32,109,111,100,117,108,101,10,32,32,32,32,98,101, +    105,110,103,32,105,109,112,111,114,116,101,100,32,40,101,46, +    103,46,32,96,96,102,114,111,109,32,109,111,100,117,108,101, +    32,105,109,112,111,114,116,32,60,102,114,111,109,108,105,115, +    116,62,96,96,41,46,32,32,84,104,101,32,39,108,101,118, +    101,108,39,10,32,32,32,32,97,114,103,117,109,101,110,116, +    32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32, +    112,97,99,107,97,103,101,32,108,111,99,97,116,105,111,110, +    32,116,111,32,105,109,112,111,114,116,32,102,114,111,109,32, +    105,110,32,97,32,114,101,108,97,116,105,118,101,10,32,32, +    32,32,105,109,112,111,114,116,32,40,101,46,103,46,32,96, +    96,102,114,111,109,32,46,46,112,107,103,32,105,109,112,111, +    114,116,32,109,111,100,96,96,32,119,111,117,108,100,32,104, +    97,118,101,32,97,32,39,108,101,118,101,108,39,32,111,102, +    32,50,41,46,10,10,32,32,32,32,105,0,0,0,0,117, +    1,0,0,0,46,78,40,9,0,0,0,117,11,0,0,0, +    95,103,99,100,95,105,109,112,111,114,116,117,4,0,0,0, +    78,111,110,101,117,17,0,0,0,95,99,97,108,99,95,95, +    95,112,97,99,107,97,103,101,95,95,117,9,0,0,0,112, +    97,114,116,105,116,105,111,110,117,3,0,0,0,108,101,110, +    117,3,0,0,0,115,121,115,117,7,0,0,0,109,111,100, +    117,108,101,115,117,8,0,0,0,95,95,110,97,109,101,95, +    95,117,16,0,0,0,95,104,97,110,100,108,101,95,102,114, +    111,109,108,105,115,116,40,9,0,0,0,117,4,0,0,0, +    110,97,109,101,117,7,0,0,0,103,108,111,98,97,108,115, +    117,6,0,0,0,108,111,99,97,108,115,117,8,0,0,0, +    102,114,111,109,108,105,115,116,117,5,0,0,0,108,101,118, +    101,108,117,6,0,0,0,109,111,100,117,108,101,117,8,0, +    0,0,103,108,111,98,97,108,115,95,117,7,0,0,0,112, +    97,99,107,97,103,101,117,7,0,0,0,99,117,116,95,111, +    102,102,40,0,0,0,0,40,0,0,0,0,117,29,0,0, +    0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, +    105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,10, +    0,0,0,95,95,105,109,112,111,114,116,95,95,115,6,0, +    0,115,26,0,0,0,0,11,12,1,15,2,24,1,12,1, +    18,1,6,3,12,1,23,1,6,1,4,2,35,1,40,2, +    117,10,0,0,0,95,95,105,109,112,111,114,116,95,95,99, +    2,0,0,0,0,0,0,0,14,0,0,0,13,0,0,0, +    67,0,0,0,115,169,2,0,0,124,1,0,97,0,0,124, +    0,0,97,1,0,120,47,0,116,0,0,116,1,0,102,2, +    0,68,93,33,0,125,2,0,116,2,0,124,2,0,100,1, +    0,131,2,0,115,25,0,116,3,0,124,2,0,95,4,0, +    113,25,0,113,25,0,87,116,1,0,106,5,0,116,6,0, +    25,125,3,0,120,76,0,100,28,0,68,93,68,0,125,4, +    0,124,4,0,116,1,0,106,5,0,107,7,0,114,121,0, +    116,3,0,106,7,0,124,4,0,131,1,0,125,5,0,110, +    13,0,116,1,0,106,5,0,124,4,0,25,125,5,0,116, +    8,0,124,3,0,124,4,0,124,5,0,131,3,0,1,113, +    82,0,87,100,6,0,100,7,0,103,1,0,102,2,0,100, +    8,0,100,9,0,100,7,0,103,2,0,102,2,0,100,10, +    0,100,9,0,100,7,0,103,2,0,102,2,0,102,3,0, +    125,6,0,120,189,0,124,6,0,68,93,169,0,92,2,0, +    125,7,0,125,8,0,116,9,0,100,11,0,100,12,0,132, +    0,0,124,8,0,68,131,1,0,131,1,0,115,252,0,116, +    10,0,130,1,0,124,8,0,100,13,0,25,125,9,0,124, +    7,0,116,1,0,106,5,0,107,6,0,114,38,1,116,1, +    0,106,5,0,124,7,0,25,125,10,0,80,113,209,0,121, +    60,0,116,3,0,106,7,0,124,7,0,131,1,0,125,10, +    0,124,7,0,100,10,0,107,2,0,114,96,1,100,14,0, +    116,1,0,106,11,0,107,6,0,114,96,1,124,8,0,100, +    15,0,25,125,9,0,110,0,0,80,87,113,209,0,4,116, +    12,0,107,10,0,114,121,1,1,1,1,119,209,0,89,113, +    209,0,88,113,209,0,87,116,12,0,100,16,0,131,1,0, +    130,1,0,121,19,0,116,3,0,106,7,0,100,17,0,131, +    1,0,125,11,0,87,110,24,0,4,116,12,0,107,10,0, +    114,183,1,1,1,1,100,27,0,125,11,0,89,110,1,0, +    88,116,3,0,106,7,0,100,18,0,131,1,0,125,12,0, +    124,7,0,100,8,0,107,2,0,114,245,1,116,3,0,106, +    7,0,100,19,0,131,1,0,125,13,0,116,8,0,124,3, +    0,100,20,0,124,13,0,131,3,0,1,110,0,0,116,8, +    0,124,3,0,100,21,0,124,10,0,131,3,0,1,116,8, +    0,124,3,0,100,17,0,124,11,0,131,3,0,1,116,8, +    0,124,3,0,100,18,0,124,12,0,131,3,0,1,116,8, +    0,124,3,0,100,22,0,124,9,0,131,3,0,1,116,8, +    0,124,3,0,100,23,0,116,14,0,124,8,0,131,1,0, +    131,3,0,1,116,8,0,124,3,0,100,24,0,116,15,0, +    131,0,0,131,3,0,1,116,16,0,106,17,0,116,0,0, +    106,18,0,131,0,0,131,1,0,1,124,7,0,100,8,0, +    107,2,0,114,165,2,116,19,0,106,20,0,100,25,0,131, +    1,0,1,100,26,0,116,16,0,107,6,0,114,165,2,100, +    29,0,116,22,0,95,23,0,113,165,2,110,0,0,100,27, +    0,83,40,30,0,0,0,117,250,0,0,0,83,101,116,117, +    112,32,105,109,112,111,114,116,108,105,98,32,98,121,32,105, +    109,112,111,114,116,105,110,103,32,110,101,101,100,101,100,32, +    98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, +    32,97,110,100,32,105,110,106,101,99,116,105,110,103,32,116, +    104,101,109,10,32,32,32,32,105,110,116,111,32,116,104,101, +    32,103,108,111,98,97,108,32,110,97,109,101,115,112,97,99, +    101,46,10,10,32,32,32,32,65,115,32,115,121,115,32,105, +    115,32,110,101,101,100,101,100,32,102,111,114,32,115,121,115, +    46,109,111,100,117,108,101,115,32,97,99,99,101,115,115,32, +    97,110,100,32,95,105,109,112,32,105,115,32,110,101,101,100, +    101,100,32,116,111,32,108,111,97,100,32,98,117,105,108,116, +    45,105,110,10,32,32,32,32,109,111,100,117,108,101,115,44, +    32,116,104,111,115,101,32,116,119,111,32,109,111,100,117,108, +    101,115,32,109,117,115,116,32,98,101,32,101,120,112,108,105, +    99,105,116,108,121,32,112,97,115,115,101,100,32,105,110,46, +    10,10,32,32,32,32,117,10,0,0,0,95,95,108,111,97, +    100,101,114,95,95,117,3,0,0,0,95,105,111,117,9,0, +    0,0,95,119,97,114,110,105,110,103,115,117,8,0,0,0, +    98,117,105,108,116,105,110,115,117,7,0,0,0,109,97,114, +    115,104,97,108,117,5,0,0,0,112,111,115,105,120,117,1, +    0,0,0,47,117,2,0,0,0,110,116,117,1,0,0,0, +    92,117,3,0,0,0,111,115,50,99,1,0,0,0,0,0, +    0,0,2,0,0,0,3,0,0,0,115,0,0,0,115,33, +    0,0,0,124,0,0,93,23,0,125,1,0,116,0,0,124, +    1,0,131,1,0,100,0,0,107,2,0,86,1,113,3,0, +    100,1,0,83,40,2,0,0,0,105,1,0,0,0,78,40, +    1,0,0,0,117,3,0,0,0,108,101,110,40,2,0,0, +    0,117,2,0,0,0,46,48,117,3,0,0,0,115,101,112, +    40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, +    102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, +    46,95,98,111,111,116,115,116,114,97,112,62,117,9,0,0, +    0,60,103,101,110,101,120,112,114,62,174,6,0,0,115,2, +    0,0,0,6,0,117,25,0,0,0,95,115,101,116,117,112, +    46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,120, +    112,114,62,105,0,0,0,0,117,7,0,0,0,69,77,88, +    32,71,67,67,105,1,0,0,0,117,30,0,0,0,105,109, +    112,111,114,116,108,105,98,32,114,101,113,117,105,114,101,115, +    32,112,111,115,105,120,32,111,114,32,110,116,117,7,0,0, +    0,95,116,104,114,101,97,100,117,8,0,0,0,95,119,101, +    97,107,114,101,102,117,6,0,0,0,119,105,110,114,101,103, +    117,7,0,0,0,95,119,105,110,114,101,103,117,3,0,0, +    0,95,111,115,117,8,0,0,0,112,97,116,104,95,115,101, +    112,117,15,0,0,0,112,97,116,104,95,115,101,112,97,114, +    97,116,111,114,115,117,11,0,0,0,95,114,101,108,97,120, +    95,99,97,115,101,117,4,0,0,0,46,112,121,119,117,6, +    0,0,0,95,100,46,112,121,100,78,40,4,0,0,0,117, +    3,0,0,0,95,105,111,117,9,0,0,0,95,119,97,114, +    110,105,110,103,115,117,8,0,0,0,98,117,105,108,116,105, +    110,115,117,7,0,0,0,109,97,114,115,104,97,108,84,40, +    24,0,0,0,117,4,0,0,0,95,105,109,112,117,3,0, +    0,0,115,121,115,117,7,0,0,0,104,97,115,97,116,116, +    114,117,15,0,0,0,66,117,105,108,116,105,110,73,109,112, +    111,114,116,101,114,117,10,0,0,0,95,95,108,111,97,100, +    101,114,95,95,117,7,0,0,0,109,111,100,117,108,101,115, +    117,8,0,0,0,95,95,110,97,109,101,95,95,117,11,0, +    0,0,108,111,97,100,95,109,111,100,117,108,101,117,7,0, +    0,0,115,101,116,97,116,116,114,117,3,0,0,0,97,108, +    108,117,14,0,0,0,65,115,115,101,114,116,105,111,110,69, +    114,114,111,114,117,7,0,0,0,118,101,114,115,105,111,110, +    117,11,0,0,0,73,109,112,111,114,116,69,114,114,111,114, +    117,4,0,0,0,78,111,110,101,117,3,0,0,0,115,101, +    116,117,16,0,0,0,95,109,97,107,101,95,114,101,108,97, +    120,95,99,97,115,101,117,18,0,0,0,69,88,84,69,78, +    83,73,79,78,95,83,85,70,70,73,88,69,83,117,6,0, +    0,0,101,120,116,101,110,100,117,18,0,0,0,101,120,116, +    101,110,115,105,111,110,95,115,117,102,102,105,120,101,115,117, +    15,0,0,0,83,79,85,82,67,69,95,83,85,70,70,73, +    88,69,83,117,6,0,0,0,97,112,112,101,110,100,117,4, +    0,0,0,84,114,117,101,117,21,0,0,0,87,105,110,100, +    111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, +    114,117,11,0,0,0,68,69,66,85,71,95,66,85,73,76, +    68,40,14,0,0,0,117,10,0,0,0,115,121,115,95,109, +    111,100,117,108,101,117,11,0,0,0,95,105,109,112,95,109, +    111,100,117,108,101,117,6,0,0,0,109,111,100,117,108,101, +    117,11,0,0,0,115,101,108,102,95,109,111,100,117,108,101, +    117,12,0,0,0,98,117,105,108,116,105,110,95,110,97,109, +    101,117,14,0,0,0,98,117,105,108,116,105,110,95,109,111, +    100,117,108,101,117,10,0,0,0,111,115,95,100,101,116,97, +    105,108,115,117,10,0,0,0,98,117,105,108,116,105,110,95, +    111,115,117,15,0,0,0,112,97,116,104,95,115,101,112,97, +    114,97,116,111,114,115,117,8,0,0,0,112,97,116,104,95, +    115,101,112,117,9,0,0,0,111,115,95,109,111,100,117,108, +    101,117,13,0,0,0,116,104,114,101,97,100,95,109,111,100, +    117,108,101,117,14,0,0,0,119,101,97,107,114,101,102,95, +    109,111,100,117,108,101,117,13,0,0,0,119,105,110,114,101, +    103,95,109,111,100,117,108,101,40,0,0,0,0,40,0,0, +    0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, +    109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, +    114,97,112,62,117,6,0,0,0,95,115,101,116,117,112,147, +    6,0,0,115,90,0,0,0,0,9,6,1,6,2,19,1, +    15,1,16,2,13,1,13,1,15,1,18,2,13,1,20,2, +    48,1,19,2,31,1,10,1,15,1,13,1,4,2,3,1, +    15,2,27,1,13,1,5,1,13,1,12,2,12,2,3,1, +    19,1,13,2,11,1,15,2,12,1,15,1,19,2,16,1, +    16,1,16,1,16,1,22,2,19,1,19,1,12,1,13,1, +    12,1,117,6,0,0,0,95,115,101,116,117,112,99,2,0, +    0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0, +    0,0,115,136,0,0,0,116,0,0,124,0,0,124,1,0, +    131,2,0,1,116,1,0,131,0,0,125,2,0,116,2,0, +    106,3,0,106,4,0,116,5,0,106,6,0,124,2,0,140, +    0,0,103,1,0,131,1,0,1,116,2,0,106,7,0,106, +    8,0,116,9,0,131,1,0,1,116,2,0,106,7,0,106, +    8,0,116,10,0,131,1,0,1,116,11,0,106,12,0,100, +    1,0,107,2,0,114,116,0,116,2,0,106,7,0,106,8, +    0,116,13,0,131,1,0,1,110,0,0,116,2,0,106,7, +    0,106,8,0,116,14,0,131,1,0,1,100,2,0,83,40, +    3,0,0,0,117,50,0,0,0,73,110,115,116,97,108,108, +    32,105,109,112,111,114,116,108,105,98,32,97,115,32,116,104, +    101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, +    32,111,102,32,105,109,112,111,114,116,46,117,2,0,0,0, +    110,116,78,40,15,0,0,0,117,6,0,0,0,95,115,101, +    116,117,112,117,27,0,0,0,95,103,101,116,95,115,117,112, +    112,111,114,116,101,100,95,102,105,108,101,95,108,111,97,100, +    101,114,115,117,3,0,0,0,115,121,115,117,10,0,0,0, +    112,97,116,104,95,104,111,111,107,115,117,6,0,0,0,101, +    120,116,101,110,100,117,10,0,0,0,70,105,108,101,70,105, +    110,100,101,114,117,9,0,0,0,112,97,116,104,95,104,111, +    111,107,117,9,0,0,0,109,101,116,97,95,112,97,116,104, +    117,6,0,0,0,97,112,112,101,110,100,117,15,0,0,0, +    66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,117, +    14,0,0,0,70,114,111,122,101,110,73,109,112,111,114,116, +    101,114,117,3,0,0,0,95,111,115,117,8,0,0,0,95, +    95,110,97,109,101,95,95,117,21,0,0,0,87,105,110,100, +    111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, +    114,117,10,0,0,0,80,97,116,104,70,105,110,100,101,114, +    40,3,0,0,0,117,10,0,0,0,115,121,115,95,109,111, +    100,117,108,101,117,11,0,0,0,95,105,109,112,95,109,111, +    100,117,108,101,117,17,0,0,0,115,117,112,112,111,114,116, +    101,100,95,108,111,97,100,101,114,115,40,0,0,0,0,40, +    0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, +    32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, +    115,116,114,97,112,62,117,8,0,0,0,95,105,110,115,116, +    97,108,108,216,6,0,0,115,16,0,0,0,0,2,13,1, +    9,1,28,1,16,1,16,1,15,1,19,1,117,8,0,0, +    0,95,105,110,115,116,97,108,108,78,40,3,0,0,0,117, +    3,0,0,0,119,105,110,117,6,0,0,0,99,121,103,119, +    105,110,117,6,0,0,0,100,97,114,119,105,110,40,75,0, +    0,0,117,7,0,0,0,95,95,100,111,99,95,95,117,27, +    0,0,0,95,67,65,83,69,95,73,78,83,69,78,83,73, +    84,73,86,69,95,80,76,65,84,70,79,82,77,83,117,16, +    0,0,0,95,109,97,107,101,95,114,101,108,97,120,95,99, +    97,115,101,117,7,0,0,0,95,119,95,108,111,110,103,117, +    7,0,0,0,95,114,95,108,111,110,103,117,10,0,0,0, +    95,112,97,116,104,95,106,111,105,110,117,11,0,0,0,95, +    112,97,116,104,95,115,112,108,105,116,117,18,0,0,0,95, +    112,97,116,104,95,105,115,95,109,111,100,101,95,116,121,112, +    101,117,12,0,0,0,95,112,97,116,104,95,105,115,102,105, +    108,101,117,11,0,0,0,95,112,97,116,104,95,105,115,100, +    105,114,117,13,0,0,0,95,119,114,105,116,101,95,97,116, +    111,109,105,99,117,5,0,0,0,95,119,114,97,112,117,4, +    0,0,0,116,121,112,101,117,8,0,0,0,95,95,99,111, +    100,101,95,95,117,10,0,0,0,95,99,111,100,101,95,116, +    121,112,101,117,10,0,0,0,110,101,119,95,109,111,100,117, +    108,101,117,13,0,0,0,95,109,111,100,117,108,101,95,108, +    111,99,107,115,117,12,0,0,0,95,98,108,111,99,107,105, +    110,103,95,111,110,117,12,0,0,0,82,117,110,116,105,109, +    101,69,114,114,111,114,117,14,0,0,0,95,68,101,97,100, +    108,111,99,107,69,114,114,111,114,117,11,0,0,0,95,77, +    111,100,117,108,101,76,111,99,107,117,16,0,0,0,95,68, +    117,109,109,121,77,111,100,117,108,101,76,111,99,107,117,16, +    0,0,0,95,103,101,116,95,109,111,100,117,108,101,95,108, +    111,99,107,117,19,0,0,0,95,108,111,99,107,95,117,110, +    108,111,99,107,95,109,111,100,117,108,101,117,25,0,0,0, +    95,99,97,108,108,95,119,105,116,104,95,102,114,97,109,101, +    115,95,114,101,109,111,118,101,100,117,3,0,0,0,111,114, +    100,117,17,0,0,0,95,82,65,87,95,77,65,71,73,67, +    95,78,85,77,66,69,82,117,5,0,0,0,98,121,116,101, +    115,117,5,0,0,0,114,97,110,103,101,117,12,0,0,0, +    95,77,65,71,73,67,95,66,89,84,69,83,117,8,0,0, +    0,95,80,89,67,65,67,72,69,117,15,0,0,0,83,79, +    85,82,67,69,95,83,85,70,70,73,88,69,83,117,23,0, +    0,0,68,69,66,85,71,95,66,89,84,69,67,79,68,69, +    95,83,85,70,70,73,88,69,83,117,27,0,0,0,79,80, +    84,73,77,73,90,69,68,95,66,89,84,69,67,79,68,69, +    95,83,85,70,70,73,88,69,83,117,17,0,0,0,66,89, +    84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,117, +    4,0,0,0,78,111,110,101,117,17,0,0,0,99,97,99, +    104,101,95,102,114,111,109,95,115,111,117,114,99,101,117,17, +    0,0,0,115,111,117,114,99,101,95,102,114,111,109,95,99, +    97,99,104,101,117,15,0,0,0,95,103,101,116,95,115,111, +    117,114,99,101,102,105,108,101,117,16,0,0,0,95,118,101, +    114,98,111,115,101,95,109,101,115,115,97,103,101,117,11,0, +    0,0,115,101,116,95,112,97,99,107,97,103,101,117,10,0, +    0,0,115,101,116,95,108,111,97,100,101,114,117,17,0,0, +    0,109,111,100,117,108,101,95,102,111,114,95,108,111,97,100, +    101,114,117,11,0,0,0,95,99,104,101,99,107,95,110,97, +    109,101,117,17,0,0,0,95,114,101,113,117,105,114,101,115, +    95,98,117,105,108,116,105,110,117,16,0,0,0,95,114,101, +    113,117,105,114,101,115,95,102,114,111,122,101,110,117,17,0, +    0,0,95,102,105,110,100,95,109,111,100,117,108,101,95,115, +    104,105,109,117,15,0,0,0,66,117,105,108,116,105,110,73, +    109,112,111,114,116,101,114,117,14,0,0,0,70,114,111,122, +    101,110,73,109,112,111,114,116,101,114,117,21,0,0,0,87, +    105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, +    110,100,101,114,117,13,0,0,0,95,76,111,97,100,101,114, +    66,97,115,105,99,115,117,12,0,0,0,83,111,117,114,99, +    101,76,111,97,100,101,114,117,10,0,0,0,70,105,108,101, +    76,111,97,100,101,114,117,16,0,0,0,83,111,117,114,99, +    101,70,105,108,101,76,111,97,100,101,114,117,20,0,0,0, +    83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111, +    97,100,101,114,117,18,0,0,0,69,88,84,69,78,83,73, +    79,78,95,83,85,70,70,73,88,69,83,117,19,0,0,0, +    69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, +    100,101,114,117,14,0,0,0,95,78,97,109,101,115,112,97, +    99,101,80,97,116,104,117,15,0,0,0,78,97,109,101,115, +    112,97,99,101,76,111,97,100,101,114,117,10,0,0,0,80, +    97,116,104,70,105,110,100,101,114,117,10,0,0,0,70,105, +    108,101,70,105,110,100,101,114,117,18,0,0,0,95,73,109, +    112,111,114,116,76,111,99,107,67,111,110,116,101,120,116,117, +    13,0,0,0,95,114,101,115,111,108,118,101,95,110,97,109, +    101,117,12,0,0,0,95,102,105,110,100,95,109,111,100,117, +    108,101,117,13,0,0,0,95,115,97,110,105,116,121,95,99, +    104,101,99,107,117,8,0,0,0,95,69,82,82,95,77,83, +    71,117,23,0,0,0,95,102,105,110,100,95,97,110,100,95, +    108,111,97,100,95,117,110,108,111,99,107,101,100,117,14,0, +    0,0,95,102,105,110,100,95,97,110,100,95,108,111,97,100, +    117,11,0,0,0,95,103,99,100,95,105,109,112,111,114,116, +    117,16,0,0,0,95,104,97,110,100,108,101,95,102,114,111, +    109,108,105,115,116,117,17,0,0,0,95,99,97,108,99,95, +    95,95,112,97,99,107,97,103,101,95,95,117,27,0,0,0, +    95,103,101,116,95,115,117,112,112,111,114,116,101,100,95,102, +    105,108,101,95,108,111,97,100,101,114,115,117,10,0,0,0, +    95,95,105,109,112,111,114,116,95,95,117,6,0,0,0,95, +    115,101,116,117,112,117,8,0,0,0,95,105,110,115,116,97, +    108,108,40,0,0,0,0,40,0,0,0,0,40,0,0,0, +    0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, +    112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, +    97,112,62,117,8,0,0,0,60,109,111,100,117,108,101,62, +    8,0,0,0,115,134,0,0,0,6,21,6,3,12,13,12, +    16,12,13,12,12,12,12,12,10,12,6,12,7,15,22,12, +    8,15,3,12,12,6,2,6,3,22,4,19,68,19,23,12, +    19,12,20,12,100,34,1,37,2,6,2,9,2,9,1,9, +    2,6,4,15,27,12,23,12,21,12,8,12,13,12,11,12, +    55,12,18,12,11,12,11,12,17,19,57,19,54,19,50,19, +    82,22,134,19,29,25,46,25,25,6,3,19,45,19,55,19, +    18,19,89,19,125,19,13,12,9,12,17,12,17,6,2,12, +    50,12,13,18,24,12,34,12,15,12,11,24,32,12,69, +}; diff --git a/Python/makeopcodetargets.py b/Python/makeopcodetargets.py index 5d8e5a9a46..d9a085552f 100755 --- a/Python/makeopcodetargets.py +++ b/Python/makeopcodetargets.py @@ -23,9 +23,6 @@ def write_contents(f):      opcode = find_module("opcode")      targets = ['_unknown_opcode'] * 256      for opname, op in opcode.opmap.items(): -        if opname == "STOP_CODE": -            # XXX opcode not implemented -            continue          targets[op] = "TARGET_%s" % opname      f.write("static void *opcode_targets[256] = {\n")      f.write(",\n".join(["    &&%s" % s for s in targets])) diff --git a/Python/marshal.c b/Python/marshal.c index 3e2fbeb499..6d52a840ce 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -31,6 +31,9 @@  #define TYPE_STOPITER           'S'  #define TYPE_ELLIPSIS           '.'  #define TYPE_INT                'i' +/* TYPE_INT64 is deprecated. It is not +   generated anymore, and support for reading it +   will be removed in Python 3.4. */  #define TYPE_INT64              'I'  #define TYPE_FLOAT              'f'  #define TYPE_BINARY_FLOAT       'g' @@ -59,9 +62,9 @@ typedef struct {      /* If fp == NULL, the following are valid: */      PyObject *readable;    /* Stream-like object being read from */      PyObject *str; +    PyObject *current_filename;      char *ptr;      char *end; -    PyObject *strings; /* dict on marshal, list on unmarshal */      int version;  } WFILE; @@ -121,15 +124,6 @@ w_long(long x, WFILE *p)      w_byte((char)((x>>24) & 0xff), p);  } -#if SIZEOF_LONG > 4 -static void -w_long64(long x, WFILE *p) -{ -    w_long(x, p); -    w_long(x>>32, p); -} -#endif -  /* We assume that Python longs are stored internally in base some power of     2**15; for the sake of portability we'll always read and write them in base     exactly 2**15. */ @@ -219,8 +213,8 @@ w_object(PyObject *v, WFILE *p)  #if SIZEOF_LONG > 4              long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);              if (y && y != -1) { -                w_byte(TYPE_INT64, p); -                w_long64(x, p); +                /* Too large for TYPE_INT */ +                w_PyLong((PyLongObject*)v, p);              }              else  #endif @@ -311,9 +305,7 @@ w_object(PyObject *v, WFILE *p)      }      else if (PyUnicode_CheckExact(v)) {          PyObject *utf8; -        utf8 = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(v), -                                    PyUnicode_GET_SIZE(v), -                                    "surrogatepass"); +        utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass");          if (utf8 == NULL) {              p->depth--;              p->error = WFERR_UNMARSHALLABLE; @@ -445,7 +437,6 @@ PyMarshal_WriteLongToFile(long x, FILE *fp, int version)      wf.fp = fp;      wf.error = WFERR_OK;      wf.depth = 0; -    wf.strings = NULL;      wf.version = version;      w_long(x, &wf);  } @@ -457,10 +448,8 @@ PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)      wf.fp = fp;      wf.error = WFERR_OK;      wf.depth = 0; -    wf.strings = (version > 0) ? PyDict_New() : NULL;      wf.version = version;      w_object(x, &wf); -    Py_XDECREF(wf.strings);  }  typedef WFILE RFILE; /* Same struct with different invariants */ @@ -485,7 +474,9 @@ r_string(char *s, int n, RFILE *p)          }      }      else { -        PyObject *data = PyObject_CallMethod(p->readable, "read", "i", n); +        _Py_IDENTIFIER(read); + +        PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "i", n);          read = 0;          if (data != NULL) {              if (!PyBytes_Check(data)) { @@ -1069,6 +1060,18 @@ r_object(RFILE *p)              filename = r_object(p);              if (filename == NULL)                  goto code_error; +            if (PyUnicode_CheckExact(filename)) { +                if (p->current_filename != NULL) { +                    if (!PyUnicode_Compare(filename, p->current_filename)) { +                        Py_DECREF(filename); +                        Py_INCREF(p->current_filename); +                        filename = p->current_filename; +                    } +                } +                else { +                    p->current_filename = filename; +                } +            }              name = r_object(p);              if (name == NULL)                  goto code_error; @@ -1131,7 +1134,7 @@ PyMarshal_ReadShortFromFile(FILE *fp)      assert(fp);      rf.readable = NULL;      rf.fp = fp; -    rf.strings = NULL; +    rf.current_filename = NULL;      rf.end = rf.ptr = NULL;      return r_short(&rf);  } @@ -1142,7 +1145,7 @@ PyMarshal_ReadLongFromFile(FILE *fp)      RFILE rf;      rf.fp = fp;      rf.readable = NULL; -    rf.strings = NULL; +    rf.current_filename = NULL;      rf.ptr = rf.end = NULL;      return r_long(&rf);  } @@ -1204,11 +1207,10 @@ PyMarshal_ReadObjectFromFile(FILE *fp)      PyObject *result;      rf.fp = fp;      rf.readable = NULL; -    rf.strings = PyList_New(0); +    rf.current_filename = NULL;      rf.depth = 0;      rf.ptr = rf.end = NULL;      result = r_object(&rf); -    Py_DECREF(rf.strings);      return result;  } @@ -1219,12 +1221,11 @@ PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)      PyObject *result;      rf.fp = NULL;      rf.readable = NULL; +    rf.current_filename = NULL;      rf.ptr = str;      rf.end = str + len; -    rf.strings = PyList_New(0);      rf.depth = 0;      result = r_object(&rf); -    Py_DECREF(rf.strings);      return result;  } @@ -1232,7 +1233,6 @@ PyObject *  PyMarshal_WriteObjectToString(PyObject *x, int version)  {      WFILE wf; -    PyObject *res = NULL;      wf.fp = NULL;      wf.readable = NULL; @@ -1244,9 +1244,7 @@ PyMarshal_WriteObjectToString(PyObject *x, int version)      wf.error = WFERR_OK;      wf.depth = 0;      wf.version = version; -    wf.strings = (version > 0) ? PyDict_New() : NULL;      w_object(x, &wf); -    Py_XDECREF(wf.strings);      if (wf.str != NULL) {          char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);          if (wf.ptr - base > PY_SSIZE_T_MAX) { @@ -1268,12 +1266,7 @@ PyMarshal_WriteObjectToString(PyObject *x, int version)                 :"object too deeply nested to marshal");          return NULL;      } -    if (wf.str != NULL) { -        /* XXX Quick hack -- need to do this differently */ -        res = PyBytes_FromObject(wf.str); -        Py_DECREF(wf.str); -    } -    return res; +    return wf.str;  }  /* And an interface for Python programs... */ @@ -1287,12 +1280,14 @@ marshal_dump(PyObject *self, PyObject *args)      int version = Py_MARSHAL_VERSION;      PyObject *s;      PyObject *res; +    _Py_IDENTIFIER(write); +      if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))          return NULL;      s = PyMarshal_WriteObjectToString(x, version);      if (s == NULL)          return NULL; -    res = PyObject_CallMethod(f, "write", "O", s); +    res = _PyObject_CallMethodId(f, &PyId_write, "O", s);      Py_DECREF(s);      return res;  } @@ -1314,6 +1309,7 @@ static PyObject *  marshal_load(PyObject *self, PyObject *f)  {      PyObject *data, *result; +    _Py_IDENTIFIER(read);      RFILE rf;      /* @@ -1321,7 +1317,7 @@ marshal_load(PyObject *self, PyObject *f)       * This is to ensure that the object passed in at least       * has a read method which returns bytes.       */ -    data = PyObject_CallMethod(f, "read", "i", 0); +    data = _PyObject_CallMethodId(f, &PyId_read, "i", 0);      if (data == NULL)          return NULL;      if (!PyBytes_Check(data)) { @@ -1331,12 +1327,11 @@ marshal_load(PyObject *self, PyObject *f)          result = NULL;      }      else { -        rf.strings = PyList_New(0);          rf.depth = 0;          rf.fp = NULL;          rf.readable = f; +        rf.current_filename = NULL;          result = read_object(&rf); -        Py_DECREF(rf.strings);      }      Py_DECREF(data);      return result; @@ -1389,12 +1384,11 @@ marshal_loads(PyObject *self, PyObject *args)      n = p.len;      rf.fp = NULL;      rf.readable = NULL; +    rf.current_filename = NULL;      rf.ptr = s;      rf.end = s + n; -    rf.strings = PyList_New(0);      rf.depth = 0;      result = read_object(&rf); -    Py_DECREF(rf.strings);      PyBuffer_Release(&p);      return result;  } diff --git a/Python/modsupport.c b/Python/modsupport.c index 85b0d66358..428914f378 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -148,15 +148,6 @@ do_mklist(const char **p_format, va_list *p_va, int endchar, int n, int flags)      return v;  } -static int -_ustrlen(Py_UNICODE *u) -{ -    int i = 0; -    Py_UNICODE *v = u; -    while (*v != 0) { i++; v++; } -    return i; -} -  static PyObject *  do_mktuple(const char **p_format, va_list *p_va, int endchar, int n, int flags)  { @@ -269,7 +260,7 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)              }              else {                  if (n < 0) -                    n = _ustrlen(u); +                    n = Py_UNICODE_strlen(u);                  v = PyUnicode_FromUnicode(u, n);              }              return v; @@ -292,11 +283,6 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)          case 'C':          {              int i = va_arg(*p_va, int); -            if (i < 0 || i > PyUnicode_GetMax()) { -                PyErr_SetString(PyExc_OverflowError, -                                "%c arg not in range(0x110000)"); -                return NULL; -            }              return PyUnicode_FromOrdinal(i);          } diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index a91da79be6..2d6bcda513 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -71,7 +71,7 @@ static void *opcode_targets[256] = {      &&TARGET_STORE_LOCALS,      &&TARGET_PRINT_EXPR,      &&TARGET_LOAD_BUILD_CLASS, -    &&_unknown_opcode, +    &&TARGET_YIELD_FROM,      &&_unknown_opcode,      &&_unknown_opcode,      &&TARGET_INPLACE_LSHIFT, diff --git a/Python/peephole.c b/Python/peephole.c index 359eda833b..5d536779ac 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -23,6 +23,64 @@  #define ISBASICBLOCK(blocks, start, bytes) \      (blocks[start]==blocks[start+bytes-1]) + +#define CONST_STACK_CREATE() { \ +    const_stack_size = 256; \ +    const_stack = PyMem_New(PyObject *, const_stack_size); \ +    load_const_stack = PyMem_New(Py_ssize_t, const_stack_size); \ +    if (!const_stack || !load_const_stack) { \ +        PyErr_NoMemory(); \ +        goto exitError; \ +    } \ +    } + +#define CONST_STACK_DELETE() do { \ +    if (const_stack) \ +        PyMem_Free(const_stack); \ +    if (load_const_stack) \ +        PyMem_Free(load_const_stack); \ +    } while(0) + +#define CONST_STACK_LEN() (const_stack_top + 1) + +#define CONST_STACK_PUSH_OP(i) do { \ +    PyObject *_x; \ +    assert(codestr[i] == LOAD_CONST); \ +    assert(PyList_GET_SIZE(consts) > GETARG(codestr, i)); \ +    _x = PyList_GET_ITEM(consts, GETARG(codestr, i)); \ +    if (++const_stack_top >= const_stack_size) { \ +        const_stack_size *= 2; \ +        PyMem_Resize(const_stack, PyObject *, const_stack_size); \ +        PyMem_Resize(load_const_stack, Py_ssize_t, const_stack_size); \ +        if (!const_stack || !load_const_stack) { \ +            PyErr_NoMemory(); \ +            goto exitError; \ +        } \ +    } \ +    load_const_stack[const_stack_top] = i; \ +    const_stack[const_stack_top] = _x; \ +    in_consts = 1; \ +    } while(0) + +#define CONST_STACK_RESET() do { \ +    const_stack_top = -1; \ +    } while(0) + +#define CONST_STACK_TOP() \ +    const_stack[const_stack_top] + +#define CONST_STACK_LASTN(i) \ +    &const_stack[const_stack_top - i + 1] + +#define CONST_STACK_POP(i) do { \ +    assert(const_stack_top + 1 >= i); \ +    const_stack_top -= i; \ +    } while(0) + +#define CONST_STACK_OP_LASTN(i) \ +    ((const_stack_top >= i - 1) ? load_const_stack[const_stack_top - i + 1] : -1) + +  /* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n     with    LOAD_CONST (c1, c2, ... cn).     The consts table must still be in list form so that the @@ -33,17 +91,14 @@     test; for BUILD_SET it assembles a frozenset rather than a tuple.  */  static int -tuple_of_constants(unsigned char *codestr, Py_ssize_t n, PyObject *consts) +tuple_of_constants(unsigned char *codestr, Py_ssize_t n, +                   PyObject *consts, PyObject **objs)  {      PyObject *newconst, *constant; -    Py_ssize_t i, arg, len_consts; +    Py_ssize_t i, len_consts;      /* Pre-conditions */      assert(PyList_CheckExact(consts)); -    assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST || codestr[n*3] == BUILD_SET); -    assert(GETARG(codestr, (n*3)) == n); -    for (i=0 ; i<n ; i++) -        assert(codestr[i*3] == LOAD_CONST);      /* Buildup new tuple of constants */      newconst = PyTuple_New(n); @@ -51,16 +106,14 @@ tuple_of_constants(unsigned char *codestr, Py_ssize_t n, PyObject *consts)          return 0;      len_consts = PyList_GET_SIZE(consts);      for (i=0 ; i<n ; i++) { -        arg = GETARG(codestr, (i*3)); -        assert(arg < len_consts); -        constant = PyList_GET_ITEM(consts, arg); +        constant = objs[i];          Py_INCREF(constant);          PyTuple_SET_ITEM(newconst, i, constant);      }      /* If it's a BUILD_SET, use the PyTuple we just built to create a        PyFrozenSet, and use that as the constant instead: */ -    if (codestr[n*3] == BUILD_SET) { +    if (codestr[0] == BUILD_SET) {          PyObject *tuple = newconst;          newconst = PyFrozenSet_New(tuple);          Py_DECREF(tuple); @@ -77,9 +130,8 @@ tuple_of_constants(unsigned char *codestr, Py_ssize_t n, PyObject *consts)      /* Write NOPs over old LOAD_CONSTS and         add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */ -    memset(codestr, NOP, n*3); -    codestr[n*3] = LOAD_CONST; -    SETARG(codestr, (n*3), len_consts); +    codestr[0] = LOAD_CONST; +    SETARG(codestr, 0, len_consts);      return 1;  } @@ -87,14 +139,14 @@ tuple_of_constants(unsigned char *codestr, Py_ssize_t n, PyObject *consts)     with    LOAD_CONST binop(c1,c2)     The consts table must still be in list form so that the     new constant can be appended. -   Called with codestr pointing to the first LOAD_CONST. +   Called with codestr pointing to the BINOP.     Abandons the transformation if the folding fails (i.e.  1+'a').     If the new constant is a sequence, only folds when the size     is below a threshold value.  That keeps pyc files from     becoming large in the presence of code like:  (None,)*1000.  */  static int -fold_binops_on_constants(unsigned char *codestr, PyObject *consts) +fold_binops_on_constants(unsigned char *codestr, PyObject *consts, PyObject **objs)  {      PyObject *newconst, *v, *w;      Py_ssize_t len_consts, size; @@ -102,13 +154,11 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts)      /* Pre-conditions */      assert(PyList_CheckExact(consts)); -    assert(codestr[0] == LOAD_CONST); -    assert(codestr[3] == LOAD_CONST);      /* Create new constant */ -    v = PyList_GET_ITEM(consts, GETARG(codestr, 0)); -    w = PyList_GET_ITEM(consts, GETARG(codestr, 3)); -    opcode = codestr[6]; +    v = objs[0]; +    w = objs[1]; +    opcode = codestr[0];      switch (opcode) {          case BINARY_POWER:              newconst = PyNumber_Power(v, w, Py_None); @@ -133,24 +183,6 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts)              break;          case BINARY_SUBSCR:              newconst = PyObject_GetItem(v, w); -            /* #5057: if v is unicode, there might be differences between -               wide and narrow builds in cases like '\U00012345'[0]. -               Wide builds will return a non-BMP char, whereas narrow builds -               will return a surrogate.  In both the cases skip the -               optimization in order to produce compatible pycs. -             */ -            if (newconst != NULL && -                PyUnicode_Check(v) && PyUnicode_Check(newconst)) { -                Py_UNICODE ch = PyUnicode_AS_UNICODE(newconst)[0]; -#ifdef Py_UNICODE_WIDE -                if (ch > 0xFFFF) { -#else -                if (ch >= 0xD800 && ch <= 0xDFFF) { -#endif -                    Py_DECREF(newconst); -                    return 0; -                } -            }              break;          case BINARY_LSHIFT:              newconst = PyNumber_Lshift(v, w); @@ -198,16 +230,15 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts)      Py_DECREF(newconst);      /* Write NOP NOP NOP NOP LOAD_CONST newconst */ -    memset(codestr, NOP, 4); -    codestr[4] = LOAD_CONST; -    SETARG(codestr, 4, len_consts); +    codestr[-2] = LOAD_CONST; +    SETARG(codestr, -2, len_consts);      return 1;  }  static int -fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts) +fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts, PyObject *v)  { -    PyObject *newconst=NULL, *v; +    PyObject *newconst;      Py_ssize_t len_consts;      int opcode; @@ -216,13 +247,10 @@ fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)      assert(codestr[0] == LOAD_CONST);      /* Create new constant */ -    v = PyList_GET_ITEM(consts, GETARG(codestr, 0));      opcode = codestr[3];      switch (opcode) {          case UNARY_NEGATIVE: -            /* Preserve the sign of -0.0 */ -            if (PyObject_IsTrue(v) == 1) -                newconst = PyNumber_Negative(v); +            newconst = PyNumber_Negative(v);              break;          case UNARY_INVERT:              newconst = PyNumber_Invert(v); @@ -358,7 +386,11 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,      unsigned char *lineno;      int *addrmap = NULL;      int new_line, cum_orig_line, last_line, tabsiz; -    int cumlc=0, lastlc=0;      /* Count runs of consecutive LOAD_CONSTs */ +    PyObject **const_stack = NULL; +    Py_ssize_t *load_const_stack = NULL; +    Py_ssize_t const_stack_top = -1; +    Py_ssize_t const_stack_size = 0; +    int in_consts = 0;  /* whether we are in a LOAD_CONST sequence */      unsigned int *blocks = NULL;      char *name; @@ -404,12 +436,16 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,          goto exitError;      assert(PyList_Check(consts)); +    CONST_STACK_CREATE(); +      for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {        reoptimize_current:          opcode = codestr[i]; -        lastlc = cumlc; -        cumlc = 0; +        if (!in_consts) { +            CONST_STACK_RESET(); +        } +        in_consts = 0;          switch (opcode) {              /* Replace UNARY_NOT POP_JUMP_IF_FALSE @@ -450,21 +486,21 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,                      goto exitError;                  else if (h == 0)                      continue; -                cumlc = lastlc + 1; +                CONST_STACK_PUSH_OP(i);                  break;                  /* Skip over LOAD_CONST trueconst                     POP_JUMP_IF_FALSE xx. This improves                     "while 1" performance. */              case LOAD_CONST: -                cumlc = lastlc + 1; +                CONST_STACK_PUSH_OP(i);                  j = GETARG(codestr, i);                  if (codestr[i+3] != POP_JUMP_IF_FALSE  ||                      !ISBASICBLOCK(blocks,i,6)  ||                      !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))                      continue;                  memset(codestr+i, NOP, 6); -                cumlc = 0; +                CONST_STACK_RESET();                  break;                  /* Try to fold tuples of constants (includes a case for lists and sets @@ -476,19 +512,23 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,              case BUILD_LIST:              case BUILD_SET:                  j = GETARG(codestr, i); -                h = i - 3 * j; -                if (h >= 0  && -                    j <= lastlc                  && +                if (j == 0) +                    break; +                h = CONST_STACK_OP_LASTN(j); +                assert((h >= 0 || CONST_STACK_LEN() < j)); +                if (h >= 0 && j > 0 && j <= CONST_STACK_LEN() &&                      ((opcode == BUILD_TUPLE && -                      ISBASICBLOCK(blocks, h, 3*(j+1))) || +                      ISBASICBLOCK(blocks, h, i-h+3)) ||                       ((opcode == BUILD_LIST || opcode == BUILD_SET) &&                        codestr[i+3]==COMPARE_OP && -                      ISBASICBLOCK(blocks, h, 3*(j+2)) && +                      ISBASICBLOCK(blocks, h, i-h+6) &&                        (GETARG(codestr,i+3)==6 ||                         GETARG(codestr,i+3)==7))) && -                    tuple_of_constants(&codestr[h], j, consts)) { +                    tuple_of_constants(&codestr[i], j, consts, CONST_STACK_LASTN(j))) {                      assert(codestr[i] == LOAD_CONST); -                    cumlc = 1; +                    memset(&codestr[h], NOP, i - h); +                    CONST_STACK_POP(j); +                    CONST_STACK_PUSH_OP(i);                      break;                  }                  if (codestr[i+3] != UNPACK_SEQUENCE  || @@ -501,10 +541,12 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,                  } else if (j == 2) {                      codestr[i] = ROT_TWO;                      memset(codestr+i+1, NOP, 5); +                    CONST_STACK_RESET();                  } else if (j == 3) {                      codestr[i] = ROT_THREE;                      codestr[i+1] = ROT_TWO;                      memset(codestr+i+2, NOP, 4); +                    CONST_STACK_RESET();                  }                  break; @@ -523,12 +565,18 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,              case BINARY_AND:              case BINARY_XOR:              case BINARY_OR: -                if (lastlc >= 2                  && -                    ISBASICBLOCK(blocks, i-6, 7)  && -                    fold_binops_on_constants(&codestr[i-6], consts)) { +                /* NOTE: LOAD_CONST is saved at `i-2` since it has an arg +                   while BINOP hasn't */ +                h = CONST_STACK_OP_LASTN(2); +                assert((h >= 0 || CONST_STACK_LEN() < 2)); +                if (h >= 0 && +                    ISBASICBLOCK(blocks, h, i-h+1)  && +                    fold_binops_on_constants(&codestr[i], consts, CONST_STACK_LASTN(2))) {                      i -= 2; +                    memset(&codestr[h], NOP, i - h);                      assert(codestr[i] == LOAD_CONST); -                    cumlc = 1; +                    CONST_STACK_POP(2); +                    CONST_STACK_PUSH_OP(i);                  }                  break; @@ -537,12 +585,15 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,              case UNARY_NEGATIVE:              case UNARY_INVERT:              case UNARY_POSITIVE: -                if (lastlc >= 1                  && -                    ISBASICBLOCK(blocks, i-3, 4)  && -                    fold_unaryops_on_constants(&codestr[i-3], consts))                  { +                h = CONST_STACK_OP_LASTN(1); +                assert((h >= 0 || CONST_STACK_LEN() < 1)); +                if (h >= 0 && +                    ISBASICBLOCK(blocks, h, i-h+1)  && +                    fold_unaryops_on_constants(&codestr[i-3], consts, CONST_STACK_TOP())) {                      i -= 2;                      assert(codestr[i] == LOAD_CONST); -                    cumlc = 1; +                    CONST_STACK_POP(1); +                    CONST_STACK_PUSH_OP(i);                  }                  break; @@ -699,6 +750,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,      assert(h + nops == codelen);      code = PyBytes_FromStringAndSize((char *)codestr, h); +    CONST_STACK_DELETE();      PyMem_Free(addrmap);      PyMem_Free(codestr);      PyMem_Free(blocks); @@ -708,6 +760,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,      code = NULL;   exitUnchanged: +    CONST_STACK_DELETE();      if (blocks != NULL)          PyMem_Free(blocks);      if (addrmap != NULL) diff --git a/Python/pystate.c b/Python/pystate.c index 42bc3eceaf..cfd61d0098 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -69,7 +69,6 @@ PyInterpreterState_New(void)              Py_FatalError("Can't initialize threads for interpreter");  #endif          interp->modules = NULL; -        interp->modules_reloading = NULL;          interp->modules_by_index = NULL;          interp->sysdict = NULL;          interp->builtins = NULL; @@ -79,6 +78,7 @@ PyInterpreterState_New(void)          interp->codec_error_registry = NULL;          interp->codecs_initialized = 0;          interp->fscodec_initialized = 0; +        interp->importlib = NULL;  #ifdef HAVE_DLOPEN  #ifdef RTLD_NOW          interp->dlopenflags = RTLD_NOW; @@ -113,9 +113,9 @@ PyInterpreterState_Clear(PyInterpreterState *interp)      Py_CLEAR(interp->codec_error_registry);      Py_CLEAR(interp->modules);      Py_CLEAR(interp->modules_by_index); -    Py_CLEAR(interp->modules_reloading);      Py_CLEAR(interp->sysdict);      Py_CLEAR(interp->builtins); +    Py_CLEAR(interp->importlib);  } @@ -242,9 +242,9 @@ _PyThreadState_Init(PyThreadState *tstate)  }  PyObject* -PyState_FindModule(struct PyModuleDef* m) +PyState_FindModule(struct PyModuleDef* module)  { -    Py_ssize_t index = m->m_base.m_index; +    Py_ssize_t index = module->m_base.m_index;      PyInterpreterState *state = PyThreadState_GET()->interp;      PyObject *res;      if (index == 0) @@ -276,6 +276,47 @@ _PyState_AddModule(PyObject* module, struct PyModuleDef* def)                            def->m_base.m_index, module);  } +int +PyState_AddModule(PyObject* module, struct PyModuleDef* def) +{ +    Py_ssize_t index; +    PyInterpreterState *state = PyThreadState_GET()->interp; +    if (!def) { +        Py_FatalError("PyState_AddModule: Module Definition is NULL"); +        return -1; +    } +    index = def->m_base.m_index; +    if (state->modules_by_index) { +        if(PyList_GET_SIZE(state->modules_by_index) >= index) { +            if(module == PyList_GET_ITEM(state->modules_by_index, index)) { +                Py_FatalError("PyState_AddModule: Module already added!"); +                return -1; +            } +        } +    } +    return _PyState_AddModule(module, def); +} + +int +PyState_RemoveModule(struct PyModuleDef* def) +{ +    Py_ssize_t index = def->m_base.m_index; +    PyInterpreterState *state = PyThreadState_GET()->interp; +    if (index == 0) { +        Py_FatalError("PyState_RemoveModule: Module index invalid."); +        return -1; +    } +    if (state->modules_by_index == NULL) { +        Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible."); +        return -1; +    } +    if (index > PyList_GET_SIZE(state->modules_by_index)) { +        Py_FatalError("PyState_RemoveModule: Module index out of bounds."); +        return -1; +    } +    return PyList_SetItem(state->modules_by_index, index, Py_None); +} +  void  PyThreadState_Clear(PyThreadState *tstate)  { diff --git a/Python/pystrtod.c b/Python/pystrtod.c index 75e3032fb7..4ab8f08d22 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -22,6 +22,43 @@ case_insensitive_match(const char *s, const char *t)     the successfully parsed portion of the string.  On failure, return -1.0 and     set *endptr to point to the start of the string. */ +#ifndef PY_NO_SHORT_FLOAT_REPR + +double +_Py_parse_inf_or_nan(const char *p, char **endptr) +{ +    double retval; +    const char *s; +    int negate = 0; + +    s = p; +    if (*s == '-') { +        negate = 1; +        s++; +    } +    else if (*s == '+') { +        s++; +    } +    if (case_insensitive_match(s, "inf")) { +        s += 3; +        if (case_insensitive_match(s, "inity")) +            s += 5; +        retval = _Py_dg_infinity(negate); +    } +    else if (case_insensitive_match(s, "nan")) { +        s += 3; +        retval = _Py_dg_stdnan(negate); +    } +    else { +        s = p; +        retval = -1.0; +    } +    *endptr = (char *)s; +    return retval; +} + +#else +  double  _Py_parse_inf_or_nan(const char *p, char **endptr)  { @@ -57,6 +94,8 @@ _Py_parse_inf_or_nan(const char *p, char **endptr)      return retval;  } +#endif +  /**   * _PyOS_ascii_strtod:   * @nptr:    the string to convert to a numeric value. @@ -954,7 +993,7 @@ format_float_short(double d, char format_code,              /* shouldn't get here: Gay's code should always return                 something starting with a digit, an 'I',  or 'N' */              strncpy(p, "ERR", 3); -            p += 3; +            /* p += 3; */              assert(0);          }          goto exit; diff --git a/Python/pythonrun.c b/Python/pythonrun.c index cf4e34c33e..05dfb8e1d0 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -52,7 +52,7 @@ extern wchar_t *Py_GetPath(void);  extern grammar _PyParser_Grammar; /* From graminit.c */  /* Forward */ -static void initmain(void); +static void initmain(PyInterpreterState *interp);  static int initfsencoding(PyInterpreterState *interp);  static void initsite(void);  static int initstdio(void); @@ -62,14 +62,17 @@ static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,  static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,                                PyCompilerFlags *);  static void err_input(perrdetail *); +static void err_free(perrdetail *);  static void initsigs(void);  static void call_py_exitfuncs(void);  static void wait_for_thread_shutdown(void);  static void call_ll_exitfuncs(void); -extern void _PyUnicode_Init(void); +extern int _PyUnicode_Init(void);  extern void _PyUnicode_Fini(void);  extern int _PyLong_Init(void);  extern void PyLong_Fini(void); +extern int _PyFaulthandler_Init(void); +extern void _PyFaulthandler_Fini(void);  #ifdef WITH_THREAD  extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); @@ -139,12 +142,13 @@ get_codec_name(const char *encoding)  {      char *name_utf8, *name_str;      PyObject *codec, *name = NULL; +    _Py_IDENTIFIER(name);      codec = _PyCodec_Lookup(encoding);      if (!codec)          goto error; -    name = PyObject_GetAttrString(codec, "name"); +    name = _PyObject_GetAttrId(codec, &PyId_name);      Py_CLEAR(codec);      if (!name)          goto error; @@ -166,21 +170,79 @@ error:      return NULL;  } -#if defined(HAVE_LANGINFO_H) && defined(CODESET)  static char* -get_codeset(void) +get_locale_encoding(void)  { +#ifdef MS_WINDOWS +    char codepage[100]; +    PyOS_snprintf(codepage, sizeof(codepage), "cp%d", GetACP()); +    return get_codec_name(codepage); +#elif defined(HAVE_LANGINFO_H) && defined(CODESET)      char* codeset = nl_langinfo(CODESET);      if (!codeset || codeset[0] == '\0') {          PyErr_SetString(PyExc_ValueError, "CODESET is not set or empty");          return NULL;      }      return get_codec_name(codeset); -} +#else +    PyErr_SetNone(PyExc_NotImplementedError); +    return NULL;  #endif +} + +static void +import_init(PyInterpreterState *interp, PyObject *sysmod) +{ +    PyObject *importlib; +    PyObject *impmod; +    PyObject *sys_modules; +    PyObject *value; + +    /* Import _importlib through its frozen version, _frozen_importlib. */ +    if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) { +        Py_FatalError("Py_Initialize: can't import _frozen_importlib"); +    } +    else if (Py_VerboseFlag) { +        PySys_FormatStderr("import _frozen_importlib # frozen\n"); +    } +    importlib = PyImport_AddModule("_frozen_importlib"); +    if (importlib == NULL) { +        Py_FatalError("Py_Initialize: couldn't get _frozen_importlib from " +                      "sys.modules"); +    } +    interp->importlib = importlib; +    Py_INCREF(interp->importlib); + +    /* Install _importlib as __import__ */ +    impmod = PyInit_imp(); +    if (impmod == NULL) { +        Py_FatalError("Py_Initialize: can't import imp"); +    } +    else if (Py_VerboseFlag) { +        PySys_FormatStderr("import imp # builtin\n"); +    } +    sys_modules = PyImport_GetModuleDict(); +    if (Py_VerboseFlag) { +        PySys_FormatStderr("import sys # builtin\n"); +    } +    if (PyDict_SetItemString(sys_modules, "_imp", impmod) < 0) { +        Py_FatalError("Py_Initialize: can't save _imp to sys.modules"); +    } + +    value = PyObject_CallMethod(importlib, "_install", "OO", sysmod, impmod); +    if (value == NULL) { +        PyErr_Print(); +        Py_FatalError("Py_Initialize: importlib install failed"); +    } +    Py_DECREF(value); +    Py_DECREF(impmod); + +    _PyImportZip_Init(); +} +  void -Py_InitializeEx(int install_sigs) +_Py_InitializeEx_Private(int install_sigs, int install_importlib)  {      PyInterpreterState *interp;      PyThreadState *tstate; @@ -252,12 +314,10 @@ Py_InitializeEx(int install_sigs)      interp->modules = PyDict_New();      if (interp->modules == NULL)          Py_FatalError("Py_Initialize: can't make modules dictionary"); -    interp->modules_reloading = PyDict_New(); -    if (interp->modules_reloading == NULL) -        Py_FatalError("Py_Initialize: can't make modules_reloading dictionary");      /* Init Unicode implementation; relies on the codec registry */ -    _PyUnicode_Init(); +    if (_PyUnicode_Init() < 0) +        Py_FatalError("Py_Initialize: can't initialize unicode");      bimod = _PyBuiltin_Init();      if (bimod == NULL) @@ -269,7 +329,7 @@ Py_InitializeEx(int install_sigs)      Py_INCREF(interp->builtins);      /* initialize builtin exceptions */ -    _PyExc_Init(); +    _PyExc_Init(bimod);      sysmod = _PySys_Init();      if (sysmod == NULL) @@ -299,6 +359,15 @@ Py_InitializeEx(int install_sigs)      /* Initialize _warnings. */      _PyWarnings_Init(); +    if (!install_importlib) +        return; + +    import_init(interp, sysmod); + +    /* initialize the faulthandler module */ +    if (_PyFaulthandler_Init()) +        Py_FatalError("Py_Initialize: can't initialize faulthandler"); +      _PyTime_Init();      if (initfsencoding(interp) < 0) @@ -307,7 +376,7 @@ Py_InitializeEx(int install_sigs)      if (install_sigs)          initsigs(); /* Signal handling stuff, including initintr() */ -    initmain(); /* Module __main__ */ +    initmain(interp); /* Module __main__ */      if (initstdio() < 0)          Py_FatalError(              "Py_Initialize: can't initialize sys standard streams"); @@ -327,6 +396,12 @@ Py_InitializeEx(int install_sigs)  }  void +Py_InitializeEx(int install_sigs) +{ +    _Py_InitializeEx_Private(install_sigs, 1); +} + +void  Py_Initialize(void)  {      Py_InitializeEx(1); @@ -361,9 +436,10 @@ flush_std_files(void)      PyObject *fout = PySys_GetObject("stdout");      PyObject *ferr = PySys_GetObject("stderr");      PyObject *tmp; +    _Py_IDENTIFIER(flush);      if (fout != NULL && fout != Py_None && !file_is_closed(fout)) { -        tmp = PyObject_CallMethod(fout, "flush", ""); +        tmp = _PyObject_CallMethodId(fout, &PyId_flush, "");          if (tmp == NULL)              PyErr_WriteUnraisable(fout);          else @@ -371,7 +447,7 @@ flush_std_files(void)      }      if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) { -        tmp = PyObject_CallMethod(ferr, "flush", ""); +        tmp = _PyObject_CallMethodId(ferr, &PyId_flush, "");          if (tmp == NULL)              PyErr_Clear();          else @@ -464,7 +540,7 @@ Py_Finalize(void)      flush_std_files();      /* Collect final garbage.  This disposes of cycles created by -     * new-style class definitions, for example. +     * class definitions, for example.       * XXX This is disabled because it caused too many problems.  If       * XXX a __del__ or weakref callback triggers here, Python code has       * XXX a hard time running, because even the sys module has been @@ -485,6 +561,9 @@ Py_Finalize(void)      /* Destroy the database used by _PyImport_{Fixup,Find}Extension */      _PyImport_Fini(); +    /* unload faulthandler module */ +    _PyFaulthandler_Fini(); +      /* Debugging stuff */  #ifdef COUNT_ALLOCS      dump_counts(stdout); @@ -534,6 +613,7 @@ Py_Finalize(void)      PyLong_Fini();      PyFloat_Fini();      PyDict_Fini(); +    PySlice_Fini();      /* Cleanup Unicode implementation */      _PyUnicode_Fini(); @@ -562,7 +642,7 @@ Py_Finalize(void)  #endif /* Py_TRACE_REFS */  #ifdef PYMALLOC_DEBUG      if (Py_GETENV("PYTHONMALLOCSTATS")) -        _PyObject_DebugMallocStats(); +        _PyObject_DebugMallocStats(stderr);  #endif      call_ll_exitfuncs(); @@ -606,7 +686,6 @@ Py_NewInterpreter(void)      /* XXX The following is lax in error checking */      interp->modules = PyDict_New(); -    interp->modules_reloading = PyDict_New();      bimod = _PyImport_FindBuiltin("builtins");      if (bimod != NULL) { @@ -617,11 +696,12 @@ Py_NewInterpreter(void)      }      /* initialize builtin exceptions */ -    _PyExc_Init(); +    _PyExc_Init(bimod);      sysmod = _PyImport_FindBuiltin("sys");      if (bimod != NULL && sysmod != NULL) {          PyObject *pstderr; +          interp->sysdict = PyModule_GetDict(sysmod);          if (interp->sysdict == NULL)              goto handle_error; @@ -640,13 +720,15 @@ Py_NewInterpreter(void)          _PyImportHooks_Init(); +        import_init(interp, sysmod); +          if (initfsencoding(interp) < 0)              goto handle_error;          if (initstdio() < 0)              Py_FatalError(              "Py_Initialize: can't initialize sys standard streams"); -        initmain(); +        initmain(interp);          if (!Py_NoSiteFlag)              initsite();      } @@ -743,7 +825,7 @@ Py_GetPythonHome(void)  /* Create __main__ module */  static void -initmain(void) +initmain(PyInterpreterState *interp)  {      PyObject *m, *d;      m = PyImport_AddModule("__main__"); @@ -752,35 +834,48 @@ initmain(void)      d = PyModule_GetDict(m);      if (PyDict_GetItemString(d, "__builtins__") == NULL) {          PyObject *bimod = PyImport_ImportModule("builtins"); -        if (bimod == NULL || -            PyDict_SetItemString(d, "__builtins__", bimod) != 0) -            Py_FatalError("can't add __builtins__ to __main__"); +        if (bimod == NULL) { +            Py_FatalError("Failed to retrieve builtins module"); +        } +        if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) { +            Py_FatalError("Failed to initialize __main__.__builtins__"); +        }          Py_DECREF(bimod);      } +    /* Main is a little special - imp.is_builtin("__main__") will return +     * False, but BuiltinImporter is still the most appropriate initial +     * setting for its __loader__ attribute. A more suitable value will +     * be set if __main__ gets further initialized later in the startup +     * process. +     */ +    if (PyDict_GetItemString(d, "__loader__") == NULL) { +        PyObject *loader = PyObject_GetAttrString(interp->importlib, +                                                  "BuiltinImporter"); +        if (loader == NULL) { +            Py_FatalError("Failed to retrieve BuiltinImporter"); +        } +        if (PyDict_SetItemString(d, "__loader__", loader) < 0) { +            Py_FatalError("Failed to initialize __main__.__loader__"); +        } +        Py_DECREF(loader); +    }  }  static int  initfsencoding(PyInterpreterState *interp)  {      PyObject *codec; -#if defined(HAVE_LANGINFO_H) && defined(CODESET) -    char *codeset = NULL; - -    if (Py_FileSystemDefaultEncoding == NULL) { -        /* On Unix, set the file system encoding according to the -           user's preference, if the CODESET names a well-known -           Python codec, and Py_FileSystemDefaultEncoding isn't -           initialized by other means. */ -        codeset = get_codeset(); -        if (codeset == NULL) + +    if (Py_FileSystemDefaultEncoding == NULL) +    { +        Py_FileSystemDefaultEncoding = get_locale_encoding(); +        if (Py_FileSystemDefaultEncoding == NULL)              Py_FatalError("Py_Initialize: Unable to get the locale encoding"); -        Py_FileSystemDefaultEncoding = codeset;          Py_HasFileSystemDefaultEncoding = 0;          interp->fscodec_initialized = 1;          return 0;      } -#endif      /* the encoding is mbcs, utf-8 or ascii */      codec = _PyCodec_Lookup(Py_FileSystemDefaultEncoding); @@ -822,6 +917,11 @@ create_stdio(PyObject* io,      const char* newline;      PyObject *line_buffering;      int buffering, isatty; +    _Py_IDENTIFIER(open); +    _Py_IDENTIFIER(isatty); +    _Py_IDENTIFIER(TextIOWrapper); +    _Py_IDENTIFIER(name); +    _Py_IDENTIFIER(mode);      /* stdin is always opened in buffered mode, first because it shouldn't         make a difference in common use cases, second because TextIOWrapper @@ -836,14 +936,15 @@ create_stdio(PyObject* io,          mode = "wb";      else          mode = "rb"; -    buf = PyObject_CallMethod(io, "open", "isiOOOi", -                              fd, mode, buffering, -                              Py_None, Py_None, Py_None, 0); +    buf = _PyObject_CallMethodId(io, &PyId_open, "isiOOOi", +                                 fd, mode, buffering, +                                 Py_None, Py_None, Py_None, 0);      if (buf == NULL)          goto error;      if (buffering) { -        raw = PyObject_GetAttrString(buf, "raw"); +        _Py_IDENTIFIER(raw); +        raw = _PyObject_GetAttrId(buf, &PyId_raw);          if (raw == NULL)              goto error;      } @@ -853,9 +954,9 @@ create_stdio(PyObject* io,      }      text = PyUnicode_FromString(name); -    if (text == NULL || PyObject_SetAttrString(raw, "name", text) < 0) +    if (text == NULL || _PyObject_SetAttrId(raw, &PyId_name, text) < 0)          goto error; -    res = PyObject_CallMethod(raw, "isatty", ""); +    res = _PyObject_CallMethodId(raw, &PyId_isatty, "");      if (res == NULL)          goto error;      isatty = PyObject_IsTrue(res); @@ -881,9 +982,9 @@ create_stdio(PyObject* io,      newline = "\n";  #endif -    stream = PyObject_CallMethod(io, "TextIOWrapper", "OsssO", -                                 buf, encoding, errors, -                                 newline, line_buffering); +    stream = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "OsssO", +                                    buf, encoding, errors, +                                    newline, line_buffering);      Py_CLEAR(buf);      if (stream == NULL)          goto error; @@ -893,7 +994,7 @@ create_stdio(PyObject* io,      else          mode = "r";      text = PyUnicode_FromString(mode); -    if (!text || PyObject_SetAttrString(stream, "mode", text) < 0) +    if (!text || _PyObject_SetAttrId(stream, &PyId_mode, text) < 0)          goto error;      Py_CLEAR(text);      return stream; @@ -1133,13 +1234,14 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags      PyArena *arena;      char *ps1 = "", *ps2 = "", *enc = NULL;      int errcode = 0; +    _Py_IDENTIFIER(encoding);      if (fp == stdin) {          /* Fetch encoding from sys.stdin */          v = PySys_GetObject("stdin");          if (v == NULL || v == Py_None)              return -1; -        oenc = PyObject_GetAttrString(v, "encoding"); +        oenc = _PyObject_GetAttrId(v, &PyId_encoding);          if (!oenc)              return -1;          enc = _PyUnicode_AsString(oenc); @@ -1252,6 +1354,32 @@ maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)  }  int +static set_main_loader(PyObject *d, const char *filename, const char *loader_name) +{ +    PyInterpreterState *interp; +    PyThreadState *tstate; +    PyObject *loader_type, *loader; +    int result = 0; +    /* Get current thread state and interpreter pointer */ +    tstate = PyThreadState_GET(); +    interp = tstate->interp; +    loader_type = PyObject_GetAttrString(interp->importlib, loader_name); +    if (loader_type == NULL) { +        return -1; +    } +    loader = PyObject_CallFunction(loader_type, "ss", "__main__", filename); +    Py_DECREF(loader_type); +    if (loader == NULL) { +        return -1; +    } +    if (PyDict_SetItemString(d, "__loader__", loader) < 0) { +        result = -1; +    } +    Py_DECREF(loader); +    return result; +} + +int  PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,                          PyCompilerFlags *flags)  { @@ -1294,8 +1422,21 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,          /* Turn on optimization if a .pyo file is given */          if (strcmp(ext, ".pyo") == 0)              Py_OptimizeFlag = 1; + +        if (set_main_loader(d, filename, "SourcelessFileLoader") < 0) { +            fprintf(stderr, "python: failed to set __main__.__loader__\n"); +            ret = -1; +            goto done; +        }          v = run_pyc_file(fp, filename, d, d, flags);      } else { +        /* When running from stdin, leave __main__.__loader__ alone */ +        if (strcmp(filename, "<stdin>") != 0 && +            set_main_loader(d, filename, "SourceFileLoader") < 0) { +            fprintf(stderr, "python: failed to set __main__.__loader__\n"); +            ret = -1; +            goto done; +        }          v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,                                closeit, flags);      } @@ -1336,20 +1477,20 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename,  {      long hold;      PyObject *v; - -    /* old style errors */ -    if (PyTuple_Check(err)) -        return PyArg_ParseTuple(err, "O(ziiz)", message, filename, -                                lineno, offset, text); +    _Py_IDENTIFIER(msg); +    _Py_IDENTIFIER(filename); +    _Py_IDENTIFIER(lineno); +    _Py_IDENTIFIER(offset); +    _Py_IDENTIFIER(text);      *message = NULL;      /* new style errors.  `err' is an instance */ -    *message = PyObject_GetAttrString(err, "msg"); +    *message = _PyObject_GetAttrId(err, &PyId_msg);      if (!*message)          goto finally; -    v = PyObject_GetAttrString(err, "filename"); +    v = _PyObject_GetAttrId(err, &PyId_filename);      if (!v)          goto finally;      if (v == Py_None) { @@ -1363,7 +1504,7 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename,              goto finally;      } -    v = PyObject_GetAttrString(err, "lineno"); +    v = _PyObject_GetAttrId(err, &PyId_lineno);      if (!v)          goto finally;      hold = PyLong_AsLong(v); @@ -1372,7 +1513,7 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename,          goto finally;      *lineno = (int)hold; -    v = PyObject_GetAttrString(err, "offset"); +    v = _PyObject_GetAttrId(err, &PyId_offset);      if (!v)          goto finally;      if (v == Py_None) { @@ -1386,7 +1527,7 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename,          *offset = (int)hold;      } -    v = PyObject_GetAttrString(err, "text"); +    v = _PyObject_GetAttrId(err, &PyId_text);      if (!v)          goto finally;      if (v == Py_None) { @@ -1460,7 +1601,8 @@ handle_system_exit(void)          goto done;      if (PyExceptionInstance_Check(value)) {          /* The error code should be in the `code' attribute. */ -        PyObject *code = PyObject_GetAttrString(value, "code"); +        _Py_IDENTIFIER(code); +        PyObject *code = _PyObject_GetAttrId(value, &PyId_code);          if (code) {              Py_DECREF(value);              value = code; @@ -1567,6 +1709,7 @@ print_exception(PyObject *f, PyObject *value)  {      int err = 0;      PyObject *type, *tb; +    _Py_IDENTIFIER(print_file_and_line);      if (!PyExceptionInstance_Check(value)) {          PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f); @@ -1582,7 +1725,7 @@ print_exception(PyObject *f, PyObject *value)      if (tb && tb != Py_None)          err = PyTraceBack_Print(tb, f);      if (err == 0 && -        PyObject_HasAttrString(value, "print_file_and_line")) +        _PyObject_HasAttrId(value, &PyId_print_file_and_line))      {          PyObject *message;          const char *filename, *text; @@ -1617,6 +1760,7 @@ print_exception(PyObject *f, PyObject *value)      else {          PyObject* moduleName;          char* className; +        _Py_IDENTIFIER(__module__);          assert(PyExceptionClass_Check(type));          className = PyExceptionClass_Name(type);          if (className != NULL) { @@ -1625,10 +1769,10 @@ print_exception(PyObject *f, PyObject *value)                  className = dot+1;          } -        moduleName = PyObject_GetAttrString(type, "__module__"); +        moduleName = _PyObject_GetAttrId(type, &PyId___module__);          if (moduleName == NULL || !PyUnicode_Check(moduleName))          { -            Py_DECREF(moduleName); +            Py_XDECREF(moduleName);              err = PyFile_WriteString("<unknown>", f);          }          else { @@ -1655,7 +1799,7 @@ print_exception(PyObject *f, PyObject *value)          if (s == NULL)              err = -1;          else if (!PyUnicode_Check(s) || -            PyUnicode_GetSize(s) != 0) +            PyUnicode_GetLength(s) != 0)              err = PyFile_WriteString(": ", f);          if (err == 0)            err = PyFile_WriteObject(s, f, Py_PRINT_RAW); @@ -1703,7 +1847,8 @@ print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)                          cause_message, f);                  }              } -            else if (context) { +            else if (context && +                !((PyBaseExceptionObject *)value)->suppress_context) {                  res = PySet_Contains(seen, context);                  if (res == -1)                      PyErr_Clear(); @@ -1792,13 +1937,14 @@ flush_io(void)  {      PyObject *f, *r;      PyObject *type, *value, *traceback; +    _Py_IDENTIFIER(flush);      /* Save the current exception */      PyErr_Fetch(&type, &value, &traceback);      f = PySys_GetObject("stderr");      if (f != NULL) { -        r = PyObject_CallMethod(f, "flush", ""); +        r = _PyObject_CallMethodId(f, &PyId_flush, "");          if (r)              Py_DECREF(r);          else @@ -1806,7 +1952,7 @@ flush_io(void)      }      f = PySys_GetObject("stdout");      if (f != NULL) { -        r = PyObject_CallMethod(f, "flush", ""); +        r = _PyObject_CallMethodId(f, &PyId_flush, "");          if (r)              Py_DECREF(r);          else @@ -1845,6 +1991,8 @@ run_pyc_file(FILE *fp, const char *filename, PyObject *globals,                     "Bad magic number in .pyc file");          return NULL;      } +    /* Skip mtime and size */ +    (void) PyMarshal_ReadLongFromFile(fp);      (void) PyMarshal_ReadLongFromFile(fp);      v = PyMarshal_ReadLastObjectFromFile(fp);      fclose(fp); @@ -1937,12 +2085,13 @@ PyParser_ASTFromString(const char *s, const char *filename, int start,          flags->cf_flags |= iflags & PyCF_MASK;          mod = PyAST_FromNode(n, flags, filename, arena);          PyNode_Free(n); -        return mod;      }      else {          err_input(&err); -        return NULL; +        mod = NULL;      } +    err_free(&err); +    return mod;  }  mod_ty @@ -1967,14 +2116,15 @@ PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc,          flags->cf_flags |= iflags & PyCF_MASK;          mod = PyAST_FromNode(n, flags, filename, arena);          PyNode_Free(n); -        return mod;      }      else {          err_input(&err);          if (errcode)              *errcode = err.error; -        return NULL; +        mod = NULL;      } +    err_free(&err); +    return mod;  }  /* Simplified interface to parsefile -- return node or set exception */ @@ -1988,6 +2138,7 @@ PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int fla                                        start, NULL, NULL, &err, flags);      if (n == NULL)          err_input(&err); +    err_free(&err);      return n;  } @@ -2002,6 +2153,7 @@ PyParser_SimpleParseStringFlags(const char *str, int start, int flags)                                          start, &err, flags);      if (n == NULL)          err_input(&err); +    err_free(&err);      return n;  } @@ -2014,6 +2166,7 @@ PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,                              &_PyParser_Grammar, start, &err, flags);      if (n == NULL)          err_input(&err); +    err_free(&err);      return n;  } @@ -2027,11 +2180,23 @@ PyParser_SimpleParseStringFilename(const char *str, const char *filename, int st     even parser modules. */  void +PyParser_ClearError(perrdetail *err) +{ +    err_free(err); +} + +void  PyParser_SetError(perrdetail *err)  {      err_input(err);  } +static void +err_free(perrdetail *err) +{ +    Py_CLEAR(err->filename); +} +  /* Set the error appropriate to the given input error code (see errcode.h) */  static void @@ -2039,7 +2204,6 @@ err_input(perrdetail *err)  {      PyObject *v, *w, *errtype, *errtext;      PyObject *msg_obj = NULL; -    PyObject *filename;      char *msg = NULL;      errtype = PyExc_SyntaxError; @@ -2111,6 +2275,9 @@ err_input(perrdetail *err)      case E_IDENTIFIER:          msg = "invalid character in identifier";          break; +    case E_BADSINGLE: +        msg = "multiple statements found while compiling a single statement"; +        break;      default:          fprintf(stderr, "error=%d\n", err->error);          msg = "unknown parsing error"; @@ -2125,17 +2292,8 @@ err_input(perrdetail *err)          errtext = PyUnicode_DecodeUTF8(err->text, strlen(err->text),                                         "replace");      } -    if (err->filename != NULL) -        filename = PyUnicode_DecodeFSDefault(err->filename); -    else { -        Py_INCREF(Py_None); -        filename = Py_None; -    } -    if (filename != NULL) -        v = Py_BuildValue("(NiiN)", filename, -                          err->lineno, err->offset, errtext); -    else -        v = NULL; +    v = Py_BuildValue("(OiiN)", err->filename, +                      err->lineno, err->offset, errtext);      if (v != NULL) {          if (msg_obj)              w = Py_BuildValue("(OO)", msg_obj, v); @@ -2159,11 +2317,24 @@ cleanup:  void  Py_FatalError(const char *msg)  { +    const int fd = fileno(stderr); +    PyThreadState *tstate; +      fprintf(stderr, "Fatal Python error: %s\n", msg);      fflush(stderr); /* it helps in Windows debug build */      if (PyErr_Occurred()) {          PyErr_PrintEx(0);      } +    else { +        tstate = _Py_atomic_load_relaxed(&_PyThreadState_Current); +        if (tstate != NULL) { +            fputc('\n', stderr); +            fflush(stderr); +            _Py_DumpTracebackThreads(fd, tstate->interp, tstate); +        } +        _PyFaulthandler_Fini(); +    } +  #ifdef MS_WINDOWS      {          size_t len = strlen(msg); @@ -2218,6 +2389,7 @@ static void  wait_for_thread_shutdown(void)  {  #ifdef WITH_THREAD +    _Py_IDENTIFIER(_shutdown);      PyObject *result;      PyThreadState *tstate = PyThreadState_GET();      PyObject *threading = PyMapping_GetItemString(tstate->interp->modules, @@ -2227,7 +2399,7 @@ wait_for_thread_shutdown(void)          PyErr_Clear();          return;      } -    result = PyObject_CallMethod(threading, "_shutdown", ""); +    result = _PyObject_CallMethodId(threading, &PyId__shutdown, "");      if (result == NULL) {          PyErr_WriteUnraisable(threading);      } diff --git a/Python/pytime.c b/Python/pytime.c index 6fb7695911..beeab87e2c 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -1,7 +1,9 @@  #include "Python.h" +#ifdef MS_WINDOWS +#include <windows.h> +#endif -#ifdef __APPLE__ -#if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME) +#if defined(__APPLE__) && defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME)    /*     * _PyTime_gettimeofday falls back to ftime when getttimeofday fails because the latter     * might fail on some platforms. This fallback is unwanted on MacOSX because @@ -10,18 +12,41 @@     */  # undef HAVE_FTIME  #endif -#endif -#ifdef HAVE_FTIME +#if defined(HAVE_FTIME) && !defined(MS_WINDOWS)  #include <sys/timeb.h> -#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)  extern int ftime(struct timeb *); -#endif /* MS_WINDOWS */ -#endif /* HAVE_FTIME */ +#endif -void -_PyTime_gettimeofday(_PyTime_timeval *tp) +static void +pygettimeofday(_PyTime_timeval *tp, _Py_clock_info_t *info)  { +#ifdef MS_WINDOWS +    FILETIME system_time; +    ULARGE_INTEGER large; +    ULONGLONG microseconds; + +    GetSystemTimeAsFileTime(&system_time); +    large.u.LowPart = system_time.dwLowDateTime; +    large.u.HighPart = system_time.dwHighDateTime; +    /* 11,644,473,600,000,000: number of microseconds between +       the 1st january 1601 and the 1st january 1970 (369 years + 89 leap +       days). */ +    microseconds = large.QuadPart / 10 - 11644473600000000; +    tp->tv_sec = microseconds / 1000000; +    tp->tv_usec = microseconds % 1000000; +    if (info) { +        DWORD timeAdjustment, timeIncrement; +        BOOL isTimeAdjustmentDisabled; + +        info->implementation = "GetSystemTimeAsFileTime()"; +        info->monotonic = 0; +        (void) GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement, +                                       &isTimeAdjustmentDisabled); +        info->resolution = timeIncrement * 1e-7; +        info->adjustable = 1; +    } +#else      /* There are three ways to get the time:        (1) gettimeofday() -- resolution in microseconds        (2) ftime() -- resolution in milliseconds @@ -30,27 +55,173 @@ _PyTime_gettimeofday(_PyTime_timeval *tp)        Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may        fail, so we fall back on ftime() or time().        Note: clock resolution does not imply clock accuracy! */ +  #ifdef HAVE_GETTIMEOFDAY +    int err;  #ifdef GETTIMEOFDAY_NO_TZ -    if (gettimeofday(tp) == 0) -        return; -#else /* !GETTIMEOFDAY_NO_TZ */ -    if (gettimeofday(tp, (struct timezone *)NULL) == 0) +    err = gettimeofday(tp); +#else +    err = gettimeofday(tp, (struct timezone *)NULL); +#endif +    if (err == 0) { +        if (info) { +            info->implementation = "gettimeofday()"; +            info->resolution = 1e-6; +            info->monotonic = 0; +            info->adjustable = 1; +        }          return; -#endif /* !GETTIMEOFDAY_NO_TZ */ -#endif /* !HAVE_GETTIMEOFDAY */ +    } +#endif   /* HAVE_GETTIMEOFDAY */ +  #if defined(HAVE_FTIME)      {          struct timeb t;          ftime(&t);          tp->tv_sec = t.time;          tp->tv_usec = t.millitm * 1000; +        if (info) { +            info->implementation = "ftime()"; +            info->resolution = 1e-3; +            info->monotonic = 0; +            info->adjustable = 1; +        }      }  #else /* !HAVE_FTIME */      tp->tv_sec = time(NULL);      tp->tv_usec = 0; +    if (info) { +        info->implementation = "time()"; +        info->resolution = 1.0; +        info->monotonic = 0; +        info->adjustable = 1; +    }  #endif /* !HAVE_FTIME */ -    return; + +#endif /* MS_WINDOWS */ +} + +void +_PyTime_gettimeofday(_PyTime_timeval *tp) +{ +    pygettimeofday(tp, NULL); +} + +void +_PyTime_gettimeofday_info(_PyTime_timeval *tp, _Py_clock_info_t *info) +{ +    pygettimeofday(tp, info); +} + +static void +error_time_t_overflow(void) +{ +    PyErr_SetString(PyExc_OverflowError, +                    "timestamp out of range for platform time_t"); +} + +time_t +_PyLong_AsTime_t(PyObject *obj) +{ +#if defined(HAVE_LONG_LONG) && SIZEOF_TIME_T == SIZEOF_LONG_LONG +    PY_LONG_LONG val; +    val = PyLong_AsLongLong(obj); +#else +    long val; +    assert(sizeof(time_t) <= sizeof(long)); +    val = PyLong_AsLong(obj); +#endif +    if (val == -1 && PyErr_Occurred()) { +        if (PyErr_ExceptionMatches(PyExc_OverflowError)) +            error_time_t_overflow(); +        return -1; +    } +    return (time_t)val; +} + +PyObject * +_PyLong_FromTime_t(time_t t) +{ +#if defined(HAVE_LONG_LONG) && SIZEOF_TIME_T == SIZEOF_LONG_LONG +    return PyLong_FromLongLong((PY_LONG_LONG)t); +#else +    assert(sizeof(time_t) <= sizeof(long)); +    return PyLong_FromLong((long)t); +#endif +} + +static int +_PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator, +                            double denominator) +{ +    assert(denominator <= LONG_MAX); +    if (PyFloat_Check(obj)) { +        double d, intpart, err; +        /* volatile avoids unsafe optimization on float enabled by gcc -O3 */ +        volatile double floatpart; + +        d = PyFloat_AsDouble(obj); +        floatpart = modf(d, &intpart); +        if (floatpart < 0) { +            floatpart = 1.0 + floatpart; +            intpart -= 1.0; +        } + +        *sec = (time_t)intpart; +        err = intpart - (double)*sec; +        if (err <= -1.0 || err >= 1.0) { +            error_time_t_overflow(); +            return -1; +        } + +        floatpart *= denominator; +        *numerator = (long)floatpart; +        return 0; +    } +    else { +        *sec = _PyLong_AsTime_t(obj); +        if (*sec == (time_t)-1 && PyErr_Occurred()) +            return -1; +        *numerator = 0; +        return 0; +    } +} + +int +_PyTime_ObjectToTime_t(PyObject *obj, time_t *sec) +{ +    if (PyFloat_Check(obj)) { +        double d, intpart, err; + +        d = PyFloat_AsDouble(obj); +        (void)modf(d, &intpart); + +        *sec = (time_t)intpart; +        err = intpart - (double)*sec; +        if (err <= -1.0 || err >= 1.0) { +            error_time_t_overflow(); +            return -1; +        } +        return 0; +    } +    else { +        *sec = _PyLong_AsTime_t(obj); +        if (*sec == (time_t)-1 && PyErr_Occurred()) +            return -1; +        return 0; +    } +} + +int +_PyTime_ObjectToTimespec(PyObject *obj, time_t *sec, long *nsec) +{ +    return _PyTime_ObjectToDenominator(obj, sec, nsec, 1e9); +} + +int +_PyTime_ObjectToTimeval(PyObject *obj, time_t *sec, long *usec) +{ +    return _PyTime_ObjectToDenominator(obj, sec, usec, 1e6);  }  void diff --git a/Python/random.c b/Python/random.c index 825260f36b..53518c2ebe 100644 --- a/Python/random.c +++ b/Python/random.c @@ -258,17 +258,6 @@ _PyRandom_Init(void)      _Py_HashSecret_Initialized = 1;      /* -      By default, hash randomization is disabled, and only -      enabled if PYTHONHASHSEED is set to non-empty or if -      "-R" is provided at the command line: -    */ -    if (!Py_HashRandomizationFlag) { -        /* Disable the randomized hash: */ -        memset(secret, 0, secret_size); -        return; -    } - -    /*        Hash randomization is enabled.  Generate a per-process secret,        using PYTHONHASHSEED if provided.      */ diff --git a/Python/symtable.c b/Python/symtable.c index 1ec51f708c..a0b786b3d7 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -19,10 +19,6 @@  #define IMPORT_STAR_WARNING "import * only allowed at module level" -#define RETURN_VAL_IN_GENERATOR \ -    "'return' with argument inside generator" - -  static PySTEntryObject *  ste_new(struct symtable *st, identifier name, _Py_block_ty block,          void *key, int lineno, int col_offset) @@ -185,6 +181,7 @@ static int symtable_visit_params(struct symtable *st, asdl_seq *args);  static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args);  static int symtable_implicit_arg(struct symtable *st, int pos);  static int symtable_visit_annotations(struct symtable *st, stmt_ty s); +static int symtable_visit_withitem(struct symtable *st, withitem_ty item);  static identifier top = NULL, lambda = NULL, genexpr = NULL, @@ -750,7 +747,7 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,              goto error;      } -    /* Recursively call analyze_block() on each child block. +    /* Recursively call analyze_child_block() on each child block.         newbound, newglobal now contain the names visible in         nested blocks.  The free variables in the children will @@ -893,18 +890,15 @@ symtable_warn(struct symtable *st, char *msg, int lineno)  static int  symtable_exit_block(struct symtable *st, void *ast)  { -    Py_ssize_t end; - -    Py_CLEAR(st->st_cur); -    end = PyList_GET_SIZE(st->st_stack) - 1; -    if (end >= 0) { -        st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack, -                                                        end); -        if (st->st_cur == NULL) -            return 0; -        Py_INCREF(st->st_cur); -        if (PySequence_DelItem(st->st_stack, end) < 0) +    Py_ssize_t size; + +    st->st_cur = NULL; +    size = PyList_GET_SIZE(st->st_stack); +    if (size) { +        if (PyList_SetSlice(st->st_stack, size - 1, size, NULL) < 0)              return 0; +        if (--size) +            st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack, size - 1);      }      return 1;  } @@ -913,23 +907,23 @@ static int  symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,                       void *ast, int lineno, int col_offset)  { -    PySTEntryObject *prev = NULL; +    PySTEntryObject *prev = NULL, *ste; -    if (st->st_cur) { -        prev = st->st_cur; -        if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) { -            return 0; -        } -        Py_DECREF(st->st_cur); -    } -    st->st_cur = ste_new(st, name, block, ast, lineno, col_offset); -    if (st->st_cur == NULL) +    ste = ste_new(st, name, block, ast, lineno, col_offset); +    if (ste == NULL)          return 0; +    if (PyList_Append(st->st_stack, (PyObject *)ste) < 0) { +        Py_DECREF(ste); +        return 0; +    } +    prev = st->st_cur; +    /* The entry is owned by the stack. Borrow it for st_cur. */ +    Py_DECREF(ste); +    st->st_cur = ste;      if (block == ModuleBlock)          st->st_global = st->st_cur->ste_symbols;      if (prev) { -        if (PyList_Append(prev->ste_children, -                          (PyObject *)st->st_cur) < 0) { +        if (PyList_Append(prev->ste_children, (PyObject *)ste) < 0) {              return 0;          }      } @@ -1023,12 +1017,6 @@ error:      if (!symtable_visit_ ## TYPE((ST), (V))) \          return 0; -#define VISIT_IN_BLOCK(ST, TYPE, V, S) \ -    if (!symtable_visit_ ## TYPE((ST), (V))) { \ -        symtable_exit_block((ST), (S)); \ -        return 0; \ -    } -  #define VISIT_SEQ(ST, TYPE, SEQ) { \      int i; \      asdl_seq *seq = (SEQ); /* avoid variable capture */ \ @@ -1039,18 +1027,6 @@ error:      } \  } -#define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \ -    int i; \ -    asdl_seq *seq = (SEQ); /* avoid variable capture */ \ -    for (i = 0; i < asdl_seq_LEN(seq); i++) { \ -        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ -        if (!symtable_visit_ ## TYPE((ST), elt)) { \ -            symtable_exit_block((ST), (S)); \ -            return 0; \ -        } \ -    } \ -} -  #define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \      int i; \      asdl_seq *seq = (SEQ); /* avoid variable capture */ \ @@ -1061,18 +1037,6 @@ error:      } \  } -#define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \ -    int i; \ -    asdl_seq *seq = (SEQ); /* avoid variable capture */ \ -    for (i = (START); i < asdl_seq_LEN(seq); i++) { \ -        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \ -        if (!symtable_visit_ ## TYPE((ST), elt)) { \ -            symtable_exit_block((ST), (S)); \ -            return 0; \ -        } \ -    } \ -} -  #define VISIT_KWONLYDEFAULTS(ST, KW_DEFAULTS) { \      int i = 0; \      asdl_seq *seq = (KW_DEFAULTS); /* avoid variable capture */ \ @@ -1122,8 +1086,8 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)                                    FunctionBlock, (void *)s, s->lineno,                                    s->col_offset))              return 0; -        VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s); -        VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s); +        VISIT(st, arguments, s->v.FunctionDef.args); +        VISIT_SEQ(st, stmt, s->v.FunctionDef.body);          if (!symtable_exit_block(st, s))              return 0;          break; @@ -1151,7 +1115,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)          }          tmp = st->st_private;          st->st_private = s->v.ClassDef.name; -        VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s); +        VISIT_SEQ(st, stmt, s->v.ClassDef.body);          st->st_private = tmp;          if (!symtable_exit_block(st, s))              return 0; @@ -1161,14 +1125,6 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)          if (s->v.Return.value) {              VISIT(st, expr, s->v.Return.value);              st->st_cur->ste_returns_value = 1; -            if (st->st_cur->ste_generator) { -                PyErr_SetString(PyExc_SyntaxError, -                    RETURN_VAL_IN_GENERATOR); -                PyErr_SyntaxLocationEx(st->st_filename, -                                       s->lineno, -                                       s->col_offset); -                return 0; -            }          }          break;      case Delete_kind: @@ -1205,19 +1161,16 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)      case Raise_kind:          if (s->v.Raise.exc) {              VISIT(st, expr, s->v.Raise.exc); -        if (s->v.Raise.cause) { -        VISIT(st, expr, s->v.Raise.cause); -        } +            if (s->v.Raise.cause) { +                VISIT(st, expr, s->v.Raise.cause); +            }          }          break; -    case TryExcept_kind: -        VISIT_SEQ(st, stmt, s->v.TryExcept.body); -        VISIT_SEQ(st, stmt, s->v.TryExcept.orelse); -        VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers); -        break; -    case TryFinally_kind: -        VISIT_SEQ(st, stmt, s->v.TryFinally.body); -        VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody); +    case Try_kind: +        VISIT_SEQ(st, stmt, s->v.Try.body); +        VISIT_SEQ(st, stmt, s->v.Try.orelse); +        VISIT_SEQ(st, excepthandler, s->v.Try.handlers); +        VISIT_SEQ(st, stmt, s->v.Try.finalbody);          break;      case Assert_kind:          VISIT(st, expr, s->v.Assert.test); @@ -1305,10 +1258,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)          /* nothing to do here */          break;      case With_kind: -        VISIT(st, expr, s->v.With.context_expr); -        if (s->v.With.optional_vars) { -            VISIT(st, expr, s->v.With.optional_vars); -        } +        VISIT_SEQ(st, withitem, s->v.With.items);          VISIT_SEQ(st, stmt, s->v.With.body);          break;      } @@ -1341,8 +1291,8 @@ symtable_visit_expr(struct symtable *st, expr_ty e)                                    FunctionBlock, (void *)e, e->lineno,                                    e->col_offset))              return 0; -        VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e); -        VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e); +        VISIT(st, arguments, e->v.Lambda.args); +        VISIT(st, expr, e->v.Lambda.body);          if (!symtable_exit_block(st, (void *)e))              return 0;          break; @@ -1376,17 +1326,14 @@ symtable_visit_expr(struct symtable *st, expr_ty e)              return 0;          break;      case Yield_kind: -        if (e->v.Yield.value) -            VISIT(st, expr, e->v.Yield.value); +    case YieldFrom_kind: { +        expr_ty value; +        value = (e->kind == YieldFrom_kind) ? e->v.YieldFrom.value : e->v.Yield.value; +        if (value) +            VISIT(st, expr, value);          st->st_cur->ste_generator = 1; -        if (st->st_cur->ste_returns_value) { -            PyErr_SetString(PyExc_SyntaxError, -                RETURN_VAL_IN_GENERATOR); -            PyErr_SyntaxLocationEx(st->st_filename, -                                   e->lineno, e->col_offset); -            return 0; -        }          break; +    }      case Compare_kind:          VISIT(st, expr, e->v.Compare.left);          VISIT_SEQ(st, expr, e->v.Compare.comparators); @@ -1543,6 +1490,16 @@ symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)      return 1;  } +static int +symtable_visit_withitem(struct symtable *st, withitem_ty item) +{ +    VISIT(st, expr, item->context_expr); +    if (item->optional_vars) { +        VISIT(st, expr, item->optional_vars); +    } +    return 1; +} +  static int  symtable_visit_alias(struct symtable *st, alias_ty a) @@ -1553,10 +1510,10 @@ symtable_visit_alias(struct symtable *st, alias_ty a)      */      PyObject *store_name;      PyObject *name = (a->asname == NULL) ? a->name : a->asname; -    const Py_UNICODE *base = PyUnicode_AS_UNICODE(name); -    Py_UNICODE *dot = Py_UNICODE_strchr(base, '.'); -    if (dot) { -        store_name = PyUnicode_FromUnicode(base, dot - base); +    Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, +                                        PyUnicode_GET_LENGTH(name), 1); +    if (dot != -1) { +        store_name = PyUnicode_Substring(name, 0, dot);          if (!store_name)              return 0;      } @@ -1653,13 +1610,12 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e,          symtable_exit_block(st, (void *)e);          return 0;      } -    VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e); -    VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e); -    VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension, -                            generators, 1, (void*)e); +    VISIT(st, expr, outermost->target); +    VISIT_SEQ(st, expr, outermost->ifs); +    VISIT_SEQ_TAIL(st, comprehension, generators, 1);      if (value) -        VISIT_IN_BLOCK(st, expr, value, (void*)e); -    VISIT_IN_BLOCK(st, expr, elt, (void*)e); +        VISIT(st, expr, value); +    VISIT(st, expr, elt);      return symtable_exit_block(st, (void *)e);  } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index c4f27d0868..20bfa555b3 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -17,6 +17,7 @@ Data members:  #include "Python.h"  #include "code.h"  #include "frameobject.h" +#include "pythread.h"  #include "osdefs.h" @@ -78,8 +79,10 @@ sys_displayhook_unencodable(PyObject *outf, PyObject *o)      PyObject *encoded, *escaped_str, *repr_str, *buffer, *result;      char *stdout_encoding_str;      int ret; +    _Py_IDENTIFIER(encoding); +    _Py_IDENTIFIER(buffer); -    stdout_encoding = PyObject_GetAttrString(outf, "encoding"); +    stdout_encoding = _PyObject_GetAttrId(outf, &PyId_encoding);      if (stdout_encoding == NULL)          goto error;      stdout_encoding_str = _PyUnicode_AsString(stdout_encoding); @@ -96,9 +99,10 @@ sys_displayhook_unencodable(PyObject *outf, PyObject *o)      if (encoded == NULL)          goto error; -    buffer = PyObject_GetAttrString(outf, "buffer"); +    buffer = _PyObject_GetAttrId(outf, &PyId_buffer);      if (buffer) { -        result = PyObject_CallMethod(buffer, "write", "(O)", encoded); +        _Py_IDENTIFIER(write); +        result = _PyObject_CallMethodId(buffer, &PyId_write, "(O)", encoded);          Py_DECREF(buffer);          Py_DECREF(encoded);          if (result == NULL) @@ -135,6 +139,7 @@ sys_displayhook(PyObject *self, PyObject *o)      PyObject *modules = interp->modules;      PyObject *builtins = PyDict_GetItemString(modules, "builtins");      int err; +    _Py_IDENTIFIER(_);      if (builtins == NULL) {          PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); @@ -148,7 +153,7 @@ sys_displayhook(PyObject *self, PyObject *o)          Py_INCREF(Py_None);          return Py_None;      } -    if (PyObject_SetAttrString(builtins, "_", Py_None) != 0) +    if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0)          return NULL;      outf = PySys_GetObject("stdout");      if (outf == NULL || outf == Py_None) { @@ -170,7 +175,7 @@ sys_displayhook(PyObject *self, PyObject *o)      }      if (PyFile_WriteString("\n", outf) != 0)          return NULL; -    if (PyObject_SetAttrString(builtins, "_", o) != 0) +    if (_PyObject_SetAttrId(builtins, &PyId__, o) != 0)          return NULL;      Py_INCREF(Py_None);      return Py_None; @@ -770,9 +775,7 @@ interpreter loads extension modules.  Among other things, this will enable\n\  a lazy resolving of symbols when importing a module, if called as\n\  sys.setdlopenflags(0).  To share symbols across extension modules, call as\n\  sys.setdlopenflags(ctypes.RTLD_GLOBAL).  Symbolic names for the flag modules\n\ -can be either found in the ctypes module, or in the DLFCN module. If DLFCN\n\ -is not available, it can be generated from /usr/include/dlfcn.h using the\n\ -h2py script."); +can be found in the os module (RTLD_xxx constants, e.g. os.RTLD_LAZY).");  static PyObject *  sys_getdlopenflags(PyObject *self, PyObject *args) @@ -811,10 +814,11 @@ static PyObject *  sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)  {      PyObject *res = NULL; -    static PyObject *str__sizeof__ = NULL, *gc_head_size = NULL; +    static PyObject *gc_head_size = NULL;      static char *kwlist[] = {"object", "default", 0};      PyObject *o, *dflt = NULL;      PyObject *method; +    _Py_IDENTIFIER(__sizeof__);      if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof",                                       kwlist, &o, &dflt)) @@ -831,8 +835,7 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds)      if (PyType_Ready(Py_TYPE(o)) < 0)          return NULL; -    method = _PyObject_LookupSpecial(o, "__sizeof__", -                                     &str__sizeof__); +    method = _PyObject_LookupSpecial(o, &PyId___sizeof__);      if (method == NULL) {          if (!PyErr_Occurred())              PyErr_Format(PyExc_TypeError, @@ -994,6 +997,27 @@ a 11-tuple where the entries in the tuple are counts of:\n\  extern "C" {  #endif +static PyObject * +sys_debugmallocstats(PyObject *self, PyObject *args) +{ +#ifdef WITH_PYMALLOC +    _PyObject_DebugMallocStats(stderr); +    fputc('\n', stderr); +#endif +    _PyObject_DebugTypeStats(stderr); + +    Py_RETURN_NONE; +} +PyDoc_STRVAR(debugmallocstats_doc, +"_debugmallocstats()\n\ +\n\ +Print summary info to stderr about the state of\n\ +pymalloc's structures.\n\ +\n\ +In Py_DEBUG mode, also perform some expensive internal consistency\n\ +checks.\n\ +"); +  #ifdef Py_TRACE_REFS  /* Defined in objects.c because it uses static globals if that file */  extern PyObject *_Py_GetObjects(PyObject *, PyObject *); @@ -1090,6 +1114,8 @@ static PyMethodDef sys_methods[] = {      {"settrace",        sys_settrace, METH_O, settrace_doc},      {"gettrace",        sys_gettrace, METH_NOARGS, gettrace_doc},      {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc}, +    {"_debugmallocstats", sys_debugmallocstats, METH_VARARGS, +     debugmallocstats_doc},      {NULL,              NULL}           /* sentinel */  }; @@ -1177,7 +1203,6 @@ PySys_AddXOption(const wchar_t *s)      PyObject *opts;      PyObject *name = NULL, *value = NULL;      const wchar_t *name_end; -    int r;      opts = get_xoptions();      if (opts == NULL) @@ -1195,7 +1220,7 @@ PySys_AddXOption(const wchar_t *s)      }      if (name == NULL || value == NULL)          goto error; -    r = PyDict_SetItem(opts, name, value); +    PyDict_SetItem(opts, name, value);      Py_DECREF(name);      Py_DECREF(value);      return; @@ -1252,21 +1277,22 @@ PyDoc_STR(  "\n\  Static objects:\n\  \n\ -float_info -- a dict with information about the float implementation.\n\ -int_info -- a struct sequence with information about the int implementation.\n\ -maxsize -- the largest supported length of containers.\n\ -maxunicode -- the largest supported character\n\  builtin_module_names -- tuple of module names built into this interpreter\n\ -subversion -- subversion information of the build as tuple\n\ -version -- the version of this interpreter as a string\n\ -version_info -- version information as a named tuple\n\ -hexversion -- version information encoded as a single integer\n\  copyright -- copyright notice pertaining to this interpreter\n\ -platform -- platform identifier\n\ -executable -- absolute path of the executable binary of the Python interpreter\n\ -prefix -- prefix used to find the Python library\n\  exec_prefix -- prefix used to find the machine-specific Python library\n\ +executable -- absolute path of the executable binary of the Python interpreter\n\ +float_info -- a struct sequence with information about the float implementation.\n\  float_repr_style -- string indicating the style of repr() output for floats\n\ +hexversion -- version information encoded as a single integer\n\ +implementation -- Python implementation information.\n\ +int_info -- a struct sequence with information about the int implementation.\n\ +maxsize -- the largest supported length of containers.\n\ +maxunicode -- the value of the largest Unicode codepoint\n\ +platform -- platform identifier\n\ +prefix -- prefix used to find the Python library\n\ +thread_info -- a struct sequence with information about the thread implementation.\n\ +version -- the version of this interpreter as a string\n\ +version_info -- version information as a named tuple\n\  "  )  #ifdef MS_WINDOWS @@ -1305,43 +1331,6 @@ settrace() -- set the global debug tracing function\n\  )  /* end of sys_doc */ ; -/* Subversion branch and revision management */ -static int svn_initialized; -static char patchlevel_revision[50]; /* Just the number */ -static char branch[50]; -static char shortbranch[50]; -static const char *svn_revision; - -static void -svnversion_init(void) -{ -    if (svn_initialized) -        return; - -    svn_initialized = 1; -    *patchlevel_revision = '\0'; -    strcpy(branch, ""); -    strcpy(shortbranch, "unknown"); -    svn_revision = ""; -} - -/* Return svnversion output if available. -   Else return Revision of patchlevel.h if on branch. -   Else return empty string */ -const char* -Py_SubversionRevision() -{ -    svnversion_init(); -    return svn_revision; -} - -const char* -Py_SubversionShortBranch() -{ -    svnversion_init(); -    return shortbranch; -} -  PyDoc_STRVAR(flags__doc__,  "sys.flags\n\ @@ -1352,7 +1341,6 @@ static PyTypeObject FlagsType;  static PyStructSequence_Field flags_fields[] = {      {"debug",                   "-d"}, -    {"division_warning",        "-Q"},      {"inspect",                 "-i"},      {"interactive",             "-i"},      {"optimize",                "-O or -OO"}, @@ -1377,9 +1365,9 @@ static PyStructSequence_Desc flags_desc = {      flags__doc__,       /* doc */      flags_fields,       /* fields */  #ifdef RISCOS -    14 -#else      13 +#else +    12  #endif  }; @@ -1397,7 +1385,6 @@ make_flags(void)      PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag))      SetFlag(Py_DebugFlag); -    SetFlag(Py_DivisionWarningFlag);      SetFlag(Py_InspectFlag);      SetFlag(Py_InteractiveFlag);      SetFlag(Py_OptimizeFlag); @@ -1491,6 +1478,73 @@ make_version_info(void)      return version_info;  } +/* sys.implementation values */ +#define NAME "cpython" +const char *_PySys_ImplName = NAME; +#define QUOTE(arg) #arg +#define STRIFY(name) QUOTE(name) +#define MAJOR STRIFY(PY_MAJOR_VERSION) +#define MINOR STRIFY(PY_MINOR_VERSION) +#define TAG NAME "-" MAJOR MINOR; +const char *_PySys_ImplCacheTag = TAG; +#undef NAME +#undef QUOTE +#undef STRIFY +#undef MAJOR +#undef MINOR +#undef TAG + +static PyObject * +make_impl_info(PyObject *version_info) +{ +    int res; +    PyObject *impl_info, *value, *ns; + +    impl_info = PyDict_New(); +    if (impl_info == NULL) +        return NULL; + +    /* populate the dict */ + +    value = PyUnicode_FromString(_PySys_ImplName); +    if (value == NULL) +        goto error; +    res = PyDict_SetItemString(impl_info, "name", value); +    Py_DECREF(value); +    if (res < 0) +        goto error; + +    value = PyUnicode_FromString(_PySys_ImplCacheTag); +    if (value == NULL) +        goto error; +    res = PyDict_SetItemString(impl_info, "cache_tag", value); +    Py_DECREF(value); +    if (res < 0) +        goto error; + +    res = PyDict_SetItemString(impl_info, "version", version_info); +    if (res < 0) +        goto error; + +    value = PyLong_FromLong(PY_VERSION_HEX); +    if (value == NULL) +        goto error; +    res = PyDict_SetItemString(impl_info, "hexversion", value); +    Py_DECREF(value); +    if (res < 0) +        goto error; + +    /* dict ready */ + +    ns = _PyNamespace_New(impl_info); +    Py_DECREF(impl_info); +    return ns; + +error: +    Py_CLEAR(impl_info); +    return NULL; +} +  static struct PyModuleDef sysmodule = {      PyModuleDef_HEAD_INIT,      "sys", @@ -1506,7 +1560,7 @@ static struct PyModuleDef sysmodule = {  PyObject *  _PySys_Init(void)  { -    PyObject *m, *v, *sysdict; +    PyObject *m, *v, *sysdict, *version_info;      char *s;      m = PyModule_Create(&sysmodule); @@ -1547,10 +1601,6 @@ _PySys_Init(void)                           PyUnicode_FromString(Py_GetVersion()));      SET_SYS_FROM_STRING("hexversion",                           PyLong_FromLong(PY_VERSION_HEX)); -    svnversion_init(); -    SET_SYS_FROM_STRING("subversion", -                        Py_BuildValue("(sss)", "CPython", branch, -                                      svn_revision));      SET_SYS_FROM_STRING("_mercurial",                          Py_BuildValue("(szz)", "CPython", _Py_hgidentifier(),                                        _Py_hgversion())); @@ -1569,6 +1619,10 @@ _PySys_Init(void)                          PyUnicode_FromWideChar(Py_GetPrefix(), -1));      SET_SYS_FROM_STRING("exec_prefix",                          PyUnicode_FromWideChar(Py_GetExecPrefix(), -1)); +    SET_SYS_FROM_STRING("base_prefix", +                        PyUnicode_FromWideChar(Py_GetPrefix(), -1)); +    SET_SYS_FROM_STRING("base_exec_prefix", +                        PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));      SET_SYS_FROM_STRING("maxsize",                          PyLong_FromSsize_t(PY_SSIZE_T_MAX));      SET_SYS_FROM_STRING("float_info", @@ -1581,7 +1635,7 @@ _PySys_Init(void)      SET_SYS_FROM_STRING("hash_info",                          get_hash_info());      SET_SYS_FROM_STRING("maxunicode", -                        PyLong_FromLong(PyUnicode_GetMax())); +                        PyLong_FromLong(0x10FFFF));      SET_SYS_FROM_STRING("builtin_module_names",                          list_builtin_module_names());      { @@ -1626,11 +1680,15 @@ _PySys_Init(void)      /* version_info */      if (VersionInfoType.tp_name == 0)          PyStructSequence_InitType(&VersionInfoType, &version_info_desc); -    SET_SYS_FROM_STRING("version_info", make_version_info()); +    version_info = make_version_info(); +    SET_SYS_FROM_STRING("version_info", version_info);      /* prevent user from creating new instances */      VersionInfoType.tp_init = NULL;      VersionInfoType.tp_new = NULL; +    /* implementation */ +    SET_SYS_FROM_STRING("implementation", make_impl_info(version_info)); +      /* flags */      if (FlagsType.tp_name == 0)          PyStructSequence_InitType(&FlagsType, &flags_desc); @@ -1658,6 +1716,10 @@ _PySys_Init(void)                          PyUnicode_FromString("legacy"));  #endif +#ifdef WITH_THREAD +    SET_SYS_FROM_STRING("thread_info", PyThread_GetInfo()); +#endif +  #undef SET_SYS_FROM_STRING      if (PyErr_Occurred())          return NULL; @@ -1812,7 +1874,7 @@ sys_update_path(int argc, wchar_t **argv)          the argument must be the full path anyway. */          wchar_t *ptemp;          if (GetFullPathNameW(argv0, -                           sizeof(fullpath)/sizeof(fullpath[0]), +                           Py_ARRAY_LENGTH(fullpath),                             fullpath,                             &ptemp)) {              argv0 = fullpath; @@ -1881,11 +1943,12 @@ sys_pyfile_write_unicode(PyObject *unicode, PyObject *file)  {      PyObject *writer = NULL, *args = NULL, *result = NULL;      int err; +    _Py_IDENTIFIER(write);      if (file == NULL)          return -1; -    writer = PyObject_GetAttrString(file, "write"); +    writer = _PyObject_GetAttrId(file, &PyId_write);      if (writer == NULL)          goto error; diff --git a/Python/thread.c b/Python/thread.c index d224046e64..e55d34244e 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -7,7 +7,6 @@  #include "Python.h" -  #ifndef _POSIX_THREADS  /* This means pthreads are not implemented in libc headers, hence the macro     not present in unistd.h. But they still can be implemented as an external @@ -27,18 +26,6 @@  #ifndef _POSIX_THREADS -#ifdef __sgi -#define SGI_THREADS -#endif - -#ifdef HAVE_THREAD_H -#define SOLARIS_THREADS -#endif - -#if defined(sun) && !defined(SOLARIS_THREADS) -#define SUN_LWP -#endif -  /* Check if we're running on HP-UX and _SC_THREADS is defined. If so, then     enough of the Posix threads package is implemented to support python     threads. @@ -94,47 +81,21 @@ PyThread_init_thread(void)     or the size specified by the THREAD_STACK_SIZE macro. */  static size_t _pythread_stacksize = 0; -#ifdef SGI_THREADS -#error SGI Irix threads are now unsupported, and code will be removed in 3.3. -#include "thread_sgi.h" -#endif - -#ifdef SOLARIS_THREADS -#include "thread_solaris.h" -#endif - -#ifdef SUN_LWP -#error SunOS lightweight processes are now unsupported, and code will be removed in 3.3. -#include "thread_lwp.h" -#endif - -#ifdef HAVE_PTH -#error GNU pth threads are now unsupported, and code will be removed in 3.3. -#include "thread_pth.h" -#undef _POSIX_THREADS -#endif -  #ifdef _POSIX_THREADS +#define PYTHREAD_NAME "pthread"  #include "thread_pthread.h"  #endif -#ifdef C_THREADS -#error Mach C Threads are now unsupported, and code will be removed in 3.3. -#include "thread_cthread.h" -#endif -  #ifdef NT_THREADS +#define PYTHREAD_NAME "nt"  #include "thread_nt.h"  #endif  #ifdef OS2_THREADS +#define PYTHREAD_NAME "os2"  #include "thread_os2.h"  #endif -#ifdef PLAN9_THREADS -#include "thread_plan9.h" -#endif -  /*  #ifdef FOOBAR_THREADS  #include "thread_foobar.h" @@ -409,3 +370,84 @@ PyThread_ReInitTLS(void)  }  #endif /* Py_HAVE_NATIVE_TLS */ + +PyDoc_STRVAR(threadinfo__doc__, +"sys.thread_info\n\ +\n\ +A struct sequence holding information about the thread implementation."); + +static PyStructSequence_Field threadinfo_fields[] = { +    {"name",    "name of the thread implementation"}, +    {"lock",    "name of the lock implementation"}, +    {"version", "name and version of the thread library"}, +    {0} +}; + +static PyStructSequence_Desc threadinfo_desc = { +    "sys.thread_info",           /* name */ +    threadinfo__doc__,           /* doc */ +    threadinfo_fields,           /* fields */ +    3 +}; + +static PyTypeObject ThreadInfoType; + +PyObject* +PyThread_GetInfo(void) +{ +    PyObject *threadinfo, *value; +    int pos = 0; +#if (defined(_POSIX_THREADS) && defined(HAVE_CONFSTR) \ +     && defined(_CS_GNU_LIBPTHREAD_VERSION)) +    char buffer[255]; +    int len; +#endif + +    if (ThreadInfoType.tp_name == 0) +        PyStructSequence_InitType(&ThreadInfoType, &threadinfo_desc); + +    threadinfo = PyStructSequence_New(&ThreadInfoType); +    if (threadinfo == NULL) +        return NULL; + +    value = PyUnicode_FromString(PYTHREAD_NAME); +    if (value == NULL) { +        Py_DECREF(threadinfo); +        return NULL; +    } +    PyStructSequence_SET_ITEM(threadinfo, pos++, value); + +#ifdef _POSIX_THREADS +#ifdef USE_SEMAPHORES +    value = PyUnicode_FromString("semaphore"); +#else +    value = PyUnicode_FromString("mutex+cond"); +#endif +    if (value == NULL) { +        Py_DECREF(threadinfo); +        return NULL; +    } +#else +    Py_INCREF(Py_None); +    value = Py_None; +#endif +    PyStructSequence_SET_ITEM(threadinfo, pos++, value); + +#if (defined(_POSIX_THREADS) && defined(HAVE_CONFSTR) \ +     && defined(_CS_GNU_LIBPTHREAD_VERSION)) +    value = NULL; +    len = confstr(_CS_GNU_LIBPTHREAD_VERSION, buffer, sizeof(buffer)); +    if (1 < len && len < sizeof(buffer)) { +        value = PyUnicode_DecodeFSDefaultAndSize(buffer, len-1); +        if (value == NULL) +            PyErr_Clear(); +    } +    if (value == NULL) +#endif +    { +        Py_INCREF(Py_None); +        value = Py_None; +    } +    PyStructSequence_SET_ITEM(threadinfo, pos++, value); +    return threadinfo; +} diff --git a/Python/thread_cthread.h b/Python/thread_cthread.h deleted file mode 100644 index 1b3e3904cd..0000000000 --- a/Python/thread_cthread.h +++ /dev/null @@ -1,112 +0,0 @@ - -#ifdef MACH_C_THREADS -#include <mach/cthreads.h> -#endif - -#ifdef HURD_C_THREADS -#include <cthreads.h> -#endif - -/* - * Initialization. - */ -static void -PyThread__init_thread(void) -{ -#ifndef HURD_C_THREADS -    /* Roland McGrath said this should not be used since this is -    done while linking to threads */ -    cthread_init(); -#else -/* do nothing */ -    ; -#endif -} - -/* - * Thread support. - */ -long -PyThread_start_new_thread(void (*func)(void *), void *arg) -{ -    int success = 0;            /* init not needed when SOLARIS_THREADS and */ -                /* C_THREADS implemented properly */ - -    dprintf(("PyThread_start_new_thread called\n")); -    if (!initialized) -        PyThread_init_thread(); -    /* looks like solaris detaches the thread to never rejoin -     * so well do it here -     */ -    cthread_detach(cthread_fork((cthread_fn_t) func, arg)); -    return success < 0 ? -1 : 0; -} - -long -PyThread_get_thread_ident(void) -{ -    if (!initialized) -        PyThread_init_thread(); -    return (long) cthread_self(); -} - -void -PyThread_exit_thread(void) -{ -    dprintf(("PyThread_exit_thread called\n")); -    if (!initialized) -        exit(0); -    cthread_exit(0); -} - -/* - * Lock support. - */ -PyThread_type_lock -PyThread_allocate_lock(void) -{ -    mutex_t lock; - -    dprintf(("PyThread_allocate_lock called\n")); -    if (!initialized) -        PyThread_init_thread(); - -    lock = mutex_alloc(); -    if (mutex_init(lock)) { -        perror("mutex_init"); -        free((void *) lock); -        lock = 0; -    } -    dprintf(("PyThread_allocate_lock() -> %p\n", lock)); -    return (PyThread_type_lock) lock; -} - -void -PyThread_free_lock(PyThread_type_lock lock) -{ -    dprintf(("PyThread_free_lock(%p) called\n", lock)); -    mutex_free(lock); -} - -int -PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) -{ -    int success = FALSE; - -    dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); -    if (waitflag) {             /* blocking */ -        mutex_lock((mutex_t)lock); -        success = TRUE; -    } else {                    /* non blocking */ -        success = mutex_try_lock((mutex_t)lock); -    } -    dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); -    return success; -} - -void -PyThread_release_lock(PyThread_type_lock lock) -{ -    dprintf(("PyThread_release_lock(%p) called\n", lock)); -    mutex_unlock((mutex_t )lock); -} diff --git a/Python/thread_lwp.h b/Python/thread_lwp.h deleted file mode 100644 index ba7b37ad7e..0000000000 --- a/Python/thread_lwp.h +++ /dev/null @@ -1,113 +0,0 @@ - -#include <stdlib.h> -#include <lwp/lwp.h> -#include <lwp/stackdep.h> - -#define STACKSIZE       1000    /* stacksize for a thread */ -#define NSTACKS         2       /* # stacks to be put in cache initially */ - -struct lock { -    int lock_locked; -    cv_t lock_condvar; -    mon_t lock_monitor; -}; - - -/* - * Initialization. - */ -static void PyThread__init_thread(void) -{ -    lwp_setstkcache(STACKSIZE, NSTACKS); -} - -/* - * Thread support. - */ - - -long PyThread_start_new_thread(void (*func)(void *), void *arg) -{ -    thread_t tid; -    int success; -    dprintf(("PyThread_start_new_thread called\n")); -    if (!initialized) -        PyThread_init_thread(); -    success = lwp_create(&tid, func, MINPRIO, 0, lwp_newstk(), 1, arg); -    return success < 0 ? -1 : 0; -} - -long PyThread_get_thread_ident(void) -{ -    thread_t tid; -    if (!initialized) -        PyThread_init_thread(); -    if (lwp_self(&tid) < 0) -        return -1; -    return tid.thread_id; -} - -void PyThread_exit_thread(void) -{ -    dprintf(("PyThread_exit_thread called\n")); -    if (!initialized) -        exit(0); -    lwp_destroy(SELF); -} - -/* - * Lock support. - */ -PyThread_type_lock PyThread_allocate_lock(void) -{ -    struct lock *lock; -    extern char *malloc(size_t); - -    dprintf(("PyThread_allocate_lock called\n")); -    if (!initialized) -        PyThread_init_thread(); - -    lock = (struct lock *) malloc(sizeof(struct lock)); -    lock->lock_locked = 0; -    (void) mon_create(&lock->lock_monitor); -    (void) cv_create(&lock->lock_condvar, lock->lock_monitor); -    dprintf(("PyThread_allocate_lock() -> %p\n", lock)); -    return (PyThread_type_lock) lock; -} - -void PyThread_free_lock(PyThread_type_lock lock) -{ -    dprintf(("PyThread_free_lock(%p) called\n", lock)); -    mon_destroy(((struct lock *) lock)->lock_monitor); -    free((char *) lock); -} - -int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) -{ -    int success; - -    dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); -    success = 0; - -    (void) mon_enter(((struct lock *) lock)->lock_monitor); -    if (waitflag) -        while (((struct lock *) lock)->lock_locked) -            cv_wait(((struct lock *) lock)->lock_condvar); -    if (!((struct lock *) lock)->lock_locked) { -        success = 1; -        ((struct lock *) lock)->lock_locked = 1; -    } -    cv_broadcast(((struct lock *) lock)->lock_condvar); -    mon_exit(((struct lock *) lock)->lock_monitor); -    dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); -    return success; -} - -void PyThread_release_lock(PyThread_type_lock lock) -{ -    dprintf(("PyThread_release_lock(%p) called\n", lock)); -    (void) mon_enter(((struct lock *) lock)->lock_monitor); -    ((struct lock *) lock)->lock_locked = 0; -    cv_broadcast(((struct lock *) lock)->lock_condvar); -    mon_exit(((struct lock *) lock)->lock_monitor); -} diff --git a/Python/thread_nt.h b/Python/thread_nt.h index d1bb0e5673..938bf1e3fe 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -9,6 +9,109 @@  #include <process.h>  #endif +/* options */ +#ifndef _PY_USE_CV_LOCKS +#define _PY_USE_CV_LOCKS 1     /* use locks based on cond vars */ +#endif + +/* Now, define a non-recursive mutex using either condition variables + * and critical sections (fast) or using operating system mutexes + * (slow) + */ + +#if _PY_USE_CV_LOCKS + +#include "condvar.h" + +typedef struct _NRMUTEX +{ +    PyMUTEX_T cs; +    PyCOND_T cv; +    int locked; +} NRMUTEX; +typedef NRMUTEX *PNRMUTEX; + +PNRMUTEX +AllocNonRecursiveMutex() +{ +    PNRMUTEX m = (PNRMUTEX)malloc(sizeof(NRMUTEX)); +    if (!m) +        return NULL; +    if (PyCOND_INIT(&m->cv)) +        goto fail; +    if (PyMUTEX_INIT(&m->cs)) { +        PyCOND_FINI(&m->cv); +        goto fail; +    } +    m->locked = 0; +    return m; +fail: +    free(m); +    return NULL; +} + +VOID +FreeNonRecursiveMutex(PNRMUTEX mutex) +{ +    if (mutex) { +        PyCOND_FINI(&mutex->cv); +        PyMUTEX_FINI(&mutex->cs); +        free(mutex); +    } +} + +DWORD +EnterNonRecursiveMutex(PNRMUTEX mutex, DWORD milliseconds) +{ +    DWORD result = WAIT_OBJECT_0; +    if (PyMUTEX_LOCK(&mutex->cs)) +        return WAIT_FAILED; +    if (milliseconds == INFINITE) { +        while (mutex->locked) { +            if (PyCOND_WAIT(&mutex->cv, &mutex->cs)) { +                result = WAIT_FAILED; +                break; +            } +        } +    } else if (milliseconds != 0) { +        /* wait at least until the target */ +        DWORD now, target = GetTickCount() + milliseconds; +        while (mutex->locked) { +            if (PyCOND_TIMEDWAIT(&mutex->cv, &mutex->cs, milliseconds*1000) < 0) { +                result = WAIT_FAILED; +                break; +            } +            now = GetTickCount(); +            if (target <= now) +                break; +            milliseconds = target-now; +        } +    } +    if (!mutex->locked) { +        mutex->locked = 1; +        result = WAIT_OBJECT_0; +    } else if (result == WAIT_OBJECT_0) +        result = WAIT_TIMEOUT; +    /* else, it is WAIT_FAILED */ +    PyMUTEX_UNLOCK(&mutex->cs); /* must ignore result here */ +    return result; +} + +BOOL +LeaveNonRecursiveMutex(PNRMUTEX mutex) +{ +    BOOL result; +    if (PyMUTEX_LOCK(&mutex->cs)) +        return FALSE; +    mutex->locked = 0; +    result = PyCOND_SIGNAL(&mutex->cv); +    result &= PyMUTEX_UNLOCK(&mutex->cs); +    return result; +}     + +#else /* if ! _PY_USE_CV_LOCKS */ + +/* NR-locks based on a kernel mutex */  #define PNRMUTEX HANDLE  PNRMUTEX @@ -35,6 +138,7 @@ LeaveNonRecursiveMutex(PNRMUTEX mutex)  {      return ReleaseSemaphore(mutex, 1, NULL);  } +#endif /* _PY_USE_CV_LOCKS */  long PyThread_get_thread_ident(void); diff --git a/Python/thread_pth.h b/Python/thread_pth.h index 82a00e72ba..5704266a03 100644 --- a/Python/thread_pth.h +++ b/Python/thread_pth.h @@ -69,9 +69,8 @@ long PyThread_get_thread_ident(void)      volatile pth_t threadid;      if (!initialized)          PyThread_init_thread(); -    /* Jump through some hoops for Alpha OSF/1 */      threadid = pth_self(); -    return (long) *(long *) &threadid; +    return (long) threadid;  }  void PyThread_exit_thread(void) diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 3cde03567c..5007aaf0b7 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -148,7 +148,7 @@ typedef struct {   * Initialization.   */ -#ifdef _HAVE_BSDI +#if defined(_HAVE_BSDI)  static  void _noop(void)  { @@ -244,8 +244,7 @@ PyThread_start_new_thread(void (*func)(void *), void *arg)     hosed" because:       - It does not guarantee the promise that a non-zero integer is returned.       - The cast to long is inherently unsafe. -     - It is not clear that the 'volatile' (for AIX?) and ugly casting in the -       latter return statement (for Alpha OSF/1) are any longer necessary. +     - It is not clear that the 'volatile' (for AIX?) are any longer necessary.  */  long  PyThread_get_thread_ident(void) @@ -253,13 +252,8 @@ PyThread_get_thread_ident(void)      volatile pthread_t threadid;      if (!initialized)          PyThread_init_thread(); -    /* Jump through some hoops for Alpha OSF/1 */      threadid = pthread_self(); -#if SIZEOF_PTHREAD_T <= SIZEOF_LONG      return (long) threadid; -#else -    return (long) *(long *) &threadid; -#endif  }  void @@ -449,12 +443,15 @@ PyThread_free_lock(PyThread_type_lock lock)      dprintf(("PyThread_free_lock(%p) called\n", lock)); -    status = pthread_mutex_destroy( &thelock->mut ); -    CHECK_STATUS("pthread_mutex_destroy"); - +    /* some pthread-like implementations tie the mutex to the cond +     * and must have the cond destroyed first. +     */      status = pthread_cond_destroy( &thelock->lock_released );      CHECK_STATUS("pthread_cond_destroy"); +    status = pthread_mutex_destroy( &thelock->mut ); +    CHECK_STATUS("pthread_mutex_destroy"); +      free((void *)thelock);  } @@ -537,12 +534,12 @@ PyThread_release_lock(PyThread_type_lock lock)      thelock->locked = 0; -    status = pthread_mutex_unlock( &thelock->mut ); -    CHECK_STATUS("pthread_mutex_unlock[3]"); -      /* wake up someone (anyone, if any) waiting on the lock */      status = pthread_cond_signal( &thelock->lock_released );      CHECK_STATUS("pthread_cond_signal"); + +    status = pthread_mutex_unlock( &thelock->mut ); +    CHECK_STATUS("pthread_mutex_unlock[3]");  }  #endif /* USE_SEMAPHORES */ diff --git a/Python/thread_sgi.h b/Python/thread_sgi.h deleted file mode 100644 index 771ab2cc60..0000000000 --- a/Python/thread_sgi.h +++ /dev/null @@ -1,259 +0,0 @@ - -#include <stdlib.h> -#include <stdio.h> -#include <signal.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <sys/prctl.h> -#include <ulocks.h> -#include <errno.h> - -#define HDR_SIZE        2680    /* sizeof(ushdr_t) */ -#define MAXPROC         100     /* max # of threads that can be started */ - -static usptr_t *shared_arena; -static ulock_t count_lock;      /* protection for some variables */ -static ulock_t wait_lock;       /* lock used to wait for other threads */ -static int waiting_for_threads; /* protected by count_lock */ -static int nthreads;            /* protected by count_lock */ -static int exit_status; -static int exiting;             /* we're already exiting (for maybe_exit) */ -static pid_t my_pid;            /* PID of main thread */ -static struct pidlist { -    pid_t parent; -    pid_t child; -} pidlist[MAXPROC];     /* PIDs of other threads; protected by count_lock */ -static int maxpidindex;         /* # of PIDs in pidlist */ -/* - * Initialization. - */ -static void PyThread__init_thread(void) -{ -#ifdef USE_DL -    long addr, size; -#endif /* USE_DL */ - - -#ifdef USE_DL -    if ((size = usconfig(CONF_INITSIZE, 64*1024)) < 0) -        perror("usconfig - CONF_INITSIZE (check)"); -    if (usconfig(CONF_INITSIZE, size) < 0) -        perror("usconfig - CONF_INITSIZE (reset)"); -    addr = (long) dl_getrange(size + HDR_SIZE); -    dprintf(("trying to use addr %p-%p for shared arena\n", addr, addr+size)); -    errno = 0; -    if ((addr = usconfig(CONF_ATTACHADDR, addr)) < 0 && errno != 0) -        perror("usconfig - CONF_ATTACHADDR (set)"); -#endif /* USE_DL */ -    if (usconfig(CONF_INITUSERS, 16) < 0) -        perror("usconfig - CONF_INITUSERS"); -    my_pid = getpid();          /* so that we know which is the main thread */ -    if (usconfig(CONF_ARENATYPE, US_SHAREDONLY) < 0) -        perror("usconfig - CONF_ARENATYPE"); -    usconfig(CONF_LOCKTYPE, US_DEBUG); /* XXX */ -#ifdef Py_DEBUG -    if (thread_debug & 4) -        usconfig(CONF_LOCKTYPE, US_DEBUGPLUS); -    else if (thread_debug & 2) -        usconfig(CONF_LOCKTYPE, US_DEBUG); -#endif /* Py_DEBUG */ -    if ((shared_arena = usinit(tmpnam(0))) == 0) -        perror("usinit"); -#ifdef USE_DL -    if (usconfig(CONF_ATTACHADDR, addr) < 0) /* reset address */ -        perror("usconfig - CONF_ATTACHADDR (reset)"); -#endif /* USE_DL */ -    if ((count_lock = usnewlock(shared_arena)) == NULL) -        perror("usnewlock (count_lock)"); -    (void) usinitlock(count_lock); -    if ((wait_lock = usnewlock(shared_arena)) == NULL) -        perror("usnewlock (wait_lock)"); -    dprintf(("arena start: %p, arena size: %ld\n",  shared_arena, (long) usconfig(CONF_GETSIZE, shared_arena))); -} - -/* - * Thread support. - */ - -static void clean_threads(void) -{ -    int i, j; -    pid_t mypid, pid; - -    /* clean up any exited threads */ -    mypid = getpid(); -    i = 0; -    while (i < maxpidindex) { -        if (pidlist[i].parent == mypid && (pid = pidlist[i].child) > 0) { -            pid = waitpid(pid, 0, WNOHANG); -            if (pid > 0) { -                /* a thread has exited */ -                pidlist[i] = pidlist[--maxpidindex]; -                /* remove references to children of dead proc */ -                for (j = 0; j < maxpidindex; j++) -                    if (pidlist[j].parent == pid) -                        pidlist[j].child = -1; -                continue; /* don't increment i */ -            } -        } -        i++; -    } -    /* clean up the list */ -    i = 0; -    while (i < maxpidindex) { -        if (pidlist[i].child == -1) { -            pidlist[i] = pidlist[--maxpidindex]; -            continue; /* don't increment i */ -        } -        i++; -    } -} - -long PyThread_start_new_thread(void (*func)(void *), void *arg) -{ -#ifdef USE_DL -    long addr, size; -    static int local_initialized = 0; -#endif /* USE_DL */ -    int success = 0;            /* init not needed when SOLARIS_THREADS and */ -                /* C_THREADS implemented properly */ - -    dprintf(("PyThread_start_new_thread called\n")); -    if (!initialized) -        PyThread_init_thread(); -    switch (ussetlock(count_lock)) { -    case 0: return 0; -    case -1: perror("ussetlock (count_lock)"); -    } -    if (maxpidindex >= MAXPROC) -        success = -1; -    else { -#ifdef USE_DL -        if (!local_initialized) { -            if ((size = usconfig(CONF_INITSIZE, 64*1024)) < 0) -                perror("usconfig - CONF_INITSIZE (check)"); -            if (usconfig(CONF_INITSIZE, size) < 0) -                perror("usconfig - CONF_INITSIZE (reset)"); -            addr = (long) dl_getrange(size + HDR_SIZE); -            dprintf(("trying to use addr %p-%p for sproc\n", -                     addr, addr+size)); -            errno = 0; -            if ((addr = usconfig(CONF_ATTACHADDR, addr)) < 0 && -                errno != 0) -                perror("usconfig - CONF_ATTACHADDR (set)"); -        } -#endif /* USE_DL */ -        clean_threads(); -        if ((success = sproc(func, PR_SALL, arg)) < 0) -            perror("sproc"); -#ifdef USE_DL -        if (!local_initialized) { -            if (usconfig(CONF_ATTACHADDR, addr) < 0) -                /* reset address */ -                perror("usconfig - CONF_ATTACHADDR (reset)"); -            local_initialized = 1; -        } -#endif /* USE_DL */ -        if (success >= 0) { -            nthreads++; -            pidlist[maxpidindex].parent = getpid(); -            pidlist[maxpidindex++].child = success; -            dprintf(("pidlist[%d] = %d\n", -                     maxpidindex-1, success)); -        } -    } -    if (usunsetlock(count_lock) < 0) -        perror("usunsetlock (count_lock)"); -    return success; -} - -long PyThread_get_thread_ident(void) -{ -    return getpid(); -} - -void PyThread_exit_thread(void) -{ -    dprintf(("PyThread_exit_thread called\n")); -    if (!initialized) -        exit(0); -    if (ussetlock(count_lock) < 0) -        perror("ussetlock (count_lock)"); -    nthreads--; -    if (getpid() == my_pid) { -        /* main thread; wait for other threads to exit */ -        exiting = 1; -        waiting_for_threads = 1; -        if (ussetlock(wait_lock) < 0) -            perror("ussetlock (wait_lock)"); -        for (;;) { -            if (nthreads < 0) { -                dprintf(("really exit (%d)\n", exit_status)); -                exit(exit_status); -            } -            if (usunsetlock(count_lock) < 0) -                perror("usunsetlock (count_lock)"); -            dprintf(("waiting for other threads (%d)\n", nthreads)); -            if (ussetlock(wait_lock) < 0) -                perror("ussetlock (wait_lock)"); -            if (ussetlock(count_lock) < 0) -                perror("ussetlock (count_lock)"); -        } -    } -    /* not the main thread */ -    if (waiting_for_threads) { -        dprintf(("main thread is waiting\n")); -        if (usunsetlock(wait_lock) < 0) -            perror("usunsetlock (wait_lock)"); -    } -    if (usunsetlock(count_lock) < 0) -        perror("usunsetlock (count_lock)"); -    _exit(0); -} - -/* - * Lock support. - */ -PyThread_type_lock PyThread_allocate_lock(void) -{ -    ulock_t lock; - -    dprintf(("PyThread_allocate_lock called\n")); -    if (!initialized) -        PyThread_init_thread(); - -    if ((lock = usnewlock(shared_arena)) == NULL) -        perror("usnewlock"); -    (void) usinitlock(lock); -    dprintf(("PyThread_allocate_lock() -> %p\n", lock)); -    return (PyThread_type_lock) lock; -} - -void PyThread_free_lock(PyThread_type_lock lock) -{ -    dprintf(("PyThread_free_lock(%p) called\n", lock)); -    usfreelock((ulock_t) lock, shared_arena); -} - -int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) -{ -    int success; - -    dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); -    errno = 0;                  /* clear it just in case */ -    if (waitflag) -        success = ussetlock((ulock_t) lock); -    else -        success = uscsetlock((ulock_t) lock, 1); /* Try it once */ -    if (success < 0) -        perror(waitflag ? "ussetlock" : "uscsetlock"); -    dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); -    return success; -} - -void PyThread_release_lock(PyThread_type_lock lock) -{ -    dprintf(("PyThread_release_lock(%p) called\n", lock)); -    if (usunsetlock((ulock_t) lock) < 0) -        perror("usunsetlock"); -} diff --git a/Python/thread_solaris.h b/Python/thread_solaris.h deleted file mode 100644 index 1ce1cfcba9..0000000000 --- a/Python/thread_solaris.h +++ /dev/null @@ -1,130 +0,0 @@ - -#include <stdlib.h> -#include <stdio.h> -#include <errno.h> -#include </usr/include/thread.h> -#undef _POSIX_THREADS - - -/* - * Initialization. - */ -static void PyThread__init_thread(void) -{ -} - -/* - * Thread support. - */ -struct func_arg { -    void (*func)(void *); -    void *arg; -}; - -static void * -new_func(void *funcarg) -{ -    void (*func)(void *); -    void *arg; - -    func = ((struct func_arg *) funcarg)->func; -    arg = ((struct func_arg *) funcarg)->arg; -    free(funcarg); -    (*func)(arg); -    return 0; -} - - -long -PyThread_start_new_thread(void (*func)(void *), void *arg) -{ -    thread_t tid; -    struct func_arg *funcarg; - -    dprintf(("PyThread_start_new_thread called\n")); -    if (!initialized) -        PyThread_init_thread(); -    funcarg = (struct func_arg *) malloc(sizeof(struct func_arg)); -    funcarg->func = func; -    funcarg->arg = arg; -    if (thr_create(0, 0, new_func, funcarg, -                   THR_DETACHED | THR_NEW_LWP, &tid)) { -        perror("thr_create"); -        free((void *) funcarg); -        return -1; -    } -    return tid; -} - -long -PyThread_get_thread_ident(void) -{ -    if (!initialized) -        PyThread_init_thread(); -    return thr_self(); -} - -void -PyThread_exit_thread(void) -{ -    dprintf(("PyThread_exit_thread called\n")); -    if (!initialized) -        exit(0); -    thr_exit(0); -} - -/* - * Lock support. - */ -PyThread_type_lock -PyThread_allocate_lock(void) -{ -    mutex_t *lock; - -    dprintf(("PyThread_allocate_lock called\n")); -    if (!initialized) -        PyThread_init_thread(); - -    lock = (mutex_t *) malloc(sizeof(mutex_t)); -    if (mutex_init(lock, USYNC_THREAD, 0)) { -        perror("mutex_init"); -        free((void *) lock); -        lock = 0; -    } -    dprintf(("PyThread_allocate_lock() -> %p\n", lock)); -    return (PyThread_type_lock) lock; -} - -void -PyThread_free_lock(PyThread_type_lock lock) -{ -    dprintf(("PyThread_free_lock(%p) called\n", lock)); -    mutex_destroy((mutex_t *) lock); -    free((void *) lock); -} - -int -PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) -{ -    int success; - -    dprintf(("PyThread_acquire_lock(%p, %d) called\n", lock, waitflag)); -    if (waitflag) -        success = mutex_lock((mutex_t *) lock); -    else -        success = mutex_trylock((mutex_t *) lock); -    if (success < 0) -        perror(waitflag ? "mutex_lock" : "mutex_trylock"); -    else -        success = !success; /* solaris does it the other way round */ -    dprintf(("PyThread_acquire_lock(%p, %d) -> %d\n", lock, waitflag, success)); -    return success; -} - -void -PyThread_release_lock(PyThread_type_lock lock) -{ -    dprintf(("PyThread_release_lock(%p) called\n", lock)); -    if (mutex_unlock((mutex_t *) lock)) -        perror("mutex_unlock"); -} diff --git a/Python/thread_wince.h b/Python/thread_wince.h deleted file mode 100644 index 51ddc02f9a..0000000000 --- a/Python/thread_wince.h +++ /dev/null @@ -1,136 +0,0 @@ - -/* This code implemented by Mark Hammond (MHammond@skippinet.com.au) */ - -#include <windows.h> -#include <limits.h> -#include <pydebug.h> - -long PyThread_get_thread_ident(void); - -/* - * Change all headers to pure ANSI as no one will use K&R style on an - * NT - */ - -/* - * Initialization of the C package, should not be needed. - */ -static void PyThread__init_thread(void) -{ -} - -/* - * Thread support. - */ -long PyThread_start_new_thread(void (*func)(void *), void *arg) -{ -    long rv; -    int success = -1; - -    dprintf(("%ld: PyThread_start_new_thread called\n", PyThread_get_thread_ident())); -    if (!initialized) -        PyThread_init_thread(); - -    rv = _beginthread(func, 0, arg); /* use default stack size */ - -    if (rv != -1) { -        success = 0; -        dprintf(("%ld: PyThread_start_new_thread succeeded:\n", PyThread_get_thread_ident())); -    } - -    return success; -} - -/* - * Return the thread Id instead of an handle. The Id is said to uniquely identify the - * thread in the system - */ -long PyThread_get_thread_ident(void) -{ -    if (!initialized) -        PyThread_init_thread(); - -    return GetCurrentThreadId(); -} - -void PyThread_exit_thread(void) -{ -    dprintf(("%ld: PyThread_exit_thread called\n", PyThread_get_thread_ident())); -    if (!initialized) -        exit(0); -    _endthread(); -} - -/* - * Lock support. It has to be implemented using Mutexes, as - * CE doesnt support semaphores.  Therefore we use some hacks to - * simulate the non reentrant requirements of Python locks - */ -PyThread_type_lock PyThread_allocate_lock(void) -{ -    HANDLE aLock; - -    dprintf(("PyThread_allocate_lock called\n")); -    if (!initialized) -    PyThread_init_thread(); - -    aLock = CreateEvent(NULL,           /* Security attributes      */ -            0,              /* Manual-Reset               */ -                        1,              /* Is initially signalled  */ -            NULL);          /* Name of event            */ - -    dprintf(("%ld: PyThread_allocate_lock() -> %p\n", PyThread_get_thread_ident(), aLock)); - -    return (PyThread_type_lock) aLock; -} - -void PyThread_free_lock(PyThread_type_lock aLock) -{ -    dprintf(("%ld: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock)); - -    CloseHandle(aLock); -} - -/* - * Return 1 on success if the lock was acquired - * - * and 0 if the lock was not acquired. This means a 0 is returned - * if the lock has already been acquired by this thread! - */ -int PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag) -{ -    int success = 1; -    DWORD waitResult; - -    dprintf(("%ld: PyThread_acquire_lock(%p, %d) called\n", PyThread_get_thread_ident(),aLock, waitflag)); - -#ifndef DEBUG -    waitResult = WaitForSingleObject(aLock, (waitflag ? INFINITE : 0)); -#else -    /* To aid in debugging, we regularly wake up.  This allows us to -    break into the debugger */ -    while (TRUE) { -        waitResult = WaitForSingleObject(aLock, waitflag ? 3000 : 0); -        if (waitflag==0 || (waitflag && waitResult == WAIT_OBJECT_0)) -            break; -    } -#endif - -    if (waitResult != WAIT_OBJECT_0) { -                success = 0;    /* We failed */ -    } - -    dprintf(("%ld: PyThread_acquire_lock(%p, %d) -> %d\n", PyThread_get_thread_ident(),aLock, waitflag, success)); - -    return success; -} - -void PyThread_release_lock(PyThread_type_lock aLock) -{ -    dprintf(("%ld: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock)); - -    if (!SetEvent(aLock)) -    dprintf(("%ld: Could not PyThread_release_lock(%p) error: %l\n", PyThread_get_thread_ident(), aLock, GetLastError())); -} - - diff --git a/Python/traceback.c b/Python/traceback.c index 59bb3f0d15..b928902ef0 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -13,8 +13,13 @@  #define OFF(x) offsetof(PyTracebackObject, x) -/* Method from Parser/tokenizer.c */ -extern char * PyTokenizer_FindEncoding(int); +#define PUTS(fd, str) write(fd, str, strlen(str)) +#define MAX_STRING_LENGTH 500 +#define MAX_FRAME_DEPTH 100 +#define MAX_NTHREADS 100 + +/* Function from Parser/tokenizer.c */ +extern char * PyTokenizer_FindEncodingFilename(int, PyObject *);  static PyObject *  tb_dir(PyTracebackObject *self) @@ -147,6 +152,7 @@ _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject *      const char* filepath;      Py_ssize_t len;      PyObject* result; +    _Py_IDENTIFIER(open);      filebytes = PyUnicode_EncodeFSDefault(filename);      if (filebytes == NULL) { @@ -194,7 +200,7 @@ _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject *              namebuf[len++] = SEP;          strcpy(namebuf+len, tail); -        binary = PyObject_CallMethod(io, "open", "ss", namebuf, "rb"); +        binary = _PyObject_CallMethodId(io, &PyId_open, "ss", namebuf, "rb");          if (binary != NULL) {              result = binary;              goto finally; @@ -224,8 +230,11 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)      PyObject *lineobj = NULL;      PyObject *res;      char buf[MAXPATHLEN+1]; -    Py_UNICODE *u, *p; -    Py_ssize_t len; +    int kind; +    void *data; +    _Py_IDENTIFIER(close); +    _Py_IDENTIFIER(open); +    _Py_IDENTIFIER(TextIOWrapper);      /* open the file */      if (filename == NULL) @@ -234,7 +243,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)      io = PyImport_ImportModuleNoBlock("io");      if (io == NULL)          return -1; -    binary = PyObject_CallMethod(io, "open", "Os", filename, "rb"); +    binary = _PyObject_CallMethodId(io, &PyId_open, "Os", filename, "rb");      if (binary == NULL) {          binary = _Py_FindSourceFile(filename, buf, sizeof(buf), io); @@ -246,10 +255,10 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)      /* use the right encoding to decode the file as unicode */      fd = PyObject_AsFileDescriptor(binary); -    found_encoding = PyTokenizer_FindEncoding(fd); +    found_encoding = PyTokenizer_FindEncodingFilename(fd, filename);      encoding = (found_encoding != NULL) ? found_encoding : "utf-8";      lseek(fd, 0, 0); /* Reset position */ -    fob = PyObject_CallMethod(io, "TextIOWrapper", "Os", binary, encoding); +    fob = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "Os", binary, encoding);      Py_DECREF(io);      Py_DECREF(binary);      PyMem_FREE(found_encoding); @@ -268,7 +277,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)              break;          }      } -    res = PyObject_CallMethod(fob, "close", ""); +    res = _PyObject_CallMethodId(fob, &PyId_close, "");      if (res)          Py_DECREF(res);      else @@ -280,13 +289,16 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)      }      /* remove the indentation of the line */ -    u = PyUnicode_AS_UNICODE(lineobj); -    len = PyUnicode_GET_SIZE(lineobj); -    for (p=u; *p == ' ' || *p == '\t' || *p == '\014'; p++) -        len--; -    if (u != p) { +    kind = PyUnicode_KIND(lineobj); +    data = PyUnicode_DATA(lineobj); +    for (i=0; i < PyUnicode_GET_LENGTH(lineobj); i++) { +        Py_UCS4 ch = PyUnicode_READ(kind, data, i); +        if (ch != ' ' && ch != '\t' && ch != '\014') +            break; +    } +    if (i) {          PyObject *truncated; -        truncated = PyUnicode_FromUnicode(p, len); +        truncated = PyUnicode_Substring(lineobj, i, PyUnicode_GET_LENGTH(lineobj));          if (truncated) {              Py_DECREF(lineobj);              lineobj = truncated; @@ -332,7 +344,10 @@ tb_displayline(PyObject *f, PyObject *filename, int lineno, PyObject *name)      Py_DECREF(line);      if (err != 0)          return err; -    return _Py_DisplaySourceLine(f, filename, lineno, 4); +    /* ignore errors since we can't report them, can we? */ +    if (_Py_DisplaySourceLine(f, filename, lineno, 4)) +        PyErr_Clear(); +    return err;  }  static int @@ -402,3 +417,250 @@ PyTraceBack_Print(PyObject *v, PyObject *f)          err = tb_printinternal((PyTracebackObject *)v, f, limit);      return err;  } + +/* Reverse a string. For example, "abcd" becomes "dcba". + +   This function is signal safe. */ + +static void +reverse_string(char *text, const size_t len) +{ +    char tmp; +    size_t i, j; +    if (len == 0) +        return; +    for (i=0, j=len-1; i < j; i++, j--) { +        tmp = text[i]; +        text[i] = text[j]; +        text[j] = tmp; +    } +} + +/* Format an integer in range [0; 999999] to decimal, +   and write it into the file fd. + +   This function is signal safe. */ + +static void +dump_decimal(int fd, int value) +{ +    char buffer[7]; +    int len; +    if (value < 0 || 999999 < value) +        return; +    len = 0; +    do { +        buffer[len] = '0' + (value % 10); +        value /= 10; +        len++; +    } while (value); +    reverse_string(buffer, len); +    write(fd, buffer, len); +} + +/* Format an integer in range [0; 0xffffffff] to hexdecimal of 'width' digits, +   and write it into the file fd. + +   This function is signal safe. */ + +static void +dump_hexadecimal(int width, unsigned long value, int fd) +{ +    int len; +    char buffer[sizeof(unsigned long) * 2 + 1]; +    len = 0; +    do { +        buffer[len] = Py_hexdigits[value & 15]; +        value >>= 4; +        len++; +    } while (len < width || value); +    reverse_string(buffer, len); +    write(fd, buffer, len); +} + +/* Write an unicode object into the file fd using ascii+backslashreplace. + +   This function is signal safe. */ + +static void +dump_ascii(int fd, PyObject *text) +{ +    PyASCIIObject *ascii = (PyASCIIObject *)text; +    Py_ssize_t i, size; +    int truncated; +    int kind; +    void *data = NULL; +    wchar_t *wstr = NULL; +    Py_UCS4 ch; + +    size = ascii->length; +    kind = ascii->state.kind; +    if (ascii->state.compact) { +        if (ascii->state.ascii) +            data = ((PyASCIIObject*)text) + 1; +        else +            data = ((PyCompactUnicodeObject*)text) + 1; +    } +    else if (kind != PyUnicode_WCHAR_KIND) { +        data = ((PyUnicodeObject *)text)->data.any; +        if (data == NULL) +            return; +    } +    else { +        wstr = ((PyASCIIObject *)text)->wstr; +        if (wstr == NULL) +            return; +        size = ((PyCompactUnicodeObject *)text)->wstr_length; +    } + +    if (MAX_STRING_LENGTH < size) { +        size = MAX_STRING_LENGTH; +        truncated = 1; +    } +    else +        truncated = 0; + +    for (i=0; i < size; i++) { +        if (kind != PyUnicode_WCHAR_KIND) +            ch = PyUnicode_READ(kind, data, i); +        else +            ch = wstr[i]; +        if (ch < 128) { +            char c = (char)ch; +            write(fd, &c, 1); +        } +        else if (ch < 0xff) { +            PUTS(fd, "\\x"); +            dump_hexadecimal(2, ch, fd); +        } +        else if (ch < 0xffff) { +            PUTS(fd, "\\u"); +            dump_hexadecimal(4, ch, fd); +        } +        else { +            PUTS(fd, "\\U"); +            dump_hexadecimal(8, ch, fd); +        } +    } +    if (truncated) +        PUTS(fd, "..."); +} + +/* Write a frame into the file fd: "File "xxx", line xxx in xxx". + +   This function is signal safe. */ + +static void +dump_frame(int fd, PyFrameObject *frame) +{ +    PyCodeObject *code; +    int lineno; + +    code = frame->f_code; +    PUTS(fd, "  File "); +    if (code != NULL && code->co_filename != NULL +        && PyUnicode_Check(code->co_filename)) +    { +        write(fd, "\"", 1); +        dump_ascii(fd, code->co_filename); +        write(fd, "\"", 1); +    } else { +        PUTS(fd, "???"); +    } + +    /* PyFrame_GetLineNumber() was introduced in Python 2.7.0 and 3.2.0 */ +    lineno = PyCode_Addr2Line(code, frame->f_lasti); +    PUTS(fd, ", line "); +    dump_decimal(fd, lineno); +    PUTS(fd, " in "); + +    if (code != NULL && code->co_name != NULL +        && PyUnicode_Check(code->co_name)) +        dump_ascii(fd, code->co_name); +    else +        PUTS(fd, "???"); + +    write(fd, "\n", 1); +} + +static void +dump_traceback(int fd, PyThreadState *tstate, int write_header) +{ +    PyFrameObject *frame; +    unsigned int depth; + +    if (write_header) +        PUTS(fd, "Traceback (most recent call first):\n"); + +    frame = _PyThreadState_GetFrame(tstate); +    if (frame == NULL) +        return; + +    depth = 0; +    while (frame != NULL) { +        if (MAX_FRAME_DEPTH <= depth) { +            PUTS(fd, "  ...\n"); +            break; +        } +        if (!PyFrame_Check(frame)) +            break; +        dump_frame(fd, frame); +        frame = frame->f_back; +        depth++; +    } +} + +void +_Py_DumpTraceback(int fd, PyThreadState *tstate) +{ +    dump_traceback(fd, tstate, 1); +} + +/* Write the thread identifier into the file 'fd': "Current thread 0xHHHH:\" if +   is_current is true, "Thread 0xHHHH:\n" otherwise. + +   This function is signal safe. */ + +static void +write_thread_id(int fd, PyThreadState *tstate, int is_current) +{ +    if (is_current) +        PUTS(fd, "Current thread 0x"); +    else +        PUTS(fd, "Thread 0x"); +    dump_hexadecimal(sizeof(long)*2, (unsigned long)tstate->thread_id, fd); +    PUTS(fd, ":\n"); +} + +const char* +_Py_DumpTracebackThreads(int fd, PyInterpreterState *interp, +                         PyThreadState *current_thread) +{ +    PyThreadState *tstate; +    unsigned int nthreads; + +    /* Get the current interpreter from the current thread */ +    tstate = PyInterpreterState_ThreadHead(interp); +    if (tstate == NULL) +        return "unable to get the thread head state"; + +    /* Dump the traceback of each thread */ +    tstate = PyInterpreterState_ThreadHead(interp); +    nthreads = 0; +    do +    { +        if (nthreads != 0) +            write(fd, "\n", 1); +        if (nthreads >= MAX_NTHREADS) { +            PUTS(fd, "...\n"); +            break; +        } +        write_thread_id(fd, tstate, tstate == current_thread); +        dump_traceback(fd, tstate, 0); +        tstate = PyThreadState_Next(tstate); +        nthreads++; +    } while (tstate != NULL); + +    return NULL; +} +  | 
