diff options
Diffstat (limited to 'Python')
53 files changed, 11605 insertions, 6205 deletions
diff --git a/Python/Python-ast.c b/Python/Python-ast.c index a276b6c..e6f1e58 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,25 @@ 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; + if (!value) { + PyErr_SetString(PyExc_ValueError, + "field value is required for YieldFrom"); + return NULL; + } + 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 +1902,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 +2250,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 +2284,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 +2293,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 +2302,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 +2311,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 +2339,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 +2370,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 +2411,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 +2420,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 +2429,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 +2443,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 +2462,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 +2486,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 +2505,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 +2538,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); + value = ast2obj_list(o->v.Try.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.TryExcept.handlers, - ast2obj_excepthandler); + value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler); if (!value) goto failed; - if (PyObject_SetAttrString(result, "handlers", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.TryExcept.orelse, ast2obj_stmt); + value = ast2obj_list(o->v.Try.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 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.finalbody, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) - goto failed; - Py_DECREF(value); - value = ast2obj_list(o->v.TryFinally.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 +2576,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 +2590,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 +2599,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 +2618,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 +2627,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 +2636,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 +2655,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 +2686,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 +2700,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 +2719,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 +2733,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 +2747,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 +2766,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 +2780,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 +2789,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 +2804,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 +2819,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 +2839,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 +2854,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 +2872,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 +2897,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 +2926,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 +2935,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 +2957,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 +2976,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 +2995,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 +3009,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 +3023,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 +3037,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 +3107,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 +3126,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 +3135,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 +3281,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 +3317,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 +3363,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 +3422,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 +3451,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 +3480,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 +3543,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 +3579,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 +3615,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 +3638,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 +3687,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 +3699,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 +3722,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 +3734,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 +3746,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 +3771,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 +3796,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 +3825,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 +3837,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 +3862,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 +3887,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 +3898,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 +3909,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 +3934,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 +3971,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 +3993,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 +4030,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 +4055,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 +4080,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 +4092,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 +4104,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 +4130,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 +4142,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 +4154,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 +4179,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 +4218,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 +4230,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 +4255,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 +4293,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 +4305,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 +4330,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 +4364,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 +4417,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 +4429,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 +4440,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 +4455,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 +4463,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 +4487,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 +4512,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 +4537,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"); + PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try"); 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")) { + if (_PyObject_HasAttrId(obj, &PyId_finalbody)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_finalbody); 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"); - return 1; - } - if (PyObject_HasAttrString(obj, "finalbody")) { - int res; - Py_ssize_t len; - Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "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 +4562,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 +4578,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 +4590,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 +4612,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 +4650,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 +4661,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 +4686,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 +4709,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 +4745,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 +4781,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 +4847,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 +4859,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 +4879,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 +4891,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 +4929,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 +4941,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 +4953,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 +4977,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 +4989,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 +5013,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 +5025,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 +5050,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 +5062,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 +5074,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 +5098,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 +5123,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 +5159,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 +5196,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 +5208,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 +5245,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 +5257,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 +5295,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 +5307,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 +5319,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 +5357,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 +5369,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 +5405,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 +5420,29 @@ 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 { + PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from YieldFrom"); + return 1; + } + *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 +5452,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 +5464,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 +5489,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 +5530,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 +5542,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 +5567,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 +5592,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 +5603,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 +5626,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 +5649,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 +5670,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 +5707,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 +5719,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 +5731,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 +5756,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 +5768,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 +5780,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 +5804,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 +5816,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 +5840,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 +5852,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 +5876,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 +5901,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 +5925,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 +5950,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 +6051,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 +6062,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 +6073,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 +6095,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 +6131,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 +6426,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 +6438,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 +6450,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 +6495,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 +6507,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 +6528,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 +6539,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 +6550,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 +6600,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 +6625,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 +6636,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 +6647,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 +6672,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 +6683,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 +6694,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 +6719,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 +6759,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 +6771,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 +6796,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 +6808,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 +6834,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 +6846,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 +6864,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 +6917,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 +6950,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 +6996,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 +7116,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 c12db44..f33e477 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 c30d7d20..e7e3280 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 d2f063b..7657b22 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1,24 +1,506 @@ /* * 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 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 +520,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 +685,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 +706,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 +722,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 +731,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 +779,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 +843,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 +890,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 +903,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 +936,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 +977,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 +1125,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 +1155,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 +1187,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 +1198,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 +1290,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 +1318,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 +1330,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 +1347,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 +1378,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 +1497,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 +1838,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 +2358,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 +2401,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 +2426,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 +2450,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 +2485,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 +2590,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 +2623,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 +2695,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 +2770,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 +2793,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 +2804,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 +2933,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 +3345,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 +3369,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 +3404,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 +3422,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 +3449,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 +3496,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 +3509,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 +3534,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 +3660,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 +3679,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 +3701,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 +3748,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 +3793,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 +3844,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"); Py_DECREF(s); goto onError; } diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 35b2cdc..0e6e6ff 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); @@ -1056,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\ @@ -1092,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 */ @@ -1116,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; } @@ -1422,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 */ @@ -1467,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 * @@ -1497,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"); @@ -1556,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 * @@ -1602,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 @@ -1611,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; @@ -1624,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 { @@ -1646,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. */ @@ -1657,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 @@ -1666,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); @@ -1737,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 @@ -1819,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", @@ -1829,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; @@ -1875,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"); @@ -1919,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); } @@ -2227,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\ @@ -2265,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 f0ea7c9..82bfcc6 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 bf7a350..2702d5c 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 e21834a..fd67d1b 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))) @@ -836,7 +806,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); @@ -849,12 +822,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; @@ -862,15 +834,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); @@ -886,8 +858,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; @@ -912,7 +885,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); @@ -1049,7 +1025,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 d6f640f..3cf71ef 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. @@ -131,10 +141,16 @@ struct compiler_unit { The u pointer points to the current compilation unit, while units for enclosing blocks are stored in c_stack. The u and c_stack are managed by compiler_enter_scope() and compiler_exit_scope(). + +Note that we don't track recursion levels during compilation - the +task of detecting and rejecting excessive levels of nesting is +handled by the symbol analysis pass. + */ 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 +164,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 +194,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 +212,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 +232,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 +302,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 +357,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 +493,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 +504,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 +516,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 +604,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 +867,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 +954,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 +1286,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 +1362,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 +1407,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 +1553,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 +1579,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 +1602,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 +1649,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 +1680,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 +1731,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 +1782,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 +1802,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 +1821,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 +2038,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 +2052,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 +2106,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 +2201,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 +2224,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 +2283,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 +2351,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 +2466,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 +2498,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 +2665,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 +3043,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 +3082,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 +3099,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 +3193,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 +3229,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 +3242,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 +3251,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); @@ -3203,6 +3351,14 @@ compiler_visit_expr(struct compiler *c, expr_ty e) } ADDOP(c, YIELD_VALUE); break; + case YieldFrom_kind: + if (c->u->u_ste->ste_type != FunctionBlock) + return compiler_error(c, "'yield' outside function"); + VISIT(c, expr, e->v.YieldFrom.value); + ADDOP(c, GET_ITER); + ADDOP_O(c, LOAD_CONST, Py_None, consts); + ADDOP(c, YIELD_FROM); + break; case Compare_kind: return compiler_compare(c, e); case Call_kind: @@ -3385,7 +3541,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 +3549,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 +4098,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 +4121,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 +4140,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 0000000..fe6bd74 --- /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 44dc01f..83861ac 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 149990d..b4f71f2 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 2606e1e..5836cb3b 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 18a8137..c955414 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 cabf9b9..85c95b4 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 101c024..0e1b907 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 7ea510e..0ca65c7 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 69f8b45..5916048 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 73a1dcf..25b6680 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 5a9a624..626b16e 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 53e8a47..b7c42e8 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "osdefs.h" #ifdef MS_WINDOWS # include <windows.h> #endif @@ -12,6 +13,36 @@ extern wchar_t* _Py_DecodeUTF8_surrogateescape(const char *s, Py_ssize_t size); #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; +} + #if !defined(__APPLE__) && !defined(MS_WINDOWS) extern int _Py_normalize_encoding(const char *, char *, size_t); @@ -200,7 +231,9 @@ decode_ascii_surrogateescape(const char *arg, size_t *size) 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. */ @@ -292,8 +325,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) { @@ -329,7 +363,8 @@ _Py_char2wchar(const char* arg, size_t *size) #endif /* HAVE_MBRTOWC */ return res; oom: - fprintf(stderr, "out of memory\n"); + if (size != NULL) + *size = (size_t)-1; return NULL; #endif /* __APPLE__ */ } @@ -341,10 +376,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) { @@ -357,9 +392,7 @@ _Py_wchar2char(const wchar_t *text, size_t *error_pos) if (unicode == NULL) return NULL; - bytes = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(unicode), - PyUnicode_GET_SIZE(unicode), - "surrogateescape"); + bytes = _PyUnicode_AsUTF8String(unicode, "surrogateescape"); Py_DECREF(unicode); if (bytes == NULL) { PyErr_Clear(); @@ -483,8 +516,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) @@ -492,8 +525,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; @@ -501,7 +538,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; @@ -547,18 +584,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); @@ -569,7 +617,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) @@ -613,7 +661,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, @@ -651,7 +700,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 c350907..aa62502 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 ddf6224..25fdc17 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 a77bb05..18c8e91 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 d1e2578..2d26787 100644 --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -4,7 +4,7 @@ static char cprt[] = "\ -Copyright (c) 2001-2012 Python Software Foundation.\n\ +Copyright (c) 2001-2013 Python Software Foundation.\n\ All Rights Reserved.\n\ \n\ Copyright (c) 2000 BeOpen.com.\n\ @@ -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 cabc4d6..e04999b 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 f655e51..5fc2523 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 @@ -285,6 +169,7 @@ _PyImport_AcquireLock(void) PyThread_acquire_lock(import_lock, 1); PyEval_RestoreThread(tstate); } + assert(import_lock_level == 0); import_lock_thread = me; import_lock_level = 1; } @@ -298,6 +183,7 @@ _PyImport_ReleaseLock(void) if (import_lock_thread != me) return -1; import_lock_level--; + assert(import_lock_level >= 0); if (import_lock_level == 0) { import_lock_thread = -1; PyThread_release_lock(import_lock); @@ -319,7 +205,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 +255,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 +263,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 +299,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 +371,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 +389,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 +420,6 @@ PyImport_Cleanup(void) PyDict_Clear(modules); interp->modules = NULL; Py_DECREF(modules); - Py_CLEAR(interp->modules_reloading); } @@ -556,25 +428,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 +466,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 +486,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 +515,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 +538,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 +553,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 +587,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 +607,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 +661,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 +725,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,415 +766,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; - int saved; -#ifdef MS_WINDOWS /* since Windows uses different permissions */ - mode_t mode = srcstat->st_mode & ~S_IEXEC; - /* Issue #6074: We ensure user write access, so we can delete it later - * when the source file changes. (On POSIX, this only requires write - * access to the directory, on Windows, we need write access to the file - * as well) - */ - mode |= _S_IWRITE; -#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 - - /* 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) { @@ -1266,227 +790,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 @@ -1542,15 +899,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); @@ -1575,661 +924,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. */ @@ -2244,37 +970,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; } @@ -2285,14 +1011,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; } @@ -2312,19 +1038,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; } @@ -2332,41 +1059,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); @@ -2377,6 +1102,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 */ @@ -2407,585 +1145,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; } @@ -2995,103 +1559,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; } @@ -3181,48 +1665,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; @@ -3233,102 +1688,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) @@ -3337,7 +1709,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; } @@ -3345,19 +1717,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; } @@ -3365,9 +1737,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); } @@ -3375,9 +1747,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); } @@ -3385,8 +1757,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)); } @@ -3394,333 +1766,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\ @@ -3740,179 +1833,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, @@ -3927,9 +1869,6 @@ PyInit_imp(void) { PyObject *m, *d; - if (PyType_Ready(&PyNullImporter_Type) < 0) - return NULL; - m = PyModule_Create(&impmodule); if (m == NULL) goto failure; @@ -3937,19 +1876,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 9caed45..942e4b8 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 b4d21be..6b9cf75 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 0000000..83d7937 --- /dev/null +++ b/Python/importlib.h @@ -0,0 +1,4424 @@ +/* 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,200,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, + 100,128,0,100,53,0,100,54,0,132,1,0,90,35,0,100, + 55,0,100,56,0,132,0,0,90,36,0,100,57,0,100,58, + 0,132,0,0,90,37,0,100,59,0,100,60,0,132,0,0, + 90,38,0,100,61,0,100,62,0,132,0,0,90,39,0,100, + 63,0,100,64,0,132,0,0,90,40,0,100,65,0,100,66, + 0,132,0,0,90,41,0,100,67,0,100,68,0,132,0,0, + 90,42,0,100,69,0,100,70,0,132,0,0,90,43,0,100, + 71,0,100,72,0,132,0,0,90,44,0,100,73,0,100,74, + 0,132,0,0,90,45,0,71,100,75,0,100,76,0,132,0, + 0,100,76,0,131,2,0,90,46,0,71,100,77,0,100,78, + 0,132,0,0,100,78,0,131,2,0,90,47,0,71,100,79, + 0,100,80,0,132,0,0,100,80,0,131,2,0,90,48,0, + 71,100,81,0,100,82,0,132,0,0,100,82,0,131,2,0, + 90,49,0,71,100,83,0,100,84,0,132,0,0,100,84,0, + 101,49,0,131,3,0,90,50,0,71,100,85,0,100,86,0, + 132,0,0,100,86,0,131,2,0,90,51,0,71,100,87,0, + 100,88,0,132,0,0,100,88,0,101,51,0,101,50,0,131, + 4,0,90,52,0,71,100,89,0,100,90,0,132,0,0,100, + 90,0,101,51,0,101,49,0,131,4,0,90,53,0,103,0, + 0,90,54,0,71,100,91,0,100,92,0,132,0,0,100,92, + 0,131,2,0,90,55,0,71,100,93,0,100,94,0,132,0, + 0,100,94,0,131,2,0,90,56,0,71,100,95,0,100,96, + 0,132,0,0,100,96,0,131,2,0,90,57,0,71,100,97, + 0,100,98,0,132,0,0,100,98,0,131,2,0,90,58,0, + 71,100,99,0,100,100,0,132,0,0,100,100,0,131,2,0, + 90,59,0,71,100,101,0,100,102,0,132,0,0,100,102,0, + 131,2,0,90,60,0,100,103,0,100,104,0,132,0,0,90, + 61,0,100,105,0,100,106,0,132,0,0,90,62,0,100,107, + 0,100,108,0,132,0,0,90,63,0,100,109,0,90,64,0, + 100,110,0,100,111,0,132,0,0,90,65,0,100,112,0,100, + 113,0,132,0,0,90,66,0,100,128,0,100,46,0,100,114, + 0,100,115,0,132,2,0,90,67,0,100,116,0,100,117,0, + 132,0,0,90,68,0,100,118,0,100,119,0,132,0,0,90, + 69,0,100,120,0,100,121,0,132,0,0,90,70,0,100,128, + 0,100,128,0,102,0,0,100,46,0,100,122,0,100,123,0, + 132,4,0,90,71,0,100,124,0,100,125,0,132,0,0,90, + 72,0,100,126,0,100,127,0,132,0,0,90,73,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,180,0,0,0,124,1,0, + 100,5,0,107,8,0,114,25,0,116,1,0,106,2,0,106, + 3,0,12,110,3,0,124,1,0,125,2,0,124,2,0,114, + 46,0,116,4,0,125,3,0,110,6,0,116,5,0,125,3, + 0,116,6,0,124,0,0,131,1,0,92,2,0,125,4,0, + 125,5,0,124,5,0,106,7,0,100,1,0,131,1,0,92, + 3,0,125,6,0,125,7,0,125,8,0,116,1,0,106,8, + 0,106,9,0,125,9,0,124,9,0,100,5,0,107,8,0, + 114,133,0,116,10,0,100,2,0,131,1,0,130,1,0,110, + 0,0,100,3,0,106,11,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,12,0,124,4,0,116,13,0,124,10,0,131,3,0, + 83,40,6,0,0,0,117,244,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,115,121,115,46,102,108,97,103,115,46,111, + 112,116,105,109,105,122,101,32,105,115,32,110,111,110,45,122, + 101,114,111,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, + 117,115,101,100,32,105,110,10,32,32,32,32,112,108,97,99, + 101,32,111,102,32,115,121,115,46,102,108,97,103,115,46,111, + 112,116,105,109,105,122,101,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,14,0,0,0,117,4, + 0,0,0,78,111,110,101,117,3,0,0,0,115,121,115,117, + 5,0,0,0,102,108,97,103,115,117,8,0,0,0,111,112, + 116,105,109,105,122,101,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,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,159, + 1,0,0,115,22,0,0,0,0,13,31,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,186,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,209,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,230,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,240,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,238, + 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,253,1,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,251,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,24,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,6,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,69, + 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,61,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,81, + 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,79,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,92,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,90,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,101,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,127,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,131,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,142,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,156,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, + 162,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,168,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,118,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,184,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,188,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,193,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, + 210,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,216,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,222,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,175,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,242,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, + 249,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,8,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,229,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,28,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,36,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, + 81,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,23,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,107,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,113,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,125, + 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,135,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,144,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,166,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,228,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,105,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, + 244,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,250,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,1,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,6,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,239,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,16,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,81,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,4,0,100,2,0,79,125,4,0,124,0,0,106,4,0, + 124,2,0,124,3,0,100,3,0,124,4,0,131,2,1,83, + 40,4,0,0,0,78,105,182,1,0,0,105,128,0,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,21,4,0,0,115,12,0,0,0, + 0,2,3,1,22,1,13,1,11,3,10,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,9,0,0,0,18,0,0, + 0,67,0,0,0,115,53,1,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,132,0,116,3, + 0,124,6,0,131,1,0,68,93,118,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,211,0,1, + 125,8,0,1,122,25,0,116,9,0,100,1,0,124,4,0, + 124,8,0,131,3,0,1,100,2,0,83,87,89,100,2,0, + 100,2,0,125,8,0,126,8,0,88,113,94,0,88,113,94, + 0,87,121,33,0,116,10,0,124,1,0,124,2,0,124,3, + 0,131,3,0,1,116,9,0,100,3,0,124,1,0,131,2, + 0,1,87,110,53,0,4,116,8,0,107,10,0,114,48,1, + 1,125,8,0,1,122,21,0,116,9,0,100,1,0,124,1, + 0,124,8,0,131,3,0,1,87,89,100,2,0,100,2,0, + 125,8,0,126,8,0,88,110,1,0,88,100,2,0,83,40, + 4,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,117,27,0,0,0,99,111,117,108,100,32,110, + 111,116,32,99,114,101,97,116,101,32,123,33,114,125,58,32, + 123,33,114,125,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,7,0,0,0,79,83,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,13,0,0,0,95,119, + 114,105,116,101,95,97,116,111,109,105,99,40,9,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,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,8,0,0,0,115,101, + 116,95,100,97,116,97,32,4,0,0,115,38,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,18,3,16,1,27,1,3,1,16, + 1,17,1,18,2,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,12,4,0,0,115,8,0,0,0, + 16,2,6,2,12,5,12,11,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,65,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,68,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,80,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,61,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,97,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,101,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,122,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,119,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,125,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, + 129,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,89,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,38,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,108,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,141,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,147,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,157,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,161,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,173,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,176,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,179,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,182,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,185,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,134,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,190, + 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,193,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,197,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,189,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, + 211,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,219,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,236,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,5,0,0,0,67, + 0,0,0,115,189,0,0,0,103,0,0,125,3,0,120,176, + 0,124,2,0,68,93,158,0,125,4,0,116,0,0,124,4, + 0,116,1,0,116,2,0,102,2,0,131,2,0,115,46,0, + 113,13,0,110,0,0,124,0,0,106,3,0,124,4,0,131, + 1,0,125,5,0,124,5,0,100,2,0,107,9,0,114,13, + 0,116,5,0,124,5,0,100,1,0,131,2,0,114,112,0, + 124,5,0,106,6,0,124,1,0,131,1,0,92,2,0,125, + 6,0,125,7,0,110,21,0,124,5,0,106,7,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,155,0,124,6,0,124,3,0,102, + 2,0,83,124,3,0,106,8,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, + 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,5,0,0,0, + 98,121,116,101,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,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,253,4,0, + 0,115,28,0,0,0,0,5,6,1,13,1,21,1,6,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,24,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,207, + 4,0,0,115,14,0,0,0,16,2,6,2,18,8,18,17, + 18,17,18,27,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,57,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,51,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,65,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,71,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,13,0,0,0,67,0,0,0,115,8,1,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,33,0,4, + 116,3,0,116,4,0,116,5,0,102,3,0,107,10,0,114, + 63,0,1,1,1,103,0,0,125,2,0,89,110,1,0,88, + 116,6,0,106,7,0,106,8,0,100,1,0,131,1,0,115, + 100,0,116,9,0,124,2,0,131,1,0,124,0,0,95,10, + 0,110,111,0,116,9,0,131,0,0,125,3,0,120,90,0, + 124,2,0,68,93,82,0,125,4,0,124,4,0,106,11,0, + 100,2,0,131,1,0,92,3,0,125,5,0,125,6,0,125, + 7,0,124,6,0,114,179,0,100,3,0,106,12,0,124,5, + 0,124,7,0,106,13,0,131,0,0,131,2,0,125,8,0, + 110,6,0,124,5,0,125,8,0,124,3,0,106,14,0,124, + 8,0,131,1,0,1,113,116,0,87,124,3,0,124,0,0, + 95,10,0,116,6,0,106,7,0,106,8,0,116,15,0,131, + 1,0,114,4,1,116,9,0,100,4,0,100,5,0,132,0, + 0,124,2,0,68,131,1,0,131,1,0,124,0,0,95,16, + 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,142,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, + 17,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,15,0,0,0,80,101,114,109, + 105,115,115,105,111,110,69,114,114,111,114,117,18,0,0,0, + 78,111,116,65,68,105,114,101,99,116,111,114,121,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,113,5,0, + 0,115,34,0,0,0,0,2,9,1,3,1,19,1,22,3, + 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,154,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,144,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,162,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,42,5,0,0,115,16,0,0, + 0,16,7,6,2,12,14,12,4,6,2,12,42,12,31,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,172,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,176,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,168,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,181,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,190,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,207,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,226,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,20,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,33,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,6,0,0,0,17,0,0, + 0,67,0,0,0,115,254,0,0,0,116,0,0,124,0,0, + 100,1,0,131,2,0,114,250,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,158,0,124,1,0,68,93,147,0,125,3,0, + 116,0,0,124,0,0,124,3,0,131,2,0,115,96,0,100, + 4,0,106,5,0,124,0,0,106,6,0,124,3,0,131,2, + 0,125,4,0,121,17,0,116,7,0,124,2,0,124,4,0, + 131,2,0,1,87,113,243,0,4,116,8,0,107,10,0,114, + 239,0,1,125,5,0,1,122,50,0,116,9,0,124,5,0, + 100,5,0,100,7,0,131,3,0,114,218,0,124,5,0,106, + 11,0,124,4,0,107,2,0,114,218,0,119,96,0,113,218, + 0,110,0,0,130,0,0,87,89,100,6,0,100,6,0,125, + 5,0,126,5,0,88,113,243,0,88,113,96,0,113,96,0, + 87,110,0,0,124,0,0,83,40,8,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,70,40,12,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,6,0,0,0,102,111,114,109,97, + 116,117,8,0,0,0,95,95,110,97,109,101,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,11,0,0, + 0,73,109,112,111,114,116,69,114,114,111,114,117,7,0,0, + 0,103,101,116,97,116,116,114,117,5,0,0,0,70,97,108, + 115,101,117,4,0,0,0,110,97,109,101,40,6,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,9,0,0,0,102, + 114,111,109,95,110,97,109,101,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,57,6,0,0,115,34,0,0,0,0,10,15,1,12,1, + 12,1,13,1,15,1,22,1,13,1,15,1,21,1,3,1, + 17,1,18,6,18,1,15,1,9,1,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,91,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,106,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,117,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,4,35,3,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,16,0,0,0,13,0,0,0,67,0,0,0,115,24, + 3,0,0,124,1,0,97,0,0,124,0,0,97,1,0,116, + 1,0,106,2,0,106,3,0,114,33,0,116,4,0,97,5, + 0,110,6,0,116,6,0,97,5,0,116,7,0,116,1,0, + 131,1,0,125,2,0,120,119,0,116,1,0,106,8,0,106, + 9,0,131,0,0,68,93,102,0,92,2,0,125,3,0,125, + 4,0,116,10,0,124,4,0,124,2,0,131,2,0,114,67, + 0,116,11,0,124,4,0,100,1,0,131,2,0,115,169,0, + 124,3,0,116,1,0,106,12,0,107,6,0,114,136,0,116, + 13,0,124,4,0,95,14,0,113,166,0,116,0,0,106,15, + 0,124,3,0,131,1,0,114,166,0,116,16,0,124,4,0, + 95,14,0,113,166,0,113,169,0,113,67,0,113,67,0,87, + 116,1,0,106,8,0,116,17,0,25,125,5,0,120,76,0, + 100,28,0,68,93,68,0,125,6,0,124,6,0,116,1,0, + 106,8,0,107,7,0,114,232,0,116,13,0,106,18,0,124, + 6,0,131,1,0,125,7,0,110,13,0,116,1,0,106,8, + 0,124,6,0,25,125,7,0,116,19,0,124,5,0,124,6, + 0,124,7,0,131,3,0,1,113,193,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,8,0,120,189,0,124, + 8,0,68,93,169,0,92,2,0,125,9,0,125,10,0,116, + 20,0,100,11,0,100,12,0,132,0,0,124,10,0,68,131, + 1,0,131,1,0,115,107,1,116,21,0,130,1,0,124,10, + 0,100,13,0,25,125,11,0,124,9,0,116,1,0,106,8, + 0,107,6,0,114,149,1,116,1,0,106,8,0,124,9,0, + 25,125,12,0,80,113,64,1,121,60,0,116,13,0,106,18, + 0,124,9,0,131,1,0,125,12,0,124,9,0,100,10,0, + 107,2,0,114,207,1,100,14,0,116,1,0,106,22,0,107, + 6,0,114,207,1,124,10,0,100,15,0,25,125,11,0,110, + 0,0,80,87,113,64,1,4,116,23,0,107,10,0,114,232, + 1,1,1,1,119,64,1,89,113,64,1,88,113,64,1,87, + 116,23,0,100,16,0,131,1,0,130,1,0,121,19,0,116, + 13,0,106,18,0,100,17,0,131,1,0,125,13,0,87,110, + 24,0,4,116,23,0,107,10,0,114,38,2,1,1,1,100, + 27,0,125,13,0,89,110,1,0,88,116,13,0,106,18,0, + 100,18,0,131,1,0,125,14,0,124,9,0,100,8,0,107, + 2,0,114,100,2,116,13,0,106,18,0,100,19,0,131,1, + 0,125,15,0,116,19,0,124,5,0,100,20,0,124,15,0, + 131,3,0,1,110,0,0,116,19,0,124,5,0,100,21,0, + 124,12,0,131,3,0,1,116,19,0,124,5,0,100,17,0, + 124,13,0,131,3,0,1,116,19,0,124,5,0,100,18,0, + 124,14,0,131,3,0,1,116,19,0,124,5,0,100,22,0, + 124,11,0,131,3,0,1,116,19,0,124,5,0,100,23,0, + 116,25,0,124,10,0,131,1,0,131,3,0,1,116,19,0, + 124,5,0,100,24,0,116,26,0,131,0,0,131,3,0,1, + 116,27,0,106,28,0,116,0,0,106,29,0,131,0,0,131, + 1,0,1,124,9,0,100,8,0,107,2,0,114,20,3,116, + 30,0,106,31,0,100,25,0,131,1,0,1,100,26,0,116, + 27,0,107,6,0,114,20,3,100,29,0,116,33,0,95,34, + 0,113,20,3,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,190,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,35,0,0,0,117,4,0, + 0,0,95,105,109,112,117,3,0,0,0,115,121,115,117,5, + 0,0,0,102,108,97,103,115,117,8,0,0,0,111,112,116, + 105,109,105,122,101,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,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,4,0,0,0,116,121,112,101, + 117,7,0,0,0,109,111,100,117,108,101,115,117,5,0,0, + 0,105,116,101,109,115,117,10,0,0,0,105,115,105,110,115, + 116,97,110,99,101,117,7,0,0,0,104,97,115,97,116,116, + 114,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,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,9,0, + 0,0,105,115,95,102,114,111,122,101,110,117,14,0,0,0, + 70,114,111,122,101,110,73,109,112,111,114,116,101,114,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, + 16,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,11,0,0,0,109,111,100,117,108,101,95,116, + 121,112,101,117,4,0,0,0,110,97,109,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,153,6,0,0,115,106,0,0,0,0, + 9,6,1,6,2,12,1,9,2,6,2,12,1,28,1,15, + 1,15,1,15,1,12,1,15,1,22,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,232,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,74,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,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,132,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,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,49,25,25,6,3,19,45,19,55,19,18, + 19,91,19,126,19,13,12,9,12,17,12,17,6,2,12,50, + 12,13,18,24,12,34,12,15,12,11,24,36,12,79, +}; diff --git a/Python/makeopcodetargets.py b/Python/makeopcodetargets.py index 5d8e5a9..d9a0855 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 3e2fbeb..6d52a84 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 85b0d66..428914f 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 a91da79..2d6bcda 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 7ae599b..5d53677 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); @@ -132,13 +182,6 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts) newconst = PyNumber_Subtract(v, w); break; case BINARY_SUBSCR: - /* #5057: if v is unicode, there might be differences between - wide and narrow builds in cases like '\U00012345'[0] or - '\U00012345abcdef'[3], so it's better to skip the optimization - in order to produce compatible pycs. - */ - if (PyUnicode_Check(v)) - return 0; newconst = PyObject_GetItem(v, w); break; case BINARY_LSHIFT: @@ -187,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; @@ -205,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); @@ -347,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; @@ -393,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 @@ -439,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 @@ -465,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 || @@ -490,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; @@ -512,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; @@ -526,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; @@ -688,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); @@ -697,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/pyarena.c b/Python/pyarena.c index 5a255ae..02a31d8 100644 --- a/Python/pyarena.c +++ b/Python/pyarena.c @@ -12,8 +12,6 @@ #define DEFAULT_BLOCK_SIZE 8192 #define ALIGNMENT 8 -#define ALIGNMENT_MASK (ALIGNMENT - 1) -#define ROUNDUP(x) (((x) + ALIGNMENT_MASK) & ~ALIGNMENT_MASK) typedef struct _block { /* Total number of bytes owned by this block available to pass out. @@ -85,8 +83,8 @@ block_new(size_t size) b->ab_size = size; b->ab_mem = (void *)(b + 1); b->ab_next = NULL; - b->ab_offset = ROUNDUP((Py_uintptr_t)(b->ab_mem)) - - (Py_uintptr_t)(b->ab_mem); + b->ab_offset = (char *)_Py_ALIGN_UP(b->ab_mem, ALIGNMENT) - + (char *)(b->ab_mem); return b; } @@ -104,7 +102,7 @@ block_alloc(block *b, size_t size) { void *p; assert(b); - size = ROUNDUP(size); + size = _Py_SIZE_ROUND_UP(size, ALIGNMENT); if (b->ab_offset + size > b->ab_size) { /* If we need to allocate more memory than will fit in the default block, allocate a one-off block that is @@ -158,7 +156,6 @@ PyArena_New() void PyArena_Free(PyArena *arena) { - int r; assert(arena); #if defined(Py_DEBUG) /* @@ -175,12 +172,6 @@ PyArena_Free(PyArena *arena) assert(arena->a_objects->ob_refcnt == 1); */ - /* Clear all the elements from the list. This is necessary - to guarantee that they will be DECREFed. */ - r = PyList_SetSlice(arena->a_objects, - 0, PyList_GET_SIZE(arena->a_objects), NULL); - assert(r == 0); - assert(PyList_GET_SIZE(arena->a_objects) == 0); Py_DECREF(arena->a_objects); free(arena); } diff --git a/Python/pystate.c b/Python/pystate.c index 42bc3ec..cfd61d0 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 75e3032..4ab8f08 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 3639fa7..dd32017 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,37 @@ 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 *filename_obj, *loader_type, *loader; + int result = 0; + + filename_obj = PyUnicode_DecodeFSDefault(filename); + if (filename_obj == NULL) + return -1; + /* 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) { + Py_DECREF(filename_obj); + return -1; + } + loader = PyObject_CallFunction(loader_type, "sN", "__main__", filename_obj); + 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) { @@ -1284,18 +1417,34 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, len = strlen(filename); ext = filename + len - (len > 4 ? 4 : 0); if (maybe_pyc_file(fp, filename, ext, closeit)) { + FILE *pyc_fp; /* Try to run a pyc file. First, re-open in binary */ if (closeit) fclose(fp); - if ((fp = fopen(filename, "rb")) == NULL) { + if ((pyc_fp = fopen(filename, "rb")) == NULL) { fprintf(stderr, "python: Can't reopen .pyc file\n"); goto done; } /* Turn on optimization if a .pyo file is given */ if (strcmp(ext, ".pyo") == 0) Py_OptimizeFlag = 1; - v = run_pyc_file(fp, filename, d, d, flags); + + if (set_main_loader(d, filename, "SourcelessFileLoader") < 0) { + fprintf(stderr, "python: failed to set __main__.__loader__\n"); + ret = -1; + fclose(pyc_fp); + goto done; + } + v = run_pyc_file(pyc_fp, filename, d, d, flags); + fclose(pyc_fp); } 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 +1485,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 +1512,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 +1521,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 +1535,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 +1609,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 +1717,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 +1733,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 +1768,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 +1777,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 +1807,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 +1855,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 +1945,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 +1960,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,9 +1999,10 @@ 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); if (v == NULL || !PyCode_Check(v)) { Py_XDECREF(v); PyErr_SetString(PyExc_RuntimeError, @@ -1937,12 +2092,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 +2123,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 +2145,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 +2160,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 +2173,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 +2187,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 +2211,6 @@ err_input(perrdetail *err) { PyObject *v, *w, *errtype, *errtext; PyObject *msg_obj = NULL; - PyObject *filename; char *msg = NULL; errtype = PyExc_SyntaxError; @@ -2111,6 +2282,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 +2299,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 +2324,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 +2396,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 +2406,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 6fb7695..beeab87 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 825260f..53518c2 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 35fc6e1..55898f9 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) @@ -187,6 +183,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, @@ -223,17 +220,40 @@ symtable_new(void) return NULL; } +/* When compiling the use of C stack is probably going to be a lot + lighter than when executing Python code but still can overflow + and causing a Python crash if not checked (e.g. eval("()"*300000)). + Using the current recursion limit for the compiler seems too + restrictive (it caused at least one test to fail) so a factor is + used to allow deeper recursion when compiling an expression. + + Using a scaling factor means this should automatically adjust when + the recursion limit is adjusted for small or large C stack allocations. +*/ +#define COMPILER_STACK_FRAME_SCALE 3 + struct symtable * PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future) { struct symtable *st = symtable_new(); asdl_seq *seq; int i; + PyThreadState *tstate; if (st == NULL) return st; st->st_filename = filename; st->st_future = future; + + /* Setup recursion depth check counters */ + tstate = PyThreadState_GET(); + if (!tstate) { + PySymtable_Free(st); + return NULL; + } + st->recursion_depth = tstate->recursion_depth * COMPILER_STACK_FRAME_SCALE; + st->recursion_limit = Py_GetRecursionLimit() * COMPILER_STACK_FRAME_SCALE; + /* Make the initial symbol information gathering pass */ if (!GET_IDENTIFIER(top) || !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0, 0)) { @@ -752,7 +772,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 @@ -895,18 +915,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; } @@ -915,23 +932,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; } } @@ -1019,17 +1036,17 @@ error: VISIT_SEQ_TAIL permits the start of an ASDL sequence to be skipped, which is useful if the first node in the sequence requires special treatment. + + VISIT_QUIT macro returns the specified value exiting from the function but + first adjusts current recursion counter depth. */ +#define VISIT_QUIT(ST, X) \ + return --(ST)->recursion_depth,(X) + #define VISIT(ST, TYPE, V) \ 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; \ - } + VISIT_QUIT((ST), 0); #define VISIT_SEQ(ST, TYPE, SEQ) { \ int i; \ @@ -1037,19 +1054,7 @@ error: 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)) \ - return 0; \ - } \ -} - -#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; \ - } \ + VISIT_QUIT((ST), 0); \ } \ } @@ -1059,19 +1064,7 @@ error: 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)) \ - return 0; \ - } \ -} - -#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; \ - } \ + VISIT_QUIT((ST), 0); \ } \ } @@ -1082,7 +1075,7 @@ error: expr_ty elt = (expr_ty)asdl_seq_GET(seq, i); \ if (!elt) continue; /* can be NULL */ \ if (!symtable_visit_expr((ST), elt)) \ - return 0; \ + VISIT_QUIT((ST), 0); \ } \ } @@ -1107,32 +1100,37 @@ symtable_new_tmpname(struct symtable *st) static int symtable_visit_stmt(struct symtable *st, stmt_ty s) { + if (++st->recursion_depth > st->recursion_limit) { + PyErr_SetString(PyExc_RuntimeError, + "maximum recursion depth exceeded during compilation"); + VISIT_QUIT(st, 0); + } switch (s->kind) { case FunctionDef_kind: if (!symtable_add_def(st, s->v.FunctionDef.name, DEF_LOCAL)) - return 0; + VISIT_QUIT(st, 0); if (s->v.FunctionDef.args->defaults) VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults); if (s->v.FunctionDef.args->kw_defaults) VISIT_KWONLYDEFAULTS(st, s->v.FunctionDef.args->kw_defaults); if (!symtable_visit_annotations(st, s)) - return 0; + VISIT_QUIT(st, 0); if (s->v.FunctionDef.decorator_list) VISIT_SEQ(st, expr, s->v.FunctionDef.decorator_list); if (!symtable_enter_block(st, s->v.FunctionDef.name, 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_QUIT(st, 0); + VISIT(st, arguments, s->v.FunctionDef.args); + VISIT_SEQ(st, stmt, s->v.FunctionDef.body); if (!symtable_exit_block(st, s)) - return 0; + VISIT_QUIT(st, 0); break; case ClassDef_kind: { PyObject *tmp; if (!symtable_add_def(st, s->v.ClassDef.name, DEF_LOCAL)) - return 0; + VISIT_QUIT(st, 0); VISIT_SEQ(st, expr, s->v.ClassDef.bases); VISIT_SEQ(st, keyword, s->v.ClassDef.keywords); if (s->v.ClassDef.starargs) @@ -1143,34 +1141,26 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) VISIT_SEQ(st, expr, s->v.ClassDef.decorator_list); if (!symtable_enter_block(st, s->v.ClassDef.name, ClassBlock, (void *)s, s->lineno, s->col_offset)) - return 0; + VISIT_QUIT(st, 0); if (!GET_IDENTIFIER(__class__) || !symtable_add_def(st, __class__, DEF_LOCAL) || !GET_IDENTIFIER(__locals__) || !symtable_add_def(st, __locals__, DEF_PARAM)) { symtable_exit_block(st, s); - return 0; + VISIT_QUIT(st, 0); } 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; + VISIT_QUIT(st, 0); break; } case Return_kind: 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: @@ -1207,19 +1197,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); @@ -1249,12 +1236,14 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) asdl_seq *seq = s->v.Global.names; for (i = 0; i < asdl_seq_LEN(seq); i++) { identifier name = (identifier)asdl_seq_GET(seq, i); - char *c_name = _PyUnicode_AsString(name); long cur = symtable_lookup(st, name); if (cur < 0) - return 0; + VISIT_QUIT(st, 0); if (cur & (DEF_LOCAL | USE)) { char buf[256]; + char *c_name = _PyUnicode_AsString(name); + if (!c_name) + return 0; if (cur & DEF_LOCAL) PyOS_snprintf(buf, sizeof(buf), GLOBAL_AFTER_ASSIGN, @@ -1264,10 +1253,10 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) GLOBAL_AFTER_USE, c_name); if (!symtable_warn(st, buf, s->lineno)) - return 0; + VISIT_QUIT(st, 0); } if (!symtable_add_def(st, name, DEF_GLOBAL)) - return 0; + VISIT_QUIT(st, 0); } break; } @@ -1276,12 +1265,14 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) asdl_seq *seq = s->v.Nonlocal.names; for (i = 0; i < asdl_seq_LEN(seq); i++) { identifier name = (identifier)asdl_seq_GET(seq, i); - char *c_name = _PyUnicode_AsString(name); long cur = symtable_lookup(st, name); if (cur < 0) - return 0; + VISIT_QUIT(st, 0); if (cur & (DEF_LOCAL | USE)) { char buf[256]; + char *c_name = _PyUnicode_AsString(name); + if (!c_name) + return 0; if (cur & DEF_LOCAL) PyOS_snprintf(buf, sizeof(buf), NONLOCAL_AFTER_ASSIGN, @@ -1291,10 +1282,10 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) NONLOCAL_AFTER_USE, c_name); if (!symtable_warn(st, buf, s->lineno)) - return 0; + VISIT_QUIT(st, 0); } if (!symtable_add_def(st, name, DEF_NONLOCAL)) - return 0; + VISIT_QUIT(st, 0); } break; } @@ -1307,19 +1298,21 @@ 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; } - return 1; + VISIT_QUIT(st, 1); } static int symtable_visit_expr(struct symtable *st, expr_ty e) { + if (++st->recursion_depth > st->recursion_limit) { + PyErr_SetString(PyExc_RuntimeError, + "maximum recursion depth exceeded during compilation"); + VISIT_QUIT(st, 0); + } switch (e->kind) { case BoolOp_kind: VISIT_SEQ(st, expr, e->v.BoolOp.values); @@ -1333,7 +1326,7 @@ symtable_visit_expr(struct symtable *st, expr_ty e) break; case Lambda_kind: { if (!GET_IDENTIFIER(lambda)) - return 0; + VISIT_QUIT(st, 0); if (e->v.Lambda.args->defaults) VISIT_SEQ(st, expr, e->v.Lambda.args->defaults); if (e->v.Lambda.args->kw_defaults) @@ -1342,11 +1335,11 @@ symtable_visit_expr(struct symtable *st, expr_ty e) if (!symtable_enter_block(st, lambda, 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_QUIT(st, 0); + VISIT(st, arguments, e->v.Lambda.args); + VISIT(st, expr, e->v.Lambda.body); if (!symtable_exit_block(st, (void *)e)) - return 0; + VISIT_QUIT(st, 0); break; } case IfExp_kind: @@ -1363,31 +1356,28 @@ symtable_visit_expr(struct symtable *st, expr_ty e) break; case GeneratorExp_kind: if (!symtable_visit_genexp(st, e)) - return 0; + VISIT_QUIT(st, 0); break; case ListComp_kind: if (!symtable_visit_listcomp(st, e)) - return 0; + VISIT_QUIT(st, 0); break; case SetComp_kind: if (!symtable_visit_setcomp(st, e)) - return 0; + VISIT_QUIT(st, 0); break; case DictComp_kind: if (!symtable_visit_dictcomp(st, e)) - return 0; + VISIT_QUIT(st, 0); break; case Yield_kind: if (e->v.Yield.value) VISIT(st, expr, e->v.Yield.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 YieldFrom_kind: + VISIT(st, expr, e->v.YieldFrom.value); + st->st_cur->ste_generator = 1; break; case Compare_kind: VISIT(st, expr, e->v.Compare.left); @@ -1422,14 +1412,14 @@ symtable_visit_expr(struct symtable *st, expr_ty e) case Name_kind: if (!symtable_add_def(st, e->v.Name.id, e->v.Name.ctx == Load ? USE : DEF_LOCAL)) - return 0; + VISIT_QUIT(st, 0); /* Special-case super: it counts as a use of __class__ */ if (e->v.Name.ctx == Load && st->st_cur->ste_type == FunctionBlock && !PyUnicode_CompareWithASCIIString(e->v.Name.id, "super")) { if (!GET_IDENTIFIER(__class__) || !symtable_add_def(st, __class__, USE)) - return 0; + VISIT_QUIT(st, 0); } break; /* child nodes of List and Tuple will have expr_context set */ @@ -1440,7 +1430,7 @@ symtable_visit_expr(struct symtable *st, expr_ty e) VISIT_SEQ(st, expr, e->v.Tuple.elts); break; } - return 1; + VISIT_QUIT(st, 1); } static int @@ -1545,6 +1535,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) @@ -1555,10 +1555,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; } @@ -1655,13 +1655,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 c4f27d0..20bfa55 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 d224046..e55d342 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 1b3e390..0000000 --- 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 ba7b37a..0000000 --- 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 d1bb0e5..938bf1e 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 82a00e7..5704266 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 de42f1a..49713ce 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 @@ -452,12 +446,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); } @@ -540,12 +537,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 771ab2c..0000000 --- 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 1ce1cfc..0000000 --- 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 51ddc02..0000000 --- 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 59bb3f0..b928902 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; +} + |