summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/Python-ast.c1277
-rw-r--r--Python/_warnings.c97
-rw-r--r--Python/asdl.c4
-rw-r--r--Python/ast.c925
-rw-r--r--Python/bltinmodule.c211
-rw-r--r--Python/ceval.c864
-rw-r--r--Python/ceval_gil.h227
-rw-r--r--Python/codecs.c230
-rw-r--r--Python/compile.c337
-rw-r--r--Python/condvar.h390
-rw-r--r--Python/dtoa.c54
-rw-r--r--Python/dynload_aix.c19
-rw-r--r--Python/dynload_dl.c16
-rw-r--r--Python/dynload_hpux.c20
-rw-r--r--Python/dynload_next.c10
-rw-r--r--Python/dynload_os2.c8
-rw-r--r--Python/dynload_shlib.c43
-rw-r--r--Python/dynload_stub.c4
-rw-r--r--Python/dynload_win.c72
-rw-r--r--Python/errors.c165
-rw-r--r--Python/fileutils.c88
-rw-r--r--Python/formatter_unicode.c1534
-rw-r--r--Python/frozen.c3
-rw-r--r--Python/getargs.c425
-rw-r--r--Python/getcopyright.c2
-rw-r--r--Python/graminit.c190
-rw-r--r--Python/import.c3330
-rw-r--r--Python/importdl.c87
-rw-r--r--Python/importdl.h26
-rw-r--r--Python/importlib.h4385
-rwxr-xr-xPython/makeopcodetargets.py3
-rw-r--r--Python/marshal.c74
-rw-r--r--Python/modsupport.c16
-rw-r--r--Python/opcode_targets.h2
-rw-r--r--Python/peephole.c189
-rw-r--r--Python/pystate.c49
-rw-r--r--Python/pystrtod.c41
-rw-r--r--Python/pythonrun.c344
-rw-r--r--Python/pytime.c203
-rw-r--r--Python/random.c11
-rw-r--r--Python/symtable.c166
-rw-r--r--Python/sysmodule.c211
-rw-r--r--Python/thread.c126
-rw-r--r--Python/thread_cthread.h112
-rw-r--r--Python/thread_lwp.h113
-rw-r--r--Python/thread_nt.h104
-rw-r--r--Python/thread_pth.h3
-rw-r--r--Python/thread_pthread.h25
-rw-r--r--Python/thread_sgi.h259
-rw-r--r--Python/thread_solaris.h130
-rw-r--r--Python/thread_wince.h136
-rw-r--r--Python/traceback.c294
52 files changed, 11483 insertions, 6171 deletions
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index a276b6c..805f2b8 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -1,13 +1,6 @@
/* File automatically generated by Parser/asdl_c.py. */
-
-/*
- __version__ 82163.
-
- This module must be committed separately after each AST grammar change;
- The __version__ number is set to the revision number of the commit
- containing the grammar change.
-*/
+#include <stddef.h>
#include "Python.h"
#include "Python-ast.h"
@@ -16,6 +9,7 @@ static PyTypeObject AST_type;
static PyTypeObject *mod_type;
static PyObject* ast2obj_mod(void*);
static PyTypeObject *Module_type;
+_Py_IDENTIFIER(body);
static char *Module_fields[]={
"body",
};
@@ -32,12 +26,18 @@ static char *Suite_fields[]={
"body",
};
static PyTypeObject *stmt_type;
+_Py_IDENTIFIER(lineno);
+_Py_IDENTIFIER(col_offset);
static char *stmt_attributes[] = {
"lineno",
"col_offset",
};
static PyObject* ast2obj_stmt(void*);
static PyTypeObject *FunctionDef_type;
+_Py_IDENTIFIER(name);
+_Py_IDENTIFIER(args);
+_Py_IDENTIFIER(decorator_list);
+_Py_IDENTIFIER(returns);
static char *FunctionDef_fields[]={
"name",
"args",
@@ -46,6 +46,10 @@ static char *FunctionDef_fields[]={
"returns",
};
static PyTypeObject *ClassDef_type;
+_Py_IDENTIFIER(bases);
+_Py_IDENTIFIER(keywords);
+_Py_IDENTIFIER(starargs);
+_Py_IDENTIFIER(kwargs);
static char *ClassDef_fields[]={
"name",
"bases",
@@ -56,10 +60,12 @@ static char *ClassDef_fields[]={
"decorator_list",
};
static PyTypeObject *Return_type;
+_Py_IDENTIFIER(value);
static char *Return_fields[]={
"value",
};
static PyTypeObject *Delete_type;
+_Py_IDENTIFIER(targets);
static char *Delete_fields[]={
"targets",
};
@@ -69,12 +75,16 @@ static char *Assign_fields[]={
"value",
};
static PyTypeObject *AugAssign_type;
+_Py_IDENTIFIER(target);
+_Py_IDENTIFIER(op);
static char *AugAssign_fields[]={
"target",
"op",
"value",
};
static PyTypeObject *For_type;
+_Py_IDENTIFIER(iter);
+_Py_IDENTIFIER(orelse);
static char *For_fields[]={
"target",
"iter",
@@ -82,6 +92,7 @@ static char *For_fields[]={
"orelse",
};
static PyTypeObject *While_type;
+_Py_IDENTIFIER(test);
static char *While_fields[]={
"test",
"body",
@@ -94,37 +105,41 @@ static char *If_fields[]={
"orelse",
};
static PyTypeObject *With_type;
+_Py_IDENTIFIER(items);
static char *With_fields[]={
- "context_expr",
- "optional_vars",
+ "items",
"body",
};
static PyTypeObject *Raise_type;
+_Py_IDENTIFIER(exc);
+_Py_IDENTIFIER(cause);
static char *Raise_fields[]={
"exc",
"cause",
};
-static PyTypeObject *TryExcept_type;
-static char *TryExcept_fields[]={
+static PyTypeObject *Try_type;
+_Py_IDENTIFIER(handlers);
+_Py_IDENTIFIER(finalbody);
+static char *Try_fields[]={
"body",
"handlers",
"orelse",
-};
-static PyTypeObject *TryFinally_type;
-static char *TryFinally_fields[]={
- "body",
"finalbody",
};
static PyTypeObject *Assert_type;
+_Py_IDENTIFIER(msg);
static char *Assert_fields[]={
"test",
"msg",
};
static PyTypeObject *Import_type;
+_Py_IDENTIFIER(names);
static char *Import_fields[]={
"names",
};
static PyTypeObject *ImportFrom_type;
+_Py_IDENTIFIER(module);
+_Py_IDENTIFIER(level);
static char *ImportFrom_fields[]={
"module",
"names",
@@ -152,17 +167,21 @@ static char *expr_attributes[] = {
};
static PyObject* ast2obj_expr(void*);
static PyTypeObject *BoolOp_type;
+_Py_IDENTIFIER(values);
static char *BoolOp_fields[]={
"op",
"values",
};
static PyTypeObject *BinOp_type;
+_Py_IDENTIFIER(left);
+_Py_IDENTIFIER(right);
static char *BinOp_fields[]={
"left",
"op",
"right",
};
static PyTypeObject *UnaryOp_type;
+_Py_IDENTIFIER(operand);
static char *UnaryOp_fields[]={
"op",
"operand",
@@ -179,15 +198,19 @@ static char *IfExp_fields[]={
"orelse",
};
static PyTypeObject *Dict_type;
+_Py_IDENTIFIER(keys);
static char *Dict_fields[]={
"keys",
"values",
};
static PyTypeObject *Set_type;
+_Py_IDENTIFIER(elts);
static char *Set_fields[]={
"elts",
};
static PyTypeObject *ListComp_type;
+_Py_IDENTIFIER(elt);
+_Py_IDENTIFIER(generators);
static char *ListComp_fields[]={
"elt",
"generators",
@@ -198,6 +221,7 @@ static char *SetComp_fields[]={
"generators",
};
static PyTypeObject *DictComp_type;
+_Py_IDENTIFIER(key);
static char *DictComp_fields[]={
"key",
"value",
@@ -212,13 +236,20 @@ static PyTypeObject *Yield_type;
static char *Yield_fields[]={
"value",
};
+static PyTypeObject *YieldFrom_type;
+static char *YieldFrom_fields[]={
+ "value",
+};
static PyTypeObject *Compare_type;
+_Py_IDENTIFIER(ops);
+_Py_IDENTIFIER(comparators);
static char *Compare_fields[]={
"left",
"ops",
"comparators",
};
static PyTypeObject *Call_type;
+_Py_IDENTIFIER(func);
static char *Call_fields[]={
"func",
"args",
@@ -227,10 +258,12 @@ static char *Call_fields[]={
"kwargs",
};
static PyTypeObject *Num_type;
+_Py_IDENTIFIER(n);
static char *Num_fields[]={
"n",
};
static PyTypeObject *Str_type;
+_Py_IDENTIFIER(s);
static char *Str_fields[]={
"s",
};
@@ -240,12 +273,15 @@ static char *Bytes_fields[]={
};
static PyTypeObject *Ellipsis_type;
static PyTypeObject *Attribute_type;
+_Py_IDENTIFIER(attr);
+_Py_IDENTIFIER(ctx);
static char *Attribute_fields[]={
"value",
"attr",
"ctx",
};
static PyTypeObject *Subscript_type;
+_Py_IDENTIFIER(slice);
static char *Subscript_fields[]={
"value",
"slice",
@@ -257,6 +293,7 @@ static char *Starred_fields[]={
"ctx",
};
static PyTypeObject *Name_type;
+_Py_IDENTIFIER(id);
static char *Name_fields[]={
"id",
"ctx",
@@ -284,12 +321,16 @@ static PyTypeObject *Param_type;
static PyTypeObject *slice_type;
static PyObject* ast2obj_slice(void*);
static PyTypeObject *Slice_type;
+_Py_IDENTIFIER(lower);
+_Py_IDENTIFIER(upper);
+_Py_IDENTIFIER(step);
static char *Slice_fields[]={
"lower",
"upper",
"step",
};
static PyTypeObject *ExtSlice_type;
+_Py_IDENTIFIER(dims);
static char *ExtSlice_fields[]={
"dims",
};
@@ -345,6 +386,7 @@ static PyTypeObject *In_type;
static PyTypeObject *NotIn_type;
static PyTypeObject *comprehension_type;
static PyObject* ast2obj_comprehension(void*);
+_Py_IDENTIFIER(ifs);
static char *comprehension_fields[]={
"target",
"iter",
@@ -357,6 +399,7 @@ static char *excepthandler_attributes[] = {
};
static PyObject* ast2obj_excepthandler(void*);
static PyTypeObject *ExceptHandler_type;
+_Py_IDENTIFIER(type);
static char *ExceptHandler_fields[]={
"type",
"name",
@@ -364,6 +407,13 @@ static char *ExceptHandler_fields[]={
};
static PyTypeObject *arguments_type;
static PyObject* ast2obj_arguments(void*);
+_Py_IDENTIFIER(vararg);
+_Py_IDENTIFIER(varargannotation);
+_Py_IDENTIFIER(kwonlyargs);
+_Py_IDENTIFIER(kwarg);
+_Py_IDENTIFIER(kwargannotation);
+_Py_IDENTIFIER(defaults);
+_Py_IDENTIFIER(kw_defaults);
static char *arguments_fields[]={
"args",
"vararg",
@@ -376,6 +426,8 @@ static char *arguments_fields[]={
};
static PyTypeObject *arg_type;
static PyObject* ast2obj_arg(void*);
+_Py_IDENTIFIER(arg);
+_Py_IDENTIFIER(annotation);
static char *arg_fields[]={
"arg",
"annotation",
@@ -388,19 +440,54 @@ static char *keyword_fields[]={
};
static PyTypeObject *alias_type;
static PyObject* ast2obj_alias(void*);
+_Py_IDENTIFIER(asname);
static char *alias_fields[]={
"name",
"asname",
};
+static PyTypeObject *withitem_type;
+static PyObject* ast2obj_withitem(void*);
+_Py_IDENTIFIER(context_expr);
+_Py_IDENTIFIER(optional_vars);
+static char *withitem_fields[]={
+ "context_expr",
+ "optional_vars",
+};
+
+
+typedef struct {
+ PyObject_HEAD
+ PyObject *dict;
+} AST_object;
+static void
+ast_dealloc(AST_object *self)
+{
+ Py_CLEAR(self->dict);
+ Py_TYPE(self)->tp_free(self);
+}
+
+static int
+ast_traverse(AST_object *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->dict);
+ return 0;
+}
+
+static void
+ast_clear(AST_object *self)
+{
+ Py_CLEAR(self->dict);
+}
static int
ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
{
+ _Py_IDENTIFIER(_fields);
Py_ssize_t i, numfields = 0;
int res = -1;
PyObject *key, *value, *fields;
- fields = PyObject_GetAttrString((PyObject*)Py_TYPE(self), "_fields");
+ fields = _PyObject_GetAttrId((PyObject*)Py_TYPE(self), &PyId__fields);
if (!fields)
PyErr_Clear();
if (fields) {
@@ -450,7 +537,8 @@ static PyObject *
ast_type_reduce(PyObject *self, PyObject *unused)
{
PyObject *res;
- PyObject *dict = PyObject_GetAttrString(self, "__dict__");
+ _Py_IDENTIFIER(__dict__);
+ PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
if (dict == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
@@ -470,12 +558,17 @@ static PyMethodDef ast_type_methods[] = {
{NULL}
};
+static PyGetSetDef ast_type_getsets[] = {
+ {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
+ {NULL}
+};
+
static PyTypeObject AST_type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"_ast.AST",
- sizeof(PyObject),
+ sizeof(AST_object),
0,
- 0, /* tp_dealloc */
+ (destructor)ast_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
@@ -490,26 +583,26 @@ static PyTypeObject AST_type = {
PyObject_GenericGetAttr, /* tp_getattro */
PyObject_GenericSetAttr, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
+ (traverseproc)ast_traverse, /* tp_traverse */
+ (inquiry)ast_clear, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
ast_type_methods, /* tp_methods */
0, /* tp_members */
- 0, /* tp_getset */
+ ast_type_getsets, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
- 0, /* tp_dictoffset */
+ offsetof(AST_object, dict),/* tp_dictoffset */
(initproc)ast_type_init, /* tp_init */
PyType_GenericAlloc, /* tp_alloc */
PyType_GenericNew, /* tp_new */
- PyObject_Del, /* tp_free */
+ PyObject_GC_Del, /* tp_free */
};
@@ -536,6 +629,7 @@ static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int
static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
{
int i, result;
+ _Py_IDENTIFIER(_attributes);
PyObject *s, *l = PyTuple_New(num_fields);
if (!l)
return 0;
@@ -547,7 +641,7 @@ static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
}
PyTuple_SET_ITEM(l, i, s);
}
- result = PyObject_SetAttrString((PyObject*)type, "_attributes", l) >= 0;
+ result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0;
Py_DECREF(l);
return result;
}
@@ -556,7 +650,7 @@ static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
{
- int i, n = asdl_seq_LEN(seq);
+ Py_ssize_t i, n = asdl_seq_LEN(seq);
PyObject *result = PyList_New(n);
PyObject *value;
if (!result)
@@ -581,6 +675,7 @@ static PyObject* ast2obj_object(void *o)
}
#define ast2obj_identifier ast2obj_object
#define ast2obj_string ast2obj_object
+#define ast2obj_bytes ast2obj_object
static PyObject* ast2obj_int(long b)
{
@@ -618,6 +713,15 @@ static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena)
return obj2ast_object(obj, out, arena);
}
+static int obj2ast_bytes(PyObject* obj, PyObject** out, PyArena* arena)
+{
+ if (!PyBytes_CheckExact(obj)) {
+ PyErr_SetString(PyExc_TypeError, "AST bytes must be of type bytes");
+ return 1;
+ }
+ return obj2ast_object(obj, out, arena);
+}
+
static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
{
int i;
@@ -691,15 +795,12 @@ static int init_types(void)
if (!While_type) return 0;
If_type = make_type("If", stmt_type, If_fields, 3);
if (!If_type) return 0;
- With_type = make_type("With", stmt_type, With_fields, 3);
+ With_type = make_type("With", stmt_type, With_fields, 2);
if (!With_type) return 0;
Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
if (!Raise_type) return 0;
- TryExcept_type = make_type("TryExcept", stmt_type, TryExcept_fields, 3);
- if (!TryExcept_type) return 0;
- TryFinally_type = make_type("TryFinally", stmt_type, TryFinally_fields,
- 2);
- if (!TryFinally_type) return 0;
+ Try_type = make_type("Try", stmt_type, Try_fields, 4);
+ if (!Try_type) return 0;
Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
if (!Assert_type) return 0;
Import_type = make_type("Import", stmt_type, Import_fields, 1);
@@ -747,6 +848,8 @@ static int init_types(void)
if (!GeneratorExp_type) return 0;
Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
if (!Yield_type) return 0;
+ YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1);
+ if (!YieldFrom_type) return 0;
Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
if (!Compare_type) return 0;
Call_type = make_type("Call", expr_type, Call_fields, 5);
@@ -949,6 +1052,8 @@ static int init_types(void)
if (!keyword_type) return 0;
alias_type = make_type("alias", &AST_type, alias_fields, 2);
if (!alias_type) return 0;
+ withitem_type = make_type("withitem", &AST_type, withitem_fields, 2);
+ if (!withitem_type) return 0;
initialized = 1;
return 1;
}
@@ -971,6 +1076,7 @@ static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);
+static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena);
mod_ty
Module(asdl_seq * body, PyArena *arena)
@@ -1236,21 +1342,15 @@ If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
}
stmt_ty
-With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body, int lineno,
- int col_offset, PyArena *arena)
+With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, PyArena
+ *arena)
{
stmt_ty p;
- if (!context_expr) {
- PyErr_SetString(PyExc_ValueError,
- "field context_expr is required for With");
- return NULL;
- }
p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
if (!p)
return NULL;
p->kind = With_kind;
- p->v.With.context_expr = context_expr;
- p->v.With.optional_vars = optional_vars;
+ p->v.With.items = items;
p->v.With.body = body;
p->lineno = lineno;
p->col_offset = col_offset;
@@ -1273,33 +1373,18 @@ Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, PyArena *arena)
}
stmt_ty
-TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno,
- int col_offset, PyArena *arena)
-{
- stmt_ty p;
- p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
- if (!p)
- return NULL;
- p->kind = TryExcept_kind;
- p->v.TryExcept.body = body;
- p->v.TryExcept.handlers = handlers;
- p->v.TryExcept.orelse = orelse;
- p->lineno = lineno;
- p->col_offset = col_offset;
- return p;
-}
-
-stmt_ty
-TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int col_offset,
- PyArena *arena)
+Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, asdl_seq *
+ finalbody, int lineno, int col_offset, PyArena *arena)
{
stmt_ty p;
p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
if (!p)
return NULL;
- p->kind = TryFinally_kind;
- p->v.TryFinally.body = body;
- p->v.TryFinally.finalbody = finalbody;
+ p->kind = Try_kind;
+ p->v.Try.body = body;
+ p->v.Try.handlers = handlers;
+ p->v.Try.orelse = orelse;
+ p->v.Try.finalbody = finalbody;
p->lineno = lineno;
p->col_offset = col_offset;
return p;
@@ -1714,6 +1799,20 @@ Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
}
expr_ty
+YieldFrom(expr_ty value, int lineno, int col_offset, PyArena *arena)
+{
+ expr_ty p;
+ p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
+ if (!p)
+ return NULL;
+ p->kind = YieldFrom_kind;
+ p->v.YieldFrom.value = value;
+ p->lineno = lineno;
+ p->col_offset = col_offset;
+ return p;
+}
+
+expr_ty
Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
int col_offset, PyArena *arena)
{
@@ -1798,7 +1897,7 @@ Str(string s, int lineno, int col_offset, PyArena *arena)
}
expr_ty
-Bytes(string s, int lineno, int col_offset, PyArena *arena)
+Bytes(bytes s, int lineno, int col_offset, PyArena *arena)
{
expr_ty p;
if (!s) {
@@ -2146,6 +2245,23 @@ alias(identifier name, identifier asname, PyArena *arena)
return p;
}
+withitem_ty
+withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena)
+{
+ withitem_ty p;
+ if (!context_expr) {
+ PyErr_SetString(PyExc_ValueError,
+ "field context_expr is required for withitem");
+ return NULL;
+ }
+ p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p));
+ if (!p)
+ return NULL;
+ p->context_expr = context_expr;
+ p->optional_vars = optional_vars;
+ return p;
+}
+
PyObject*
ast2obj_mod(void* _o)
@@ -2163,7 +2279,7 @@ ast2obj_mod(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2172,7 +2288,7 @@ ast2obj_mod(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2181,7 +2297,7 @@ ast2obj_mod(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Expression.body);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2190,7 +2306,7 @@ ast2obj_mod(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2218,29 +2334,29 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_identifier(o->v.FunctionDef.name);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "name", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_arguments(o->v.FunctionDef.args);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "args", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.FunctionDef.decorator_list,
ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "decorator_list", value) ==
+ if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) ==
-1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.FunctionDef.returns);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "returns", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2249,38 +2365,38 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_identifier(o->v.ClassDef.name);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "name", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "bases", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "keywords", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.ClassDef.starargs);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "starargs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_starargs, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.ClassDef.kwargs);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kwargs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kwargs, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ClassDef.decorator_list,
ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "decorator_list", value) ==
+ if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) ==
-1)
goto failed;
Py_DECREF(value);
@@ -2290,7 +2406,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Return.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2299,7 +2415,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "targets", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2308,12 +2424,12 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "targets", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Assign.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2322,17 +2438,17 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.AugAssign.target);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "target", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_operator(o->v.AugAssign.op);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "op", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.AugAssign.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2341,22 +2457,22 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.For.target);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "target", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.For.iter);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "iter", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.For.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "orelse", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2365,17 +2481,17 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.While.test);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "test", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.While.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "orelse", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2384,37 +2500,31 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.If.test);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "test", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.If.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "orelse", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
goto failed;
Py_DECREF(value);
break;
case With_kind:
result = PyType_GenericNew(With_type, NULL, NULL);
if (!result) goto failed;
- value = ast2obj_expr(o->v.With.context_expr);
+ value = ast2obj_list(o->v.With.items, ast2obj_withitem);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "context_expr", value) == -1)
- goto failed;
- Py_DECREF(value);
- value = ast2obj_expr(o->v.With.optional_vars);
- if (!value) goto failed;
- if (PyObject_SetAttrString(result, "optional_vars", value) ==
- -1)
+ if (_PyObject_SetAttrId(result, &PyId_items, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.With.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2423,46 +2533,36 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Raise.exc);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "exc", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Raise.cause);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "cause", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1)
goto failed;
Py_DECREF(value);
break;
- case TryExcept_kind:
- result = PyType_GenericNew(TryExcept_type, NULL, NULL);
+ case Try_kind:
+ result = PyType_GenericNew(Try_type, NULL, NULL);
if (!result) goto failed;
- value = ast2obj_list(o->v.TryExcept.body, ast2obj_stmt);
- if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
- goto failed;
- Py_DECREF(value);
- value = ast2obj_list(o->v.TryExcept.handlers,
- ast2obj_excepthandler);
+ value = ast2obj_list(o->v.Try.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "handlers", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
- value = ast2obj_list(o->v.TryExcept.orelse, ast2obj_stmt);
+ value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "orelse", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1)
goto failed;
Py_DECREF(value);
- break;
- case TryFinally_kind:
- result = PyType_GenericNew(TryFinally_type, NULL, NULL);
- if (!result) goto failed;
- value = ast2obj_list(o->v.TryFinally.body, ast2obj_stmt);
+ value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
goto failed;
Py_DECREF(value);
- value = ast2obj_list(o->v.TryFinally.finalbody, ast2obj_stmt);
+ value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "finalbody", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2471,12 +2571,12 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Assert.test);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "test", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Assert.msg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "msg", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2485,7 +2585,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Import.names, ast2obj_alias);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "names", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2494,17 +2594,17 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_identifier(o->v.ImportFrom.module);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "module", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_module, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "names", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_int(o->v.ImportFrom.level);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "level", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_level, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2513,7 +2613,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "names", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2522,7 +2622,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "names", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_names, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2531,7 +2631,7 @@ ast2obj_stmt(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Expr.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2550,12 +2650,12 @@ ast2obj_stmt(void* _o)
}
value = ast2obj_int(o->lineno);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "lineno", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
goto failed;
Py_DECREF(value);
value = ast2obj_int(o->col_offset);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "col_offset", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
goto failed;
Py_DECREF(value);
return result;
@@ -2581,12 +2681,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_boolop(o->v.BoolOp.op);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "op", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "values", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2595,17 +2695,17 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.BinOp.left);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "left", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_operator(o->v.BinOp.op);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "op", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.BinOp.right);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "right", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_right, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2614,12 +2714,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_unaryop(o->v.UnaryOp.op);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "op", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_op, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.UnaryOp.operand);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "operand", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2628,12 +2728,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_arguments(o->v.Lambda.args);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "args", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Lambda.body);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2642,17 +2742,17 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.IfExp.test);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "test", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_test, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.IfExp.body);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.IfExp.orelse);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "orelse", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2661,12 +2761,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "keys", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "values", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_values, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2675,7 +2775,7 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elts", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2684,13 +2784,13 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.ListComp.elt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elt", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ListComp.generators,
ast2obj_comprehension);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "generators", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2699,13 +2799,13 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.SetComp.elt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elt", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.SetComp.generators,
ast2obj_comprehension);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "generators", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2714,18 +2814,18 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.DictComp.key);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "key", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_key, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.DictComp.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.DictComp.generators,
ast2obj_comprehension);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "generators", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2734,13 +2834,13 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.GeneratorExp.elt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elt", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.GeneratorExp.generators,
ast2obj_comprehension);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "generators", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2749,7 +2849,16 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Yield.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ break;
+ case YieldFrom_kind:
+ result = PyType_GenericNew(YieldFrom_type, NULL, NULL);
+ if (!result) goto failed;
+ value = ast2obj_expr(o->v.YieldFrom.value);
+ if (!value) goto failed;
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2758,23 +2867,23 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Compare.left);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "left", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_left, value) == -1)
goto failed;
Py_DECREF(value);
{
- int i, n = asdl_seq_LEN(o->v.Compare.ops);
+ Py_ssize_t i, n = asdl_seq_LEN(o->v.Compare.ops);
value = PyList_New(n);
if (!value) goto failed;
for(i = 0; i < n; i++)
PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
}
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ops", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "comparators", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2783,27 +2892,27 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Call.func);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "func", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_func, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.Call.args, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "args", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "keywords", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Call.starargs);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "starargs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_starargs, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Call.kwargs);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kwargs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kwargs, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2812,7 +2921,7 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_object(o->v.Num.n);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "n", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_n, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2821,16 +2930,16 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_string(o->v.Str.s);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "s", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
goto failed;
Py_DECREF(value);
break;
case Bytes_kind:
result = PyType_GenericNew(Bytes_type, NULL, NULL);
if (!result) goto failed;
- value = ast2obj_string(o->v.Bytes.s);
+ value = ast2obj_bytes(o->v.Bytes.s);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "s", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_s, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2843,17 +2952,17 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Attribute.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_identifier(o->v.Attribute.attr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "attr", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.Attribute.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2862,17 +2971,17 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Subscript.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_slice(o->v.Subscript.slice);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "slice", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.Subscript.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2881,12 +2990,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Starred.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.Starred.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2895,12 +3004,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_identifier(o->v.Name.id);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "id", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_id, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.Name.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2909,12 +3018,12 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.List.elts, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elts", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.List.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -2923,24 +3032,24 @@ ast2obj_expr(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "elts", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr_context(o->v.Tuple.ctx);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ctx", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1)
goto failed;
Py_DECREF(value);
break;
}
value = ast2obj_int(o->lineno);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "lineno", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
goto failed;
Py_DECREF(value);
value = ast2obj_int(o->col_offset);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "col_offset", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
goto failed;
Py_DECREF(value);
return result;
@@ -2993,17 +3102,17 @@ ast2obj_slice(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Slice.lower);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "lower", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Slice.upper);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "upper", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->v.Slice.step);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "step", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_step, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -3012,7 +3121,7 @@ ast2obj_slice(void* _o)
if (!result) goto failed;
value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "dims", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -3021,7 +3130,7 @@ ast2obj_slice(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.Index.value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
break;
@@ -3167,17 +3276,17 @@ ast2obj_comprehension(void* _o)
if (!result) return NULL;
value = ast2obj_expr(o->target);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "target", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_target, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->iter);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "iter", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->ifs, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "ifs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1)
goto failed;
Py_DECREF(value);
return result;
@@ -3203,29 +3312,29 @@ ast2obj_excepthandler(void* _o)
if (!result) goto failed;
value = ast2obj_expr(o->v.ExceptHandler.type);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "type", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_type, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_identifier(o->v.ExceptHandler.name);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "name", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "body", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_body, value) == -1)
goto failed;
Py_DECREF(value);
break;
}
value = ast2obj_int(o->lineno);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "lineno", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0)
goto failed;
Py_DECREF(value);
value = ast2obj_int(o->col_offset);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "col_offset", value) < 0)
+ if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0)
goto failed;
Py_DECREF(value);
return result;
@@ -3249,42 +3358,42 @@ ast2obj_arguments(void* _o)
if (!result) return NULL;
value = ast2obj_list(o->args, ast2obj_arg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "args", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_args, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_identifier(o->vararg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "vararg", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->varargannotation);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "varargannotation", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_varargannotation, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kwonlyargs", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_identifier(o->kwarg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kwarg", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->kwargannotation);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kwargannotation", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kwargannotation, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->defaults, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "defaults", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_list(o->kw_defaults, ast2obj_expr);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "kw_defaults", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1)
goto failed;
Py_DECREF(value);
return result;
@@ -3308,12 +3417,12 @@ ast2obj_arg(void* _o)
if (!result) return NULL;
value = ast2obj_identifier(o->arg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "arg", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->annotation);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "annotation", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1)
goto failed;
Py_DECREF(value);
return result;
@@ -3337,12 +3446,12 @@ ast2obj_keyword(void* _o)
if (!result) return NULL;
value = ast2obj_identifier(o->arg);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "arg", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_expr(o->value);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "value", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_value, value) == -1)
goto failed;
Py_DECREF(value);
return result;
@@ -3366,12 +3475,41 @@ ast2obj_alias(void* _o)
if (!result) return NULL;
value = ast2obj_identifier(o->name);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "name", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_name, value) == -1)
goto failed;
Py_DECREF(value);
value = ast2obj_identifier(o->asname);
if (!value) goto failed;
- if (PyObject_SetAttrString(result, "asname", value) == -1)
+ if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ return result;
+failed:
+ Py_XDECREF(value);
+ Py_XDECREF(result);
+ return NULL;
+}
+
+PyObject*
+ast2obj_withitem(void* _o)
+{
+ withitem_ty o = (withitem_ty)_o;
+ PyObject *result = NULL, *value = NULL;
+ if (!o) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ result = PyType_GenericNew(withitem_type, NULL, NULL);
+ if (!result) return NULL;
+ value = ast2obj_expr(o->context_expr);
+ if (!value) goto failed;
+ if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1)
+ goto failed;
+ Py_DECREF(value);
+ value = ast2obj_expr(o->optional_vars);
+ if (!value) goto failed;
+ if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1)
goto failed;
Py_DECREF(value);
return result;
@@ -3400,11 +3538,11 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* body;
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3436,11 +3574,11 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* body;
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3472,9 +3610,9 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
if (isinstance) {
expr_ty body;
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &body, arena);
if (res != 0) goto failed;
@@ -3495,11 +3633,11 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* body;
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3544,9 +3682,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
*out = NULL;
return 0;
}
- if (PyObject_HasAttrString(obj, "lineno")) {
+ if (_PyObject_HasAttrId(obj, &PyId_lineno)) {
int res;
- tmp = PyObject_GetAttrString(obj, "lineno");
+ tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &lineno, arena);
if (res != 0) goto failed;
@@ -3556,9 +3694,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
return 1;
}
- if (PyObject_HasAttrString(obj, "col_offset")) {
+ if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {
int res;
- tmp = PyObject_GetAttrString(obj, "col_offset");
+ tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &col_offset, arena);
if (res != 0) goto failed;
@@ -3579,9 +3717,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* decorator_list;
expr_ty returns;
- if (PyObject_HasAttrString(obj, "name")) {
+ if (_PyObject_HasAttrId(obj, &PyId_name)) {
int res;
- tmp = PyObject_GetAttrString(obj, "name");
+ tmp = _PyObject_GetAttrId(obj, &PyId_name);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &name, arena);
if (res != 0) goto failed;
@@ -3591,9 +3729,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "args")) {
+ if (_PyObject_HasAttrId(obj, &PyId_args)) {
int res;
- tmp = PyObject_GetAttrString(obj, "args");
+ tmp = _PyObject_GetAttrId(obj, &PyId_args);
if (tmp == NULL) goto failed;
res = obj2ast_arguments(tmp, &args, arena);
if (res != 0) goto failed;
@@ -3603,11 +3741,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3628,11 +3766,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "decorator_list")) {
+ if (_PyObject_HasAttrId(obj, &PyId_decorator_list)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "decorator_list");
+ tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3653,9 +3791,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "returns")) {
+ if (_PyObject_HasAttrId(obj, &PyId_returns)) {
int res;
- tmp = PyObject_GetAttrString(obj, "returns");
+ tmp = _PyObject_GetAttrId(obj, &PyId_returns);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &returns, arena);
if (res != 0) goto failed;
@@ -3682,9 +3820,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* body;
asdl_seq* decorator_list;
- if (PyObject_HasAttrString(obj, "name")) {
+ if (_PyObject_HasAttrId(obj, &PyId_name)) {
int res;
- tmp = PyObject_GetAttrString(obj, "name");
+ tmp = _PyObject_GetAttrId(obj, &PyId_name);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &name, arena);
if (res != 0) goto failed;
@@ -3694,11 +3832,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "bases")) {
+ if (_PyObject_HasAttrId(obj, &PyId_bases)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "bases");
+ tmp = _PyObject_GetAttrId(obj, &PyId_bases);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3719,11 +3857,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "keywords")) {
+ if (_PyObject_HasAttrId(obj, &PyId_keywords)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "keywords");
+ tmp = _PyObject_GetAttrId(obj, &PyId_keywords);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3744,9 +3882,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "starargs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_starargs)) {
int res;
- tmp = PyObject_GetAttrString(obj, "starargs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_starargs);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &starargs, arena);
if (res != 0) goto failed;
@@ -3755,9 +3893,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
} else {
starargs = NULL;
}
- if (PyObject_HasAttrString(obj, "kwargs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kwargs)) {
int res;
- tmp = PyObject_GetAttrString(obj, "kwargs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kwargs);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &kwargs, arena);
if (res != 0) goto failed;
@@ -3766,11 +3904,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
} else {
kwargs = NULL;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3791,11 +3929,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
return 1;
}
- if (PyObject_HasAttrString(obj, "decorator_list")) {
+ if (_PyObject_HasAttrId(obj, &PyId_decorator_list)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "decorator_list");
+ tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3828,9 +3966,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
expr_ty value;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -3850,11 +3988,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* targets;
- if (PyObject_HasAttrString(obj, "targets")) {
+ if (_PyObject_HasAttrId(obj, &PyId_targets)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "targets");
+ tmp = _PyObject_GetAttrId(obj, &PyId_targets);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3887,11 +4025,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* targets;
expr_ty value;
- if (PyObject_HasAttrString(obj, "targets")) {
+ if (_PyObject_HasAttrId(obj, &PyId_targets)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "targets");
+ tmp = _PyObject_GetAttrId(obj, &PyId_targets);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -3912,9 +4050,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
return 1;
}
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -3937,9 +4075,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
operator_ty op;
expr_ty value;
- if (PyObject_HasAttrString(obj, "target")) {
+ if (_PyObject_HasAttrId(obj, &PyId_target)) {
int res;
- tmp = PyObject_GetAttrString(obj, "target");
+ tmp = _PyObject_GetAttrId(obj, &PyId_target);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &target, arena);
if (res != 0) goto failed;
@@ -3949,9 +4087,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
return 1;
}
- if (PyObject_HasAttrString(obj, "op")) {
+ if (_PyObject_HasAttrId(obj, &PyId_op)) {
int res;
- tmp = PyObject_GetAttrString(obj, "op");
+ tmp = _PyObject_GetAttrId(obj, &PyId_op);
if (tmp == NULL) goto failed;
res = obj2ast_operator(tmp, &op, arena);
if (res != 0) goto failed;
@@ -3961,9 +4099,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
return 1;
}
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -3987,9 +4125,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* body;
asdl_seq* orelse;
- if (PyObject_HasAttrString(obj, "target")) {
+ if (_PyObject_HasAttrId(obj, &PyId_target)) {
int res;
- tmp = PyObject_GetAttrString(obj, "target");
+ tmp = _PyObject_GetAttrId(obj, &PyId_target);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &target, arena);
if (res != 0) goto failed;
@@ -3999,9 +4137,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
return 1;
}
- if (PyObject_HasAttrString(obj, "iter")) {
+ if (_PyObject_HasAttrId(obj, &PyId_iter)) {
int res;
- tmp = PyObject_GetAttrString(obj, "iter");
+ tmp = _PyObject_GetAttrId(obj, &PyId_iter);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &iter, arena);
if (res != 0) goto failed;
@@ -4011,11 +4149,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4036,11 +4174,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
return 1;
}
- if (PyObject_HasAttrString(obj, "orelse")) {
+ if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "orelse");
+ tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4075,9 +4213,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* body;
asdl_seq* orelse;
- if (PyObject_HasAttrString(obj, "test")) {
+ if (_PyObject_HasAttrId(obj, &PyId_test)) {
int res;
- tmp = PyObject_GetAttrString(obj, "test");
+ tmp = _PyObject_GetAttrId(obj, &PyId_test);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &test, arena);
if (res != 0) goto failed;
@@ -4087,11 +4225,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4112,11 +4250,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
return 1;
}
- if (PyObject_HasAttrString(obj, "orelse")) {
+ if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "orelse");
+ tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4150,9 +4288,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* body;
asdl_seq* orelse;
- if (PyObject_HasAttrString(obj, "test")) {
+ if (_PyObject_HasAttrId(obj, &PyId_test)) {
int res;
- tmp = PyObject_GetAttrString(obj, "test");
+ tmp = _PyObject_GetAttrId(obj, &PyId_test);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &test, arena);
if (res != 0) goto failed;
@@ -4162,11 +4300,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4187,11 +4325,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
return 1;
}
- if (PyObject_HasAttrString(obj, "orelse")) {
+ if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "orelse");
+ tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4221,38 +4359,39 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
return 1;
}
if (isinstance) {
- expr_ty context_expr;
- expr_ty optional_vars;
+ asdl_seq* items;
asdl_seq* body;
- if (PyObject_HasAttrString(obj, "context_expr")) {
+ if (_PyObject_HasAttrId(obj, &PyId_items)) {
int res;
- tmp = PyObject_GetAttrString(obj, "context_expr");
+ Py_ssize_t len;
+ Py_ssize_t i;
+ tmp = _PyObject_GetAttrId(obj, &PyId_items);
if (tmp == NULL) goto failed;
- res = obj2ast_expr(tmp, &context_expr, arena);
- if (res != 0) goto failed;
+ if (!PyList_Check(tmp)) {
+ PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name);
+ goto failed;
+ }
+ len = PyList_GET_SIZE(tmp);
+ items = asdl_seq_new(len, arena);
+ if (items == NULL) goto failed;
+ for (i = 0; i < len; i++) {
+ withitem_ty value;
+ res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &value, arena);
+ if (res != 0) goto failed;
+ asdl_seq_SET(items, i, value);
+ }
Py_XDECREF(tmp);
tmp = NULL;
} else {
- PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from With");
+ PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With");
return 1;
}
- if (PyObject_HasAttrString(obj, "optional_vars")) {
- int res;
- tmp = PyObject_GetAttrString(obj, "optional_vars");
- if (tmp == NULL) goto failed;
- res = obj2ast_expr(tmp, &optional_vars, arena);
- if (res != 0) goto failed;
- Py_XDECREF(tmp);
- tmp = NULL;
- } else {
- optional_vars = NULL;
- }
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4273,8 +4412,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
return 1;
}
- *out = With(context_expr, optional_vars, body, lineno,
- col_offset, arena);
+ *out = With(items, body, lineno, col_offset, arena);
if (*out == NULL) goto failed;
return 0;
}
@@ -4286,9 +4424,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
expr_ty exc;
expr_ty cause;
- if (PyObject_HasAttrString(obj, "exc")) {
+ if (_PyObject_HasAttrId(obj, &PyId_exc)) {
int res;
- tmp = PyObject_GetAttrString(obj, "exc");
+ tmp = _PyObject_GetAttrId(obj, &PyId_exc);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &exc, arena);
if (res != 0) goto failed;
@@ -4297,9 +4435,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
} else {
exc = NULL;
}
- if (PyObject_HasAttrString(obj, "cause")) {
+ if (_PyObject_HasAttrId(obj, &PyId_cause)) {
int res;
- tmp = PyObject_GetAttrString(obj, "cause");
+ tmp = _PyObject_GetAttrId(obj, &PyId_cause);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &cause, arena);
if (res != 0) goto failed;
@@ -4312,7 +4450,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (*out == NULL) goto failed;
return 0;
}
- isinstance = PyObject_IsInstance(obj, (PyObject*)TryExcept_type);
+ isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type);
if (isinstance == -1) {
return 1;
}
@@ -4320,15 +4458,16 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* body;
asdl_seq* handlers;
asdl_seq* orelse;
+ asdl_seq* finalbody;
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
- PyErr_Format(PyExc_TypeError, "TryExcept field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
goto failed;
}
len = PyList_GET_SIZE(tmp);
@@ -4343,17 +4482,17 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
Py_XDECREF(tmp);
tmp = NULL;
} else {
- PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryExcept");
+ PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try");
return 1;
}
- if (PyObject_HasAttrString(obj, "handlers")) {
+ if (_PyObject_HasAttrId(obj, &PyId_handlers)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "handlers");
+ tmp = _PyObject_GetAttrId(obj, &PyId_handlers);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
- PyErr_Format(PyExc_TypeError, "TryExcept field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
goto failed;
}
len = PyList_GET_SIZE(tmp);
@@ -4368,17 +4507,17 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
Py_XDECREF(tmp);
tmp = NULL;
} else {
- PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from TryExcept");
+ PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try");
return 1;
}
- if (PyObject_HasAttrString(obj, "orelse")) {
+ if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "orelse");
+ tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
- PyErr_Format(PyExc_TypeError, "TryExcept field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
goto failed;
}
len = PyList_GET_SIZE(tmp);
@@ -4393,55 +4532,17 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
Py_XDECREF(tmp);
tmp = NULL;
} else {
- PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from TryExcept");
- return 1;
- }
- *out = TryExcept(body, handlers, orelse, lineno, col_offset,
- arena);
- if (*out == NULL) goto failed;
- return 0;
- }
- isinstance = PyObject_IsInstance(obj, (PyObject*)TryFinally_type);
- if (isinstance == -1) {
- return 1;
- }
- if (isinstance) {
- asdl_seq* body;
- asdl_seq* finalbody;
-
- if (PyObject_HasAttrString(obj, "body")) {
- int res;
- Py_ssize_t len;
- Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
- if (tmp == NULL) goto failed;
- if (!PyList_Check(tmp)) {
- PyErr_Format(PyExc_TypeError, "TryFinally field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
- goto failed;
- }
- len = PyList_GET_SIZE(tmp);
- body = asdl_seq_new(len, arena);
- if (body == NULL) goto failed;
- for (i = 0; i < len; i++) {
- stmt_ty value;
- res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
- if (res != 0) goto failed;
- asdl_seq_SET(body, i, value);
- }
- Py_XDECREF(tmp);
- tmp = NULL;
- } else {
- PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryFinally");
+ PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try");
return 1;
}
- if (PyObject_HasAttrString(obj, "finalbody")) {
+ if (_PyObject_HasAttrId(obj, &PyId_finalbody)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "finalbody");
+ tmp = _PyObject_GetAttrId(obj, &PyId_finalbody);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
- PyErr_Format(PyExc_TypeError, "TryFinally field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
goto failed;
}
len = PyList_GET_SIZE(tmp);
@@ -4456,10 +4557,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
Py_XDECREF(tmp);
tmp = NULL;
} else {
- PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from TryFinally");
+ PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from Try");
return 1;
}
- *out = TryFinally(body, finalbody, lineno, col_offset, arena);
+ *out = Try(body, handlers, orelse, finalbody, lineno,
+ col_offset, arena);
if (*out == NULL) goto failed;
return 0;
}
@@ -4471,9 +4573,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
expr_ty test;
expr_ty msg;
- if (PyObject_HasAttrString(obj, "test")) {
+ if (_PyObject_HasAttrId(obj, &PyId_test)) {
int res;
- tmp = PyObject_GetAttrString(obj, "test");
+ tmp = _PyObject_GetAttrId(obj, &PyId_test);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &test, arena);
if (res != 0) goto failed;
@@ -4483,9 +4585,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
return 1;
}
- if (PyObject_HasAttrString(obj, "msg")) {
+ if (_PyObject_HasAttrId(obj, &PyId_msg)) {
int res;
- tmp = PyObject_GetAttrString(obj, "msg");
+ tmp = _PyObject_GetAttrId(obj, &PyId_msg);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &msg, arena);
if (res != 0) goto failed;
@@ -4505,11 +4607,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* names;
- if (PyObject_HasAttrString(obj, "names")) {
+ if (_PyObject_HasAttrId(obj, &PyId_names)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "names");
+ tmp = _PyObject_GetAttrId(obj, &PyId_names);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4543,9 +4645,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
asdl_seq* names;
int level;
- if (PyObject_HasAttrString(obj, "module")) {
+ if (_PyObject_HasAttrId(obj, &PyId_module)) {
int res;
- tmp = PyObject_GetAttrString(obj, "module");
+ tmp = _PyObject_GetAttrId(obj, &PyId_module);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &module, arena);
if (res != 0) goto failed;
@@ -4554,11 +4656,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
} else {
module = NULL;
}
- if (PyObject_HasAttrString(obj, "names")) {
+ if (_PyObject_HasAttrId(obj, &PyId_names)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "names");
+ tmp = _PyObject_GetAttrId(obj, &PyId_names);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4579,9 +4681,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
return 1;
}
- if (PyObject_HasAttrString(obj, "level")) {
+ if (_PyObject_HasAttrId(obj, &PyId_level)) {
int res;
- tmp = PyObject_GetAttrString(obj, "level");
+ tmp = _PyObject_GetAttrId(obj, &PyId_level);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &level, arena);
if (res != 0) goto failed;
@@ -4602,11 +4704,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* names;
- if (PyObject_HasAttrString(obj, "names")) {
+ if (_PyObject_HasAttrId(obj, &PyId_names)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "names");
+ tmp = _PyObject_GetAttrId(obj, &PyId_names);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4638,11 +4740,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* names;
- if (PyObject_HasAttrString(obj, "names")) {
+ if (_PyObject_HasAttrId(obj, &PyId_names)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "names");
+ tmp = _PyObject_GetAttrId(obj, &PyId_names);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4674,9 +4776,9 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
if (isinstance) {
expr_ty value;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -4740,9 +4842,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
*out = NULL;
return 0;
}
- if (PyObject_HasAttrString(obj, "lineno")) {
+ if (_PyObject_HasAttrId(obj, &PyId_lineno)) {
int res;
- tmp = PyObject_GetAttrString(obj, "lineno");
+ tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &lineno, arena);
if (res != 0) goto failed;
@@ -4752,9 +4854,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
return 1;
}
- if (PyObject_HasAttrString(obj, "col_offset")) {
+ if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {
int res;
- tmp = PyObject_GetAttrString(obj, "col_offset");
+ tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &col_offset, arena);
if (res != 0) goto failed;
@@ -4772,9 +4874,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
boolop_ty op;
asdl_seq* values;
- if (PyObject_HasAttrString(obj, "op")) {
+ if (_PyObject_HasAttrId(obj, &PyId_op)) {
int res;
- tmp = PyObject_GetAttrString(obj, "op");
+ tmp = _PyObject_GetAttrId(obj, &PyId_op);
if (tmp == NULL) goto failed;
res = obj2ast_boolop(tmp, &op, arena);
if (res != 0) goto failed;
@@ -4784,11 +4886,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
return 1;
}
- if (PyObject_HasAttrString(obj, "values")) {
+ if (_PyObject_HasAttrId(obj, &PyId_values)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "values");
+ tmp = _PyObject_GetAttrId(obj, &PyId_values);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -4822,9 +4924,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
operator_ty op;
expr_ty right;
- if (PyObject_HasAttrString(obj, "left")) {
+ if (_PyObject_HasAttrId(obj, &PyId_left)) {
int res;
- tmp = PyObject_GetAttrString(obj, "left");
+ tmp = _PyObject_GetAttrId(obj, &PyId_left);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &left, arena);
if (res != 0) goto failed;
@@ -4834,9 +4936,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
return 1;
}
- if (PyObject_HasAttrString(obj, "op")) {
+ if (_PyObject_HasAttrId(obj, &PyId_op)) {
int res;
- tmp = PyObject_GetAttrString(obj, "op");
+ tmp = _PyObject_GetAttrId(obj, &PyId_op);
if (tmp == NULL) goto failed;
res = obj2ast_operator(tmp, &op, arena);
if (res != 0) goto failed;
@@ -4846,9 +4948,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
return 1;
}
- if (PyObject_HasAttrString(obj, "right")) {
+ if (_PyObject_HasAttrId(obj, &PyId_right)) {
int res;
- tmp = PyObject_GetAttrString(obj, "right");
+ tmp = _PyObject_GetAttrId(obj, &PyId_right);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &right, arena);
if (res != 0) goto failed;
@@ -4870,9 +4972,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
unaryop_ty op;
expr_ty operand;
- if (PyObject_HasAttrString(obj, "op")) {
+ if (_PyObject_HasAttrId(obj, &PyId_op)) {
int res;
- tmp = PyObject_GetAttrString(obj, "op");
+ tmp = _PyObject_GetAttrId(obj, &PyId_op);
if (tmp == NULL) goto failed;
res = obj2ast_unaryop(tmp, &op, arena);
if (res != 0) goto failed;
@@ -4882,9 +4984,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
return 1;
}
- if (PyObject_HasAttrString(obj, "operand")) {
+ if (_PyObject_HasAttrId(obj, &PyId_operand)) {
int res;
- tmp = PyObject_GetAttrString(obj, "operand");
+ tmp = _PyObject_GetAttrId(obj, &PyId_operand);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &operand, arena);
if (res != 0) goto failed;
@@ -4906,9 +5008,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
arguments_ty args;
expr_ty body;
- if (PyObject_HasAttrString(obj, "args")) {
+ if (_PyObject_HasAttrId(obj, &PyId_args)) {
int res;
- tmp = PyObject_GetAttrString(obj, "args");
+ tmp = _PyObject_GetAttrId(obj, &PyId_args);
if (tmp == NULL) goto failed;
res = obj2ast_arguments(tmp, &args, arena);
if (res != 0) goto failed;
@@ -4918,9 +5020,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &body, arena);
if (res != 0) goto failed;
@@ -4943,9 +5045,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty body;
expr_ty orelse;
- if (PyObject_HasAttrString(obj, "test")) {
+ if (_PyObject_HasAttrId(obj, &PyId_test)) {
int res;
- tmp = PyObject_GetAttrString(obj, "test");
+ tmp = _PyObject_GetAttrId(obj, &PyId_test);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &test, arena);
if (res != 0) goto failed;
@@ -4955,9 +5057,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
return 1;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &body, arena);
if (res != 0) goto failed;
@@ -4967,9 +5069,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
return 1;
}
- if (PyObject_HasAttrString(obj, "orelse")) {
+ if (_PyObject_HasAttrId(obj, &PyId_orelse)) {
int res;
- tmp = PyObject_GetAttrString(obj, "orelse");
+ tmp = _PyObject_GetAttrId(obj, &PyId_orelse);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &orelse, arena);
if (res != 0) goto failed;
@@ -4991,11 +5093,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
asdl_seq* keys;
asdl_seq* values;
- if (PyObject_HasAttrString(obj, "keys")) {
+ if (_PyObject_HasAttrId(obj, &PyId_keys)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "keys");
+ tmp = _PyObject_GetAttrId(obj, &PyId_keys);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5016,11 +5118,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
return 1;
}
- if (PyObject_HasAttrString(obj, "values")) {
+ if (_PyObject_HasAttrId(obj, &PyId_values)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "values");
+ tmp = _PyObject_GetAttrId(obj, &PyId_values);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5052,11 +5154,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* elts;
- if (PyObject_HasAttrString(obj, "elts")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elts)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "elts");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elts);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5089,9 +5191,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty elt;
asdl_seq* generators;
- if (PyObject_HasAttrString(obj, "elt")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elt)) {
int res;
- tmp = PyObject_GetAttrString(obj, "elt");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elt);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &elt, arena);
if (res != 0) goto failed;
@@ -5101,11 +5203,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
return 1;
}
- if (PyObject_HasAttrString(obj, "generators")) {
+ if (_PyObject_HasAttrId(obj, &PyId_generators)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "generators");
+ tmp = _PyObject_GetAttrId(obj, &PyId_generators);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5138,9 +5240,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty elt;
asdl_seq* generators;
- if (PyObject_HasAttrString(obj, "elt")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elt)) {
int res;
- tmp = PyObject_GetAttrString(obj, "elt");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elt);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &elt, arena);
if (res != 0) goto failed;
@@ -5150,11 +5252,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
return 1;
}
- if (PyObject_HasAttrString(obj, "generators")) {
+ if (_PyObject_HasAttrId(obj, &PyId_generators)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "generators");
+ tmp = _PyObject_GetAttrId(obj, &PyId_generators);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5188,9 +5290,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty value;
asdl_seq* generators;
- if (PyObject_HasAttrString(obj, "key")) {
+ if (_PyObject_HasAttrId(obj, &PyId_key)) {
int res;
- tmp = PyObject_GetAttrString(obj, "key");
+ tmp = _PyObject_GetAttrId(obj, &PyId_key);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &key, arena);
if (res != 0) goto failed;
@@ -5200,9 +5302,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
return 1;
}
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -5212,11 +5314,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
return 1;
}
- if (PyObject_HasAttrString(obj, "generators")) {
+ if (_PyObject_HasAttrId(obj, &PyId_generators)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "generators");
+ tmp = _PyObject_GetAttrId(obj, &PyId_generators);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5250,9 +5352,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty elt;
asdl_seq* generators;
- if (PyObject_HasAttrString(obj, "elt")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elt)) {
int res;
- tmp = PyObject_GetAttrString(obj, "elt");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elt);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &elt, arena);
if (res != 0) goto failed;
@@ -5262,11 +5364,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
return 1;
}
- if (PyObject_HasAttrString(obj, "generators")) {
+ if (_PyObject_HasAttrId(obj, &PyId_generators)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "generators");
+ tmp = _PyObject_GetAttrId(obj, &PyId_generators);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5298,9 +5400,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
if (isinstance) {
expr_ty value;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -5313,6 +5415,28 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
if (*out == NULL) goto failed;
return 0;
}
+ isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type);
+ if (isinstance == -1) {
+ return 1;
+ }
+ if (isinstance) {
+ expr_ty value;
+
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
+ int res;
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
+ if (tmp == NULL) goto failed;
+ res = obj2ast_expr(tmp, &value, arena);
+ if (res != 0) goto failed;
+ Py_XDECREF(tmp);
+ tmp = NULL;
+ } else {
+ value = NULL;
+ }
+ *out = YieldFrom(value, lineno, col_offset, arena);
+ if (*out == NULL) goto failed;
+ return 0;
+ }
isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type);
if (isinstance == -1) {
return 1;
@@ -5322,9 +5446,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
asdl_int_seq* ops;
asdl_seq* comparators;
- if (PyObject_HasAttrString(obj, "left")) {
+ if (_PyObject_HasAttrId(obj, &PyId_left)) {
int res;
- tmp = PyObject_GetAttrString(obj, "left");
+ tmp = _PyObject_GetAttrId(obj, &PyId_left);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &left, arena);
if (res != 0) goto failed;
@@ -5334,11 +5458,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
return 1;
}
- if (PyObject_HasAttrString(obj, "ops")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ops)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "ops");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ops);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5359,11 +5483,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
return 1;
}
- if (PyObject_HasAttrString(obj, "comparators")) {
+ if (_PyObject_HasAttrId(obj, &PyId_comparators)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "comparators");
+ tmp = _PyObject_GetAttrId(obj, &PyId_comparators);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5400,9 +5524,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty starargs;
expr_ty kwargs;
- if (PyObject_HasAttrString(obj, "func")) {
+ if (_PyObject_HasAttrId(obj, &PyId_func)) {
int res;
- tmp = PyObject_GetAttrString(obj, "func");
+ tmp = _PyObject_GetAttrId(obj, &PyId_func);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &func, arena);
if (res != 0) goto failed;
@@ -5412,11 +5536,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
return 1;
}
- if (PyObject_HasAttrString(obj, "args")) {
+ if (_PyObject_HasAttrId(obj, &PyId_args)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "args");
+ tmp = _PyObject_GetAttrId(obj, &PyId_args);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5437,11 +5561,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
return 1;
}
- if (PyObject_HasAttrString(obj, "keywords")) {
+ if (_PyObject_HasAttrId(obj, &PyId_keywords)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "keywords");
+ tmp = _PyObject_GetAttrId(obj, &PyId_keywords);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5462,9 +5586,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
return 1;
}
- if (PyObject_HasAttrString(obj, "starargs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_starargs)) {
int res;
- tmp = PyObject_GetAttrString(obj, "starargs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_starargs);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &starargs, arena);
if (res != 0) goto failed;
@@ -5473,9 +5597,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
} else {
starargs = NULL;
}
- if (PyObject_HasAttrString(obj, "kwargs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kwargs)) {
int res;
- tmp = PyObject_GetAttrString(obj, "kwargs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kwargs);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &kwargs, arena);
if (res != 0) goto failed;
@@ -5496,9 +5620,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
if (isinstance) {
object n;
- if (PyObject_HasAttrString(obj, "n")) {
+ if (_PyObject_HasAttrId(obj, &PyId_n)) {
int res;
- tmp = PyObject_GetAttrString(obj, "n");
+ tmp = _PyObject_GetAttrId(obj, &PyId_n);
if (tmp == NULL) goto failed;
res = obj2ast_object(tmp, &n, arena);
if (res != 0) goto failed;
@@ -5519,9 +5643,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
if (isinstance) {
string s;
- if (PyObject_HasAttrString(obj, "s")) {
+ if (_PyObject_HasAttrId(obj, &PyId_s)) {
int res;
- tmp = PyObject_GetAttrString(obj, "s");
+ tmp = _PyObject_GetAttrId(obj, &PyId_s);
if (tmp == NULL) goto failed;
res = obj2ast_string(tmp, &s, arena);
if (res != 0) goto failed;
@@ -5540,13 +5664,13 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
return 1;
}
if (isinstance) {
- string s;
+ bytes s;
- if (PyObject_HasAttrString(obj, "s")) {
+ if (_PyObject_HasAttrId(obj, &PyId_s)) {
int res;
- tmp = PyObject_GetAttrString(obj, "s");
+ tmp = _PyObject_GetAttrId(obj, &PyId_s);
if (tmp == NULL) goto failed;
- res = obj2ast_string(tmp, &s, arena);
+ res = obj2ast_bytes(tmp, &s, arena);
if (res != 0) goto failed;
Py_XDECREF(tmp);
tmp = NULL;
@@ -5577,9 +5701,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
identifier attr;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -5589,9 +5713,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
return 1;
}
- if (PyObject_HasAttrString(obj, "attr")) {
+ if (_PyObject_HasAttrId(obj, &PyId_attr)) {
int res;
- tmp = PyObject_GetAttrString(obj, "attr");
+ tmp = _PyObject_GetAttrId(obj, &PyId_attr);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &attr, arena);
if (res != 0) goto failed;
@@ -5601,9 +5725,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5626,9 +5750,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
slice_ty slice;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -5638,9 +5762,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
return 1;
}
- if (PyObject_HasAttrString(obj, "slice")) {
+ if (_PyObject_HasAttrId(obj, &PyId_slice)) {
int res;
- tmp = PyObject_GetAttrString(obj, "slice");
+ tmp = _PyObject_GetAttrId(obj, &PyId_slice);
if (tmp == NULL) goto failed;
res = obj2ast_slice(tmp, &slice, arena);
if (res != 0) goto failed;
@@ -5650,9 +5774,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5674,9 +5798,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
expr_ty value;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -5686,9 +5810,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5710,9 +5834,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
identifier id;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "id")) {
+ if (_PyObject_HasAttrId(obj, &PyId_id)) {
int res;
- tmp = PyObject_GetAttrString(obj, "id");
+ tmp = _PyObject_GetAttrId(obj, &PyId_id);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &id, arena);
if (res != 0) goto failed;
@@ -5722,9 +5846,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5746,11 +5870,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
asdl_seq* elts;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "elts")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elts)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "elts");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elts);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5771,9 +5895,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5795,11 +5919,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
asdl_seq* elts;
expr_context_ty ctx;
- if (PyObject_HasAttrString(obj, "elts")) {
+ if (_PyObject_HasAttrId(obj, &PyId_elts)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "elts");
+ tmp = _PyObject_GetAttrId(obj, &PyId_elts);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -5820,9 +5944,9 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
return 1;
}
- if (PyObject_HasAttrString(obj, "ctx")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ctx)) {
int res;
- tmp = PyObject_GetAttrString(obj, "ctx");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ctx);
if (tmp == NULL) goto failed;
res = obj2ast_expr_context(tmp, &ctx, arena);
if (res != 0) goto failed;
@@ -5921,9 +6045,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
expr_ty upper;
expr_ty step;
- if (PyObject_HasAttrString(obj, "lower")) {
+ if (_PyObject_HasAttrId(obj, &PyId_lower)) {
int res;
- tmp = PyObject_GetAttrString(obj, "lower");
+ tmp = _PyObject_GetAttrId(obj, &PyId_lower);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &lower, arena);
if (res != 0) goto failed;
@@ -5932,9 +6056,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
} else {
lower = NULL;
}
- if (PyObject_HasAttrString(obj, "upper")) {
+ if (_PyObject_HasAttrId(obj, &PyId_upper)) {
int res;
- tmp = PyObject_GetAttrString(obj, "upper");
+ tmp = _PyObject_GetAttrId(obj, &PyId_upper);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &upper, arena);
if (res != 0) goto failed;
@@ -5943,9 +6067,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
} else {
upper = NULL;
}
- if (PyObject_HasAttrString(obj, "step")) {
+ if (_PyObject_HasAttrId(obj, &PyId_step)) {
int res;
- tmp = PyObject_GetAttrString(obj, "step");
+ tmp = _PyObject_GetAttrId(obj, &PyId_step);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &step, arena);
if (res != 0) goto failed;
@@ -5965,11 +6089,11 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
if (isinstance) {
asdl_seq* dims;
- if (PyObject_HasAttrString(obj, "dims")) {
+ if (_PyObject_HasAttrId(obj, &PyId_dims)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "dims");
+ tmp = _PyObject_GetAttrId(obj, &PyId_dims);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6001,9 +6125,9 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
if (isinstance) {
expr_ty value;
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -6296,9 +6420,9 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
expr_ty iter;
asdl_seq* ifs;
- if (PyObject_HasAttrString(obj, "target")) {
+ if (_PyObject_HasAttrId(obj, &PyId_target)) {
int res;
- tmp = PyObject_GetAttrString(obj, "target");
+ tmp = _PyObject_GetAttrId(obj, &PyId_target);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &target, arena);
if (res != 0) goto failed;
@@ -6308,9 +6432,9 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
return 1;
}
- if (PyObject_HasAttrString(obj, "iter")) {
+ if (_PyObject_HasAttrId(obj, &PyId_iter)) {
int res;
- tmp = PyObject_GetAttrString(obj, "iter");
+ tmp = _PyObject_GetAttrId(obj, &PyId_iter);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &iter, arena);
if (res != 0) goto failed;
@@ -6320,11 +6444,11 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
return 1;
}
- if (PyObject_HasAttrString(obj, "ifs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_ifs)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "ifs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_ifs);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6365,9 +6489,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
*out = NULL;
return 0;
}
- if (PyObject_HasAttrString(obj, "lineno")) {
+ if (_PyObject_HasAttrId(obj, &PyId_lineno)) {
int res;
- tmp = PyObject_GetAttrString(obj, "lineno");
+ tmp = _PyObject_GetAttrId(obj, &PyId_lineno);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &lineno, arena);
if (res != 0) goto failed;
@@ -6377,9 +6501,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
return 1;
}
- if (PyObject_HasAttrString(obj, "col_offset")) {
+ if (_PyObject_HasAttrId(obj, &PyId_col_offset)) {
int res;
- tmp = PyObject_GetAttrString(obj, "col_offset");
+ tmp = _PyObject_GetAttrId(obj, &PyId_col_offset);
if (tmp == NULL) goto failed;
res = obj2ast_int(tmp, &col_offset, arena);
if (res != 0) goto failed;
@@ -6398,9 +6522,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
identifier name;
asdl_seq* body;
- if (PyObject_HasAttrString(obj, "type")) {
+ if (_PyObject_HasAttrId(obj, &PyId_type)) {
int res;
- tmp = PyObject_GetAttrString(obj, "type");
+ tmp = _PyObject_GetAttrId(obj, &PyId_type);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &type, arena);
if (res != 0) goto failed;
@@ -6409,9 +6533,9 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
} else {
type = NULL;
}
- if (PyObject_HasAttrString(obj, "name")) {
+ if (_PyObject_HasAttrId(obj, &PyId_name)) {
int res;
- tmp = PyObject_GetAttrString(obj, "name");
+ tmp = _PyObject_GetAttrId(obj, &PyId_name);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &name, arena);
if (res != 0) goto failed;
@@ -6420,11 +6544,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
} else {
name = NULL;
}
- if (PyObject_HasAttrString(obj, "body")) {
+ if (_PyObject_HasAttrId(obj, &PyId_body)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "body");
+ tmp = _PyObject_GetAttrId(obj, &PyId_body);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6470,11 +6594,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
asdl_seq* defaults;
asdl_seq* kw_defaults;
- if (PyObject_HasAttrString(obj, "args")) {
+ if (_PyObject_HasAttrId(obj, &PyId_args)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "args");
+ tmp = _PyObject_GetAttrId(obj, &PyId_args);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6495,9 +6619,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
return 1;
}
- if (PyObject_HasAttrString(obj, "vararg")) {
+ if (_PyObject_HasAttrId(obj, &PyId_vararg)) {
int res;
- tmp = PyObject_GetAttrString(obj, "vararg");
+ tmp = _PyObject_GetAttrId(obj, &PyId_vararg);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &vararg, arena);
if (res != 0) goto failed;
@@ -6506,9 +6630,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
} else {
vararg = NULL;
}
- if (PyObject_HasAttrString(obj, "varargannotation")) {
+ if (_PyObject_HasAttrId(obj, &PyId_varargannotation)) {
int res;
- tmp = PyObject_GetAttrString(obj, "varargannotation");
+ tmp = _PyObject_GetAttrId(obj, &PyId_varargannotation);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &varargannotation, arena);
if (res != 0) goto failed;
@@ -6517,11 +6641,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
} else {
varargannotation = NULL;
}
- if (PyObject_HasAttrString(obj, "kwonlyargs")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kwonlyargs)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "kwonlyargs");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kwonlyargs);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6542,9 +6666,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
return 1;
}
- if (PyObject_HasAttrString(obj, "kwarg")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kwarg)) {
int res;
- tmp = PyObject_GetAttrString(obj, "kwarg");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kwarg);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &kwarg, arena);
if (res != 0) goto failed;
@@ -6553,9 +6677,9 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
} else {
kwarg = NULL;
}
- if (PyObject_HasAttrString(obj, "kwargannotation")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kwargannotation)) {
int res;
- tmp = PyObject_GetAttrString(obj, "kwargannotation");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kwargannotation);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &kwargannotation, arena);
if (res != 0) goto failed;
@@ -6564,11 +6688,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
} else {
kwargannotation = NULL;
}
- if (PyObject_HasAttrString(obj, "defaults")) {
+ if (_PyObject_HasAttrId(obj, &PyId_defaults)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "defaults");
+ tmp = _PyObject_GetAttrId(obj, &PyId_defaults);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6589,11 +6713,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
return 1;
}
- if (PyObject_HasAttrString(obj, "kw_defaults")) {
+ if (_PyObject_HasAttrId(obj, &PyId_kw_defaults)) {
int res;
Py_ssize_t len;
Py_ssize_t i;
- tmp = PyObject_GetAttrString(obj, "kw_defaults");
+ tmp = _PyObject_GetAttrId(obj, &PyId_kw_defaults);
if (tmp == NULL) goto failed;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
@@ -6629,9 +6753,9 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
identifier arg;
expr_ty annotation;
- if (PyObject_HasAttrString(obj, "arg")) {
+ if (_PyObject_HasAttrId(obj, &PyId_arg)) {
int res;
- tmp = PyObject_GetAttrString(obj, "arg");
+ tmp = _PyObject_GetAttrId(obj, &PyId_arg);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &arg, arena);
if (res != 0) goto failed;
@@ -6641,9 +6765,9 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
return 1;
}
- if (PyObject_HasAttrString(obj, "annotation")) {
+ if (_PyObject_HasAttrId(obj, &PyId_annotation)) {
int res;
- tmp = PyObject_GetAttrString(obj, "annotation");
+ tmp = _PyObject_GetAttrId(obj, &PyId_annotation);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &annotation, arena);
if (res != 0) goto failed;
@@ -6666,9 +6790,9 @@ obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
identifier arg;
expr_ty value;
- if (PyObject_HasAttrString(obj, "arg")) {
+ if (_PyObject_HasAttrId(obj, &PyId_arg)) {
int res;
- tmp = PyObject_GetAttrString(obj, "arg");
+ tmp = _PyObject_GetAttrId(obj, &PyId_arg);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &arg, arena);
if (res != 0) goto failed;
@@ -6678,9 +6802,9 @@ obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from keyword");
return 1;
}
- if (PyObject_HasAttrString(obj, "value")) {
+ if (_PyObject_HasAttrId(obj, &PyId_value)) {
int res;
- tmp = PyObject_GetAttrString(obj, "value");
+ tmp = _PyObject_GetAttrId(obj, &PyId_value);
if (tmp == NULL) goto failed;
res = obj2ast_expr(tmp, &value, arena);
if (res != 0) goto failed;
@@ -6704,9 +6828,9 @@ obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
identifier name;
identifier asname;
- if (PyObject_HasAttrString(obj, "name")) {
+ if (_PyObject_HasAttrId(obj, &PyId_name)) {
int res;
- tmp = PyObject_GetAttrString(obj, "name");
+ tmp = _PyObject_GetAttrId(obj, &PyId_name);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &name, arena);
if (res != 0) goto failed;
@@ -6716,9 +6840,9 @@ obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
return 1;
}
- if (PyObject_HasAttrString(obj, "asname")) {
+ if (_PyObject_HasAttrId(obj, &PyId_asname)) {
int res;
- tmp = PyObject_GetAttrString(obj, "asname");
+ tmp = _PyObject_GetAttrId(obj, &PyId_asname);
if (tmp == NULL) goto failed;
res = obj2ast_identifier(tmp, &asname, arena);
if (res != 0) goto failed;
@@ -6734,6 +6858,43 @@ failed:
return 1;
}
+int
+obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena)
+{
+ PyObject* tmp = NULL;
+ expr_ty context_expr;
+ expr_ty optional_vars;
+
+ if (_PyObject_HasAttrId(obj, &PyId_context_expr)) {
+ int res;
+ tmp = _PyObject_GetAttrId(obj, &PyId_context_expr);
+ if (tmp == NULL) goto failed;
+ res = obj2ast_expr(tmp, &context_expr, arena);
+ if (res != 0) goto failed;
+ Py_XDECREF(tmp);
+ tmp = NULL;
+ } else {
+ PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem");
+ return 1;
+ }
+ if (_PyObject_HasAttrId(obj, &PyId_optional_vars)) {
+ int res;
+ tmp = _PyObject_GetAttrId(obj, &PyId_optional_vars);
+ if (tmp == NULL) goto failed;
+ res = obj2ast_expr(tmp, &optional_vars, arena);
+ if (res != 0) goto failed;
+ Py_XDECREF(tmp);
+ tmp = NULL;
+ } else {
+ optional_vars = NULL;
+ }
+ *out = withitem(context_expr, optional_vars, arena);
+ return 0;
+failed:
+ Py_XDECREF(tmp);
+ return 1;
+}
+
static struct PyModuleDef _astmodule = {
PyModuleDef_HEAD_INIT, "_ast"
@@ -6750,8 +6911,6 @@ PyInit__ast(void)
NULL;
if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)
return NULL;
- if (PyModule_AddStringConstant(m, "__version__", "82163") < 0)
- return NULL;
if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return
NULL;
if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0)
@@ -6785,10 +6944,8 @@ PyInit__ast(void)
NULL;
if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
NULL;
- if (PyDict_SetItemString(d, "TryExcept", (PyObject*)TryExcept_type) <
- 0) return NULL;
- if (PyDict_SetItemString(d, "TryFinally", (PyObject*)TryFinally_type) <
- 0) return NULL;
+ if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return
+ NULL;
if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0)
return NULL;
if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0)
@@ -6833,6 +6990,8 @@ PyInit__ast(void)
(PyObject*)GeneratorExp_type) < 0) return NULL;
if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
NULL;
+ if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) <
+ 0) return NULL;
if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0)
return NULL;
if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return
@@ -6951,6 +7110,8 @@ PyInit__ast(void)
return NULL;
if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
NULL;
+ if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0)
+ return NULL;
return m;
}
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..0c0c1a6 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -1,24 +1,507 @@
/*
* This file includes functions to transform a concrete syntax tree (CST) to
- * an abstract syntax tree (AST). The main function is PyAST_FromNode().
+ * an abstract syntax tree (AST). The main function is PyAST_FromNode().
*
*/
#include "Python.h"
#include "Python-ast.h"
-#include "grammar.h"
#include "node.h"
#include "ast.h"
#include "token.h"
-#include "parsetok.h"
-#include "graminit.h"
#include <assert.h>
+static int validate_stmts(asdl_seq *);
+static int validate_exprs(asdl_seq *, expr_context_ty, int);
+static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
+static int validate_stmt(stmt_ty);
+static int validate_expr(expr_ty, expr_context_ty);
+
+static int
+validate_comprehension(asdl_seq *gens)
+{
+ int i;
+ if (!asdl_seq_LEN(gens)) {
+ PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
+ return 0;
+ }
+ for (i = 0; i < asdl_seq_LEN(gens); i++) {
+ comprehension_ty comp = asdl_seq_GET(gens, i);
+ if (!validate_expr(comp->target, Store) ||
+ !validate_expr(comp->iter, Load) ||
+ !validate_exprs(comp->ifs, Load, 0))
+ return 0;
+ }
+ return 1;
+}
+
+static int
+validate_slice(slice_ty slice)
+{
+ switch (slice->kind) {
+ case Slice_kind:
+ return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
+ (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
+ (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
+ case ExtSlice_kind: {
+ int i;
+ if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
+ return 0;
+ for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
+ if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
+ return 0;
+ return 1;
+ }
+ case Index_kind:
+ return validate_expr(slice->v.Index.value, Load);
+ default:
+ PyErr_SetString(PyExc_SystemError, "unknown slice node");
+ return 0;
+ }
+}
+
+static int
+validate_keywords(asdl_seq *keywords)
+{
+ int i;
+ for (i = 0; i < asdl_seq_LEN(keywords); i++)
+ if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
+ return 0;
+ return 1;
+}
+
+static int
+validate_args(asdl_seq *args)
+{
+ int i;
+ for (i = 0; i < asdl_seq_LEN(args); i++) {
+ arg_ty arg = asdl_seq_GET(args, i);
+ if (arg->annotation && !validate_expr(arg->annotation, Load))
+ return 0;
+ }
+ return 1;
+}
+
+static const char *
+expr_context_name(expr_context_ty ctx)
+{
+ switch (ctx) {
+ case Load:
+ return "Load";
+ case Store:
+ return "Store";
+ case Del:
+ return "Del";
+ case AugLoad:
+ return "AugLoad";
+ case AugStore:
+ return "AugStore";
+ case Param:
+ return "Param";
+ default:
+ assert(0);
+ return "(unknown)";
+ }
+}
+
+static int
+validate_arguments(arguments_ty args)
+{
+ if (!validate_args(args->args))
+ return 0;
+ if (args->varargannotation) {
+ if (!args->vararg) {
+ PyErr_SetString(PyExc_ValueError, "varargannotation but no vararg on arguments");
+ return 0;
+ }
+ if (!validate_expr(args->varargannotation, Load))
+ return 0;
+ }
+ if (!validate_args(args->kwonlyargs))
+ return 0;
+ if (args->kwargannotation) {
+ if (!args->kwarg) {
+ PyErr_SetString(PyExc_ValueError, "kwargannotation but no kwarg on arguments");
+ return 0;
+ }
+ if (!validate_expr(args->kwargannotation, Load))
+ return 0;
+ }
+ if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
+ PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
+ return 0;
+ }
+ if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
+ PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
+ "kw_defaults on arguments");
+ return 0;
+ }
+ return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
+}
+
+static int
+validate_expr(expr_ty exp, expr_context_ty ctx)
+{
+ int check_ctx = 1;
+ expr_context_ty actual_ctx;
+
+ /* First check expression context. */
+ switch (exp->kind) {
+ case Attribute_kind:
+ actual_ctx = exp->v.Attribute.ctx;
+ break;
+ case Subscript_kind:
+ actual_ctx = exp->v.Subscript.ctx;
+ break;
+ case Starred_kind:
+ actual_ctx = exp->v.Starred.ctx;
+ break;
+ case Name_kind:
+ actual_ctx = exp->v.Name.ctx;
+ break;
+ case List_kind:
+ actual_ctx = exp->v.List.ctx;
+ break;
+ case Tuple_kind:
+ actual_ctx = exp->v.Tuple.ctx;
+ break;
+ default:
+ if (ctx != Load) {
+ PyErr_Format(PyExc_ValueError, "expression which can't be "
+ "assigned to in %s context", expr_context_name(ctx));
+ return 0;
+ }
+ check_ctx = 0;
+ }
+ if (check_ctx && actual_ctx != ctx) {
+ PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
+ expr_context_name(ctx), expr_context_name(actual_ctx));
+ return 0;
+ }
+
+ /* Now validate expression. */
+ switch (exp->kind) {
+ case BoolOp_kind:
+ if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
+ PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
+ return 0;
+ }
+ return validate_exprs(exp->v.BoolOp.values, Load, 0);
+ case BinOp_kind:
+ return validate_expr(exp->v.BinOp.left, Load) &&
+ validate_expr(exp->v.BinOp.right, Load);
+ case UnaryOp_kind:
+ return validate_expr(exp->v.UnaryOp.operand, Load);
+ case Lambda_kind:
+ return validate_arguments(exp->v.Lambda.args) &&
+ validate_expr(exp->v.Lambda.body, Load);
+ case IfExp_kind:
+ return validate_expr(exp->v.IfExp.test, Load) &&
+ validate_expr(exp->v.IfExp.body, Load) &&
+ validate_expr(exp->v.IfExp.orelse, Load);
+ case Dict_kind:
+ if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
+ PyErr_SetString(PyExc_ValueError,
+ "Dict doesn't have the same number of keys as values");
+ return 0;
+ }
+ return validate_exprs(exp->v.Dict.keys, Load, 0) &&
+ validate_exprs(exp->v.Dict.values, Load, 0);
+ case Set_kind:
+ return validate_exprs(exp->v.Set.elts, Load, 0);
+#define COMP(NAME) \
+ case NAME ## _kind: \
+ return validate_comprehension(exp->v.NAME.generators) && \
+ validate_expr(exp->v.NAME.elt, Load);
+ COMP(ListComp)
+ COMP(SetComp)
+ COMP(GeneratorExp)
+#undef COMP
+ case DictComp_kind:
+ return validate_comprehension(exp->v.DictComp.generators) &&
+ validate_expr(exp->v.DictComp.key, Load) &&
+ validate_expr(exp->v.DictComp.value, Load);
+ case Yield_kind:
+ return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
+ case YieldFrom_kind:
+ return !exp->v.YieldFrom.value ||
+ validate_expr(exp->v.YieldFrom.value, Load);
+ case Compare_kind:
+ if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
+ PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
+ return 0;
+ }
+ if (asdl_seq_LEN(exp->v.Compare.comparators) !=
+ asdl_seq_LEN(exp->v.Compare.ops)) {
+ PyErr_SetString(PyExc_ValueError, "Compare has a different number "
+ "of comparators and operands");
+ return 0;
+ }
+ return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
+ validate_expr(exp->v.Compare.left, Load);
+ case Call_kind:
+ return validate_expr(exp->v.Call.func, Load) &&
+ validate_exprs(exp->v.Call.args, Load, 0) &&
+ validate_keywords(exp->v.Call.keywords) &&
+ (!exp->v.Call.starargs || validate_expr(exp->v.Call.starargs, Load)) &&
+ (!exp->v.Call.kwargs || validate_expr(exp->v.Call.kwargs, Load));
+ case Num_kind: {
+ PyObject *n = exp->v.Num.n;
+ if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
+ !PyComplex_CheckExact(n)) {
+ PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
+ return 0;
+ }
+ return 1;
+ }
+ case Str_kind: {
+ PyObject *s = exp->v.Str.s;
+ if (!PyUnicode_CheckExact(s)) {
+ PyErr_SetString(PyExc_TypeError, "non-string type in Str");
+ return 0;
+ }
+ return 1;
+ }
+ case Bytes_kind: {
+ PyObject *b = exp->v.Bytes.s;
+ if (!PyBytes_CheckExact(b)) {
+ PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
+ return 0;
+ }
+ return 1;
+ }
+ case Attribute_kind:
+ return validate_expr(exp->v.Attribute.value, Load);
+ case Subscript_kind:
+ return validate_slice(exp->v.Subscript.slice) &&
+ validate_expr(exp->v.Subscript.value, Load);
+ case Starred_kind:
+ return validate_expr(exp->v.Starred.value, ctx);
+ case List_kind:
+ return validate_exprs(exp->v.List.elts, ctx, 0);
+ case Tuple_kind:
+ return validate_exprs(exp->v.Tuple.elts, ctx, 0);
+ /* These last cases don't have any checking. */
+ case Name_kind:
+ case Ellipsis_kind:
+ return 1;
+ default:
+ PyErr_SetString(PyExc_SystemError, "unexpected expression");
+ return 0;
+ }
+}
+
+static int
+validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
+{
+ if (asdl_seq_LEN(seq))
+ return 1;
+ PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
+ return 0;
+}
+
+static int
+validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
+{
+ return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
+ validate_exprs(targets, ctx, 0);
+}
+
+static int
+validate_body(asdl_seq *body, const char *owner)
+{
+ return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
+}
+
+static int
+validate_stmt(stmt_ty stmt)
+{
+ int i;
+ switch (stmt->kind) {
+ case FunctionDef_kind:
+ return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
+ validate_arguments(stmt->v.FunctionDef.args) &&
+ validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
+ (!stmt->v.FunctionDef.returns ||
+ validate_expr(stmt->v.FunctionDef.returns, Load));
+ case ClassDef_kind:
+ return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
+ validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
+ validate_keywords(stmt->v.ClassDef.keywords) &&
+ validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0) &&
+ (!stmt->v.ClassDef.starargs || validate_expr(stmt->v.ClassDef.starargs, Load)) &&
+ (!stmt->v.ClassDef.kwargs || validate_expr(stmt->v.ClassDef.kwargs, Load));
+ case Return_kind:
+ return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
+ case Delete_kind:
+ return validate_assignlist(stmt->v.Delete.targets, Del);
+ case Assign_kind:
+ return validate_assignlist(stmt->v.Assign.targets, Store) &&
+ validate_expr(stmt->v.Assign.value, Load);
+ case AugAssign_kind:
+ return validate_expr(stmt->v.AugAssign.target, Store) &&
+ validate_expr(stmt->v.AugAssign.value, Load);
+ case For_kind:
+ return validate_expr(stmt->v.For.target, Store) &&
+ validate_expr(stmt->v.For.iter, Load) &&
+ validate_body(stmt->v.For.body, "For") &&
+ validate_stmts(stmt->v.For.orelse);
+ case While_kind:
+ return validate_expr(stmt->v.While.test, Load) &&
+ validate_body(stmt->v.While.body, "While") &&
+ validate_stmts(stmt->v.While.orelse);
+ case If_kind:
+ return validate_expr(stmt->v.If.test, Load) &&
+ validate_body(stmt->v.If.body, "If") &&
+ validate_stmts(stmt->v.If.orelse);
+ case With_kind:
+ if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
+ return 0;
+ for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
+ withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
+ if (!validate_expr(item->context_expr, Load) ||
+ (item->optional_vars && !validate_expr(item->optional_vars, Store)))
+ return 0;
+ }
+ return validate_body(stmt->v.With.body, "With");
+ case Raise_kind:
+ if (stmt->v.Raise.exc) {
+ return validate_expr(stmt->v.Raise.exc, Load) &&
+ (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
+ }
+ if (stmt->v.Raise.cause) {
+ PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
+ return 0;
+ }
+ return 1;
+ case Try_kind:
+ if (!validate_body(stmt->v.Try.body, "Try"))
+ return 0;
+ if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
+ !asdl_seq_LEN(stmt->v.Try.finalbody)) {
+ PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
+ return 0;
+ }
+ if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
+ asdl_seq_LEN(stmt->v.Try.orelse)) {
+ PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
+ return 0;
+ }
+ for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
+ excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
+ if ((handler->v.ExceptHandler.type &&
+ !validate_expr(handler->v.ExceptHandler.type, Load)) ||
+ !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
+ return 0;
+ }
+ return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
+ validate_stmts(stmt->v.Try.finalbody)) &&
+ (!asdl_seq_LEN(stmt->v.Try.orelse) ||
+ validate_stmts(stmt->v.Try.orelse));
+ case Assert_kind:
+ return validate_expr(stmt->v.Assert.test, Load) &&
+ (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
+ case Import_kind:
+ return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
+ case ImportFrom_kind:
+ if (stmt->v.ImportFrom.level < -1) {
+ PyErr_SetString(PyExc_ValueError, "ImportFrom level less than -1");
+ return 0;
+ }
+ return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
+ case Global_kind:
+ return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
+ case Nonlocal_kind:
+ return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
+ case Expr_kind:
+ return validate_expr(stmt->v.Expr.value, Load);
+ case Pass_kind:
+ case Break_kind:
+ case Continue_kind:
+ return 1;
+ default:
+ PyErr_SetString(PyExc_SystemError, "unexpected statement");
+ return 0;
+ }
+}
+
+static int
+validate_stmts(asdl_seq *seq)
+{
+ int i;
+ for (i = 0; i < asdl_seq_LEN(seq); i++) {
+ stmt_ty stmt = asdl_seq_GET(seq, i);
+ if (stmt) {
+ if (!validate_stmt(stmt))
+ return 0;
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError,
+ "None disallowed in statement list");
+ return 0;
+ }
+ }
+ return 1;
+}
+
+static int
+validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
+{
+ int i;
+ for (i = 0; i < asdl_seq_LEN(exprs); i++) {
+ expr_ty expr = asdl_seq_GET(exprs, i);
+ if (expr) {
+ if (!validate_expr(expr, ctx))
+ return 0;
+ }
+ else if (!null_ok) {
+ PyErr_SetString(PyExc_ValueError,
+ "None disallowed in expression list");
+ return 0;
+ }
+
+ }
+ return 1;
+}
+
+int
+PyAST_Validate(mod_ty mod)
+{
+ int res = 0;
+
+ switch (mod->kind) {
+ case Module_kind:
+ res = validate_stmts(mod->v.Module.body);
+ break;
+ case Interactive_kind:
+ res = validate_stmts(mod->v.Interactive.body);
+ break;
+ case Expression_kind:
+ res = validate_expr(mod->v.Expression.body, Load);
+ break;
+ case Suite_kind:
+ PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
+ break;
+ default:
+ PyErr_SetString(PyExc_SystemError, "impossible module node");
+ res = 0;
+ break;
+ }
+ return res;
+}
+
+/* This is done here, so defines like "test" don't interfere with AST use above. */
+#include "grammar.h"
+#include "parsetok.h"
+#include "graminit.h"
+
/* Data structure used internally */
struct compiling {
char *c_encoding; /* source encoding */
PyArena *c_arena; /* arena for allocating memeory */
const char *c_filename; /* filename */
+ PyObject *c_normalize; /* Normalization function from unicodedata. */
+ PyObject *c_normalize_args; /* Normalization argument tuple. */
};
static asdl_seq *seq_for_testlist(struct compiling *, const node *);
@@ -38,127 +521,96 @@ static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
static PyObject *parsestrplus(struct compiling *, const node *n,
int *bytesmode);
-#ifndef LINENO
-#define LINENO(n) ((n)->n_lineno)
-#endif
-
#define COMP_GENEXP 0
#define COMP_LISTCOMP 1
#define COMP_SETCOMP 2
+static int
+init_normalization(struct compiling *c)
+{
+ PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
+ if (!m)
+ return 0;
+ c->c_normalize = PyObject_GetAttrString(m, "normalize");
+ Py_DECREF(m);
+ if (!c->c_normalize)
+ return 0;
+ c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
+ PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
+ if (!c->c_normalize_args) {
+ Py_CLEAR(c->c_normalize);
+ return 0;
+ }
+ return 1;
+}
+
static identifier
-new_identifier(const char *n, PyArena *arena)
+new_identifier(const char *n, struct compiling *c)
{
PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
- Py_UNICODE *u;
if (!id)
return NULL;
- u = PyUnicode_AS_UNICODE(id);
+ /* PyUnicode_DecodeUTF8 should always return a ready string. */
+ assert(PyUnicode_IS_READY(id));
/* Check whether there are non-ASCII characters in the
identifier; if so, normalize to NFKC. */
- for (; *u; u++) {
- if (*u >= 128) {
- PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
- PyObject *id2;
- if (!m)
- return NULL;
- id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id);
- Py_DECREF(m);
- if (!id2)
- return NULL;
+ if (!PyUnicode_IS_ASCII(id)) {
+ PyObject *id2;
+ if (!c->c_normalize && !init_normalization(c)) {
Py_DECREF(id);
- id = id2;
- break;
+ return NULL;
}
+ PyTuple_SET_ITEM(c->c_normalize_args, 1, id);
+ id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL);
+ Py_DECREF(id);
+ if (!id2)
+ return NULL;
+ id = id2;
}
PyUnicode_InternInPlace(&id);
- PyArena_AddPyObject(arena, id);
+ PyArena_AddPyObject(c->c_arena, id);
return id;
}
-#define NEW_IDENTIFIER(n) new_identifier(STR(n), c->c_arena)
-
-/* This routine provides an invalid object for the syntax error.
- The outermost routine must unpack this error and create the
- proper object. We do this so that we don't have to pass
- the filename to everything function.
-
- XXX Maybe we should just pass the filename...
-*/
+#define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
static int
-ast_error(const node *n, const char *errstr)
+ast_error(struct compiling *c, const node *n, const char *errmsg)
{
- PyObject *u = Py_BuildValue("zii", errstr, LINENO(n), n->n_col_offset), *save;
- if (!u)
- return 0;
- /*
- * Prevent the error from being chained. PyErr_SetObject will normalize the
- * exception in order to chain it. ast_error_finish, however, requires the
- * error not to be normalized.
- */
- save = PyThreadState_GET()->exc_value;
- PyThreadState_GET()->exc_value = NULL;
- PyErr_SetObject(PyExc_SyntaxError, u);
- PyThreadState_GET()->exc_value = save;
- Py_DECREF(u);
- return 0;
-}
-
-static void
-ast_error_finish(const char *filename)
-{
- PyObject *type, *value, *tback, *errstr, *offset, *loc, *tmp;
+ PyObject *value, *errstr, *loc, *tmp;
PyObject *filename_obj;
- long lineno;
-
- assert(PyErr_Occurred());
- if (!PyErr_ExceptionMatches(PyExc_SyntaxError))
- return;
-
- PyErr_Fetch(&type, &value, &tback);
- errstr = PyTuple_GetItem(value, 0);
- if (!errstr)
- return;
- Py_INCREF(errstr);
- lineno = PyLong_AsLong(PyTuple_GetItem(value, 1));
- if (lineno == -1) {
- Py_DECREF(errstr);
- return;
- }
- offset = PyTuple_GetItem(value, 2);
- if (!offset) {
- Py_DECREF(errstr);
- return;
- }
- Py_DECREF(value);
-
- loc = PyErr_ProgramText(filename, lineno);
+
+ loc = PyErr_ProgramText(c->c_filename, LINENO(n));
if (!loc) {
Py_INCREF(Py_None);
loc = Py_None;
}
- if (filename != NULL)
- filename_obj = PyUnicode_DecodeFSDefault(filename);
- else {
+ if (c->c_filename) {
+ filename_obj = PyUnicode_DecodeFSDefault(c->c_filename);
+ if (!filename_obj) {
+ Py_DECREF(loc);
+ return 0;
+ }
+ } else {
Py_INCREF(Py_None);
filename_obj = Py_None;
}
- if (filename_obj != NULL)
- tmp = Py_BuildValue("(NlOO)", filename_obj, lineno, offset, loc);
- else
- tmp = NULL;
- Py_DECREF(loc);
- if (!tmp) {
- Py_DECREF(errstr);
- return;
+ tmp = Py_BuildValue("(NiiN)", filename_obj, LINENO(n), n->n_col_offset, loc);
+ if (!tmp)
+ return 0;
+ errstr = PyUnicode_FromString(errmsg);
+ if (!errstr) {
+ Py_DECREF(tmp);
+ return 0;
}
value = PyTuple_Pack(2, errstr, tmp);
Py_DECREF(errstr);
Py_DECREF(tmp);
- if (!value)
- return;
- PyErr_Restore(type, value, tback);
+ if (value) {
+ PyErr_SetObject(PyExc_SyntaxError, value);
+ Py_DECREF(value);
+ }
+ return 0;
}
/* num_stmts() returns number of contained statements.
@@ -234,13 +686,17 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
stmt_ty s;
node *ch;
struct compiling c;
+ mod_ty res = NULL;
+ c.c_arena = arena;
+ c.c_filename = filename;
+ c.c_normalize = c.c_normalize_args = NULL;
if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
c.c_encoding = "utf-8";
if (TYPE(n) == encoding_decl) {
#if 0
- ast_error(n, "encoding declaration in Unicode string");
- goto error;
+ ast_error(c, n, "encoding declaration in Unicode string");
+ goto out;
#endif
n = CHILD(n, 0);
}
@@ -251,15 +707,13 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
/* PEP 3120 */
c.c_encoding = "utf-8";
}
- c.c_arena = arena;
- c.c_filename = filename;
k = 0;
switch (TYPE(n)) {
case file_input:
stmts = asdl_seq_new(num_stmts(n), arena);
if (!stmts)
- return NULL;
+ goto out;
for (i = 0; i < NCH(n) - 1; i++) {
ch = CHILD(n, i);
if (TYPE(ch) == NEWLINE)
@@ -269,7 +723,7 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
if (num == 1) {
s = ast_for_stmt(&c, ch);
if (!s)
- goto error;
+ goto out;
asdl_seq_SET(stmts, k++, s);
}
else {
@@ -278,42 +732,44 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
for (j = 0; j < num; j++) {
s = ast_for_stmt(&c, CHILD(ch, j * 2));
if (!s)
- goto error;
+ goto out;
asdl_seq_SET(stmts, k++, s);
}
}
}
- return Module(stmts, arena);
+ res = Module(stmts, arena);
+ break;
case eval_input: {
expr_ty testlist_ast;
/* XXX Why not comp_for here? */
testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
if (!testlist_ast)
- goto error;
- return Expression(testlist_ast, arena);
+ goto out;
+ res = Expression(testlist_ast, arena);
+ break;
}
case single_input:
if (TYPE(CHILD(n, 0)) == NEWLINE) {
stmts = asdl_seq_new(1, arena);
if (!stmts)
- goto error;
+ goto out;
asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
arena));
if (!asdl_seq_GET(stmts, 0))
- goto error;
- return Interactive(stmts, arena);
+ goto out;
+ res = Interactive(stmts, arena);
}
else {
n = CHILD(n, 0);
num = num_stmts(n);
stmts = asdl_seq_new(num, arena);
if (!stmts)
- goto error;
+ goto out;
if (num == 1) {
s = ast_for_stmt(&c, n);
if (!s)
- goto error;
+ goto out;
asdl_seq_SET(stmts, 0, s);
}
else {
@@ -324,21 +780,26 @@ PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename,
break;
s = ast_for_stmt(&c, CHILD(n, i));
if (!s)
- goto error;
+ goto out;
asdl_seq_SET(stmts, i / 2, s);
}
}
- return Interactive(stmts, arena);
+ res = Interactive(stmts, arena);
}
+ break;
default:
PyErr_Format(PyExc_SystemError,
"invalid node %d for PyAST_FromNode", TYPE(n));
- goto error;
+ goto out;
}
- error:
- ast_error_finish(filename);
- return NULL;
+ out:
+ if (c.c_normalize) {
+ Py_DECREF(c.c_normalize);
+ PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
+ Py_DECREF(c.c_normalize_args);
+ }
+ return res;
}
/* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
@@ -383,18 +844,18 @@ static const char* FORBIDDEN[] = {
};
static int
-forbidden_name(identifier name, const node *n, int full_checks)
+forbidden_name(struct compiling *c, identifier name, const node *n, int full_checks)
{
assert(PyUnicode_Check(name));
if (PyUnicode_CompareWithASCIIString(name, "__debug__") == 0) {
- ast_error(n, "assignment to keyword");
+ ast_error(c, n, "assignment to keyword");
return 1;
}
if (full_checks) {
const char **p;
for (p = FORBIDDEN; *p; p++) {
if (PyUnicode_CompareWithASCIIString(name, *p) == 0) {
- ast_error(n, "assignment to keyword");
+ ast_error(c, n, "assignment to keyword");
return 1;
}
}
@@ -430,7 +891,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
switch (e->kind) {
case Attribute_kind:
e->v.Attribute.ctx = ctx;
- if (ctx == Store && forbidden_name(e->v.Attribute.attr, n, 1))
+ if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
return 0;
break;
case Subscript_kind:
@@ -443,7 +904,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
break;
case Name_kind:
if (ctx == Store) {
- if (forbidden_name(e->v.Name.id, n, 1))
+ if (forbidden_name(c, e->v.Name.id, n, 1))
return 0; /* forbidden_name() calls ast_error() */
}
e->v.Name.ctx = ctx;
@@ -476,6 +937,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
expr_name = "generator expression";
break;
case Yield_kind:
+ case YieldFrom_kind:
expr_name = "yield expression";
break;
case ListComp_kind:
@@ -516,7 +978,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
"can't %s %s",
ctx == Store ? "assign to" : "delete",
expr_name);
- return ast_error(n, buf);
+ return ast_error(c, n, buf);
}
/* If the LHS is a list or tuple, we need to set the assignment
@@ -664,7 +1126,7 @@ ast_for_arg(struct compiling *c, const node *n)
name = NEW_IDENTIFIER(ch);
if (!name)
return NULL;
- if (forbidden_name(name, ch, 0))
+ if (forbidden_name(c, name, ch, 0))
return NULL;
if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
@@ -694,7 +1156,7 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,
int j = 0; /* index for kwdefaults and kwonlyargs */
if (kwonlyargs == NULL) {
- ast_error(CHILD(n, start), "named arguments must follow bare *");
+ ast_error(c, CHILD(n, start), "named arguments must follow bare *");
return -1;
}
assert(kwdefaults != NULL);
@@ -726,7 +1188,7 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,
argname = NEW_IDENTIFIER(ch);
if (!argname)
goto error;
- if (forbidden_name(argname, ch, 0))
+ if (forbidden_name(c, argname, ch, 0))
goto error;
arg = arg(argname, annotation, c->c_arena);
if (!arg)
@@ -737,7 +1199,7 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start,
case DOUBLESTAR:
return i;
default:
- ast_error(ch, "unexpected node");
+ ast_error(c, ch, "unexpected node");
goto error;
}
}
@@ -829,7 +1291,7 @@ ast_for_arguments(struct compiling *c, const node *n)
return NULL;
if (nposargs + nkwonlyargs > 255) {
- ast_error(n, "more than 255 arguments");
+ ast_error(c, n, "more than 255 arguments");
return NULL;
}
@@ -857,7 +1319,7 @@ ast_for_arguments(struct compiling *c, const node *n)
found_default = 1;
}
else if (found_default) {
- ast_error(n,
+ ast_error(c, n,
"non-default argument follows default argument");
return NULL;
}
@@ -869,7 +1331,7 @@ ast_for_arguments(struct compiling *c, const node *n)
break;
case STAR:
if (i+1 >= NCH(n)) {
- ast_error(CHILD(n, i),
+ ast_error(c, CHILD(n, i),
"named arguments must follow bare *");
return NULL;
}
@@ -886,7 +1348,7 @@ ast_for_arguments(struct compiling *c, const node *n)
vararg = NEW_IDENTIFIER(CHILD(ch, 0));
if (!vararg)
return NULL;
- if (forbidden_name(vararg, CHILD(ch, 0), 0))
+ if (forbidden_name(c, vararg, CHILD(ch, 0), 0))
return NULL;
if (NCH(ch) > 1) {
/* there is an annotation on the vararg */
@@ -917,7 +1379,7 @@ ast_for_arguments(struct compiling *c, const node *n)
if (!kwargannotation)
return NULL;
}
- if (forbidden_name(kwarg, CHILD(ch, 0), 0))
+ if (forbidden_name(c, kwarg, CHILD(ch, 0), 0))
return NULL;
i += 3;
break;
@@ -1036,7 +1498,7 @@ ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
name = NEW_IDENTIFIER(CHILD(n, name_i));
if (!name)
return NULL;
- if (forbidden_name(name, CHILD(n, name_i), 0))
+ if (forbidden_name(c, name, CHILD(n, name_i), 0))
return NULL;
args = ast_for_arguments(c, CHILD(n, name_i + 1));
if (!args)
@@ -1377,10 +1839,10 @@ ast_for_atom(struct compiling *c, const node *n)
char buf[128];
s = _PyUnicode_AsString(errstr);
PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);
- ast_error(n, buf);
+ ast_error(c, n, buf);
Py_DECREF(errstr);
} else {
- ast_error(n, "(unicode error) unknown error");
+ ast_error(c, n, "(unicode error) unknown error");
}
Py_DECREF(type);
Py_DECREF(value);
@@ -1897,12 +2359,25 @@ ast_for_expr(struct compiling *c, const node *n)
}
return ast_for_binop(c, n);
case yield_expr: {
+ node *an = NULL;
+ node *en = NULL;
+ int is_from = 0;
expr_ty exp = NULL;
- if (NCH(n) == 2) {
- exp = ast_for_testlist(c, CHILD(n, 1));
+ if (NCH(n) > 1)
+ an = CHILD(n, 1); /* yield_arg */
+ if (an) {
+ en = CHILD(an, NCH(an) - 1);
+ if (NCH(an) == 2) {
+ is_from = 1;
+ exp = ast_for_expr(c, en);
+ }
+ else
+ exp = ast_for_testlist(c, en);
if (!exp)
return NULL;
}
+ if (is_from)
+ return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
}
case factor:
@@ -1927,7 +2402,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
/*
arglist: (argument ',')* (argument [',']| '*' test [',' '**' test]
| '**' test)
- argument: [test '='] test [comp_for] # Really [keyword '='] test
+ argument: [test '='] (test) [comp_for] # Really [keyword '='] test
*/
int i, nargs, nkeywords, ngens;
@@ -1952,14 +2427,14 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
}
}
if (ngens > 1 || (ngens && (nargs || nkeywords))) {
- ast_error(n, "Generator expression must be parenthesized "
+ ast_error(c, n, "Generator expression must be parenthesized "
"if not sole argument");
return NULL;
}
if (nargs + nkeywords + ngens > 255) {
- ast_error(n, "more than 255 arguments");
- return NULL;
+ ast_error(c, n, "more than 255 arguments");
+ return NULL;
}
args = asdl_seq_new(nargs + ngens, c->c_arena);
@@ -1976,12 +2451,12 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
expr_ty e;
if (NCH(ch) == 1) {
if (nkeywords) {
- ast_error(CHILD(ch, 0),
+ ast_error(c, CHILD(ch, 0),
"non-keyword arg after keyword arg");
return NULL;
}
if (vararg) {
- ast_error(CHILD(ch, 0),
+ ast_error(c, CHILD(ch, 0),
"only named arguments may follow *expression");
return NULL;
}
@@ -2011,19 +2486,19 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
* then is very confusing.
*/
if (e->kind == Lambda_kind) {
- ast_error(CHILD(ch, 0), "lambda cannot contain assignment");
- return NULL;
+ ast_error(c, CHILD(ch, 0), "lambda cannot contain assignment");
+ return NULL;
} else if (e->kind != Name_kind) {
- ast_error(CHILD(ch, 0), "keyword can't be an expression");
- return NULL;
- } else if (forbidden_name(e->v.Name.id, ch, 1)) {
- return NULL;
+ ast_error(c, CHILD(ch, 0), "keyword can't be an expression");
+ return NULL;
+ } else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
+ return NULL;
}
key = e->v.Name.id;
for (k = 0; k < nkeywords; k++) {
tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
if (!PyUnicode_Compare(tmp, key)) {
- ast_error(CHILD(ch, 0), "keyword argument repeated");
+ ast_error(c, CHILD(ch, 0), "keyword argument repeated");
return NULL;
}
}
@@ -2116,7 +2591,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n)
case Subscript_kind:
break;
default:
- ast_error(ch, "illegal expression for augmented assignment");
+ ast_error(c, ch, "illegal expression for augmented assignment");
return NULL;
}
@@ -2149,7 +2624,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n)
expr_ty e;
node *ch = CHILD(n, i);
if (TYPE(ch) == yield_expr) {
- ast_error(ch, "assignment to yield expression not possible");
+ ast_error(c, ch, "assignment to yield expression not possible");
return NULL;
}
e = ast_for_testlist(c, ch);
@@ -2221,7 +2696,7 @@ ast_for_flow_stmt(struct compiling *c, const node *n)
continue_stmt: 'continue'
return_stmt: 'return' [testlist]
yield_stmt: yield_expr
- yield_expr: 'yield' testlist
+ yield_expr: 'yield' testlist | 'yield' 'from' test
raise_stmt: 'raise' [test [',' test [',' test]]]
*/
node *ch;
@@ -2296,11 +2771,11 @@ alias_for_import_name(struct compiling *c, const node *n, int store)
str = NEW_IDENTIFIER(str_node);
if (!str)
return NULL;
- if (store && forbidden_name(str, str_node, 0))
+ if (store && forbidden_name(c, str, str_node, 0))
return NULL;
}
else {
- if (forbidden_name(name, name_node, 0))
+ if (forbidden_name(c, name, name_node, 0))
return NULL;
}
return alias(name, str, c->c_arena);
@@ -2319,7 +2794,7 @@ alias_for_import_name(struct compiling *c, const node *n, int store)
a->asname = NEW_IDENTIFIER(asname_node);
if (!a->asname)
return NULL;
- if (forbidden_name(a->asname, asname_node, 0))
+ if (forbidden_name(c, a->asname, asname_node, 0))
return NULL;
return a;
}
@@ -2330,7 +2805,7 @@ alias_for_import_name(struct compiling *c, const node *n, int store)
name = NEW_IDENTIFIER(name_node);
if (!name)
return NULL;
- if (store && forbidden_name(name, name_node, 0))
+ if (store && forbidden_name(c, name, name_node, 0))
return NULL;
return alias(name, NULL, c->c_arena);
}
@@ -2459,13 +2934,13 @@ ast_for_import_stmt(struct compiling *c, const node *n)
n = CHILD(n, idx);
n_children = NCH(n);
if (n_children % 2 == 0) {
- ast_error(n, "trailing comma not allowed without"
+ ast_error(c, n, "trailing comma not allowed without"
" surrounding parentheses");
return NULL;
}
break;
default:
- ast_error(n, "Unexpected node-type in from-import");
+ ast_error(c, n, "Unexpected node-type in from-import");
return NULL;
}
@@ -2871,7 +3346,7 @@ ast_for_except_clause(struct compiling *c, const node *exc, node *body)
identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
if (!e)
return NULL;
- if (forbidden_name(e, CHILD(exc, 3), 0))
+ if (forbidden_name(c, e, CHILD(exc, 3), 0))
return NULL;
expression = ast_for_expr(c, CHILD(exc, 1));
if (!expression)
@@ -2895,7 +3370,7 @@ ast_for_try_stmt(struct compiling *c, const node *n)
{
const int nch = NCH(n);
int n_except = (nch - 3)/3;
- asdl_seq *body, *orelse = NULL, *finally = NULL;
+ asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
REQ(n, try_stmt);
@@ -2930,15 +3405,14 @@ ast_for_try_stmt(struct compiling *c, const node *n)
}
}
else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
- ast_error(n, "malformed 'try' statement");
+ ast_error(c, n, "malformed 'try' statement");
return NULL;
}
if (n_except > 0) {
int i;
- stmt_ty except_st;
/* process except statements to create a try ... except */
- asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena);
+ handlers = asdl_seq_new(n_except, c->c_arena);
if (handlers == NULL)
return NULL;
@@ -2949,28 +3423,15 @@ ast_for_try_stmt(struct compiling *c, const node *n)
return NULL;
asdl_seq_SET(handlers, i, e);
}
-
- except_st = TryExcept(body, handlers, orelse, LINENO(n),
- n->n_col_offset, c->c_arena);
- if (!finally)
- return except_st;
-
- /* if a 'finally' is present too, we nest the TryExcept within a
- TryFinally to emulate try ... except ... finally */
- body = asdl_seq_new(1, c->c_arena);
- if (body == NULL)
- return NULL;
- asdl_seq_SET(body, 0, except_st);
}
- /* must be a try ... finally (except clauses are in body, if any exist) */
- assert(finally != NULL);
- return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena);
+ assert(finally != NULL || asdl_seq_LEN(handlers));
+ return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
}
/* with_item: test ['as' expr] */
-static stmt_ty
-ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
+static withitem_ty
+ast_for_with_item(struct compiling *c, const node *n)
{
expr_ty context_expr, optional_vars = NULL;
@@ -2989,43 +3450,34 @@ ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)
}
}
- return With(context_expr, optional_vars, content, LINENO(n),
- n->n_col_offset, c->c_arena);
+ return withitem(context_expr, optional_vars, c->c_arena);
}
/* with_stmt: 'with' with_item (',' with_item)* ':' suite */
static stmt_ty
ast_for_with_stmt(struct compiling *c, const node *n)
{
- int i;
- stmt_ty ret;
- asdl_seq *inner;
+ int i, n_items;
+ asdl_seq *items, *body;
REQ(n, with_stmt);
- /* process the with items inside-out */
- i = NCH(n) - 1;
- /* the suite of the innermost with item is the suite of the with stmt */
- inner = ast_for_suite(c, CHILD(n, i));
- if (!inner)
+ n_items = (NCH(n) - 2) / 2;
+ items = asdl_seq_new(n_items, c->c_arena);
+ if (!items)
return NULL;
-
- for (;;) {
- i -= 2;
- ret = ast_for_with_item(c, CHILD(n, i), inner);
- if (!ret)
- return NULL;
- /* was this the last item? */
- if (i == 1)
- break;
- /* if not, wrap the result so far in a new sequence */
- inner = asdl_seq_new(1, c->c_arena);
- if (!inner)
+ for (i = 1; i < NCH(n) - 2; i += 2) {
+ withitem_ty item = ast_for_with_item(c, CHILD(n, i));
+ if (!item)
return NULL;
- asdl_seq_SET(inner, 0, ret);
+ asdl_seq_SET(items, (i - 1) / 2, item);
}
- return ret;
+ body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
+ if (!body)
+ return NULL;
+
+ return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
}
static stmt_ty
@@ -3045,7 +3497,7 @@ ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
classname = NEW_IDENTIFIER(CHILD(n, 1));
if (!classname)
return NULL;
- if (forbidden_name(classname, CHILD(n, 3), 0))
+ if (forbidden_name(c, classname, CHILD(n, 3), 0))
return NULL;
return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
LINENO(n), n->n_col_offset, c->c_arena);
@@ -3058,7 +3510,7 @@ ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
classname = NEW_IDENTIFIER(CHILD(n, 1));
if (!classname)
return NULL;
- if (forbidden_name(classname, CHILD(n, 3), 0))
+ if (forbidden_name(c, classname, CHILD(n, 3), 0))
return NULL;
return ClassDef(classname, NULL, NULL, NULL, NULL, s, decorator_seq,
LINENO(n), n->n_col_offset, c->c_arena);
@@ -3083,7 +3535,7 @@ ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
classname = NEW_IDENTIFIER(CHILD(n, 1));
if (!classname)
return NULL;
- if (forbidden_name(classname, CHILD(n, 1), 0))
+ if (forbidden_name(c, classname, CHILD(n, 1), 0))
return NULL;
return ClassDef(classname, call->v.Call.args, call->v.Call.keywords,
@@ -3209,20 +3661,14 @@ parsenumber(struct compiling *c, const char *s)
}
static PyObject *
-decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
+decode_utf8(struct compiling *c, const char **sPtr, const char *end)
{
- PyObject *u, *v;
char *s, *t;
t = s = (char *)*sPtr;
/* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
while (s < end && (*s & 0x80)) s++;
*sPtr = s;
- u = PyUnicode_DecodeUTF8(t, s - t, NULL);
- if (u == NULL)
- return NULL;
- v = PyUnicode_AsEncodedString(u, encoding, NULL);
- Py_DECREF(u);
- return v;
+ return PyUnicode_DecodeUTF8(t, s - t, NULL);
}
static PyObject *
@@ -3234,7 +3680,6 @@ decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, cons
const char *end;
if (encoding == NULL) {
- buf = (char *)s;
u = NULL;
} else {
/* check for integer overflow */
@@ -3257,22 +3702,20 @@ decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, cons
}
if (*s & 0x80) { /* XXX inefficient */
PyObject *w;
- char *r;
- Py_ssize_t rn, i;
- w = decode_utf8(c, &s, end, "utf-32-be");
+ int kind;
+ void *data;
+ Py_ssize_t len, i;
+ w = decode_utf8(c, &s, end);
if (w == NULL) {
Py_DECREF(u);
return NULL;
}
- r = PyBytes_AS_STRING(w);
- rn = Py_SIZE(w);
- assert(rn % 4 == 0);
- for (i = 0; i < rn; i += 4) {
- sprintf(p, "\\U%02x%02x%02x%02x",
- r[i + 0] & 0xFF,
- r[i + 1] & 0xFF,
- r[i + 2] & 0xFF,
- r[i + 3] & 0xFF);
+ kind = PyUnicode_KIND(w);
+ data = PyUnicode_DATA(w);
+ len = PyUnicode_GET_LENGTH(w);
+ for (i = 0; i < len; i++) {
+ Py_UCS4 chr = PyUnicode_READ(kind, data, i);
+ sprintf(p, "\\U%08x", chr);
p += 10;
}
/* Should be impossible to overflow */
@@ -3306,13 +3749,21 @@ parsestr(struct compiling *c, const node *n, int *bytesmode)
int rawmode = 0;
int need_encoding;
if (isalpha(quote)) {
- if (quote == 'b' || quote == 'B') {
- quote = *++s;
- *bytesmode = 1;
- }
- if (quote == 'r' || quote == 'R') {
- quote = *++s;
- rawmode = 1;
+ while (!*bytesmode || !rawmode) {
+ if (quote == 'b' || quote == 'B') {
+ quote = *++s;
+ *bytesmode = 1;
+ }
+ else if (quote == 'u' || quote == 'U') {
+ quote = *++s;
+ }
+ else if (quote == 'r' || quote == 'R') {
+ quote = *++s;
+ rawmode = 1;
+ }
+ else {
+ break;
+ }
}
}
if (quote != '\'' && quote != '\"') {
@@ -3343,10 +3794,10 @@ parsestr(struct compiling *c, const node *n, int *bytesmode)
}
if (*bytesmode) {
/* Disallow non-ascii characters (but not escapes) */
- const char *c;
- for (c = s; *c; c++) {
- if (Py_CHARMASK(*c) >= 0x80) {
- ast_error(n, "bytes can only contain ASCII "
+ const char *ch;
+ for (ch = s; *ch; ch++) {
+ if (Py_CHARMASK(*ch) >= 0x80) {
+ ast_error(c, n, "bytes can only contain ASCII "
"literal characters.");
return NULL;
}
@@ -3394,7 +3845,7 @@ parsestrplus(struct compiling *c, const node *n, int *bytesmode)
if (s == NULL)
goto onError;
if (*bytesmode != subbm) {
- ast_error(n, "cannot mix bytes and nonbytes literals");
+ ast_error(c, n, "cannot mix bytes and nonbytes literals");
Py_DECREF(s);
goto onError;
}
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index b85e37b..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);
@@ -793,7 +805,6 @@ builtin_exec(PyObject *self, PyObject *args)
{
PyObject *v;
PyObject *prog, *globals = Py_None, *locals = Py_None;
- int plain = 0;
if (!PyArg_UnpackTuple(args, "exec", 1, 3, &prog, &globals, &locals))
return NULL;
@@ -802,7 +813,6 @@ builtin_exec(PyObject *self, PyObject *args)
globals = PyEval_GetGlobals();
if (locals == Py_None) {
locals = PyEval_GetLocals();
- plain = 1;
}
if (!globals || !locals) {
PyErr_SetString(PyExc_SystemError,
@@ -1058,6 +1068,31 @@ map_next(mapobject *lz)
return result;
}
+static PyObject *
+map_reduce(mapobject *lz)
+{
+ Py_ssize_t numargs = PyTuple_GET_SIZE(lz->iters);
+ PyObject *args = PyTuple_New(numargs+1);
+ Py_ssize_t i;
+ if (args == NULL)
+ return NULL;
+ Py_INCREF(lz->func);
+ PyTuple_SET_ITEM(args, 0, lz->func);
+ for (i = 0; i<numargs; i++){
+ PyObject *it = PyTuple_GET_ITEM(lz->iters, i);
+ Py_INCREF(it);
+ PyTuple_SET_ITEM(args, i+1, it);
+ }
+
+ return Py_BuildValue("ON", Py_TYPE(lz), args);
+}
+
+static PyMethodDef map_methods[] = {
+ {"__reduce__", (PyCFunction)map_reduce, METH_NOARGS, reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
+
PyDoc_STRVAR(map_doc,
"map(func, *iterables) --> map object\n\
\n\
@@ -1094,7 +1129,7 @@ PyTypeObject PyMap_Type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)map_next, /* tp_iternext */
- 0, /* tp_methods */
+ map_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
@@ -1118,7 +1153,7 @@ builtin_next(PyObject *self, PyObject *args)
return NULL;
if (!PyIter_Check(it)) {
PyErr_Format(PyExc_TypeError,
- "%.200s object is not an iterator",
+ "'%.200s' object is not an iterator",
it->ob_type->tp_name);
return NULL;
}
@@ -1424,24 +1459,13 @@ builtin_ord(PyObject *self, PyObject* obj)
}
}
else if (PyUnicode_Check(obj)) {
- size = PyUnicode_GET_SIZE(obj);
+ if (PyUnicode_READY(obj) == -1)
+ return NULL;
+ size = PyUnicode_GET_LENGTH(obj);
if (size == 1) {
- ord = (long)*PyUnicode_AS_UNICODE(obj);
+ ord = (long)PyUnicode_READ_CHAR(obj, 0);
return PyLong_FromLong(ord);
}
-#ifndef Py_UNICODE_WIDE
- if (size == 2) {
- /* Decode a valid surrogate pair */
- int c0 = PyUnicode_AS_UNICODE(obj)[0];
- int c1 = PyUnicode_AS_UNICODE(obj)[1];
- if (0xD800 <= c0 && c0 <= 0xDBFF &&
- 0xDC00 <= c1 && c1 <= 0xDFFF) {
- ord = ((((c0 & 0x03FF) << 10) | (c1 & 0x03FF)) +
- 0x00010000);
- return PyLong_FromLong(ord);
- }
- }
-#endif
}
else if (PyByteArray_Check(obj)) {
/* XXX Hopefully this is temporary */
@@ -1469,13 +1493,7 @@ PyDoc_VAR(ord_doc) = PyDoc_STR(
"ord(c) -> integer\n\
\n\
Return the integer ordinal of a one-character string."
-)
-#ifndef Py_UNICODE_WIDE
-PyDoc_STR(
-"\nA valid surrogate pair is also accepted."
-)
-#endif
-;
+);
static PyObject *
@@ -1499,15 +1517,15 @@ equivalent to (x**y) % z, but may be more efficient (e.g. for longs).");
static PyObject *
builtin_print(PyObject *self, PyObject *args, PyObject *kwds)
{
- static char *kwlist[] = {"sep", "end", "file", 0};
+ static char *kwlist[] = {"sep", "end", "file", "flush", 0};
static PyObject *dummy_args;
- PyObject *sep = NULL, *end = NULL, *file = NULL;
+ PyObject *sep = NULL, *end = NULL, *file = NULL, *flush = NULL;
int i, err;
if (dummy_args == NULL && !(dummy_args = PyTuple_New(0)))
- return NULL;
- if (!PyArg_ParseTupleAndKeywords(dummy_args, kwds, "|OOO:print",
- kwlist, &sep, &end, &file))
+ return NULL;
+ if (!PyArg_ParseTupleAndKeywords(dummy_args, kwds, "|OOOO:print",
+ kwlist, &sep, &end, &file, &flush))
return NULL;
if (file == NULL || file == Py_None) {
file = PySys_GetObject("stdout");
@@ -1558,17 +1576,32 @@ builtin_print(PyObject *self, PyObject *args, PyObject *kwds)
if (err)
return NULL;
+ if (flush != NULL) {
+ PyObject *tmp;
+ int do_flush = PyObject_IsTrue(flush);
+ if (do_flush == -1)
+ return NULL;
+ else if (do_flush) {
+ tmp = PyObject_CallMethod(file, "flush", "");
+ if (tmp == NULL)
+ return NULL;
+ else
+ Py_DECREF(tmp);
+ }
+ }
+
Py_RETURN_NONE;
}
PyDoc_STRVAR(print_doc,
-"print(value, ..., sep=' ', end='\\n', file=sys.stdout)\n\
+"print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n\
\n\
Prints the values to a stream, or to sys.stdout by default.\n\
Optional keyword arguments:\n\
-file: a file-like object (stream); defaults to the current sys.stdout.\n\
-sep: string inserted between values, default a space.\n\
-end: string appended after the last value, default a newline.");
+file: a file-like object (stream); defaults to the current sys.stdout.\n\
+sep: string inserted between values, default a space.\n\
+end: string appended after the last value, default a newline.\n\
+flush: whether to forcibly flush the stream.");
static PyObject *
@@ -1604,7 +1637,7 @@ builtin_input(PyObject *self, PyObject *args)
}
/* First of all, flush stderr */
- tmp = PyObject_CallMethod(ferr, "flush", "");
+ tmp = _PyObject_CallMethodId(ferr, &PyId_flush, "");
if (tmp == NULL)
PyErr_Clear();
else
@@ -1613,7 +1646,7 @@ builtin_input(PyObject *self, PyObject *args)
/* We should only use (GNU) readline if Python's sys.stdin and
sys.stdout are the same as C's stdin and stdout, because we
need to pass it those. */
- tmp = PyObject_CallMethod(fin, "fileno", "");
+ tmp = _PyObject_CallMethodId(fin, &PyId_fileno, "");
if (tmp == NULL) {
PyErr_Clear();
tty = 0;
@@ -1626,7 +1659,7 @@ builtin_input(PyObject *self, PyObject *args)
tty = fd == fileno(stdin) && isatty(fd);
}
if (tty) {
- tmp = PyObject_CallMethod(fout, "fileno", "");
+ tmp = _PyObject_CallMethodId(fout, &PyId_fileno, "");
if (tmp == NULL)
PyErr_Clear();
else {
@@ -1648,9 +1681,11 @@ builtin_input(PyObject *self, PyObject *args)
char *stdin_encoding_str, *stdin_errors_str;
PyObject *result;
size_t len;
+ _Py_IDENTIFIER(encoding);
+ _Py_IDENTIFIER(errors);
- stdin_encoding = PyObject_GetAttrString(fin, "encoding");
- stdin_errors = PyObject_GetAttrString(fin, "errors");
+ stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding);
+ stdin_errors = _PyObject_GetAttrId(fin, &PyId_errors);
if (!stdin_encoding || !stdin_errors)
/* stdin is a text stream, so it must have an
encoding. */
@@ -1659,7 +1694,7 @@ builtin_input(PyObject *self, PyObject *args)
stdin_errors_str = _PyUnicode_AsString(stdin_errors);
if (!stdin_encoding_str || !stdin_errors_str)
goto _readline_errors;
- tmp = PyObject_CallMethod(fout, "flush", "");
+ tmp = _PyObject_CallMethodId(fout, &PyId_flush, "");
if (tmp == NULL)
PyErr_Clear();
else
@@ -1668,8 +1703,8 @@ builtin_input(PyObject *self, PyObject *args)
/* We have a prompt, encode it as stdout would */
char *stdout_encoding_str, *stdout_errors_str;
PyObject *stringpo;
- stdout_encoding = PyObject_GetAttrString(fout, "encoding");
- stdout_errors = PyObject_GetAttrString(fout, "errors");
+ stdout_encoding = _PyObject_GetAttrId(fout, &PyId_encoding);
+ stdout_errors = _PyObject_GetAttrId(fout, &PyId_errors);
if (!stdout_encoding || !stdout_errors)
goto _readline_errors;
stdout_encoding_str = _PyUnicode_AsString(stdout_encoding);
@@ -1739,7 +1774,7 @@ builtin_input(PyObject *self, PyObject *args)
if (PyFile_WriteObject(promptarg, fout, Py_PRINT_RAW) != 0)
return NULL;
}
- tmp = PyObject_CallMethod(fout, "flush", "");
+ tmp = _PyObject_CallMethodId(fout, &PyId_flush, "");
if (tmp == NULL)
PyErr_Clear();
else
@@ -1821,6 +1856,7 @@ builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds)
PyObject *callable;
static char *kwlist[] = {"iterable", "key", "reverse", 0};
int reverse;
+ _Py_IDENTIFIER(sort);
/* args 1-3 should match listsort in Objects/listobject.c */
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oi:sorted",
@@ -1831,7 +1867,7 @@ builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds)
if (newlist == NULL)
return NULL;
- callable = PyObject_GetAttrString(newlist, "sort");
+ callable = _PyObject_GetAttrId(newlist, &PyId_sort);
if (callable == NULL) {
Py_DECREF(newlist);
return NULL;
@@ -1877,7 +1913,8 @@ builtin_vars(PyObject *self, PyObject *args)
Py_INCREF(d);
}
else {
- d = PyObject_GetAttrString(v, "__dict__");
+ _Py_IDENTIFIER(__dict__);
+ d = _PyObject_GetAttrId(v, &PyId___dict__);
if (d == NULL) {
PyErr_SetString(PyExc_TypeError,
"vars() argument must have __dict__ attribute");
@@ -1921,12 +1958,18 @@ builtin_sum(PyObject *self, PyObject *args)
Py_DECREF(iter);
return NULL;
}
- if (PyByteArray_Check(result)) {
+ if (PyBytes_Check(result)) {
PyErr_SetString(PyExc_TypeError,
"sum() can't sum bytes [use b''.join(seq) instead]");
Py_DECREF(iter);
return NULL;
}
+ if (PyByteArray_Check(result)) {
+ PyErr_SetString(PyExc_TypeError,
+ "sum() can't sum bytearray [use b''.join(seq) instead]");
+ Py_DECREF(iter);
+ return NULL;
+ }
Py_INCREF(result);
}
@@ -2229,6 +2272,18 @@ zip_next(zipobject *lz)
return result;
}
+static PyObject *
+zip_reduce(zipobject *lz)
+{
+ /* Just recreate the zip with the internal iterator tuple */
+ return Py_BuildValue("OO", Py_TYPE(lz), lz->ittuple);
+}
+
+static PyMethodDef zip_methods[] = {
+ {"__reduce__", (PyCFunction)zip_reduce, METH_NOARGS, reduce_doc},
+ {NULL, NULL} /* sentinel */
+};
+
PyDoc_STRVAR(zip_doc,
"zip(iter1 [,iter2 [...]]) --> zip object\n\
\n\
@@ -2267,7 +2322,7 @@ PyTypeObject PyZip_Type = {
0, /* tp_weaklistoffset */
PyObject_SelfIter, /* tp_iter */
(iternextfunc)zip_next, /* tp_iternext */
- 0, /* tp_methods */
+ zip_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
diff --git a/Python/ceval.c b/Python/ceval.c
index 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 c7f4a9c..797a45f 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -11,6 +11,8 @@ Copyright (c) Corporation for National Research Initiatives.
#include "Python.h"
#include <ctype.h>
+const char *Py_hexdigits = "0123456789abcdef";
+
/* --- Codec Registry ----------------------------------------------------- */
/* Import the standard encodings package which will register the first
@@ -465,9 +467,11 @@ PyObject *PyCodec_LookupError(const char *name)
static void wrong_exception_type(PyObject *exc)
{
- PyObject *type = PyObject_GetAttrString(exc, "__class__");
+ _Py_IDENTIFIER(__class__);
+ _Py_IDENTIFIER(__name__);
+ PyObject *type = _PyObject_GetAttrId(exc, &PyId___class__);
if (type != NULL) {
- PyObject *name = PyObject_GetAttrString(type, "__name__");
+ PyObject *name = _PyObject_GetAttrId(type, &PyId___name__);
Py_DECREF(type);
if (name != NULL) {
PyErr_Format(PyExc_TypeError,
@@ -506,57 +510,58 @@ PyObject *PyCodec_IgnoreErrors(PyObject *exc)
wrong_exception_type(exc);
return NULL;
}
- /* ouch: passing NULL, 0, pos gives None instead of u'' */
- return Py_BuildValue("(u#n)", &end, 0, end);
+ return Py_BuildValue("(Nn)", PyUnicode_New(0, 0), end);
}
PyObject *PyCodec_ReplaceErrors(PyObject *exc)
{
- PyObject *restuple;
- Py_ssize_t start;
- Py_ssize_t end;
- Py_ssize_t i;
+ Py_ssize_t start, end, i, len;
if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
PyObject *res;
- Py_UNICODE *p;
+ int kind;
+ void *data;
if (PyUnicodeEncodeError_GetStart(exc, &start))
return NULL;
if (PyUnicodeEncodeError_GetEnd(exc, &end))
return NULL;
- res = PyUnicode_FromUnicode(NULL, end-start);
+ len = end - start;
+ res = PyUnicode_New(len, '?');
if (res == NULL)
return NULL;
- for (p = PyUnicode_AS_UNICODE(res), i = start;
- i<end; ++p, ++i)
- *p = '?';
- restuple = Py_BuildValue("(On)", res, end);
- Py_DECREF(res);
- return restuple;
+ kind = PyUnicode_KIND(res);
+ data = PyUnicode_DATA(res);
+ for (i = 0; i < len; ++i)
+ PyUnicode_WRITE(kind, data, i, '?');
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ return Py_BuildValue("(Nn)", res, end);
}
else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) {
- Py_UNICODE res = Py_UNICODE_REPLACEMENT_CHARACTER;
if (PyUnicodeDecodeError_GetEnd(exc, &end))
return NULL;
- return Py_BuildValue("(u#n)", &res, 1, end);
+ return Py_BuildValue("(Cn)",
+ (int)Py_UNICODE_REPLACEMENT_CHARACTER,
+ end);
}
else if (PyObject_IsInstance(exc, PyExc_UnicodeTranslateError)) {
PyObject *res;
- Py_UNICODE *p;
+ int kind;
+ void *data;
if (PyUnicodeTranslateError_GetStart(exc, &start))
return NULL;
if (PyUnicodeTranslateError_GetEnd(exc, &end))
return NULL;
- res = PyUnicode_FromUnicode(NULL, end-start);
+ len = end - start;
+ res = PyUnicode_New(len, Py_UNICODE_REPLACEMENT_CHARACTER);
if (res == NULL)
return NULL;
- for (p = PyUnicode_AS_UNICODE(res), i = start;
- i<end; ++p, ++i)
- *p = Py_UNICODE_REPLACEMENT_CHARACTER;
- restuple = Py_BuildValue("(On)", res, end);
- Py_DECREF(res);
- return restuple;
+ kind = PyUnicode_KIND(res);
+ data = PyUnicode_DATA(res);
+ for (i=0; i < len; i++)
+ PyUnicode_WRITE(kind, data, i, Py_UNICODE_REPLACEMENT_CHARACTER);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ return Py_BuildValue("(Nn)", res, end);
}
else {
wrong_exception_type(exc);
@@ -569,82 +574,72 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
PyObject *restuple;
PyObject *object;
+ Py_ssize_t i;
Py_ssize_t start;
Py_ssize_t end;
PyObject *res;
- Py_UNICODE *p;
- Py_UNICODE *startp;
- Py_UNICODE *outp;
+ unsigned char *outp;
int ressize;
+ Py_UCS4 ch;
if (PyUnicodeEncodeError_GetStart(exc, &start))
return NULL;
if (PyUnicodeEncodeError_GetEnd(exc, &end))
return NULL;
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
return NULL;
- startp = PyUnicode_AS_UNICODE(object);
- for (p = startp+start, ressize = 0; p < startp+end; ++p) {
- if (*p<10)
+ for (i = start, ressize = 0; i < end; ++i) {
+ /* object is guaranteed to be "ready" */
+ ch = PyUnicode_READ_CHAR(object, i);
+ if (ch<10)
ressize += 2+1+1;
- else if (*p<100)
+ else if (ch<100)
ressize += 2+2+1;
- else if (*p<1000)
+ else if (ch<1000)
ressize += 2+3+1;
- else if (*p<10000)
+ else if (ch<10000)
ressize += 2+4+1;
-#ifndef Py_UNICODE_WIDE
- else
+ else if (ch<100000)
ressize += 2+5+1;
-#else
- else if (*p<100000)
- ressize += 2+5+1;
- else if (*p<1000000)
+ else if (ch<1000000)
ressize += 2+6+1;
else
ressize += 2+7+1;
-#endif
}
/* allocate replacement */
- res = PyUnicode_FromUnicode(NULL, ressize);
+ res = PyUnicode_New(ressize, 127);
if (res == NULL) {
Py_DECREF(object);
return NULL;
}
+ outp = PyUnicode_1BYTE_DATA(res);
/* generate replacement */
- for (p = startp+start, outp = PyUnicode_AS_UNICODE(res);
- p < startp+end; ++p) {
- Py_UNICODE c = *p;
+ for (i = start; i < end; ++i) {
int digits;
int base;
+ ch = PyUnicode_READ_CHAR(object, i);
*outp++ = '&';
*outp++ = '#';
- if (*p<10) {
+ if (ch<10) {
digits = 1;
base = 1;
}
- else if (*p<100) {
+ else if (ch<100) {
digits = 2;
base = 10;
}
- else if (*p<1000) {
+ else if (ch<1000) {
digits = 3;
base = 100;
}
- else if (*p<10000) {
+ else if (ch<10000) {
digits = 4;
base = 1000;
}
-#ifndef Py_UNICODE_WIDE
- else {
+ else if (ch<100000) {
digits = 5;
base = 10000;
}
-#else
- else if (*p<100000) {
- digits = 5;
- base = 10000;
- }
- else if (*p<1000000) {
+ else if (ch<1000000) {
digits = 6;
base = 100000;
}
@@ -652,16 +647,15 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
digits = 7;
base = 1000000;
}
-#endif
while (digits-->0) {
- *outp++ = '0' + c/base;
- c %= base;
+ *outp++ = '0' + ch/base;
+ ch %= base;
base /= 10;
}
*outp++ = ';';
}
- restuple = Py_BuildValue("(On)", res, end);
- Py_DECREF(res);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ restuple = Py_BuildValue("(Nn)", res, end);
Py_DECREF(object);
return restuple;
}
@@ -671,87 +665,65 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
}
}
-static Py_UNICODE hexdigits[] = {
- '0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
-};
-
PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)
{
-#ifndef Py_UNICODE_WIDE
-#define IS_SURROGATE_PAIR(p, end) \
- (*p >= 0xD800 && *p <= 0xDBFF && (p + 1) < end && \
- *(p + 1) >= 0xDC00 && *(p + 1) <= 0xDFFF)
-#else
-#define IS_SURROGATE_PAIR(p, end) 0
-#endif
if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
PyObject *restuple;
PyObject *object;
+ Py_ssize_t i;
Py_ssize_t start;
Py_ssize_t end;
PyObject *res;
- Py_UNICODE *p;
- Py_UNICODE *startp;
- Py_UNICODE *outp;
+ unsigned char *outp;
int ressize;
+ Py_UCS4 c;
if (PyUnicodeEncodeError_GetStart(exc, &start))
return NULL;
if (PyUnicodeEncodeError_GetEnd(exc, &end))
return NULL;
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
return NULL;
- startp = PyUnicode_AS_UNICODE(object);
- for (p = startp+start, ressize = 0; p < startp+end; ++p) {
-#ifdef Py_UNICODE_WIDE
- if (*p >= 0x00010000)
+ for (i = start, ressize = 0; i < end; ++i) {
+ /* object is guaranteed to be "ready" */
+ c = PyUnicode_READ_CHAR(object, i);
+ if (c >= 0x10000) {
ressize += 1+1+8;
- else
-#endif
- if (*p >= 0x100) {
- if (IS_SURROGATE_PAIR(p, startp+end)) {
- ressize += 1+1+8;
- ++p;
- }
- else
- ressize += 1+1+4;
+ }
+ else if (c >= 0x100) {
+ ressize += 1+1+4;
}
else
ressize += 1+1+2;
}
- res = PyUnicode_FromUnicode(NULL, ressize);
+ res = PyUnicode_New(ressize, 127);
if (res==NULL)
return NULL;
- for (p = startp+start, outp = PyUnicode_AS_UNICODE(res);
- p < startp+end; ++p) {
- Py_UCS4 c = (Py_UCS4) *p;
+ for (i = start, outp = PyUnicode_1BYTE_DATA(res);
+ i < end; ++i) {
+ c = PyUnicode_READ_CHAR(object, i);
*outp++ = '\\';
- if (IS_SURROGATE_PAIR(p, startp+end)) {
- c = ((*p & 0x3FF) << 10) + (*(p + 1) & 0x3FF) + 0x10000;
- ++p;
- }
if (c >= 0x00010000) {
*outp++ = 'U';
- *outp++ = hexdigits[(c>>28)&0xf];
- *outp++ = hexdigits[(c>>24)&0xf];
- *outp++ = hexdigits[(c>>20)&0xf];
- *outp++ = hexdigits[(c>>16)&0xf];
- *outp++ = hexdigits[(c>>12)&0xf];
- *outp++ = hexdigits[(c>>8)&0xf];
+ *outp++ = Py_hexdigits[(c>>28)&0xf];
+ *outp++ = Py_hexdigits[(c>>24)&0xf];
+ *outp++ = Py_hexdigits[(c>>20)&0xf];
+ *outp++ = Py_hexdigits[(c>>16)&0xf];
+ *outp++ = Py_hexdigits[(c>>12)&0xf];
+ *outp++ = Py_hexdigits[(c>>8)&0xf];
}
else if (c >= 0x100) {
*outp++ = 'u';
- *outp++ = hexdigits[(c>>12)&0xf];
- *outp++ = hexdigits[(c>>8)&0xf];
+ *outp++ = Py_hexdigits[(c>>12)&0xf];
+ *outp++ = Py_hexdigits[(c>>8)&0xf];
}
else
*outp++ = 'x';
- *outp++ = hexdigits[(c>>4)&0xf];
- *outp++ = hexdigits[c&0xf];
+ *outp++ = Py_hexdigits[(c>>4)&0xf];
+ *outp++ = Py_hexdigits[c&0xf];
}
- restuple = Py_BuildValue("(On)", res, end);
- Py_DECREF(res);
+ assert(_PyUnicode_CheckConsistency(res, 1));
+ restuple = Py_BuildValue("(Nn)", res, end);
Py_DECREF(object);
return restuple;
}
@@ -759,7 +731,6 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)
wrong_exception_type(exc);
return NULL;
}
-#undef IS_SURROGATE_PAIR
}
/* This handler is declared static until someone demonstrates
@@ -769,12 +740,11 @@ PyCodec_SurrogatePassErrors(PyObject *exc)
{
PyObject *restuple;
PyObject *object;
+ Py_ssize_t i;
Py_ssize_t start;
Py_ssize_t end;
PyObject *res;
if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
- Py_UNICODE *p;
- Py_UNICODE *startp;
char *outp;
if (PyUnicodeEncodeError_GetStart(exc, &start))
return NULL;
@@ -782,15 +752,15 @@ PyCodec_SurrogatePassErrors(PyObject *exc)
return NULL;
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
return NULL;
- startp = PyUnicode_AS_UNICODE(object);
res = PyBytes_FromStringAndSize(NULL, 3*(end-start));
if (!res) {
Py_DECREF(object);
return NULL;
}
outp = PyBytes_AsString(res);
- for (p = startp+start; p < startp+end; p++) {
- Py_UNICODE ch = *p;
+ for (i = start; i < end; i++) {
+ /* object is guaranteed to be "ready" */
+ Py_UCS4 ch = PyUnicode_READ_CHAR(object, i);
if (ch < 0xd800 || ch > 0xdfff) {
/* Not a surrogate, fail with original exception */
PyErr_SetObject(PyExceptionInstance_Class(exc), exc);
@@ -809,7 +779,7 @@ PyCodec_SurrogatePassErrors(PyObject *exc)
}
else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) {
unsigned char *p;
- Py_UNICODE ch = 0;
+ Py_UCS4 ch = 0;
if (PyUnicodeDecodeError_GetStart(exc, &start))
return NULL;
if (!(object = PyUnicodeDecodeError_GetObject(exc)))
@@ -835,7 +805,10 @@ PyCodec_SurrogatePassErrors(PyObject *exc)
PyErr_SetObject(PyExceptionInstance_Class(exc), exc);
return NULL;
}
- return Py_BuildValue("(u#n)", &ch, 1, start+3);
+ res = PyUnicode_FromOrdinal(ch);
+ if (res == NULL)
+ return NULL;
+ return Py_BuildValue("(Nn)", res, start+3);
}
else {
wrong_exception_type(exc);
@@ -848,12 +821,11 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)
{
PyObject *restuple;
PyObject *object;
+ Py_ssize_t i;
Py_ssize_t start;
Py_ssize_t end;
PyObject *res;
if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
- Py_UNICODE *p;
- Py_UNICODE *startp;
char *outp;
if (PyUnicodeEncodeError_GetStart(exc, &start))
return NULL;
@@ -861,15 +833,15 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)
return NULL;
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
return NULL;
- startp = PyUnicode_AS_UNICODE(object);
res = PyBytes_FromStringAndSize(NULL, end-start);
if (!res) {
Py_DECREF(object);
return NULL;
}
outp = PyBytes_AsString(res);
- for (p = startp+start; p < startp+end; p++) {
- Py_UNICODE ch = *p;
+ for (i = start; i < end; i++) {
+ /* object is guaranteed to be "ready" */
+ Py_UCS4 ch = PyUnicode_READ_CHAR(object, i);
if (ch < 0xdc80 || ch > 0xdcff) {
/* Not a UTF-8b surrogate, fail with original exception */
PyErr_SetObject(PyExceptionInstance_Class(exc), exc);
@@ -885,8 +857,9 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)
return restuple;
}
else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) {
+ PyObject *str;
unsigned char *p;
- Py_UNICODE ch[4]; /* decode up to 4 bad bytes. */
+ Py_UCS2 ch[4]; /* decode up to 4 bad bytes. */
int consumed = 0;
if (PyUnicodeDecodeError_GetStart(exc, &start))
return NULL;
@@ -911,7 +884,10 @@ PyCodec_SurrogateEscapeErrors(PyObject *exc)
PyErr_SetObject(PyExceptionInstance_Class(exc), exc);
return NULL;
}
- return Py_BuildValue("(u#n)", ch, consumed, start+consumed);
+ str = PyUnicode_FromKindAndData(PyUnicode_2BYTE_KIND, ch, consumed);
+ if (str == NULL)
+ return NULL;
+ return Py_BuildValue("(Nn)", str, start+consumed);
}
else {
wrong_exception_type(exc);
@@ -1048,7 +1024,7 @@ static int _PyCodecRegistry_Init(void)
interp->codec_error_registry = PyDict_New();
if (interp->codec_error_registry) {
- for (i = 0; i < sizeof(methods)/sizeof(methods[0]); ++i) {
+ for (i = 0; i < Py_ARRAY_LENGTH(methods); ++i) {
PyObject *func = PyCFunction_New(&methods[i].def, NULL);
int res;
if (!func)
diff --git a/Python/compile.c b/Python/compile.c
index d6f640f..ff55220 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -90,6 +90,13 @@ struct fblockinfo {
basicblock *fb_block;
};
+enum {
+ COMPILER_SCOPE_MODULE,
+ COMPILER_SCOPE_CLASS,
+ COMPILER_SCOPE_FUNCTION,
+ COMPILER_SCOPE_COMPREHENSION,
+};
+
/* The following items change on entry and exit of code blocks.
They must be saved and restored when returning to a block.
*/
@@ -97,6 +104,9 @@ struct compiler_unit {
PySTEntryObject *u_ste;
PyObject *u_name;
+ PyObject *u_qualname; /* dot-separated qualified name (lazy) */
+ int u_scope_type;
+
/* The following fields are dicts that map objects to
the index of them in co_XXX. The index is used as
the argument for opcodes that refer to those collections.
@@ -135,6 +145,7 @@ managed by compiler_enter_scope() and compiler_exit_scope().
struct compiler {
const char *c_filename;
+ PyObject *c_filename_obj;
struct symtable *c_st;
PyFutureFeatures *c_future; /* pointer to module's __future__ */
PyCompilerFlags *c_flags;
@@ -148,7 +159,7 @@ struct compiler {
PyArena *c_arena; /* pointer to memory allocation arena */
};
-static int compiler_enter_scope(struct compiler *, identifier, void *, int);
+static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
static void compiler_free(struct compiler *);
static basicblock *compiler_new_block(struct compiler *);
static int compiler_next_instr(struct compiler *, basicblock *);
@@ -178,12 +189,13 @@ static int compiler_in_loop(struct compiler *);
static int inplace_binop(struct compiler *, operator_ty);
static int expr_constant(struct compiler *, expr_ty);
-static int compiler_with(struct compiler *, stmt_ty);
+static int compiler_with(struct compiler *, stmt_ty, int);
static int compiler_call_helper(struct compiler *c, int n,
asdl_seq *args,
asdl_seq *keywords,
expr_ty starargs,
expr_ty kwargs);
+static int compiler_try_except(struct compiler *, stmt_ty);
static PyCodeObject *assemble(struct compiler *, int addNone);
static PyObject *__doc__;
@@ -195,16 +207,17 @@ _Py_Mangle(PyObject *privateobj, PyObject *ident)
{
/* Name mangling: __private becomes _classname__private.
This is independent from how the name is used. */
- const Py_UNICODE *p, *name = PyUnicode_AS_UNICODE(ident);
- Py_UNICODE *buffer;
- size_t nlen, plen;
+ PyObject *result;
+ size_t nlen, plen, ipriv;
+ Py_UCS4 maxchar;
if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
- name == NULL || name[0] != '_' || name[1] != '_') {
+ PyUnicode_READ_CHAR(ident, 0) != '_' ||
+ PyUnicode_READ_CHAR(ident, 1) != '_') {
Py_INCREF(ident);
return ident;
}
- p = PyUnicode_AS_UNICODE(privateobj);
- nlen = Py_UNICODE_strlen(name);
+ nlen = PyUnicode_GET_LENGTH(ident);
+ plen = PyUnicode_GET_LENGTH(privateobj);
/* Don't mangle __id__ or names with dots.
The only time a name with a dot can occur is when
@@ -214,32 +227,44 @@ _Py_Mangle(PyObject *privateobj, PyObject *ident)
TODO(jhylton): Decide whether we want to support
mangling of the module name, e.g. __M.X.
*/
- if ((name[nlen-1] == '_' && name[nlen-2] == '_')
- || Py_UNICODE_strchr(name, '.')) {
+ if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
+ PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
+ PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
Py_INCREF(ident);
return ident; /* Don't mangle __whatever__ */
}
/* Strip leading underscores from class name */
- while (*p == '_')
- p++;
- if (*p == 0) {
+ ipriv = 0;
+ while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
+ ipriv++;
+ if (ipriv == plen) {
Py_INCREF(ident);
return ident; /* Don't mangle if class is just underscores */
}
- plen = Py_UNICODE_strlen(p);
+ plen -= ipriv;
assert(1 <= PY_SSIZE_T_MAX - nlen);
assert(1 + nlen <= PY_SSIZE_T_MAX - plen);
- ident = PyUnicode_FromStringAndSize(NULL, 1 + nlen + plen);
- if (!ident)
+ maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
+ if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
+ maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
+
+ result = PyUnicode_New(1 + nlen + plen, maxchar);
+ if (!result)
return 0;
- /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
- buffer = PyUnicode_AS_UNICODE(ident);
- buffer[0] = '_';
- Py_UNICODE_strncpy(buffer+1, p, plen);
- Py_UNICODE_strcpy(buffer+1+plen, name);
- return ident;
+ /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
+ PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
+ if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
+ Py_DECREF(result);
+ return NULL;
+ }
+ if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
+ Py_DECREF(result);
+ return NULL;
+ }
+ assert(_PyUnicode_CheckConsistency(result, 1));
+ return result;
}
static int
@@ -272,6 +297,9 @@ PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags,
if (!compiler_init(&c))
return NULL;
c.c_filename = filename;
+ c.c_filename_obj = PyUnicode_DecodeFSDefault(filename);
+ if (!c.c_filename_obj)
+ goto finally;
c.c_arena = arena;
c.c_future = PyFuture_FromAST(mod, filename);
if (c.c_future == NULL)
@@ -324,6 +352,8 @@ compiler_free(struct compiler *c)
PySymtable_Free(c->c_st);
if (c->c_future)
PyObject_Free(c->c_future);
+ if (c->c_filename_obj)
+ Py_DECREF(c->c_filename_obj);
Py_DECREF(c->c_stack);
}
@@ -458,6 +488,7 @@ compiler_unit_free(struct compiler_unit *u)
}
Py_CLEAR(u->u_ste);
Py_CLEAR(u->u_name);
+ Py_CLEAR(u->u_qualname);
Py_CLEAR(u->u_consts);
Py_CLEAR(u->u_names);
Py_CLEAR(u->u_varnames);
@@ -468,8 +499,8 @@ compiler_unit_free(struct compiler_unit *u)
}
static int
-compiler_enter_scope(struct compiler *c, identifier name, void *key,
- int lineno)
+compiler_enter_scope(struct compiler *c, identifier name,
+ int scope_type, void *key, int lineno)
{
struct compiler_unit *u;
@@ -480,6 +511,7 @@ compiler_enter_scope(struct compiler *c, identifier name, void *key,
return 0;
}
memset(u, 0, sizeof(struct compiler_unit));
+ u->u_scope_type = scope_type;
u->u_argcount = 0;
u->u_kwonlyargcount = 0;
u->u_ste = PySymtable_Lookup(c->c_st, key);
@@ -567,6 +599,59 @@ compiler_exit_scope(struct compiler *c)
}
+static PyObject *
+compiler_scope_qualname(struct compiler *c)
+{
+ Py_ssize_t stack_size, i;
+ _Py_static_string(dot, ".");
+ _Py_static_string(locals, "<locals>");
+ struct compiler_unit *u;
+ PyObject *capsule, *name, *seq, *dot_str, *locals_str;
+
+ u = c->u;
+ if (u->u_qualname != NULL) {
+ Py_INCREF(u->u_qualname);
+ return u->u_qualname;
+ }
+
+ seq = PyList_New(0);
+ if (seq == NULL)
+ return NULL;
+
+ stack_size = PyList_GET_SIZE(c->c_stack);
+ for (i = 0; i < stack_size; i++) {
+ capsule = PyList_GET_ITEM(c->c_stack, i);
+ u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT);
+ assert(u);
+ if (u->u_scope_type == COMPILER_SCOPE_MODULE)
+ continue;
+ if (PyList_Append(seq, u->u_name))
+ goto _error;
+ if (u->u_scope_type == COMPILER_SCOPE_FUNCTION) {
+ locals_str = _PyUnicode_FromId(&locals);
+ if (locals_str == NULL)
+ goto _error;
+ if (PyList_Append(seq, locals_str))
+ goto _error;
+ }
+ }
+ u = c->u;
+ if (PyList_Append(seq, u->u_name))
+ goto _error;
+ dot_str = _PyUnicode_FromId(&dot);
+ if (dot_str == NULL)
+ goto _error;
+ name = PyUnicode_Join(dot_str, seq);
+ Py_DECREF(seq);
+ u->u_qualname = name;
+ Py_XINCREF(name);
+ return name;
+
+_error:
+ Py_XDECREF(seq);
+ return NULL;
+}
+
/* Allocate a new block and return a pointer to it.
Returns NULL on error.
*/
@@ -777,7 +862,8 @@ opcode_stack_effect(int opcode, int oparg)
return -1;
case YIELD_VALUE:
return 0;
-
+ case YIELD_FROM:
+ return -1;
case POP_BLOCK:
return 0;
case POP_EXCEPT:
@@ -863,9 +949,9 @@ opcode_stack_effect(int opcode, int oparg)
case CALL_FUNCTION_VAR_KW:
return -NARGS(oparg)-2;
case MAKE_FUNCTION:
- return -NARGS(oparg) - ((oparg >> 16) & 0xffff);
+ return -1 -NARGS(oparg) - ((oparg >> 16) & 0xffff);
case MAKE_CLOSURE:
- return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
+ return -2 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
#undef NARGS
case BUILD_SLICE:
if (oparg == 3)
@@ -1195,7 +1281,7 @@ compiler_mod(struct compiler *c, mod_ty mod)
return NULL;
}
/* Use 0 for firstlineno initially, will fixup in assemble(). */
- if (!compiler_enter_scope(c, module, mod, 0))
+ if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
return NULL;
switch (mod->kind) {
case Module_kind:
@@ -1271,11 +1357,15 @@ compiler_lookup_arg(PyObject *dict, PyObject *name)
}
static int
-compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
+compiler_make_closure(struct compiler *c, PyCodeObject *co, int args, PyObject *qualname)
{
int i, free = PyCode_GetNumFree(co);
+ if (qualname == NULL)
+ qualname = co->co_name;
+
if (free == 0) {
ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
+ ADDOP_O(c, LOAD_CONST, qualname, consts);
ADDOP_I(c, MAKE_FUNCTION, args);
return 1;
}
@@ -1312,6 +1402,7 @@ compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)
}
ADDOP_I(c, BUILD_TUPLE, free);
ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
+ ADDOP_O(c, LOAD_CONST, qualname, consts);
ADDOP_I(c, MAKE_CLOSURE, args);
return 1;
}
@@ -1457,7 +1548,7 @@ static int
compiler_function(struct compiler *c, stmt_ty s)
{
PyCodeObject *co;
- PyObject *first_const = Py_None;
+ PyObject *qualname, *first_const = Py_None;
arguments_ty args = s->v.FunctionDef.args;
expr_ty returns = s->v.FunctionDef.returns;
asdl_seq* decos = s->v.FunctionDef.decorator_list;
@@ -1483,7 +1574,8 @@ compiler_function(struct compiler *c, stmt_ty s)
return 0;
assert((num_annotations & 0xFFFF) == num_annotations);
- if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s,
+ if (!compiler_enter_scope(c, s->v.FunctionDef.name,
+ COMPILER_SCOPE_FUNCTION, (void *)s,
s->lineno))
return 0;
@@ -1505,14 +1597,19 @@ compiler_function(struct compiler *c, stmt_ty s)
VISIT_IN_SCOPE(c, stmt, st);
}
co = assemble(c, 1);
+ qualname = compiler_scope_qualname(c);
compiler_exit_scope(c);
- if (co == NULL)
+ if (qualname == NULL || co == NULL) {
+ Py_XDECREF(qualname);
+ Py_XDECREF(co);
return 0;
+ }
arglength = asdl_seq_LEN(args->defaults);
arglength |= kw_default_count << 8;
arglength |= num_annotations << 16;
- compiler_make_closure(c, co, arglength);
+ compiler_make_closure(c, co, arglength, qualname);
+ Py_DECREF(qualname);
Py_DECREF(co);
/* decorators */
@@ -1547,7 +1644,8 @@ compiler_class(struct compiler *c, stmt_ty s)
*/
/* 1. compile the class body into a code object */
- if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno))
+ if (!compiler_enter_scope(c, s->v.ClassDef.name,
+ COMPILER_SCOPE_CLASS, (void *)s, s->lineno))
return 0;
/* this block represents what we do in the new scope */
{
@@ -1577,6 +1675,21 @@ compiler_class(struct compiler *c, stmt_ty s)
return 0;
}
Py_DECREF(str);
+ /* store the __qualname__ */
+ str = compiler_scope_qualname(c);
+ if (!str) {
+ compiler_exit_scope(c);
+ return 0;
+ }
+ ADDOP_O(c, LOAD_CONST, str, consts);
+ Py_DECREF(str);
+ str = PyUnicode_InternFromString("__qualname__");
+ if (!str || !compiler_nameop(c, str, Store)) {
+ Py_XDECREF(str);
+ compiler_exit_scope(c);
+ return 0;
+ }
+ Py_DECREF(str);
/* compile the body proper */
if (!compiler_body(c, s->v.ClassDef.body)) {
compiler_exit_scope(c);
@@ -1613,7 +1726,7 @@ compiler_class(struct compiler *c, stmt_ty s)
ADDOP(c, LOAD_BUILD_CLASS);
/* 3. load a function (or closure) made from the code object */
- compiler_make_closure(c, co, 0);
+ compiler_make_closure(c, co, 0, NULL);
Py_DECREF(co);
/* 4. load class name */
@@ -1664,6 +1777,7 @@ static int
compiler_lambda(struct compiler *c, expr_ty e)
{
PyCodeObject *co;
+ PyObject *qualname;
static identifier name;
int kw_default_count = 0, arglength;
arguments_ty args = e->v.Lambda.args;
@@ -1683,7 +1797,8 @@ compiler_lambda(struct compiler *c, expr_ty e)
}
if (args->defaults)
VISIT_SEQ(c, expr, args->defaults);
- if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
+ if (!compiler_enter_scope(c, name, COMPILER_SCOPE_FUNCTION,
+ (void *)e, e->lineno))
return 0;
/* Make None the first constant, so the lambda can't have a
@@ -1701,13 +1816,15 @@ compiler_lambda(struct compiler *c, expr_ty e)
ADDOP_IN_SCOPE(c, RETURN_VALUE);
}
co = assemble(c, 1);
+ qualname = compiler_scope_qualname(c);
compiler_exit_scope(c);
- if (co == NULL)
+ if (qualname == NULL || co == NULL)
return 0;
arglength = asdl_seq_LEN(args->defaults);
arglength |= kw_default_count << 8;
- compiler_make_closure(c, co, arglength);
+ compiler_make_closure(c, co, arglength, qualname);
+ Py_DECREF(qualname);
Py_DECREF(co);
return 1;
@@ -1916,7 +2033,13 @@ compiler_try_finally(struct compiler *c, stmt_ty s)
compiler_use_next_block(c, body);
if (!compiler_push_fblock(c, FINALLY_TRY, body))
return 0;
- VISIT_SEQ(c, stmt, s->v.TryFinally.body);
+ if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
+ if (!compiler_try_except(c, s))
+ return 0;
+ }
+ else {
+ VISIT_SEQ(c, stmt, s->v.Try.body);
+ }
ADDOP(c, POP_BLOCK);
compiler_pop_fblock(c, FINALLY_TRY, body);
@@ -1924,7 +2047,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s)
compiler_use_next_block(c, end);
if (!compiler_push_fblock(c, FINALLY_END, end))
return 0;
- VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
+ VISIT_SEQ(c, stmt, s->v.Try.finalbody);
ADDOP(c, END_FINALLY);
compiler_pop_fblock(c, FINALLY_END, end);
@@ -1978,15 +2101,15 @@ compiler_try_except(struct compiler *c, stmt_ty s)
compiler_use_next_block(c, body);
if (!compiler_push_fblock(c, EXCEPT, body))
return 0;
- VISIT_SEQ(c, stmt, s->v.TryExcept.body);
+ VISIT_SEQ(c, stmt, s->v.Try.body);
ADDOP(c, POP_BLOCK);
compiler_pop_fblock(c, EXCEPT, body);
ADDOP_JREL(c, JUMP_FORWARD, orelse);
- n = asdl_seq_LEN(s->v.TryExcept.handlers);
+ n = asdl_seq_LEN(s->v.Try.handlers);
compiler_use_next_block(c, except);
for (i = 0; i < n; i++) {
excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
- s->v.TryExcept.handlers, i);
+ s->v.Try.handlers, i);
if (!handler->v.ExceptHandler.type && i < n-1)
return compiler_error(c, "default 'except:' must be last");
c->u->u_lineno_set = 0;
@@ -2073,12 +2196,21 @@ compiler_try_except(struct compiler *c, stmt_ty s)
}
ADDOP(c, END_FINALLY);
compiler_use_next_block(c, orelse);
- VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
+ VISIT_SEQ(c, stmt, s->v.Try.orelse);
compiler_use_next_block(c, end);
return 1;
}
static int
+compiler_try(struct compiler *c, stmt_ty s) {
+ if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
+ return compiler_try_finally(c, s);
+ else
+ return compiler_try_except(c, s);
+}
+
+
+static int
compiler_import_as(struct compiler *c, identifier name, identifier asname)
{
/* The IMPORT_NAME opcode was already generated. This function
@@ -2087,22 +2219,27 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname)
If there is a dot in name, we need to split it and emit a
LOAD_ATTR for each name.
*/
- const Py_UNICODE *src = PyUnicode_AS_UNICODE(name);
- const Py_UNICODE *dot = Py_UNICODE_strchr(src, '.');
- if (dot) {
+ Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
+ PyUnicode_GET_LENGTH(name), 1);
+ if (dot == -2)
+ return -1;
+ if (dot != -1) {
/* Consume the base module name to get the first attribute */
- src = dot + 1;
- while (dot) {
- /* NB src is only defined when dot != NULL */
+ Py_ssize_t pos = dot + 1;
+ while (dot != -1) {
PyObject *attr;
- dot = Py_UNICODE_strchr(src, '.');
- attr = PyUnicode_FromUnicode(src,
- dot ? dot - src : Py_UNICODE_strlen(src));
+ dot = PyUnicode_FindChar(name, '.', pos,
+ PyUnicode_GET_LENGTH(name), 1);
+ if (dot == -2)
+ return -1;
+ attr = PyUnicode_Substring(name, pos,
+ (dot != -1) ? dot :
+ PyUnicode_GET_LENGTH(name));
if (!attr)
return -1;
ADDOP_O(c, LOAD_ATTR, attr, names);
Py_DECREF(attr);
- src = dot + 1;
+ pos = dot + 1;
}
}
return compiler_nameop(c, asname, Store);
@@ -2141,13 +2278,12 @@ compiler_import(struct compiler *c, stmt_ty s)
}
else {
identifier tmp = alias->name;
- const Py_UNICODE *base = PyUnicode_AS_UNICODE(alias->name);
- Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
- if (dot)
- tmp = PyUnicode_FromUnicode(base,
- dot - base);
+ Py_ssize_t dot = PyUnicode_FindChar(
+ alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
+ if (dot != -1)
+ tmp = PyUnicode_Substring(alias->name, 0, dot);
r = compiler_nameop(c, tmp, Store);
- if (dot) {
+ if (dot != -1) {
Py_DECREF(tmp);
}
if (!r)
@@ -2210,7 +2346,7 @@ compiler_from_import(struct compiler *c, stmt_ty s)
alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
identifier store_name;
- if (i == 0 && *PyUnicode_AS_UNICODE(alias->name) == '*') {
+ if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
assert(n == 1);
ADDOP(c, IMPORT_STAR);
return 1;
@@ -2325,10 +2461,8 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s)
}
ADDOP_I(c, RAISE_VARARGS, n);
break;
- case TryExcept_kind:
- return compiler_try_except(c, s);
- case TryFinally_kind:
- return compiler_try_finally(c, s);
+ case Try_kind:
+ return compiler_try(c, s);
case Assert_kind:
return compiler_assert(c, s);
case Import_kind:
@@ -2359,7 +2493,7 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s)
case Continue_kind:
return compiler_continue(c);
case With_kind:
- return compiler_with(c, s);
+ return compiler_with(c, s, 0);
}
return 1;
}
@@ -2526,7 +2660,7 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
}
/* XXX Leave assert here, but handle __doc__ and the like better */
- assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_');
+ assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
switch (optype) {
case OP_DEREF:
@@ -2904,11 +3038,13 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
{
PyCodeObject *co = NULL;
expr_ty outermost_iter;
+ PyObject *qualname = NULL;
outermost_iter = ((comprehension_ty)
asdl_seq_GET(generators, 0))->iter;
- if (!compiler_enter_scope(c, name, (void *)e, e->lineno))
+ if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
+ (void *)e, e->lineno))
goto error;
if (type != COMP_GENEXP) {
@@ -2941,12 +3077,14 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
}
co = assemble(c, 1);
+ qualname = compiler_scope_qualname(c);
compiler_exit_scope(c);
- if (co == NULL)
+ if (qualname == NULL || co == NULL)
goto error;
- if (!compiler_make_closure(c, co, 0))
+ if (!compiler_make_closure(c, co, 0, qualname))
goto error;
+ Py_DECREF(qualname);
Py_DECREF(co);
VISIT(c, expr, outermost_iter);
@@ -2956,6 +3094,7 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
error_in_scope:
compiler_exit_scope(c);
error:
+ Py_XDECREF(qualname);
Py_XDECREF(co);
return 0;
}
@@ -3049,8 +3188,7 @@ expr_constant(struct compiler *c, expr_ty e)
return PyObject_IsTrue(e->v.Str.s);
case Name_kind:
/* optimize away names that can't be reassigned */
- id = PyBytes_AS_STRING(
- _PyUnicode_AsDefaultEncodedString(e->v.Name.id, NULL));
+ id = PyUnicode_AsUTF8(e->v.Name.id);
if (strcmp(id, "True") == 0) return 1;
if (strcmp(id, "False") == 0) return 0;
if (strcmp(id, "None") == 0) return 0;
@@ -3086,9 +3224,10 @@ expr_constant(struct compiler *c, expr_ty e)
exit(*exc)
*/
static int
-compiler_with(struct compiler *c, stmt_ty s)
+compiler_with(struct compiler *c, stmt_ty s, int pos)
{
basicblock *block, *finally;
+ withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
assert(s->kind == With_kind);
@@ -3098,7 +3237,7 @@ compiler_with(struct compiler *c, stmt_ty s)
return 0;
/* Evaluate EXPR */
- VISIT(c, expr, s->v.With.context_expr);
+ VISIT(c, expr, item->context_expr);
ADDOP_JREL(c, SETUP_WITH, finally);
/* SETUP_WITH pushes a finally block. */
@@ -3107,16 +3246,20 @@ compiler_with(struct compiler *c, stmt_ty s)
return 0;
}
- if (s->v.With.optional_vars) {
- VISIT(c, expr, s->v.With.optional_vars);
+ if (item->optional_vars) {
+ VISIT(c, expr, item->optional_vars);
}
else {
/* Discard result from context.__enter__() */
ADDOP(c, POP_TOP);
}
- /* BLOCK code */
- VISIT_SEQ(c, stmt, s->v.With.body);
+ pos++;
+ if (pos == asdl_seq_LEN(s->v.With.items))
+ /* BLOCK code */
+ VISIT_SEQ(c, stmt, s->v.With.body)
+ else if (!compiler_with(c, s, pos))
+ return 0;
/* End of try block; start the finally block */
ADDOP(c, POP_BLOCK);
@@ -3193,16 +3336,27 @@ compiler_visit_expr(struct compiler *c, expr_ty e)
case DictComp_kind:
return compiler_dictcomp(c, e);
case Yield_kind:
+ case YieldFrom_kind: {
+ expr_ty value;
if (c->u->u_ste->ste_type != FunctionBlock)
return compiler_error(c, "'yield' outside function");
- if (e->v.Yield.value) {
- VISIT(c, expr, e->v.Yield.value);
+ value = (e->kind == YieldFrom_kind) ? e->v.YieldFrom.value : e->v.Yield.value;
+ if (value) {
+ VISIT(c, expr, value);
}
else {
ADDOP_O(c, LOAD_CONST, Py_None, consts);
}
- ADDOP(c, YIELD_VALUE);
+ if (e->kind == YieldFrom_kind) {
+ ADDOP(c, GET_ITER);
+ ADDOP_O(c, LOAD_CONST, Py_None, consts);
+ ADDOP(c, YIELD_FROM);
+ }
+ else {
+ ADDOP(c, YIELD_VALUE);
+ }
break;
+ }
case Compare_kind:
return compiler_compare(c, e);
case Call_kind:
@@ -3385,7 +3539,7 @@ compiler_in_loop(struct compiler *c) {
static int
compiler_error(struct compiler *c, const char *errstr)
{
- PyObject *loc, *filename;
+ PyObject *loc;
PyObject *u = NULL, *v = NULL;
loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
@@ -3393,16 +3547,7 @@ compiler_error(struct compiler *c, const char *errstr)
Py_INCREF(Py_None);
loc = Py_None;
}
- if (c->c_filename != NULL) {
- filename = PyUnicode_DecodeFSDefault(c->c_filename);
- if (!filename)
- goto exit;
- }
- else {
- Py_INCREF(Py_None);
- filename = Py_None;
- }
- u = Py_BuildValue("(NiiO)", filename, c->u->u_lineno,
+ u = Py_BuildValue("(OiiO)", c->c_filename_obj, c->u->u_lineno,
c->u->u_col_offset, loc);
if (!u)
goto exit;
@@ -3951,7 +4096,6 @@ makecode(struct compiler *c, struct assembler *a)
PyObject *consts = NULL;
PyObject *names = NULL;
PyObject *varnames = NULL;
- PyObject *filename = NULL;
PyObject *name = NULL;
PyObject *freevars = NULL;
PyObject *cellvars = NULL;
@@ -3975,10 +4119,6 @@ makecode(struct compiler *c, struct assembler *a)
freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
if (!freevars)
goto error;
- filename = PyUnicode_DecodeFSDefault(c->c_filename);
- if (!filename)
- goto error;
-
nlocals = PyDict_Size(c->u->u_varnames);
flags = compute_code_flags(c);
if (flags < 0)
@@ -3998,14 +4138,13 @@ makecode(struct compiler *c, struct assembler *a)
nlocals, stackdepth(c), flags,
bytecode, consts, names, varnames,
freevars, cellvars,
- filename, c->u->u_name,
+ c->c_filename_obj, c->u->u_name,
c->u->u_firstlineno,
a->a_lnotab);
error:
Py_XDECREF(consts);
Py_XDECREF(names);
Py_XDECREF(varnames);
- Py_XDECREF(filename);
Py_XDECREF(name);
Py_XDECREF(freevars);
Py_XDECREF(cellvars);
diff --git a/Python/condvar.h b/Python/condvar.h
new file mode 100644
index 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 c563eaa..501cb8c 100644
--- a/Python/fileutils.c
+++ b/Python/fileutils.c
@@ -3,6 +3,40 @@
# include <windows.h>
#endif
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
+PyObject *
+_Py_device_encoding(int fd)
+{
+#if defined(MS_WINDOWS) || defined(MS_WIN64)
+ UINT cp;
+#endif
+ if (!_PyVerify_fd(fd) || !isatty(fd)) {
+ Py_RETURN_NONE;
+ }
+#if defined(MS_WINDOWS) || defined(MS_WIN64)
+ if (fd == 0)
+ cp = GetConsoleCP();
+ else if (fd == 1 || fd == 2)
+ cp = GetConsoleOutputCP();
+ else
+ cp = 0;
+ /* GetConsoleCP() and GetConsoleOutputCP() return 0 if the application
+ has no console */
+ if (cp != 0)
+ return PyUnicode_FromFormat("cp%u", (unsigned int)cp);
+#elif defined(CODESET)
+ {
+ char *codeset = nl_langinfo(CODESET);
+ if (codeset != NULL && codeset[0] != 0)
+ return PyUnicode_FromString(codeset);
+ }
+#endif
+ Py_RETURN_NONE;
+}
+
#ifdef HAVE_STAT
/* Decode a byte string from the locale encoding with the
@@ -16,7 +50,9 @@
Return a pointer to a newly allocated wide character string (use
PyMem_Free() to free the memory) and write the number of written wide
characters excluding the null character into *size if size is not NULL, or
- NULL on error (conversion or memory allocation error).
+ NULL on error (decoding or memory allocation error). If size is not NULL,
+ *size is set to (size_t)-1 on memory error and (size_t)-2 on decoding
+ error.
Conversion errors should never happen, unless there is a bug in the C
library. */
@@ -82,8 +118,9 @@ _Py_char2wchar(const char* arg, size_t *size)
since we provide everything that we have -
unless there is a bug in the C library, or I
misunderstood how mbrtowc works. */
- fprintf(stderr, "unexpected mbrtowc result -2\n");
PyMem_Free(res);
+ if (size != NULL)
+ *size = (size_t)-2;
return NULL;
}
if (converted == (size_t)-1) {
@@ -112,7 +149,8 @@ _Py_char2wchar(const char* arg, size_t *size)
is ASCII (i.e. escape all bytes > 128. This will still roundtrip
correctly in the locale's charset, which must be an ASCII superset. */
res = PyMem_Malloc((strlen(arg)+1)*sizeof(wchar_t));
- if (!res) goto oom;
+ if (!res)
+ goto oom;
in = (unsigned char*)arg;
out = res;
while(*in)
@@ -126,7 +164,8 @@ _Py_char2wchar(const char* arg, size_t *size)
*size = out - res;
return res;
oom:
- fprintf(stderr, "out of memory\n");
+ if (size != NULL)
+ *size = (size_t)-1;
return NULL;
}
@@ -137,10 +176,10 @@ oom:
This function is the reverse of _Py_char2wchar().
Return a pointer to a newly allocated byte string (use PyMem_Free() to free
- the memory), or NULL on conversion or memory allocation error.
+ the memory), or NULL on encoding or memory allocation error.
If error_pos is not NULL: *error_pos is the index of the invalid character
- on conversion error, or (size_t)-1 otherwise. */
+ on encoding error, or (size_t)-1 otherwise. */
char*
_Py_wchar2char(const wchar_t *text, size_t *error_pos)
{
@@ -235,8 +274,8 @@ _Py_wstat(const wchar_t* path, struct stat *buf)
/* Call _wstat() on Windows, or encode the path to the filesystem encoding and
call stat() otherwise. Only fill st_mode attribute on Windows.
- Return 0 on success, -1 on _wstat() / stat() error or (if PyErr_Occurred())
- unicode error. */
+ Return 0 on success, -1 on _wstat() / stat() error, -2 if an exception was
+ raised. */
int
_Py_stat(PyObject *path, struct stat *statbuf)
@@ -244,8 +283,12 @@ _Py_stat(PyObject *path, struct stat *statbuf)
#ifdef MS_WINDOWS
int err;
struct _stat wstatbuf;
+ wchar_t *wpath;
- err = _wstat(PyUnicode_AS_UNICODE(path), &wstatbuf);
+ wpath = PyUnicode_AsUnicode(path);
+ if (wpath == NULL)
+ return -2;
+ err = _wstat(wpath, &wstatbuf);
if (!err)
statbuf->st_mode = wstatbuf.st_mode;
return err;
@@ -253,7 +296,7 @@ _Py_stat(PyObject *path, struct stat *statbuf)
int ret;
PyObject *bytes = PyUnicode_EncodeFSDefault(path);
if (bytes == NULL)
- return -1;
+ return -2;
ret = stat(PyBytes_AS_STRING(bytes), statbuf);
Py_DECREF(bytes);
return ret;
@@ -297,18 +340,29 @@ FILE*
_Py_fopen(PyObject *path, const char *mode)
{
#ifdef MS_WINDOWS
+ wchar_t *wpath;
wchar_t wmode[10];
int usize;
+ if (!PyUnicode_Check(path)) {
+ PyErr_Format(PyExc_TypeError,
+ "str file path expected under Windows, got %R",
+ Py_TYPE(path));
+ return NULL;
+ }
+ wpath = PyUnicode_AsUnicode(path);
+ if (wpath == NULL)
+ return NULL;
+
usize = MultiByteToWideChar(CP_ACP, 0, mode, -1, wmode, sizeof(wmode));
if (usize == 0)
return NULL;
- return _wfopen(PyUnicode_AS_UNICODE(path), wmode);
+ return _wfopen(wpath, wmode);
#else
FILE *f;
- PyObject *bytes = PyUnicode_EncodeFSDefault(path);
- if (bytes == NULL)
+ PyObject *bytes;
+ if (!PyUnicode_FSConverter(path, &bytes))
return NULL;
f = fopen(PyBytes_AS_STRING(bytes), mode);
Py_DECREF(bytes);
@@ -319,7 +373,7 @@ _Py_fopen(PyObject *path, const char *mode)
#ifdef HAVE_READLINK
/* Read value of symbolic link. Encode the path to the locale encoding, decode
- the result from the locale encoding. */
+ the result from the locale encoding. Return -1 on error. */
int
_Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz)
@@ -363,7 +417,8 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz)
#ifdef HAVE_REALPATH
/* Return the canonicalized absolute pathname. Encode path to the locale
- encoding, decode the result from the locale encoding. */
+ encoding, decode the result from the locale encoding.
+ Return NULL on error. */
wchar_t*
_Py_wrealpath(const wchar_t *path,
@@ -401,7 +456,8 @@ _Py_wrealpath(const wchar_t *path,
#endif
/* Get the current directory. size is the buffer size in wide characters
- including the null character. Decode the path from the locale encoding. */
+ including the null character. Decode the path from the locale encoding.
+ Return NULL on error. */
wchar_t*
_Py_wgetcwd(wchar_t *buf, size_t size)
diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c
index 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..d83c6da 100644
--- a/Python/getcopyright.c
+++ b/Python/getcopyright.c
@@ -19,5 +19,5 @@ All Rights Reserved.";
const char *
Py_GetCopyright(void)
{
- return cprt;
+ return cprt;
}
diff --git a/Python/graminit.c b/Python/graminit.c
index 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 beb0eec..2f71b97 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -8,6 +8,7 @@
#include "errcode.h"
#include "marshal.h"
#include "code.h"
+#include "frameobject.h"
#include "osdefs.h"
#include "importdl.h"
@@ -26,176 +27,38 @@ typedef unsigned short mode_t;
#endif
-/* Magic word to reject .pyc files generated by other Python versions.
- It should change for each incompatible change to the bytecode.
-
- The value of CR and LF is incorporated so if you ever read or write
- a .pyc file in text mode the magic number will be wrong; also, the
- Apple MPW compiler swaps their values, botching string constants.
-
- The magic numbers must be spaced apart at least 2 values, as the
- -U interpeter flag will cause MAGIC+1 being used. They have been
- odd numbers for some time now.
-
- There were a variety of old schemes for setting the magic number.
- The current working scheme is to increment the previous value by
- 10.
-
- Starting with the adoption of PEP 3147 in Python 3.2, every bump in magic
- number also includes a new "magic tag", i.e. a human readable string used
- to represent the magic number in __pycache__ directories. When you change
- the magic number, you must also set a new unique magic tag. Generally this
- can be named after the Python major version of the magic number bump, but
- it can really be anything, as long as it's different than anything else
- that's come before. The tags are included in the following table, starting
- with Python 3.2a0.
-
- Known values:
- Python 1.5: 20121
- Python 1.5.1: 20121
- Python 1.5.2: 20121
- Python 1.6: 50428
- Python 2.0: 50823
- Python 2.0.1: 50823
- Python 2.1: 60202
- Python 2.1.1: 60202
- Python 2.1.2: 60202
- Python 2.2: 60717
- Python 2.3a0: 62011
- Python 2.3a0: 62021
- Python 2.3a0: 62011 (!)
- Python 2.4a0: 62041
- Python 2.4a3: 62051
- Python 2.4b1: 62061
- Python 2.5a0: 62071
- Python 2.5a0: 62081 (ast-branch)
- Python 2.5a0: 62091 (with)
- Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
- Python 2.5b3: 62101 (fix wrong code: for x, in ...)
- Python 2.5b3: 62111 (fix wrong code: x += yield)
- Python 2.5c1: 62121 (fix wrong lnotab with for loops and
- storing constants that should have been removed)
- Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
- Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
- Python 2.6a1: 62161 (WITH_CLEANUP optimization)
- Python 3000: 3000
- 3010 (removed UNARY_CONVERT)
- 3020 (added BUILD_SET)
- 3030 (added keyword-only parameters)
- 3040 (added signature annotations)
- 3050 (print becomes a function)
- 3060 (PEP 3115 metaclass syntax)
- 3061 (string literals become unicode)
- 3071 (PEP 3109 raise changes)
- 3081 (PEP 3137 make __file__ and __name__ unicode)
- 3091 (kill str8 interning)
- 3101 (merge from 2.6a0, see 62151)
- 3103 (__file__ points to source file)
- Python 3.0a4: 3111 (WITH_CLEANUP optimization).
- Python 3.0a5: 3131 (lexical exception stacking, including POP_EXCEPT)
- Python 3.1a0: 3141 (optimize list, set and dict comprehensions:
- change LIST_APPEND and SET_ADD, add MAP_ADD)
- Python 3.1a0: 3151 (optimize conditional branches:
- introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
- Python 3.2a0: 3160 (add SETUP_WITH)
- tag: cpython-32
- Python 3.2a1: 3170 (add DUP_TOP_TWO, remove DUP_TOPX and ROT_FOUR)
- tag: cpython-32
- Python 3.2a2 3180 (add DELETE_DEREF)
-*/
-
-/* MAGIC must change whenever the bytecode emitted by the compiler may no
- longer be understood by older implementations of the eval loop (usually
- due to the addition of new opcodes)
- TAG must change for each major Python release. The magic number will take
- care of any bytecode changes that occur during development.
-*/
-#define MAGIC (3180 | ((long)'\r'<<16) | ((long)'\n'<<24))
-#define TAG "cpython-32"
#define CACHEDIR "__pycache__"
-/* Current magic word and string tag as globals. */
-static long pyc_magic = MAGIC;
-static const char *pyc_tag = TAG;
-/* See _PyImport_FixupExtensionUnicode() below */
+/* See _PyImport_FixupExtensionObject() below */
static PyObject *extensions = NULL;
+/* Function from Parser/tokenizer.c */
+extern char * PyTokenizer_FindEncodingFilename(int, PyObject *);
+
/* This table is defined in config.c: */
extern struct _inittab _PyImport_Inittab[];
-/* Method from Parser/tokenizer.c */
-extern char * PyTokenizer_FindEncoding(int);
-
struct _inittab *PyImport_Inittab = _PyImport_Inittab;
-/* these tables define the module suffixes that Python recognizes */
-struct filedescr * _PyImport_Filetab = NULL;
-
-static const struct filedescr _PyImport_StandardFiletab[] = {
- {".py", "U", PY_SOURCE},
-#ifdef MS_WINDOWS
- {".pyw", "U", PY_SOURCE},
-#endif
- {".pyc", "rb", PY_COMPILED},
- {0, 0}
-};
-
+static PyObject *initstr = NULL;
/* Initialize things */
void
_PyImport_Init(void)
{
- const struct filedescr *scan;
- struct filedescr *filetab;
- int countD = 0;
- int countS = 0;
-
- /* prepare _PyImport_Filetab: copy entries from
- _PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
- */
-#ifdef HAVE_DYNAMIC_LOADING
- for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
- ++countD;
-#endif
- for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
- ++countS;
- filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
- if (filetab == NULL)
- Py_FatalError("Can't initialize import file table.");
-#ifdef HAVE_DYNAMIC_LOADING
- memcpy(filetab, _PyImport_DynLoadFiletab,
- countD * sizeof(struct filedescr));
-#endif
- memcpy(filetab + countD, _PyImport_StandardFiletab,
- countS * sizeof(struct filedescr));
- filetab[countD + countS].suffix = NULL;
-
- _PyImport_Filetab = filetab;
-
- if (Py_OptimizeFlag) {
- /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
- for (; filetab->suffix != NULL; filetab++) {
- if (strcmp(filetab->suffix, ".pyc") == 0)
- filetab->suffix = ".pyo";
- }
- }
+ initstr = PyUnicode_InternFromString("__init__");
+ if (initstr == NULL)
+ Py_FatalError("Can't initialize import variables");
}
void
_PyImportHooks_Init(void)
{
- PyObject *v, *path_hooks = NULL, *zimpimport;
+ PyObject *v, *path_hooks = NULL;
int err = 0;
- /* adding sys.path_hooks and sys.path_importer_cache, setting up
- zipimport */
- if (PyType_Ready(&PyNullImporter_Type) < 0)
- goto error;
-
- if (Py_VerboseFlag)
- PySys_WriteStderr("# installing zipimport hook\n");
-
+ /* adding sys.path_hooks and sys.path_importer_cache */
v = PyList_New(0);
if (v == NULL)
goto error;
@@ -216,11 +79,25 @@ _PyImportHooks_Init(void)
err = PySys_SetObject("path_hooks", path_hooks);
if (err) {
error:
- PyErr_Print();
- Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
- "path_importer_cache, or NullImporter failed"
- );
+ PyErr_Print();
+ Py_FatalError("initializing sys.meta_path, sys.path_hooks, "
+ "or path_importer_cache failed");
}
+ Py_DECREF(path_hooks);
+}
+
+void
+_PyImportZip_Init(void)
+{
+ PyObject *path_hooks, *zimpimport;
+ int err = 0;
+
+ path_hooks = PySys_GetObject("path_hooks");
+ if (path_hooks == NULL)
+ goto error;
+
+ if (Py_VerboseFlag)
+ PySys_WriteStderr("# installing zipimport hook\n");
zimpimport = PyImport_ImportModule("zipimport");
if (zimpimport == NULL) {
@@ -229,8 +106,9 @@ _PyImportHooks_Init(void)
PySys_WriteStderr("# can't import zipimport\n");
}
else {
- PyObject *zipimporter = PyObject_GetAttrString(zimpimport,
- "zipimporter");
+ _Py_IDENTIFIER(zipimporter);
+ PyObject *zipimporter = _PyObject_GetAttrId(zimpimport,
+ &PyId_zipimporter);
Py_DECREF(zimpimport);
if (zipimporter == NULL) {
PyErr_Clear(); /* No zipimporter object -- okay */
@@ -239,17 +117,23 @@ _PyImportHooks_Init(void)
"# can't import zipimport.zipimporter\n");
}
else {
- /* sys.path_hooks.append(zipimporter) */
- err = PyList_Append(path_hooks, zipimporter);
+ /* sys.path_hooks.insert(0, zipimporter) */
+ err = PyList_Insert(path_hooks, 0, zipimporter);
Py_DECREF(zipimporter);
- if (err)
+ if (err < 0) {
goto error;
+ }
if (Py_VerboseFlag)
PySys_WriteStderr(
"# installed zipimport hook\n");
}
}
- Py_DECREF(path_hooks);
+
+ return;
+
+ error:
+ PyErr_Print();
+ Py_FatalError("initializing zipimport failed");
}
/* Locking primitives to prevent parallel imports of the same module
@@ -319,7 +203,7 @@ _PyImport_ReInitLock(void)
/* Forked as a side effect of import */
long me = PyThread_get_thread_ident();
PyThread_acquire_lock(import_lock, 0);
- /* XXX: can the previous line fail? */
+ /* XXX: can the previous line fail? */
import_lock_thread = me;
import_lock_level--;
} else {
@@ -369,8 +253,6 @@ _PyImport_Fini(void)
{
Py_XDECREF(extensions);
extensions = NULL;
- PyMem_DEL(_PyImport_Filetab);
- _PyImport_Filetab = NULL;
#ifdef WITH_THREAD
if (import_lock != NULL) {
PyThread_free_lock(import_lock);
@@ -379,14 +261,6 @@ _PyImport_Fini(void)
#endif
}
-static void
-imp_modules_reloading_clear(void)
-{
- PyInterpreterState *interp = PyThreadState_Get()->interp;
- if (interp->modules_reloading != NULL)
- PyDict_Clear(interp->modules_reloading);
-}
-
/* Helper for sys */
PyObject *
@@ -423,7 +297,6 @@ void
PyImport_Cleanup(void)
{
Py_ssize_t pos, ndone;
- char *name;
PyObject *key, *value, *dict;
PyInterpreterState *interp = PyThreadState_GET()->interp;
PyObject *modules = interp->modules;
@@ -496,14 +369,13 @@ PyImport_Cleanup(void)
if (value->ob_refcnt != 1)
continue;
if (PyUnicode_Check(key) && PyModule_Check(value)) {
- name = _PyUnicode_AsString(key);
- if (strcmp(name, "builtins") == 0)
+ if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0)
continue;
- if (strcmp(name, "sys") == 0)
+ if (PyUnicode_CompareWithASCIIString(key, "sys") == 0)
continue;
if (Py_VerboseFlag)
- PySys_WriteStderr(
- "# cleanup[1] %s\n", name);
+ PySys_FormatStderr(
+ "# cleanup[1] %U\n", key);
_PyModule_Clear(value);
PyDict_SetItem(modules, key, Py_None);
ndone++;
@@ -515,13 +387,12 @@ PyImport_Cleanup(void)
pos = 0;
while (PyDict_Next(modules, &pos, &key, &value)) {
if (PyUnicode_Check(key) && PyModule_Check(value)) {
- name = _PyUnicode_AsString(key);
- if (strcmp(name, "builtins") == 0)
+ if (PyUnicode_CompareWithASCIIString(key, "builtins") == 0)
continue;
- if (strcmp(name, "sys") == 0)
+ if (PyUnicode_CompareWithASCIIString(key, "sys") == 0)
continue;
if (Py_VerboseFlag)
- PySys_WriteStderr("# cleanup[2] %s\n", name);
+ PySys_FormatStderr("# cleanup[2] %U\n", key);
_PyModule_Clear(value);
PyDict_SetItem(modules, key, Py_None);
}
@@ -547,7 +418,6 @@ PyImport_Cleanup(void)
PyDict_Clear(modules);
interp->modules = NULL;
Py_DECREF(modules);
- Py_CLEAR(interp->modules_reloading);
}
@@ -556,25 +426,36 @@ PyImport_Cleanup(void)
long
PyImport_GetMagicNumber(void)
{
- return pyc_magic;
+ long res;
+ PyInterpreterState *interp = PyThreadState_Get()->interp;
+ PyObject *pyc_magic = PyObject_GetAttrString(interp->importlib,
+ "_RAW_MAGIC_NUMBER");
+ if (pyc_magic == NULL)
+ return -1;
+ res = PyLong_AsLong(pyc_magic);
+ Py_DECREF(pyc_magic);
+ return res;
}
+extern const char * _PySys_ImplCacheTag;
+
const char *
PyImport_GetMagicTag(void)
{
- return pyc_tag;
+ return _PySys_ImplCacheTag;
}
+
/* Magic for extension modules (built-in as well as dynamically
loaded). To prevent initializing an extension module more than
once, we keep a static dictionary 'extensions' keyed by module name
(for built-in modules) or by filename (for dynamically loaded
modules), containing these modules. A copy of the module's
- dictionary is stored by calling _PyImport_FixupExtensionUnicode()
+ dictionary is stored by calling _PyImport_FixupExtensionObject()
immediately after the module initialization function succeeds. A
copy can be retrieved from there by calling
- _PyImport_FindExtensionUnicode().
+ _PyImport_FindExtensionObject().
Modules which do support multiple initialization set their m_size
field to a non-negative number (indicating the size of the
@@ -583,7 +464,8 @@ PyImport_GetMagicTag(void)
*/
int
-_PyImport_FixupExtensionUnicode(PyObject *mod, char *name, PyObject *filename)
+_PyImport_FixupExtensionObject(PyObject *mod, PyObject *name,
+ PyObject *filename)
{
PyObject *modules, *dict;
struct PyModuleDef *def;
@@ -602,10 +484,10 @@ _PyImport_FixupExtensionUnicode(PyObject *mod, char *name, PyObject *filename)
return -1;
}
modules = PyImport_GetModuleDict();
- if (PyDict_SetItemString(modules, name, mod) < 0)
+ if (PyDict_SetItem(modules, name, mod) < 0)
return -1;
if (_PyState_AddModule(mod, def) < 0) {
- PyDict_DelItemString(modules, name);
+ PyDict_DelItem(modules, name);
return -1;
}
if (def->m_size == -1) {
@@ -631,17 +513,17 @@ int
_PyImport_FixupBuiltin(PyObject *mod, char *name)
{
int res;
- PyObject *filename;
- filename = PyUnicode_FromString(name);
- if (filename == NULL)
+ PyObject *nameobj;
+ nameobj = PyUnicode_InternFromString(name);
+ if (nameobj == NULL)
return -1;
- res = _PyImport_FixupExtensionUnicode(mod, name, filename);
- Py_DECREF(filename);
+ res = _PyImport_FixupExtensionObject(mod, nameobj, nameobj);
+ Py_DECREF(nameobj);
return res;
}
PyObject *
-_PyImport_FindExtensionUnicode(char *name, PyObject *filename)
+_PyImport_FindExtensionObject(PyObject *name, PyObject *filename)
{
PyObject *mod, *mdict;
PyModuleDef* def;
@@ -654,7 +536,7 @@ _PyImport_FindExtensionUnicode(char *name, PyObject *filename)
/* Module does not support repeated initialization */
if (def->m_base.m_copy == NULL)
return NULL;
- mod = PyImport_AddModule(name);
+ mod = PyImport_AddModuleObject(name);
if (mod == NULL)
return NULL;
mdict = PyModule_GetDict(mod);
@@ -669,30 +551,30 @@ _PyImport_FindExtensionUnicode(char *name, PyObject *filename)
mod = def->m_base.m_init();
if (mod == NULL)
return NULL;
- PyDict_SetItemString(PyImport_GetModuleDict(), name, mod);
+ PyDict_SetItem(PyImport_GetModuleDict(), name, mod);
Py_DECREF(mod);
}
if (_PyState_AddModule(mod, def) < 0) {
- PyDict_DelItemString(PyImport_GetModuleDict(), name);
+ PyDict_DelItem(PyImport_GetModuleDict(), name);
Py_DECREF(mod);
return NULL;
}
if (Py_VerboseFlag)
- PySys_FormatStderr("import %s # previously loaded (%U)\n",
+ PySys_FormatStderr("import %U # previously loaded (%R)\n",
name, filename);
return mod;
}
PyObject *
-_PyImport_FindBuiltin(char *name)
+_PyImport_FindBuiltin(const char *name)
{
- PyObject *res, *filename;
- filename = PyUnicode_FromString(name);
- if (filename == NULL)
+ PyObject *res, *nameobj;
+ nameobj = PyUnicode_InternFromString(name);
+ if (nameobj == NULL)
return NULL;
- res = _PyImport_FindExtensionUnicode(name, filename);
- Py_DECREF(filename);
+ res = _PyImport_FindExtensionObject(nameobj, nameobj);
+ Py_DECREF(nameobj);
return res;
}
@@ -703,18 +585,18 @@ _PyImport_FindBuiltin(char *name)
'NEW' REFERENCE! */
PyObject *
-PyImport_AddModule(const char *name)
+PyImport_AddModuleObject(PyObject *name)
{
PyObject *modules = PyImport_GetModuleDict();
PyObject *m;
- if ((m = PyDict_GetItemString(modules, name)) != NULL &&
+ if ((m = PyDict_GetItem(modules, name)) != NULL &&
PyModule_Check(m))
return m;
- m = PyModule_New(name);
+ m = PyModule_NewObject(name);
if (m == NULL)
return NULL;
- if (PyDict_SetItemString(modules, name, m) != 0) {
+ if (PyDict_SetItem(modules, name, m) != 0) {
Py_DECREF(m);
return NULL;
}
@@ -723,22 +605,31 @@ PyImport_AddModule(const char *name)
return m;
}
+PyObject *
+PyImport_AddModule(const char *name)
+{
+ PyObject *nameobj, *module;
+ nameobj = PyUnicode_FromString(name);
+ if (nameobj == NULL)
+ return NULL;
+ module = PyImport_AddModuleObject(nameobj);
+ Py_DECREF(nameobj);
+ return module;
+}
+
+
/* Remove name from sys.modules, if it's there. */
static void
-remove_module(const char *name)
+remove_module(PyObject *name)
{
PyObject *modules = PyImport_GetModuleDict();
- if (PyDict_GetItemString(modules, name) == NULL)
+ if (PyDict_GetItem(modules, name) == NULL)
return;
- if (PyDict_DelItemString(modules, name) < 0)
+ if (PyDict_DelItem(modules, name) < 0)
Py_FatalError("import: deleting existing key in"
"sys.modules failed");
}
-static PyObject * get_sourcefile(char *file);
-static char *make_source_pathname(char *pathname, char *buf);
-static char *make_compiled_pathname(char *pathname, char *buf, size_t buflen,
- int debug);
/* Execute a code object in a module and return the module object
* WITH INCREMENTED REFERENCE COUNT. If an error occurs, name is
@@ -768,10 +659,60 @@ PyObject *
PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,
char *cpathname)
{
+ PyObject *m = NULL;
+ PyObject *nameobj, *pathobj = NULL, *cpathobj = NULL;
+
+ nameobj = PyUnicode_FromString(name);
+ if (nameobj == NULL)
+ return NULL;
+
+ if (cpathname != NULL) {
+ cpathobj = PyUnicode_DecodeFSDefault(cpathname);
+ if (cpathobj == NULL)
+ goto error;
+ }
+ else
+ cpathobj = NULL;
+
+ if (pathname != NULL) {
+ pathobj = PyUnicode_DecodeFSDefault(pathname);
+ if (pathobj == NULL)
+ goto error;
+ }
+ else if (cpathobj != NULL) {
+ PyInterpreterState *interp = PyThreadState_GET()->interp;
+ _Py_IDENTIFIER(_get_sourcefile);
+
+ if (interp == NULL) {
+ Py_FatalError("PyImport_ExecCodeModuleWithPathnames: "
+ "no interpreter!");
+ }
+
+ pathobj = _PyObject_CallMethodObjIdArgs(interp->importlib,
+ &PyId__get_sourcefile, cpathobj,
+ NULL);
+ if (pathobj == NULL)
+ PyErr_Clear();
+ }
+ else
+ pathobj = NULL;
+
+ m = PyImport_ExecCodeModuleObject(nameobj, co, pathobj, cpathobj);
+error:
+ Py_DECREF(nameobj);
+ Py_XDECREF(pathobj);
+ Py_XDECREF(cpathobj);
+ return m;
+}
+
+PyObject*
+PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
+ PyObject *cpathname)
+{
PyObject *modules = PyImport_GetModuleDict();
PyObject *m, *d, *v;
- m = PyImport_AddModule(name);
+ m = PyImport_AddModuleObject(name);
if (m == NULL)
return NULL;
/* If the module is being reloaded, we get the old module back
@@ -782,43 +723,33 @@ PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,
PyEval_GetBuiltins()) != 0)
goto error;
}
- /* Remember the filename as the __file__ attribute */
- v = NULL;
if (pathname != NULL) {
- v = get_sourcefile(pathname);
- if (v == NULL)
- PyErr_Clear();
+ v = pathname;
}
- if (v == NULL) {
+ else {
v = ((PyCodeObject *)co)->co_filename;
- Py_INCREF(v);
}
+ Py_INCREF(v);
if (PyDict_SetItemString(d, "__file__", v) != 0)
PyErr_Clear(); /* Not important enough to report */
Py_DECREF(v);
/* Remember the pyc path name as the __cached__ attribute. */
- if (cpathname == NULL) {
- v = Py_None;
- Py_INCREF(v);
- }
- else if ((v = PyUnicode_FromString(cpathname)) == NULL) {
- PyErr_Clear(); /* Not important enough to report */
+ if (cpathname != NULL)
+ v = cpathname;
+ else
v = Py_None;
- Py_INCREF(v);
- }
if (PyDict_SetItemString(d, "__cached__", v) != 0)
PyErr_Clear(); /* Not important enough to report */
- Py_DECREF(v);
v = PyEval_EvalCode(co, d, d);
if (v == NULL)
goto error;
Py_DECREF(v);
- if ((m = PyDict_GetItemString(modules, name)) == NULL) {
+ if ((m = PyDict_GetItem(modules, name)) == NULL) {
PyErr_Format(PyExc_ImportError,
- "Loaded module %.200s not found in sys.modules",
+ "Loaded module %R not found in sys.modules",
name);
return NULL;
}
@@ -833,409 +764,6 @@ PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,
}
-/* Like strrchr(string, '/') but searches for the rightmost of either SEP
- or ALTSEP, if the latter is defined.
-*/
-static char *
-rightmost_sep(char *s)
-{
- char *found, c;
- for (found = NULL; (c = *s); s++) {
- if (c == SEP
-#ifdef ALTSEP
- || c == ALTSEP
-#endif
- )
- {
- found = s;
- }
- }
- return found;
-}
-
-
-/* Given a pathname for a Python source file, fill a buffer with the
- pathname for the corresponding compiled file. Return the pathname
- for the compiled file, or NULL if there's no space in the buffer.
- Doesn't set an exception. */
-
-static char *
-make_compiled_pathname(char *pathname, char *buf, size_t buflen, int debug)
-{
- /* foo.py -> __pycache__/foo.<tag>.pyc */
- size_t len = strlen(pathname);
- size_t i, save;
- char *pos;
- int sep = SEP;
-
- /* Sanity check that the buffer has roughly enough space to hold what
- will eventually be the full path to the compiled file. The 5 extra
- bytes include the slash afer __pycache__, the two extra dots, the
- extra trailing character ('c' or 'o') and null. This isn't exact
- because the contents of the buffer can affect how many actual
- characters of the string get into the buffer. We'll do a final
- sanity check before writing the extension to ensure we do not
- overflow the buffer.
- */
- if (len + strlen(CACHEDIR) + strlen(pyc_tag) + 5 > buflen)
- return NULL;
-
- /* Find the last path separator and copy everything from the start of
- the source string up to and including the separator.
- */
- if ((pos = rightmost_sep(pathname)) == NULL) {
- i = 0;
- }
- else {
- sep = *pos;
- i = pos - pathname + 1;
- strncpy(buf, pathname, i);
- }
-
- save = i;
- buf[i++] = '\0';
- /* Add __pycache__/ */
- strcat(buf, CACHEDIR);
- i += strlen(CACHEDIR) - 1;
- buf[i++] = sep;
- buf[i++] = '\0';
- /* Add the base filename, but remove the .py or .pyw extension, since
- the tag name must go before the extension.
- */
- strcat(buf, pathname + save);
- if ((pos = strrchr(buf, '.')) != NULL)
- *++pos = '\0';
- strcat(buf, pyc_tag);
- /* The length test above assumes that we're only adding one character
- to the end of what would normally be the extension. What if there
- is no extension, or the string ends in '.' or '.p', and otherwise
- fills the buffer? By appending 4 more characters onto the string
- here, we could overrun the buffer.
-
- As a simple example, let's say buflen=32 and the input string is
- 'xxx.py'. strlen() would be 6 and the test above would yield:
-
- (6 + 11 + 10 + 5 == 32) > 32
-
- which is false and so the name mangling would continue. This would
- be fine because we'd end up with this string in buf:
-
- __pycache__/xxx.cpython-32.pyc\0
-
- strlen(of that) == 30 + the nul fits inside a 32 character buffer.
- We can even handle an input string of say 'xxxxx' above because
- that's (5 + 11 + 10 + 5 == 31) > 32 which is also false. Name
- mangling that yields:
-
- __pycache__/xxxxxcpython-32.pyc\0
-
- which is 32 characters including the nul, and thus fits in the
- buffer. However, an input string of 'xxxxxx' would yield a result
- string of:
-
- __pycache__/xxxxxxcpython-32.pyc\0
-
- which is 33 characters long (including the nul), thus overflowing
- the buffer, even though the first test would fail, i.e.: the input
- string is also 6 characters long, so 32 > 32 is false.
-
- The reason the first test fails but we still overflow the buffer is
- that the test above only expects to add one extra character to be
- added to the extension, and here we're adding three (pyc). We
- don't add the first dot, so that reclaims one of expected
- positions, leaving us overflowing by 1 byte (3 extra - 1 reclaimed
- dot - 1 expected extra == 1 overflowed).
-
- The best we can do is ensure that we still have enough room in the
- target buffer before we write the extension. Because it's always
- only the extension that can cause the overflow, and never the other
- path bytes we've written, it's sufficient to just do one more test
- here. Still, the assertion that follows can't hurt.
- */
-#if 0
- printf("strlen(buf): %d; buflen: %d\n", (int)strlen(buf), (int)buflen);
-#endif
- if (strlen(buf) + 5 > buflen)
- return NULL;
- strcat(buf, debug ? ".pyc" : ".pyo");
- assert(strlen(buf) < buflen);
- return buf;
-}
-
-
-/* Given a pathname to a Python byte compiled file, return the path to the
- source file, if the path matches the PEP 3147 format. This does not check
- for any file existence, however, if the pyc file name does not match PEP
- 3147 style, NULL is returned. buf must be at least as big as pathname;
- the resulting path will always be shorter. */
-
-static char *
-make_source_pathname(char *pathname, char *buf)
-{
- /* __pycache__/foo.<tag>.pyc -> foo.py */
- size_t i, j;
- char *left, *right, *dot0, *dot1, sep;
-
- /* Look back two slashes from the end. In between these two slashes
- must be the string __pycache__ or this is not a PEP 3147 style
- path. It's possible for there to be only one slash.
- */
- if ((right = rightmost_sep(pathname)) == NULL)
- return NULL;
- sep = *right;
- *right = '\0';
- left = rightmost_sep(pathname);
- *right = sep;
- if (left == NULL)
- left = pathname;
- else
- left++;
- if (right-left != strlen(CACHEDIR) ||
- strncmp(left, CACHEDIR, right-left) != 0)
- return NULL;
-
- /* Now verify that the path component to the right of the last slash
- has two dots in it.
- */
- if ((dot0 = strchr(right + 1, '.')) == NULL)
- return NULL;
- if ((dot1 = strchr(dot0 + 1, '.')) == NULL)
- return NULL;
- /* Too many dots? */
- if (strchr(dot1 + 1, '.') != NULL)
- return NULL;
-
- /* This is a PEP 3147 path. Start by copying everything from the
- start of pathname up to and including the leftmost slash. Then
- copy the file's basename, removing the magic tag and adding a .py
- suffix.
- */
- strncpy(buf, pathname, (i=left-pathname));
- strncpy(buf+i, right+1, (j=dot0-right));
- strcpy(buf+i+j, "py");
- return buf;
-}
-
-/* Given a pathname for a Python source file, its time of last
- modification, and a pathname for a compiled file, check whether the
- compiled file represents the same version of the source. If so,
- return a FILE pointer for the compiled file, positioned just after
- the header; if not, return NULL.
- Doesn't set an exception. */
-
-static FILE *
-check_compiled_module(char *pathname, time_t mtime, char *cpathname)
-{
- FILE *fp;
- long magic;
- long pyc_mtime;
-
- fp = fopen(cpathname, "rb");
- if (fp == NULL)
- return NULL;
- magic = PyMarshal_ReadLongFromFile(fp);
- if (magic != pyc_magic) {
- if (Py_VerboseFlag)
- PySys_WriteStderr("# %s has bad magic\n", cpathname);
- fclose(fp);
- return NULL;
- }
- pyc_mtime = PyMarshal_ReadLongFromFile(fp);
- if (pyc_mtime != mtime) {
- if (Py_VerboseFlag)
- PySys_WriteStderr("# %s has bad mtime\n", cpathname);
- fclose(fp);
- return NULL;
- }
- if (Py_VerboseFlag)
- PySys_WriteStderr("# %s matches %s\n", cpathname, pathname);
- return fp;
-}
-
-
-/* Read a code object from a file and check it for validity */
-
-static PyCodeObject *
-read_compiled_module(char *cpathname, FILE *fp)
-{
- PyObject *co;
-
- co = PyMarshal_ReadLastObjectFromFile(fp);
- if (co == NULL)
- return NULL;
- if (!PyCode_Check(co)) {
- PyErr_Format(PyExc_ImportError,
- "Non-code object in %.200s", cpathname);
- Py_DECREF(co);
- return NULL;
- }
- return (PyCodeObject *)co;
-}
-
-
-/* Load a module from a compiled file, execute it, and return its
- module object WITH INCREMENTED REFERENCE COUNT */
-
-static PyObject *
-load_compiled_module(char *name, char *cpathname, FILE *fp)
-{
- long magic;
- PyCodeObject *co;
- PyObject *m;
-
- magic = PyMarshal_ReadLongFromFile(fp);
- if (magic != pyc_magic) {
- PyErr_Format(PyExc_ImportError,
- "Bad magic number in %.200s", cpathname);
- return NULL;
- }
- (void) PyMarshal_ReadLongFromFile(fp);
- co = read_compiled_module(cpathname, fp);
- if (co == NULL)
- return NULL;
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # precompiled from %s\n",
- name, cpathname);
- m = PyImport_ExecCodeModuleWithPathnames(
- name, (PyObject *)co, cpathname, cpathname);
- Py_DECREF(co);
-
- return m;
-}
-
-/* Parse a source file and return the corresponding code object */
-
-static PyCodeObject *
-parse_source_module(const char *pathname, FILE *fp)
-{
- PyCodeObject *co = NULL;
- mod_ty mod;
- PyCompilerFlags flags;
- PyArena *arena = PyArena_New();
- if (arena == NULL)
- return NULL;
-
- flags.cf_flags = 0;
- mod = PyParser_ASTFromFile(fp, pathname, NULL,
- Py_file_input, 0, 0, &flags,
- NULL, arena);
- if (mod) {
- co = PyAST_Compile(mod, pathname, NULL, arena);
- }
- PyArena_Free(arena);
- return co;
-}
-
-
-/* Helper to open a bytecode file for writing in exclusive mode */
-
-static FILE *
-open_exclusive(char *filename, mode_t mode)
-{
-#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC)
- /* Use O_EXCL to avoid a race condition when another process tries to
- write the same file. When that happens, our open() call fails,
- which is just fine (since it's only a cache).
- XXX If the file exists and is writable but the directory is not
- writable, the file will never be written. Oh well.
- */
- int fd;
- (void) unlink(filename);
- fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC
-#ifdef O_BINARY
- |O_BINARY /* necessary for Windows */
-#endif
-#ifdef __VMS
- , mode, "ctxt=bin", "shr=nil"
-#else
- , mode
-#endif
- );
- if (fd < 0)
- return NULL;
- return fdopen(fd, "wb");
-#else
- /* Best we can do -- on Windows this can't happen anyway */
- return fopen(filename, "wb");
-#endif
-}
-
-
-/* Write a compiled module to a file, placing the time of last
- modification of its source into the header.
- Errors are ignored, if a write error occurs an attempt is made to
- remove the file. */
-
-static void
-write_compiled_module(PyCodeObject *co, char *cpathname, struct stat *srcstat)
-{
- FILE *fp;
- char *dirpath;
- time_t mtime = srcstat->st_mtime;
-#ifdef MS_WINDOWS /* since Windows uses different permissions */
- mode_t mode = srcstat->st_mode & ~S_IEXEC;
-#else
- mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH;
- mode_t dirmode = (srcstat->st_mode |
- S_IXUSR | S_IXGRP | S_IXOTH |
- S_IWUSR | S_IWGRP | S_IWOTH);
-#endif
- int saved;
-
- /* Ensure that the __pycache__ directory exists. */
- dirpath = rightmost_sep(cpathname);
- if (dirpath == NULL) {
- if (Py_VerboseFlag)
- PySys_WriteStderr(
- "# no %s path found %s\n",
- CACHEDIR, cpathname);
- return;
- }
- saved = *dirpath;
- *dirpath = '\0';
-
-#ifdef MS_WINDOWS
- if (_mkdir(cpathname) < 0 && errno != EEXIST) {
-#else
- if (mkdir(cpathname, dirmode) < 0 && errno != EEXIST) {
-#endif
- *dirpath = saved;
- if (Py_VerboseFlag)
- PySys_WriteStderr(
- "# cannot create cache dir %s\n", cpathname);
- return;
- }
- *dirpath = saved;
-
- fp = open_exclusive(cpathname, mode);
- if (fp == NULL) {
- if (Py_VerboseFlag)
- PySys_WriteStderr(
- "# can't create %s\n", cpathname);
- return;
- }
- PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
- /* First write a 0 for mtime */
- PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION);
- PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
- if (fflush(fp) != 0 || ferror(fp)) {
- if (Py_VerboseFlag)
- PySys_WriteStderr("# can't write %s\n", cpathname);
- /* Don't keep partial file */
- fclose(fp);
- (void) unlink(cpathname);
- return;
- }
- /* Now write the true mtime (as a 32-bit field) */
- fseek(fp, 4L, 0);
- assert(mtime <= 0xFFFFFFFF);
- PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
- fflush(fp);
- fclose(fp);
- if (Py_VerboseFlag)
- PySys_WriteStderr("# wrote %s\n", cpathname);
-}
-
static void
update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
{
@@ -1260,227 +788,60 @@ update_code_filenames(PyCodeObject *co, PyObject *oldname, PyObject *newname)
}
}
-static int
-update_compiled_module(PyCodeObject *co, char *pathname)
+static void
+update_compiled_module(PyCodeObject *co, PyObject *newname)
{
- PyObject *oldname, *newname;
+ PyObject *oldname;
- newname = PyUnicode_DecodeFSDefault(pathname);
- if (newname == NULL)
- return -1;
-
- if (!PyUnicode_Compare(co->co_filename, newname)) {
- Py_DECREF(newname);
- return 0;
- }
+ if (PyUnicode_Compare(co->co_filename, newname) == 0)
+ return;
oldname = co->co_filename;
Py_INCREF(oldname);
update_code_filenames(co, oldname, newname);
Py_DECREF(oldname);
- Py_DECREF(newname);
- return 1;
}
-/* Load a source module from a given file and return its module
- object WITH INCREMENTED REFERENCE COUNT. If there's a matching
- byte-compiled file, use that instead. */
-
static PyObject *
-load_source_module(char *name, char *pathname, FILE *fp)
+imp_fix_co_filename(PyObject *self, PyObject *args)
{
- struct stat st;
- FILE *fpc;
- char *buf;
- char *cpathname;
- PyCodeObject *co = NULL;
- PyObject *m;
+ PyObject *co;
+ PyObject *file_path;
- if (fstat(fileno(fp), &st) != 0) {
- PyErr_Format(PyExc_RuntimeError,
- "unable to get file status from '%s'",
- pathname);
+ if (!PyArg_ParseTuple(args, "OO:_fix_co_filename", &co, &file_path))
return NULL;
- }
- if (sizeof st.st_mtime > 4) {
- /* Python's .pyc timestamp handling presumes that the timestamp fits
- in 4 bytes. Since the code only does an equality comparison,
- ordering is not important and we can safely ignore the higher bits
- (collisions are extremely unlikely).
- */
- st.st_mtime &= 0xFFFFFFFF;
- }
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- return PyErr_NoMemory();
- }
- cpathname = make_compiled_pathname(
- pathname, buf, (size_t)MAXPATHLEN + 1, !Py_OptimizeFlag);
- if (cpathname != NULL &&
- (fpc = check_compiled_module(pathname, st.st_mtime, cpathname))) {
- co = read_compiled_module(cpathname, fpc);
- fclose(fpc);
- if (co == NULL)
- goto error_exit;
- if (update_compiled_module(co, pathname) < 0)
- goto error_exit;
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # precompiled from %s\n",
- name, cpathname);
- pathname = cpathname;
- }
- else {
- co = parse_source_module(pathname, fp);
- if (co == NULL)
- goto error_exit;
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # from %s\n",
- name, pathname);
- if (cpathname) {
- PyObject *ro = PySys_GetObject("dont_write_bytecode");
- int b = (ro == NULL) ? 0 : PyObject_IsTrue(ro);
- if (b < 0)
- goto error_exit;
- if (!b)
- write_compiled_module(co, cpathname, &st);
- }
- }
- m = PyImport_ExecCodeModuleWithPathnames(
- name, (PyObject *)co, pathname, cpathname);
- Py_DECREF(co);
- PyMem_FREE(buf);
- return m;
-
-error_exit:
- Py_XDECREF(co);
- PyMem_FREE(buf);
- return NULL;
-}
-
-/* Get source file -> unicode or None
- * Returns the path to the py file if available, else the given path
- */
-static PyObject *
-get_sourcefile(char *file)
-{
- char *py = NULL;
- Py_ssize_t len;
- PyObject *u;
- struct stat statbuf;
-
- if (!file || !*file) {
- Py_RETURN_NONE;
+ if (!PyCode_Check(co)) {
+ PyErr_SetString(PyExc_TypeError,
+ "first argument must be a code object");
+ return NULL;
}
- len = strlen(file);
- /* match '*.py?' */
- if (len > MAXPATHLEN || PyOS_strnicmp(&file[len-4], ".py", 3) != 0) {
- return PyUnicode_DecodeFSDefault(file);
+ if (!PyUnicode_Check(file_path)) {
+ PyErr_SetString(PyExc_TypeError,
+ "second argument must be a string");
+ return NULL;
}
- py = PyMem_MALLOC(MAXPATHLEN+1);
- if (py == NULL) {
- return PyErr_NoMemory();
- }
- /* Start by trying to turn PEP 3147 path into source path. If that
- * fails, just chop off the trailing character, i.e. legacy pyc path
- * to py.
- */
- if (make_source_pathname(file, py) == NULL) {
- strncpy(py, file, len-1);
- py[len-1] = '\0';
- }
+ update_compiled_module((PyCodeObject*)co, file_path);
- if (stat(py, &statbuf) == 0 &&
- S_ISREG(statbuf.st_mode)) {
- u = PyUnicode_DecodeFSDefault(py);
- }
- else {
- u = PyUnicode_DecodeFSDefault(file);
- }
- PyMem_FREE(py);
- return u;
+ Py_RETURN_NONE;
}
-/* Forward */
-static PyObject *load_module(char *, FILE *, char *, int, PyObject *);
-static struct filedescr *find_module(char *, char *, PyObject *,
- char *, size_t, FILE **, PyObject **);
-static struct _frozen * find_frozen(char *);
-
-/* Load a package and return its module object WITH INCREMENTED
- REFERENCE COUNT */
-
-static PyObject *
-load_package(char *name, char *pathname)
-{
- PyObject *m, *d;
- PyObject *file = NULL;
- PyObject *path = NULL;
- int err;
- char *buf = NULL;
- FILE *fp = NULL;
- struct filedescr *fdp;
-
- m = PyImport_AddModule(name);
- if (m == NULL)
- return NULL;
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # directory %s\n",
- name, pathname);
- d = PyModule_GetDict(m);
- file = get_sourcefile(pathname);
- if (file == NULL)
- goto error;
- path = Py_BuildValue("[O]", file);
- if (path == NULL)
- goto error;
- err = PyDict_SetItemString(d, "__file__", file);
- if (err == 0)
- err = PyDict_SetItemString(d, "__path__", path);
- if (err != 0)
- goto error;
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- PyErr_NoMemory();
- goto error;
- }
- buf[0] = '\0';
- fdp = find_module(name, "__init__", path, buf, MAXPATHLEN+1, &fp, NULL);
- if (fdp == NULL) {
- if (PyErr_ExceptionMatches(PyExc_ImportError)) {
- PyErr_Clear();
- Py_INCREF(m);
- }
- else
- m = NULL;
- goto cleanup;
- }
- m = load_module(name, fp, buf, fdp->type, NULL);
- if (fp != NULL)
- fclose(fp);
- goto cleanup;
- error:
- m = NULL;
- cleanup:
- if (buf)
- PyMem_FREE(buf);
- Py_XDECREF(path);
- Py_XDECREF(file);
- return m;
-}
+/* Forward */
+static struct _frozen * find_frozen(PyObject *);
/* Helper to test for built-in module */
static int
-is_builtin(char *name)
+is_builtin(PyObject *name)
{
- int i;
+ int i, cmp;
for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
- if (strcmp(name, PyImport_Inittab[i].name) == 0) {
+ cmp = PyUnicode_CompareWithASCIIString(name, PyImport_Inittab[i].name);
+ if (cmp == 0) {
if (PyImport_Inittab[i].initfunc == NULL)
return -1;
else
@@ -1536,15 +897,7 @@ get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
PyErr_Clear();
}
if (importer == NULL) {
- importer = PyObject_CallFunctionObjArgs(
- (PyObject *)&PyNullImporter_Type, p, NULL
- );
- if (importer == NULL) {
- if (PyErr_ExceptionMatches(PyExc_ImportError)) {
- PyErr_Clear();
- return Py_None;
- }
- }
+ return Py_None;
}
if (importer != NULL) {
int err = PyDict_SetItem(path_importer_cache, p, importer);
@@ -1569,661 +922,38 @@ PyImport_GetImporter(PyObject *path) {
return importer;
}
-/* Search the path (default sys.path) for a module. Return the
- corresponding filedescr struct, and (via return arguments) the
- pathname and an open file. Return NULL if the module is not found. */
-
-#ifdef MS_COREDLL
-extern FILE *PyWin_FindRegisteredModule(const char *, struct filedescr **,
- char *, Py_ssize_t);
-#endif
-
-static int case_ok(char *, Py_ssize_t, Py_ssize_t, char *);
-static int find_init_module(char *); /* Forward */
-static struct filedescr importhookdescr = {"", "", IMP_HOOK};
-
-static struct filedescr *
-find_module(char *fullname, char *subname, PyObject *path, char *buf,
- size_t buflen, FILE **p_fp, PyObject **p_loader)
-{
- Py_ssize_t i, npath;
- size_t len, namelen;
- struct filedescr *fdp = NULL;
- char *filemode;
- FILE *fp = NULL;
- PyObject *path_hooks, *path_importer_cache;
- struct stat statbuf;
- static struct filedescr fd_frozen = {"", "", PY_FROZEN};
- static struct filedescr fd_builtin = {"", "", C_BUILTIN};
- static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
- char *name;
-#if defined(PYOS_OS2)
- size_t saved_len;
- size_t saved_namelen;
- char *saved_buf = NULL;
-#endif
- if (p_loader != NULL)
- *p_loader = NULL;
-
- if (strlen(subname) > MAXPATHLEN) {
- PyErr_SetString(PyExc_OverflowError,
- "module name is too long");
- return NULL;
- }
- name = PyMem_MALLOC(MAXPATHLEN+1);
- if (name == NULL) {
- PyErr_NoMemory();
- return NULL;
- }
- strcpy(name, subname);
-
- /* sys.meta_path import hook */
- if (p_loader != NULL) {
- PyObject *meta_path;
-
- meta_path = PySys_GetObject("meta_path");
- if (meta_path == NULL || !PyList_Check(meta_path)) {
- PyErr_SetString(PyExc_RuntimeError,
- "sys.meta_path must be a list of "
- "import hooks");
- goto error_exit;
- }
- Py_INCREF(meta_path); /* zap guard */
- npath = PyList_Size(meta_path);
- for (i = 0; i < npath; i++) {
- PyObject *loader;
- PyObject *hook = PyList_GetItem(meta_path, i);
- loader = PyObject_CallMethod(hook, "find_module",
- "sO", fullname,
- path != NULL ?
- path : Py_None);
- if (loader == NULL) {
- Py_DECREF(meta_path);
- goto error_exit; /* true error */
- }
- if (loader != Py_None) {
- /* a loader was found */
- *p_loader = loader;
- Py_DECREF(meta_path);
- PyMem_FREE(name);
- return &importhookdescr;
- }
- Py_DECREF(loader);
- }
- Py_DECREF(meta_path);
- }
-
- if (find_frozen(fullname) != NULL) {
- strcpy(buf, fullname);
- PyMem_FREE(name);
- return &fd_frozen;
- }
-
- if (path == NULL) {
- if (is_builtin(name)) {
- strcpy(buf, name);
- PyMem_FREE(name);
- return &fd_builtin;
- }
-#ifdef MS_COREDLL
- fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
- if (fp != NULL) {
- *p_fp = fp;
- PyMem_FREE(name);
- return fdp;
- }
-#endif
- path = PySys_GetObject("path");
- }
-
- if (path == NULL || !PyList_Check(path)) {
- PyErr_SetString(PyExc_RuntimeError,
- "sys.path must be a list of directory names");
- goto error_exit;
- }
-
- path_hooks = PySys_GetObject("path_hooks");
- if (path_hooks == NULL || !PyList_Check(path_hooks)) {
- PyErr_SetString(PyExc_RuntimeError,
- "sys.path_hooks must be a list of "
- "import hooks");
- goto error_exit;
- }
- path_importer_cache = PySys_GetObject("path_importer_cache");
- if (path_importer_cache == NULL ||
- !PyDict_Check(path_importer_cache)) {
- PyErr_SetString(PyExc_RuntimeError,
- "sys.path_importer_cache must be a dict");
- goto error_exit;
- }
-
- npath = PyList_Size(path);
- namelen = strlen(name);
- for (i = 0; i < npath; i++) {
- PyObject *v = PyList_GetItem(path, i);
- PyObject *origv = v;
- const char *base;
- Py_ssize_t size;
- if (!v)
- goto error_exit;
- if (PyUnicode_Check(v)) {
- v = PyUnicode_EncodeFSDefault(v);
- if (v == NULL)
- goto error_exit;
- }
- else if (!PyBytes_Check(v))
- continue;
- else
- Py_INCREF(v);
-
- base = PyBytes_AS_STRING(v);
- size = PyBytes_GET_SIZE(v);
- len = size;
- if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
- Py_DECREF(v);
- continue; /* Too long */
- }
- strcpy(buf, base);
- Py_DECREF(v);
-
- if (strlen(buf) != len) {
- continue; /* v contains '\0' */
- }
-
- /* sys.path_hooks import hook */
- if (p_loader != NULL) {
- PyObject *importer;
-
- importer = get_path_importer(path_importer_cache,
- path_hooks, origv);
- if (importer == NULL) {
- goto error_exit;
- }
- /* Note: importer is a borrowed reference */
- if (importer != Py_None) {
- PyObject *loader;
- loader = PyObject_CallMethod(importer,
- "find_module",
- "s", fullname);
- if (loader == NULL)
- goto error_exit; /* error */
- if (loader != Py_None) {
- /* a loader was found */
- *p_loader = loader;
- PyMem_FREE(name);
- return &importhookdescr;
- }
- Py_DECREF(loader);
- continue;
- }
- }
- /* no hook was found, use builtin import */
-
- if (len > 0 && buf[len-1] != SEP
-#ifdef ALTSEP
- && buf[len-1] != ALTSEP
-#endif
- )
- buf[len++] = SEP;
- strcpy(buf+len, name);
- len += namelen;
-
- /* Check for package import (buf holds a directory name,
- and there's an __init__ module in that directory */
-#ifdef HAVE_STAT
- if (stat(buf, &statbuf) == 0 && /* it exists */
- S_ISDIR(statbuf.st_mode) && /* it's a directory */
- case_ok(buf, len, namelen, name)) { /* case matches */
- if (find_init_module(buf)) { /* and has __init__.py */
- PyMem_FREE(name);
- return &fd_package;
- }
- else {
- int err;
- PyObject *unicode = PyUnicode_DecodeFSDefault(buf);
- if (unicode == NULL)
- goto error_exit;
- err = PyErr_WarnFormat(PyExc_ImportWarning, 1,
- "Not importing directory '%U': missing __init__.py",
- unicode);
- Py_DECREF(unicode);
- if (err)
- goto error_exit;
- }
- }
-#endif
-#if defined(PYOS_OS2)
- /* take a snapshot of the module spec for restoration
- * after the 8 character DLL hackery
- */
- saved_buf = strdup(buf);
- saved_len = len;
- saved_namelen = namelen;
-#endif /* PYOS_OS2 */
- for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
- struct stat statbuf;
-#if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING)
- /* OS/2 limits DLLs to 8 character names (w/o
- extension)
- * so if the name is longer than that and its a
- * dynamically loaded module we're going to try,
- * truncate the name before trying
- */
- if (strlen(subname) > 8) {
- /* is this an attempt to load a C extension? */
- const struct filedescr *scan;
- scan = _PyImport_DynLoadFiletab;
- while (scan->suffix != NULL) {
- if (!strcmp(scan->suffix, fdp->suffix))
- break;
- else
- scan++;
- }
- if (scan->suffix != NULL) {
- /* yes, so truncate the name */
- namelen = 8;
- len -= strlen(subname) - namelen;
- buf[len] = '\0';
- }
- }
-#endif /* PYOS_OS2 */
- strcpy(buf+len, fdp->suffix);
- if (Py_VerboseFlag > 1)
- PySys_WriteStderr("# trying %s\n", buf);
-
- filemode = fdp->mode;
- if (filemode[0] == 'U')
- filemode = "r" PY_STDIOTEXTMODE;
-
- if (stat(buf, &statbuf) == 0 && S_ISDIR(statbuf.st_mode))
- /* it's a directory */
- fp = NULL;
- else
- fp = fopen(buf, filemode);
- if (fp != NULL) {
- if (case_ok(buf, len, namelen, name))
- break;
- else { /* continue search */
- fclose(fp);
- fp = NULL;
- }
- }
-#if defined(PYOS_OS2)
- /* restore the saved snapshot */
- strcpy(buf, saved_buf);
- len = saved_len;
- namelen = saved_namelen;
-#endif
- }
-#if defined(PYOS_OS2)
- /* don't need/want the module name snapshot anymore */
- if (saved_buf)
- {
- free(saved_buf);
- saved_buf = NULL;
- }
-#endif
- if (fp != NULL)
- break;
- }
- if (fp == NULL) {
- PyErr_Format(PyExc_ImportError,
- "No module named %.200s", name);
- goto error_exit;
- }
- *p_fp = fp;
- PyMem_FREE(name);
- return fdp;
-
-error_exit:
- PyMem_FREE(name);
- return NULL;
-}
-
-/* case_ok(char* buf, Py_ssize_t len, Py_ssize_t namelen, char* name)
- * The arguments here are tricky, best shown by example:
- * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
- * ^ ^ ^ ^
- * |--------------------- buf ---------------------|
- * |------------------- len ------------------|
- * |------ name -------|
- * |----- namelen -----|
- * buf is the full path, but len only counts up to (& exclusive of) the
- * extension. name is the module name, also exclusive of extension.
- *
- * We've already done a successful stat() or fopen() on buf, so know that
- * there's some match, possibly case-insensitive.
- *
- * case_ok() is to return 1 if there's a case-sensitive match for
- * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
- * exists.
- *
- * case_ok() is used to implement case-sensitive import semantics even
- * on platforms with case-insensitive filesystems. It's trivial to implement
- * for case-sensitive filesystems. It's pretty much a cross-platform
- * nightmare for systems with case-insensitive filesystems.
- */
-
-/* First we may need a pile of platform-specific header files; the sequence
- * of #if's here should match the sequence in the body of case_ok().
- */
-#if defined(MS_WINDOWS)
-#include <windows.h>
-
-#elif defined(DJGPP)
-#include <dir.h>
-
-#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
-#include <sys/types.h>
-#include <dirent.h>
-
-#elif defined(PYOS_OS2)
-#define INCL_DOS
-#define INCL_DOSERRORS
-#define INCL_NOPMAPI
-#include <os2.h>
-#endif
-
-static int
-case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
-{
-/* Pick a platform-specific implementation; the sequence of #if's here should
- * match the sequence just above.
- */
-
-/* MS_WINDOWS */
-#if defined(MS_WINDOWS)
- WIN32_FIND_DATA data;
- HANDLE h;
-
- if (Py_GETENV("PYTHONCASEOK") != NULL)
- return 1;
-
- h = FindFirstFile(buf, &data);
- if (h == INVALID_HANDLE_VALUE) {
- PyErr_Format(PyExc_NameError,
- "Can't find file for module %.100s\n(filename %.300s)",
- name, buf);
- return 0;
- }
- FindClose(h);
- return strncmp(data.cFileName, name, namelen) == 0;
-
-/* DJGPP */
-#elif defined(DJGPP)
- struct ffblk ffblk;
- int done;
-
- if (Py_GETENV("PYTHONCASEOK") != NULL)
- return 1;
-
- done = findfirst(buf, &ffblk, FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_DIREC);
- if (done) {
- PyErr_Format(PyExc_NameError,
- "Can't find file for module %.100s\n(filename %.300s)",
- name, buf);
- return 0;
- }
- return strncmp(ffblk.ff_name, name, namelen) == 0;
-
-/* new-fangled macintosh (macosx) or Cygwin */
-#elif (defined(__MACH__) && defined(__APPLE__) || defined(__CYGWIN__)) && defined(HAVE_DIRENT_H)
- DIR *dirp;
- struct dirent *dp;
- char dirname[MAXPATHLEN + 1];
- const int dirlen = len - namelen - 1; /* don't want trailing SEP */
-
- if (Py_GETENV("PYTHONCASEOK") != NULL)
- return 1;
-
- /* Copy the dir component into dirname; substitute "." if empty */
- if (dirlen <= 0) {
- dirname[0] = '.';
- dirname[1] = '\0';
- }
- else {
- assert(dirlen <= MAXPATHLEN);
- memcpy(dirname, buf, dirlen);
- dirname[dirlen] = '\0';
- }
- /* Open the directory and search the entries for an exact match. */
- dirp = opendir(dirname);
- if (dirp) {
- char *nameWithExt = buf + len - namelen;
- while ((dp = readdir(dirp)) != NULL) {
- const int thislen =
-#ifdef _DIRENT_HAVE_D_NAMELEN
- dp->d_namlen;
-#else
- strlen(dp->d_name);
-#endif
- if (thislen >= namelen &&
- strcmp(dp->d_name, nameWithExt) == 0) {
- (void)closedir(dirp);
- return 1; /* Found */
- }
- }
- (void)closedir(dirp);
- }
- return 0 ; /* Not found */
-
-/* OS/2 */
-#elif defined(PYOS_OS2)
- HDIR hdir = 1;
- ULONG srchcnt = 1;
- FILEFINDBUF3 ffbuf;
- APIRET rc;
-
- if (Py_GETENV("PYTHONCASEOK") != NULL)
- return 1;
-
- rc = DosFindFirst(buf,
- &hdir,
- FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
- &ffbuf, sizeof(ffbuf),
- &srchcnt,
- FIL_STANDARD);
- if (rc != NO_ERROR)
- return 0;
- return strncmp(ffbuf.achName, name, namelen) == 0;
-
-/* assuming it's a case-sensitive filesystem, so there's nothing to do! */
-#else
- return 1;
-
-#endif
-}
-
-#ifdef HAVE_STAT
-
-/* Helper to look for __init__.py or __init__.py[co] in potential package */
-static int
-find_init_module(char *buf)
-{
- const size_t save_len = strlen(buf);
- size_t i = save_len;
- char *pname; /* pointer to start of __init__ */
- struct stat statbuf;
-
-/* For calling case_ok(buf, len, namelen, name):
- * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
- * ^ ^ ^ ^
- * |--------------------- buf ---------------------|
- * |------------------- len ------------------|
- * |------ name -------|
- * |----- namelen -----|
- */
- if (save_len + 13 >= MAXPATHLEN)
- return 0;
- buf[i++] = SEP;
- pname = buf + i;
- strcpy(pname, "__init__.py");
- if (stat(buf, &statbuf) == 0) {
- if (case_ok(buf,
- save_len + 9, /* len("/__init__") */
- 8, /* len("__init__") */
- pname)) {
- buf[save_len] = '\0';
- return 1;
- }
- }
- i += strlen(pname);
- strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
- if (stat(buf, &statbuf) == 0) {
- if (case_ok(buf,
- save_len + 9, /* len("/__init__") */
- 8, /* len("__init__") */
- pname)) {
- buf[save_len] = '\0';
- return 1;
- }
- }
- buf[save_len] = '\0';
- return 0;
-}
-
-#endif /* HAVE_STAT */
-
-
-static int init_builtin(char *); /* Forward */
-
-static PyObject*
-load_builtin(char *name, char *pathname, int type)
-{
- PyObject *m, *modules;
- int err;
-
- if (pathname != NULL && pathname[0] != '\0')
- name = pathname;
-
- if (type == C_BUILTIN)
- err = init_builtin(name);
- else
- err = PyImport_ImportFrozenModule(name);
- if (err < 0)
- return NULL;
- if (err == 0) {
- PyErr_Format(PyExc_ImportError,
- "Purported %s module %.200s not found",
- type == C_BUILTIN ?
- "builtin" : "frozen",
- name);
- return NULL;
- }
-
- modules = PyImport_GetModuleDict();
- m = PyDict_GetItemString(modules, name);
- if (m == NULL) {
- PyErr_Format(
- PyExc_ImportError,
- "%s module %.200s not properly initialized",
- type == C_BUILTIN ?
- "builtin" : "frozen",
- name);
- return NULL;
- }
- Py_INCREF(m);
- return m;
-}
-
-/* Load an external module using the default search path and return
- its module object WITH INCREMENTED REFERENCE COUNT */
-
-static PyObject *
-load_module(char *name, FILE *fp, char *pathname, int type, PyObject *loader)
-{
- PyObject *m;
-
- /* First check that there's an open file (if we need one) */
- switch (type) {
- case PY_SOURCE:
- case PY_COMPILED:
- if (fp == NULL) {
- PyErr_Format(PyExc_ValueError,
- "file object required for import (type code %d)",
- type);
- return NULL;
- }
- }
-
- switch (type) {
-
- case PY_SOURCE:
- m = load_source_module(name, pathname, fp);
- break;
-
- case PY_COMPILED:
- m = load_compiled_module(name, pathname, fp);
- break;
-
-#ifdef HAVE_DYNAMIC_LOADING
- case C_EXTENSION:
- m = _PyImport_LoadDynamicModule(name, pathname, fp);
- break;
-#endif
-
- case PKG_DIRECTORY:
- m = load_package(name, pathname);
- break;
-
- case C_BUILTIN:
- case PY_FROZEN:
- m = load_builtin(name, pathname, type);
- break;
-
- case IMP_HOOK: {
- if (loader == NULL) {
- PyErr_SetString(PyExc_ImportError,
- "import hook without loader");
- return NULL;
- }
- m = PyObject_CallMethod(loader, "load_module", "s", name);
- break;
- }
-
- default:
- PyErr_Format(PyExc_ImportError,
- "Don't know how to import %.200s (type code %d)",
- name, type);
- m = NULL;
-
- }
-
- return m;
-}
+static int init_builtin(PyObject *); /* Forward */
/* Initialize a built-in module.
Return 1 for success, 0 if the module is not found, and -1 with
an exception set if the initialization failed. */
static int
-init_builtin(char *name)
+init_builtin(PyObject *name)
{
struct _inittab *p;
- if (_PyImport_FindBuiltin(name) != NULL)
+ if (_PyImport_FindExtensionObject(name, name) != NULL)
return 1;
for (p = PyImport_Inittab; p->name != NULL; p++) {
PyObject *mod;
PyModuleDef *def;
- if (strcmp(name, p->name) == 0) {
+ if (PyUnicode_CompareWithASCIIString(name, p->name) == 0) {
if (p->initfunc == NULL) {
PyErr_Format(PyExc_ImportError,
- "Cannot re-init internal module %.200s",
+ "Cannot re-init internal module %R",
name);
return -1;
}
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # builtin\n", name);
mod = (*p->initfunc)();
if (mod == 0)
return -1;
/* Remember pointer to module init function. */
def = PyModule_GetDef(mod);
def->m_base.m_init = p->initfunc;
- if (_PyImport_FixupBuiltin(mod, name) < 0)
+ if (_PyImport_FixupExtensionObject(mod, name, name) < 0)
return -1;
/* FixupExtension has put the module into sys.modules,
so we can release our own reference. */
@@ -2238,37 +968,37 @@ init_builtin(char *name)
/* Frozen modules */
static struct _frozen *
-find_frozen(char *name)
+find_frozen(PyObject *name)
{
struct _frozen *p;
- if (!name)
+ if (name == NULL)
return NULL;
for (p = PyImport_FrozenModules; ; p++) {
if (p->name == NULL)
return NULL;
- if (strcmp(p->name, name) == 0)
+ if (PyUnicode_CompareWithASCIIString(name, p->name) == 0)
break;
}
return p;
}
static PyObject *
-get_frozen_object(char *name)
+get_frozen_object(PyObject *name)
{
struct _frozen *p = find_frozen(name);
int size;
if (p == NULL) {
PyErr_Format(PyExc_ImportError,
- "No such frozen object named %.200s",
+ "No such frozen object named %R",
name);
return NULL;
}
if (p->code == NULL) {
PyErr_Format(PyExc_ImportError,
- "Excluded frozen object named %.200s",
+ "Excluded frozen object named %R",
name);
return NULL;
}
@@ -2279,14 +1009,14 @@ get_frozen_object(char *name)
}
static PyObject *
-is_frozen_package(char *name)
+is_frozen_package(PyObject *name)
{
struct _frozen *p = find_frozen(name);
int size;
if (p == NULL) {
PyErr_Format(PyExc_ImportError,
- "No such frozen object named %.200s",
+ "No such frozen object named %R",
name);
return NULL;
}
@@ -2306,19 +1036,20 @@ is_frozen_package(char *name)
This function is also used from frozenmain.c */
int
-PyImport_ImportFrozenModule(char *name)
+PyImport_ImportFrozenModuleObject(PyObject *name)
{
- struct _frozen *p = find_frozen(name);
- PyObject *co;
- PyObject *m;
+ struct _frozen *p;
+ PyObject *co, *m, *path;
int ispackage;
int size;
+ p = find_frozen(name);
+
if (p == NULL)
return 0;
if (p->code == NULL) {
PyErr_Format(PyExc_ImportError,
- "Excluded frozen object named %.200s",
+ "Excluded frozen object named %R",
name);
return -1;
}
@@ -2326,41 +1057,39 @@ PyImport_ImportFrozenModule(char *name)
ispackage = (size < 0);
if (ispackage)
size = -size;
- if (Py_VerboseFlag)
- PySys_WriteStderr("import %s # frozen%s\n",
- name, ispackage ? " package" : "");
co = PyMarshal_ReadObjectFromString((char *)p->code, size);
if (co == NULL)
return -1;
if (!PyCode_Check(co)) {
PyErr_Format(PyExc_TypeError,
- "frozen object %.200s is not a code object",
+ "frozen object %R is not a code object",
name);
goto err_return;
}
if (ispackage) {
/* Set __path__ to the package name */
- PyObject *d, *s, *l;
+ PyObject *d, *l;
int err;
- m = PyImport_AddModule(name);
+ m = PyImport_AddModuleObject(name);
if (m == NULL)
goto err_return;
d = PyModule_GetDict(m);
- s = PyUnicode_InternFromString(name);
- if (s == NULL)
- goto err_return;
l = PyList_New(1);
if (l == NULL) {
- Py_DECREF(s);
goto err_return;
}
- PyList_SET_ITEM(l, 0, s);
+ Py_INCREF(name);
+ PyList_SET_ITEM(l, 0, name);
err = PyDict_SetItemString(d, "__path__", l);
Py_DECREF(l);
if (err != 0)
goto err_return;
}
- m = PyImport_ExecCodeModuleEx(name, co, "<frozen>");
+ path = PyUnicode_FromString("<frozen>");
+ if (path == NULL)
+ goto err_return;
+ m = PyImport_ExecCodeModuleObject(name, co, path, NULL);
+ Py_DECREF(path);
if (m == NULL)
goto err_return;
Py_DECREF(co);
@@ -2371,6 +1100,19 @@ err_return:
return -1;
}
+int
+PyImport_ImportFrozenModule(char *name)
+{
+ PyObject *nameobj;
+ int ret;
+ nameobj = PyUnicode_InternFromString(name);
+ if (nameobj == NULL)
+ return -1;
+ ret = PyImport_ImportFrozenModuleObject(nameobj);
+ Py_DECREF(nameobj);
+ return ret;
+}
+
/* Import a module, either built-in, frozen, or external, and return
its module object WITH INCREMENTED REFERENCE COUNT */
@@ -2401,585 +1143,411 @@ PyImport_ImportModule(const char *name)
PyObject *
PyImport_ImportModuleNoBlock(const char *name)
{
- PyObject *result;
- PyObject *modules;
-#ifdef WITH_THREAD
- long me;
-#endif
-
- /* Try to get the module from sys.modules[name] */
- modules = PyImport_GetModuleDict();
- if (modules == NULL)
- return NULL;
-
- result = PyDict_GetItemString(modules, name);
- if (result != NULL) {
- Py_INCREF(result);
- return result;
- }
- else {
- PyErr_Clear();
- }
-#ifdef WITH_THREAD
- /* check the import lock
- * me might be -1 but I ignore the error here, the lock function
- * takes care of the problem */
- me = PyThread_get_thread_ident();
- if (import_lock_thread == -1 || import_lock_thread == me) {
- /* no thread or me is holding the lock */
- return PyImport_ImportModule(name);
- }
- else {
- PyErr_Format(PyExc_ImportError,
- "Failed to import %.200s because the import lock"
- "is held by another thread.",
- name);
- return NULL;
- }
-#else
return PyImport_ImportModule(name);
-#endif
}
-/* Forward declarations for helper routines */
-static PyObject *get_parent(PyObject *globals, char *buf,
- Py_ssize_t *p_buflen, int level);
-static PyObject *load_next(PyObject *mod, PyObject *altmod,
- char **p_name, char *buf, Py_ssize_t *p_buflen);
-static int mark_miss(char *name);
-static int ensure_fromlist(PyObject *mod, PyObject *fromlist,
- char *buf, Py_ssize_t buflen, int recursive);
-static PyObject * import_submodule(PyObject *mod, char *name, char *fullname);
-
-/* The Magnum Opus of dotted-name import :-) */
-
-static PyObject *
-import_module_level(char *name, PyObject *globals, PyObject *locals,
- PyObject *fromlist, int level)
-{
- char *buf;
- Py_ssize_t buflen = 0;
- PyObject *parent, *head, *next, *tail;
- if (strchr(name, '/') != NULL
-#ifdef MS_WINDOWS
- || strchr(name, '\\') != NULL
-#endif
- ) {
- PyErr_SetString(PyExc_ImportError,
- "Import by filename is not supported.");
- return NULL;
+/* Remove importlib frames from the traceback,
+ * except in Verbose mode. */
+static void
+remove_importlib_frames(void)
+{
+ const char *importlib_filename = "<frozen importlib._bootstrap>";
+ const char *remove_frames = "_call_with_frames_removed";
+ int always_trim = 0;
+ int in_importlib = 0;
+ PyObject *exception, *value, *base_tb, *tb;
+ PyObject **prev_link, **outer_link = NULL;
+
+ /* Synopsis: if it's an ImportError, we trim all importlib chunks
+ from the traceback. We always trim chunks
+ which end with a call to "_call_with_frames_removed". */
+
+ PyErr_Fetch(&exception, &value, &base_tb);
+ if (!exception || Py_VerboseFlag)
+ goto done;
+ if (PyType_IsSubtype((PyTypeObject *) exception,
+ (PyTypeObject *) PyExc_ImportError))
+ always_trim = 1;
+
+ prev_link = &base_tb;
+ tb = base_tb;
+ while (tb != NULL) {
+ PyTracebackObject *traceback = (PyTracebackObject *)tb;
+ PyObject *next = (PyObject *) traceback->tb_next;
+ PyFrameObject *frame = traceback->tb_frame;
+ PyCodeObject *code = frame->f_code;
+ int now_in_importlib;
+
+ assert(PyTraceBack_Check(tb));
+ now_in_importlib = (PyUnicode_CompareWithASCIIString(
+ code->co_filename,
+ importlib_filename) == 0);
+ if (now_in_importlib && !in_importlib) {
+ /* This is the link to this chunk of importlib tracebacks */
+ outer_link = prev_link;
+ }
+ in_importlib = now_in_importlib;
+
+ if (in_importlib &&
+ (always_trim ||
+ PyUnicode_CompareWithASCIIString(code->co_name,
+ remove_frames) == 0)) {
+ PyObject *tmp = *outer_link;
+ *outer_link = next;
+ Py_XINCREF(next);
+ Py_DECREF(tmp);
+ prev_link = outer_link;
+ }
+ else {
+ prev_link = (PyObject **) &traceback->tb_next;
+ }
+ tb = next;
}
+done:
+ PyErr_Restore(exception, value, base_tb);
+}
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- return PyErr_NoMemory();
- }
- parent = get_parent(globals, buf, &buflen, level);
- if (parent == NULL)
- goto error_exit;
- head = load_next(parent, level < 0 ? Py_None : parent, &name, buf,
- &buflen);
- if (head == NULL)
- goto error_exit;
+PyObject *
+PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals,
+ PyObject *locals, PyObject *given_fromlist,
+ int level)
+{
+ _Py_IDENTIFIER(__import__);
+ _Py_IDENTIFIER(__initializing__);
+ _Py_IDENTIFIER(__package__);
+ _Py_IDENTIFIER(__path__);
+ _Py_IDENTIFIER(__name__);
+ _Py_IDENTIFIER(_find_and_load);
+ _Py_IDENTIFIER(_handle_fromlist);
+ _Py_IDENTIFIER(_lock_unlock_module);
+ _Py_static_string(single_dot, ".");
+ PyObject *abs_name = NULL;
+ PyObject *builtins_import = NULL;
+ PyObject *final_mod = NULL;
+ PyObject *mod = NULL;
+ PyObject *package = NULL;
+ PyObject *globals = NULL;
+ PyObject *fromlist = NULL;
+ PyInterpreterState *interp = PyThreadState_GET()->interp;
- tail = head;
- Py_INCREF(tail);
- while (name) {
- next = load_next(tail, tail, &name, buf, &buflen);
- Py_DECREF(tail);
- if (next == NULL) {
- Py_DECREF(head);
- goto error_exit;
+ /* Make sure to use default values so as to not have
+ PyObject_CallMethodObjArgs() truncate the parameter list because of a
+ NULL argument. */
+ if (given_globals == NULL) {
+ globals = PyDict_New();
+ if (globals == NULL) {
+ goto error;
}
- tail = next;
- }
- if (tail == Py_None) {
- /* If tail is Py_None, both get_parent and load_next found
- an empty module name: someone called __import__("") or
- doctored faulty bytecode */
- Py_DECREF(tail);
- Py_DECREF(head);
- PyErr_SetString(PyExc_ValueError,
- "Empty module name");
- goto error_exit;
- }
-
- if (fromlist != NULL) {
- int b = (fromlist == Py_None) ? 0 : PyObject_IsTrue(fromlist);
- if (b < 0) {
- Py_DECREF(tail);
- Py_DECREF(head);
- goto error_exit;
+ }
+ else {
+ /* Only have to care what given_globals is if it will be used
+ for something. */
+ if (level > 0 && !PyDict_Check(given_globals)) {
+ PyErr_SetString(PyExc_TypeError, "globals must be a dict");
+ goto error;
}
- if (!b)
- fromlist = NULL;
+ globals = given_globals;
+ Py_INCREF(globals);
}
- if (fromlist == NULL) {
- Py_DECREF(tail);
- PyMem_FREE(buf);
- return head;
+ if (given_fromlist == NULL) {
+ fromlist = PyList_New(0);
+ if (fromlist == NULL) {
+ goto error;
+ }
}
-
- Py_DECREF(head);
- if (!ensure_fromlist(tail, fromlist, buf, buflen, 0)) {
- Py_DECREF(tail);
- goto error_exit;
+ else {
+ fromlist = given_fromlist;
+ Py_INCREF(fromlist);
}
-
- PyMem_FREE(buf);
- return tail;
-
-error_exit:
- PyMem_FREE(buf);
- return NULL;
-}
-
-PyObject *
-PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
- PyObject *fromlist, int level)
-{
- PyObject *result;
- _PyImport_AcquireLock();
- result = import_module_level(name, globals, locals, fromlist, level);
- if (_PyImport_ReleaseLock() < 0) {
- Py_XDECREF(result);
- PyErr_SetString(PyExc_RuntimeError,
- "not holding the import lock");
- return NULL;
+ if (name == NULL) {
+ PyErr_SetString(PyExc_ValueError, "Empty module name");
+ goto error;
}
- return result;
-}
-
-/* Return the package that an import is being performed in. If globals comes
- from the module foo.bar.bat (not itself a package), this returns the
- sys.modules entry for foo.bar. If globals is from a package's __init__.py,
- the package's entry in sys.modules is returned, as a borrowed reference.
-
- The *name* of the returned package is returned in buf, with the length of
- the name in *p_buflen.
- If globals doesn't come from a package or a module in a package, or a
- corresponding entry is not found in sys.modules, Py_None is returned.
-*/
-static PyObject *
-get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
-{
- static PyObject *namestr = NULL;
- static PyObject *pathstr = NULL;
- static PyObject *pkgstr = NULL;
- PyObject *pkgname, *modname, *modpath, *modules, *parent;
- int orig_level = level;
+ /* The below code is importlib.__import__() & _gcd_import(), ported to C
+ for added performance. */
- if (globals == NULL || !PyDict_Check(globals) || !level)
- return Py_None;
-
- if (namestr == NULL) {
- namestr = PyUnicode_InternFromString("__name__");
- if (namestr == NULL)
- return NULL;
+ if (!PyUnicode_Check(name)) {
+ PyErr_SetString(PyExc_TypeError, "module name must be a string");
+ goto error;
}
- if (pathstr == NULL) {
- pathstr = PyUnicode_InternFromString("__path__");
- if (pathstr == NULL)
- return NULL;
+ else if (PyUnicode_READY(name) < 0) {
+ goto error;
}
- if (pkgstr == NULL) {
- pkgstr = PyUnicode_InternFromString("__package__");
- if (pkgstr == NULL)
- return NULL;
+ if (level < 0) {
+ PyErr_SetString(PyExc_ValueError, "level must be >= 0");
+ goto error;
}
-
- *buf = '\0';
- *p_buflen = 0;
- pkgname = PyDict_GetItem(globals, pkgstr);
-
- if ((pkgname != NULL) && (pkgname != Py_None)) {
- /* __package__ is set, so use it */
- char *pkgname_str;
- Py_ssize_t len;
-
- if (!PyUnicode_Check(pkgname)) {
- PyErr_SetString(PyExc_ValueError,
- "__package__ set to non-string");
- return NULL;
- }
- pkgname_str = _PyUnicode_AsStringAndSize(pkgname, &len);
- if (len == 0) {
- if (level > 0) {
- PyErr_SetString(PyExc_ValueError,
- "Attempted relative import in non-package");
- return NULL;
+ else if (level > 0) {
+ package = _PyDict_GetItemId(globals, &PyId___package__);
+ if (package != NULL && package != Py_None) {
+ Py_INCREF(package);
+ if (!PyUnicode_Check(package)) {
+ PyErr_SetString(PyExc_TypeError, "package must be a string");
+ goto error;
}
- return Py_None;
}
- if (len > MAXPATHLEN) {
- PyErr_SetString(PyExc_ValueError,
- "Package name too long");
- return NULL;
- }
- strcpy(buf, pkgname_str);
- } else {
- /* __package__ not set, so figure it out and set it */
- modname = PyDict_GetItem(globals, namestr);
- if (modname == NULL || !PyUnicode_Check(modname))
- return Py_None;
-
- modpath = PyDict_GetItem(globals, pathstr);
- if (modpath != NULL) {
- /* __path__ is set, so modname is already the package name */
- char *modname_str;
- Py_ssize_t len;
- int error;
-
- modname_str = _PyUnicode_AsStringAndSize(modname, &len);
- if (len > MAXPATHLEN) {
- PyErr_SetString(PyExc_ValueError,
- "Module name too long");
- return NULL;
+ else {
+ package = _PyDict_GetItemId(globals, &PyId___name__);
+ if (package == NULL) {
+ PyErr_SetString(PyExc_KeyError, "'__name__' not in globals");
+ goto error;
}
- strcpy(buf, modname_str);
- error = PyDict_SetItem(globals, pkgstr, modname);
- if (error) {
- PyErr_SetString(PyExc_ValueError,
- "Could not set __package__");
- return NULL;
+ else if (!PyUnicode_Check(package)) {
+ PyErr_SetString(PyExc_TypeError, "__name__ must be a string");
}
- } else {
- /* Normal module, so work out the package name if any */
- char *start = _PyUnicode_AsString(modname);
- char *lastdot = strrchr(start, '.');
- size_t len;
- int error;
- if (lastdot == NULL && level > 0) {
- PyErr_SetString(PyExc_ValueError,
- "Attempted relative import in non-package");
- return NULL;
- }
- if (lastdot == NULL) {
- error = PyDict_SetItem(globals, pkgstr, Py_None);
- if (error) {
- PyErr_SetString(PyExc_ValueError,
- "Could not set __package__");
- return NULL;
+ Py_INCREF(package);
+
+ if (_PyDict_GetItemId(globals, &PyId___path__) == NULL) {
+ PyObject *partition = NULL;
+ PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot);
+ if (borrowed_dot == NULL) {
+ goto error;
}
- return Py_None;
- }
- len = lastdot - start;
- if (len >= MAXPATHLEN) {
- PyErr_SetString(PyExc_ValueError,
- "Module name too long");
- return NULL;
- }
- strncpy(buf, start, len);
- buf[len] = '\0';
- pkgname = PyUnicode_FromString(buf);
- if (pkgname == NULL) {
- return NULL;
- }
- error = PyDict_SetItem(globals, pkgstr, pkgname);
- Py_DECREF(pkgname);
- if (error) {
- PyErr_SetString(PyExc_ValueError,
- "Could not set __package__");
- return NULL;
+ partition = PyUnicode_RPartition(package, borrowed_dot);
+ Py_DECREF(package);
+ if (partition == NULL) {
+ goto error;
+ }
+ package = PyTuple_GET_ITEM(partition, 0);
+ Py_INCREF(package);
+ Py_DECREF(partition);
}
}
+
+ if (PyDict_GetItem(interp->modules, package) == NULL) {
+ PyErr_Format(PyExc_SystemError,
+ "Parent module %R not loaded, cannot perform relative "
+ "import", package);
+ goto error;
+ }
}
- while (--level > 0) {
- char *dot = strrchr(buf, '.');
- if (dot == NULL) {
- PyErr_SetString(PyExc_ValueError,
- "Attempted relative import beyond "
- "toplevel package");
- return NULL;
+ else { /* level == 0 */
+ if (PyUnicode_GET_LENGTH(name) == 0) {
+ PyErr_SetString(PyExc_ValueError, "Empty module name");
+ goto error;
}
- *dot = '\0';
+ package = Py_None;
+ Py_INCREF(package);
}
- *p_buflen = strlen(buf);
- modules = PyImport_GetModuleDict();
- parent = PyDict_GetItemString(modules, buf);
- if (parent == NULL) {
- if (orig_level < 1) {
- PyObject *err_msg = PyBytes_FromFormat(
- "Parent module '%.200s' not found "
- "while handling absolute import", buf);
- if (err_msg == NULL) {
- return NULL;
+ if (level > 0) {
+ Py_ssize_t last_dot = PyUnicode_GET_LENGTH(package);
+ PyObject *base = NULL;
+ int level_up = 1;
+
+ for (level_up = 1; level_up < level; level_up += 1) {
+ last_dot = PyUnicode_FindChar(package, '.', 0, last_dot, -1);
+ if (last_dot == -2) {
+ goto error;
}
- if (!PyErr_WarnEx(PyExc_RuntimeWarning,
- PyBytes_AsString(err_msg), 1)) {
- *buf = '\0';
- *p_buflen = 0;
- parent = Py_None;
+ else if (last_dot == -1) {
+ PyErr_SetString(PyExc_ValueError,
+ "attempted relative import beyond top-level "
+ "package");
+ goto error;
}
- Py_DECREF(err_msg);
- } else {
- PyErr_Format(PyExc_SystemError,
- "Parent module '%.200s' not loaded, "
- "cannot perform relative import", buf);
}
- }
- return parent;
- /* We expect, but can't guarantee, if parent != None, that:
- - parent.__name__ == buf
- - parent.__dict__ is globals
- If this is violated... Who cares? */
-}
-
-/* altmod is either None or same as mod */
-static PyObject *
-load_next(PyObject *mod, PyObject *altmod, char **p_name, char *buf,
- Py_ssize_t *p_buflen)
-{
- char *name = *p_name;
- char *dot = strchr(name, '.');
- size_t len;
- char *p;
- PyObject *result;
-
- if (strlen(name) == 0) {
- /* completely empty module name should only happen in
- 'from . import' (or '__import__("")')*/
- Py_INCREF(mod);
- *p_name = NULL;
- return mod;
- }
+ base = PyUnicode_Substring(package, 0, last_dot);
+ if (PyUnicode_GET_LENGTH(name) > 0) {
+ PyObject *borrowed_dot, *seq = NULL;
+
+ borrowed_dot = _PyUnicode_FromId(&single_dot);
+ seq = PyTuple_Pack(2, base, name);
+ Py_DECREF(base);
+ if (borrowed_dot == NULL || seq == NULL) {
+ goto error;
+ }
- if (dot == NULL) {
- *p_name = NULL;
- len = strlen(name);
+ abs_name = PyUnicode_Join(borrowed_dot, seq);
+ Py_DECREF(seq);
+ if (abs_name == NULL) {
+ goto error;
+ }
+ }
+ else {
+ abs_name = base;
+ }
}
else {
- *p_name = dot+1;
- len = dot-name;
- }
- if (len == 0) {
- PyErr_SetString(PyExc_ValueError,
- "Empty module name");
- return NULL;
+ abs_name = name;
+ Py_INCREF(abs_name);
}
- p = buf + *p_buflen;
- if (p != buf)
- *p++ = '.';
- if (p+len-buf >= MAXPATHLEN) {
- PyErr_SetString(PyExc_ValueError,
- "Module name too long");
- return NULL;
- }
- strncpy(p, name, len);
- p[len] = '\0';
- *p_buflen = p+len-buf;
-
- result = import_submodule(mod, p, buf);
- if (result == Py_None && altmod != mod) {
- Py_DECREF(result);
- /* Here, altmod must be None and mod must not be None */
- result = import_submodule(altmod, p, p);
- if (result != NULL && result != Py_None) {
- if (mark_miss(buf) != 0) {
- Py_DECREF(result);
- return NULL;
- }
- strncpy(buf, name, len);
- buf[len] = '\0';
- *p_buflen = len;
+#ifdef WITH_THREAD
+ _PyImport_AcquireLock();
+#endif
+ /* From this point forward, goto error_with_unlock! */
+ if (PyDict_Check(globals)) {
+ builtins_import = _PyDict_GetItemId(globals, &PyId___import__);
+ }
+ if (builtins_import == NULL) {
+ builtins_import = _PyDict_GetItemId(interp->builtins, &PyId___import__);
+ if (builtins_import == NULL) {
+ Py_FatalError("__import__ missing");
}
}
- if (result == NULL)
- return NULL;
+ Py_INCREF(builtins_import);
- if (result == Py_None) {
- Py_DECREF(result);
- PyErr_Format(PyExc_ImportError,
- "No module named %.200s", name);
- return NULL;
+ mod = PyDict_GetItem(interp->modules, abs_name);
+ if (mod == Py_None) {
+ PyObject *msg = PyUnicode_FromFormat("import of %R halted; "
+ "None in sys.modules", abs_name);
+ if (msg != NULL) {
+ PyErr_SetImportError(msg, abs_name, NULL);
+ Py_DECREF(msg);
+ }
+ mod = NULL;
+ goto error_with_unlock;
}
+ else if (mod != NULL) {
+ PyObject *value;
+ int initializing = 0;
- return result;
-}
-
-static int
-mark_miss(char *name)
-{
- PyObject *modules = PyImport_GetModuleDict();
- return PyDict_SetItemString(modules, name, Py_None);
-}
-
-static int
-ensure_fromlist(PyObject *mod, PyObject *fromlist, char *buf, Py_ssize_t buflen,
- int recursive)
-{
- int i;
-
- if (!PyObject_HasAttrString(mod, "__path__"))
- return 1;
-
- for (i = 0; ; i++) {
- PyObject *item = PySequence_GetItem(fromlist, i);
- int hasit;
- if (item == NULL) {
- if (PyErr_ExceptionMatches(PyExc_IndexError)) {
+ Py_INCREF(mod);
+ /* Optimization: only call _bootstrap._lock_unlock_module() if
+ __initializing__ is true.
+ NOTE: because of this, __initializing__ must be set *before*
+ stuffing the new module in sys.modules.
+ */
+ value = _PyObject_GetAttrId(mod, &PyId___initializing__);
+ if (value == NULL)
+ PyErr_Clear();
+ else {
+ initializing = PyObject_IsTrue(value);
+ Py_DECREF(value);
+ if (initializing == -1)
PyErr_Clear();
- return 1;
- }
- return 0;
}
- if (!PyUnicode_Check(item)) {
- PyErr_SetString(PyExc_TypeError,
- "Item in ``from list'' not a string");
- Py_DECREF(item);
- return 0;
+ if (initializing > 0) {
+ /* _bootstrap._lock_unlock_module() releases the import lock */
+ value = _PyObject_CallMethodObjIdArgs(interp->importlib,
+ &PyId__lock_unlock_module, abs_name,
+ NULL);
+ if (value == NULL)
+ goto error;
+ Py_DECREF(value);
}
- if (PyUnicode_AS_UNICODE(item)[0] == '*') {
- PyObject *all;
- Py_DECREF(item);
- /* See if the package defines __all__ */
- if (recursive)
- continue; /* Avoid endless recursion */
- all = PyObject_GetAttrString(mod, "__all__");
- if (all == NULL)
- PyErr_Clear();
- else {
- int ret = ensure_fromlist(mod, all, buf, buflen, 1);
- Py_DECREF(all);
- if (!ret)
- return 0;
+ else {
+#ifdef WITH_THREAD
+ if (_PyImport_ReleaseLock() < 0) {
+ PyErr_SetString(PyExc_RuntimeError, "not holding the import lock");
+ goto error;
}
- continue;
+#endif
}
- hasit = PyObject_HasAttr(mod, item);
- if (!hasit) {
- PyObject *item8;
- char *subname;
- PyObject *submod;
- char *p;
- item8 = PyUnicode_EncodeFSDefault(item);
- if (!item8) {
- PyErr_SetString(PyExc_ValueError, "Cannot encode path item");
- return 0;
- }
- subname = PyBytes_AS_STRING(item8);
- if (buflen + strlen(subname) >= MAXPATHLEN) {
- PyErr_SetString(PyExc_ValueError,
- "Module name too long");
- Py_DECREF(item);
- return 0;
- }
- p = buf + buflen;
- *p++ = '.';
- strcpy(p, subname);
- submod = import_submodule(mod, subname, buf);
- Py_DECREF(item8);
- Py_XDECREF(submod);
- if (submod == NULL) {
- Py_DECREF(item);
- return 0;
- }
+ }
+ else {
+ /* _bootstrap._find_and_load() releases the import lock */
+ mod = _PyObject_CallMethodObjIdArgs(interp->importlib,
+ &PyId__find_and_load, abs_name,
+ builtins_import, NULL);
+ if (mod == NULL) {
+ goto error;
}
- Py_DECREF(item);
}
+ /* From now on we don't hold the import lock anymore. */
- /* NOTREACHED */
-}
+ if (PyObject_Not(fromlist)) {
+ if (level == 0 || PyUnicode_GET_LENGTH(name) > 0) {
+ PyObject *front = NULL;
+ PyObject *partition = NULL;
+ PyObject *borrowed_dot = _PyUnicode_FromId(&single_dot);
-static int
-add_submodule(PyObject *mod, PyObject *submod, char *fullname, char *subname,
- PyObject *modules)
-{
- if (mod == Py_None)
- return 1;
- /* Irrespective of the success of this load, make a
- reference to it in the parent package module. A copy gets
- saved in the modules dictionary under the full name, so get a
- reference from there, if need be. (The exception is when the
- load failed with a SyntaxError -- then there's no trace in
- sys.modules. In that case, of course, do nothing extra.) */
- if (submod == NULL) {
- submod = PyDict_GetItemString(modules, fullname);
- if (submod == NULL)
- return 1;
- }
- if (PyModule_Check(mod)) {
- /* We can't use setattr here since it can give a
- * spurious warning if the submodule name shadows a
- * builtin name */
- PyObject *dict = PyModule_GetDict(mod);
- if (!dict)
- return 0;
- if (PyDict_SetItemString(dict, subname, submod) < 0)
- return 0;
- }
- else {
- if (PyObject_SetAttrString(mod, subname, submod) < 0)
- return 0;
- }
- return 1;
-}
+ if (borrowed_dot == NULL) {
+ goto error;
+ }
-static PyObject *
-import_submodule(PyObject *mod, char *subname, char *fullname)
-{
- PyObject *modules = PyImport_GetModuleDict();
- PyObject *m = NULL;
+ partition = PyUnicode_Partition(name, borrowed_dot);
+ if (partition == NULL) {
+ goto error;
+ }
- /* Require:
- if mod == None: subname == fullname
- else: mod.__name__ + "." + subname == fullname
- */
+ if (PyUnicode_GET_LENGTH(PyTuple_GET_ITEM(partition, 1)) == 0) {
+ /* No dot in module name, simple exit */
+ Py_DECREF(partition);
+ final_mod = mod;
+ Py_INCREF(mod);
+ goto error;
+ }
- if ((m = PyDict_GetItemString(modules, fullname)) != NULL) {
- Py_INCREF(m);
- }
- else {
- PyObject *path, *loader = NULL;
- char *buf;
- struct filedescr *fdp;
- FILE *fp = NULL;
+ front = PyTuple_GET_ITEM(partition, 0);
+ Py_INCREF(front);
+ Py_DECREF(partition);
- if (mod == Py_None)
- path = NULL;
- else {
- path = PyObject_GetAttrString(mod, "__path__");
- if (path == NULL) {
- PyErr_Clear();
- Py_INCREF(Py_None);
- return Py_None;
+ if (level == 0) {
+ final_mod = PyObject_CallFunctionObjArgs(builtins_import, front, NULL);
+ Py_DECREF(front);
}
- }
+ else {
+ Py_ssize_t cut_off = PyUnicode_GET_LENGTH(name) -
+ PyUnicode_GET_LENGTH(front);
+ Py_ssize_t abs_name_len = PyUnicode_GET_LENGTH(abs_name);
+ PyObject *to_return = PyUnicode_Substring(abs_name, 0,
+ abs_name_len - cut_off);
+ Py_DECREF(front);
+ if (to_return == NULL) {
+ goto error;
+ }
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- return PyErr_NoMemory();
- }
- buf[0] = '\0';
- fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
- &fp, &loader);
- Py_XDECREF(path);
- if (fdp == NULL) {
- PyMem_FREE(buf);
- if (!PyErr_ExceptionMatches(PyExc_ImportError))
- return NULL;
- PyErr_Clear();
- Py_INCREF(Py_None);
- return Py_None;
+ final_mod = PyDict_GetItem(interp->modules, to_return);
+ if (final_mod == NULL) {
+ PyErr_Format(PyExc_KeyError,
+ "%R not in sys.modules as expected",
+ to_return);
+ }
+ else {
+ Py_INCREF(final_mod);
+ }
+ Py_DECREF(to_return);
+ }
}
- m = load_module(fullname, fp, buf, fdp->type, loader);
- Py_XDECREF(loader);
- if (fp)
- fclose(fp);
- if (!add_submodule(mod, m, fullname, subname, modules)) {
- Py_XDECREF(m);
- m = NULL;
+ else {
+ final_mod = mod;
+ Py_INCREF(mod);
}
- PyMem_FREE(buf);
}
+ else {
+ final_mod = _PyObject_CallMethodObjIdArgs(interp->importlib,
+ &PyId__handle_fromlist, mod,
+ fromlist, builtins_import,
+ NULL);
+ }
+ goto error;
- return m;
+ error_with_unlock:
+#ifdef WITH_THREAD
+ if (_PyImport_ReleaseLock() < 0) {
+ PyErr_SetString(PyExc_RuntimeError, "not holding the import lock");
+ }
+#endif
+ error:
+ Py_XDECREF(abs_name);
+ Py_XDECREF(builtins_import);
+ Py_XDECREF(mod);
+ Py_XDECREF(package);
+ Py_XDECREF(globals);
+ Py_XDECREF(fromlist);
+ if (final_mod == NULL)
+ remove_importlib_frames();
+ return final_mod;
+}
+
+PyObject *
+PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals,
+ PyObject *fromlist, int level)
+{
+ PyObject *nameobj, *mod;
+ nameobj = PyUnicode_FromString(name);
+ if (nameobj == NULL)
+ return NULL;
+ mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
+ fromlist, level);
+ Py_DECREF(nameobj);
+ return mod;
}
@@ -2989,103 +1557,23 @@ import_submodule(PyObject *mod, char *subname, char *fullname)
PyObject *
PyImport_ReloadModule(PyObject *m)
{
- PyInterpreterState *interp = PyThreadState_Get()->interp;
- PyObject *modules_reloading = interp->modules_reloading;
+ _Py_IDENTIFIER(reload);
+ PyObject *reloaded_module = NULL;
PyObject *modules = PyImport_GetModuleDict();
- PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
- char *name, *subname;
- char *buf;
- struct filedescr *fdp;
- FILE *fp = NULL;
- PyObject *newm;
-
- if (modules_reloading == NULL) {
- Py_FatalError("PyImport_ReloadModule: "
- "no modules_reloading dictionary!");
- return NULL;
- }
-
- if (m == NULL || !PyModule_Check(m)) {
- PyErr_SetString(PyExc_TypeError,
- "reload() argument must be module");
- return NULL;
- }
- name = (char*)PyModule_GetName(m);
- if (name == NULL)
- return NULL;
- if (m != PyDict_GetItemString(modules, name)) {
- PyErr_Format(PyExc_ImportError,
- "reload(): module %.200s not in sys.modules",
- name);
- return NULL;
- }
- existing_m = PyDict_GetItemString(modules_reloading, name);
- if (existing_m != NULL) {
- /* Due to a recursive reload, this module is already
- being reloaded. */
- Py_INCREF(existing_m);
- return existing_m;
- }
- if (PyDict_SetItemString(modules_reloading, name, m) < 0)
- return NULL;
-
- subname = strrchr(name, '.');
- if (subname == NULL)
- subname = name;
- else {
- PyObject *parentname, *parent;
- parentname = PyUnicode_FromStringAndSize(name, (subname-name));
- if (parentname == NULL) {
- imp_modules_reloading_clear();
+ PyObject *imp = PyDict_GetItemString(modules, "imp");
+ if (imp == NULL) {
+ imp = PyImport_ImportModule("imp");
+ if (imp == NULL) {
return NULL;
}
- parent = PyDict_GetItem(modules, parentname);
- if (parent == NULL) {
- PyErr_Format(PyExc_ImportError,
- "reload(): parent %U not in sys.modules",
- parentname);
- Py_DECREF(parentname);
- imp_modules_reloading_clear();
- return NULL;
- }
- Py_DECREF(parentname);
- subname++;
- path = PyObject_GetAttrString(parent, "__path__");
- if (path == NULL)
- PyErr_Clear();
- }
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- Py_XDECREF(path);
- return PyErr_NoMemory();
}
- buf[0] = '\0';
- fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
- Py_XDECREF(path);
-
- if (fdp == NULL) {
- Py_XDECREF(loader);
- imp_modules_reloading_clear();
- PyMem_FREE(buf);
- return NULL;
+ else {
+ Py_INCREF(imp);
}
- newm = load_module(name, fp, buf, fdp->type, loader);
- Py_XDECREF(loader);
-
- if (fp)
- fclose(fp);
- if (newm == NULL) {
- /* load_module probably removed name from modules because of
- * the error. Put back the original module object. We're
- * going to return NULL in this case regardless of whether
- * replacing name succeeds, so the return value is ignored.
- */
- PyDict_SetItemString(modules, name, m);
- }
- imp_modules_reloading_clear();
- PyMem_FREE(buf);
- return newm;
+ reloaded_module = _PyObject_CallMethodId(imp, &PyId_reload, "O", m);
+ Py_DECREF(imp);
+ return reloaded_module;
}
@@ -3175,48 +1663,19 @@ PyImport_Import(PyObject *module_name)
return r;
}
-
-/* Module 'imp' provides Python access to the primitives used for
- importing modules.
-*/
-
-static PyObject *
-imp_make_magic(long magic)
-{
- char buf[4];
-
- buf[0] = (char) ((magic >> 0) & 0xff);
- buf[1] = (char) ((magic >> 8) & 0xff);
- buf[2] = (char) ((magic >> 16) & 0xff);
- buf[3] = (char) ((magic >> 24) & 0xff);
-
- return PyBytes_FromStringAndSize(buf, 4);
-}
-
-static PyObject *
-imp_get_magic(PyObject *self, PyObject *noargs)
-{
- return imp_make_magic(pyc_magic);
-}
-
-static PyObject *
-imp_get_tag(PyObject *self, PyObject *noargs)
-{
- return PyUnicode_FromString(pyc_tag);
-}
-
static PyObject *
-imp_get_suffixes(PyObject *self, PyObject *noargs)
+imp_extension_suffixes(PyObject *self, PyObject *noargs)
{
PyObject *list;
- struct filedescr *fdp;
+ const char *suffix;
+ unsigned int index = 0;
list = PyList_New(0);
if (list == NULL)
return NULL;
- for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
- PyObject *item = Py_BuildValue("ssi",
- fdp->suffix, fdp->mode, fdp->type);
+#ifdef HAVE_DYNAMIC_LOADING
+ while ((suffix = _PyImport_DynLoadFiletab[index])) {
+ PyObject *item = PyUnicode_FromString(suffix);
if (item == NULL) {
Py_DECREF(list);
return NULL;
@@ -3227,102 +1686,19 @@ imp_get_suffixes(PyObject *self, PyObject *noargs)
return NULL;
}
Py_DECREF(item);
+ index += 1;
}
+#endif
return list;
}
static PyObject *
-call_find_module(char *name, PyObject *path)
-{
- extern int fclose(FILE *);
- PyObject *fob, *ret;
- PyObject *pathobj;
- struct filedescr *fdp;
- char *pathname;
- FILE *fp = NULL;
- int fd = -1;
- char *found_encoding = NULL;
- char *encoding = NULL;
-
- pathname = PyMem_MALLOC(MAXPATHLEN+1);
- if (pathname == NULL) {
- return PyErr_NoMemory();
- }
- pathname[0] = '\0';
- if (path == Py_None)
- path = NULL;
- fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
- if (fdp == NULL)
- goto error_exit;
- if (fp != NULL) {
- fd = fileno(fp);
- if (fd != -1)
- fd = dup(fd);
- fclose(fp);
- fp = NULL;
- if (fd == -1) {
- PyErr_SetFromErrno(PyExc_OSError);
- goto error_exit;
- }
- }
- if (fd != -1) {
- if (strchr(fdp->mode, 'b') == NULL) {
- /* PyTokenizer_FindEncoding() returns PyMem_MALLOC'ed
- memory. */
- found_encoding = PyTokenizer_FindEncoding(fd);
- lseek(fd, 0, 0); /* Reset position */
- if (found_encoding == NULL && PyErr_Occurred()) {
- close(fd);
- goto error_exit;
- }
- encoding = (found_encoding != NULL) ? found_encoding :
- (char*)PyUnicode_GetDefaultEncoding();
- }
- fob = PyFile_FromFd(fd, pathname, fdp->mode, -1,
- (char*)encoding, NULL, NULL, 1);
- if (fob == NULL) {
- close(fd);
- PyMem_FREE(found_encoding);
- goto error_exit;
- }
- }
- else {
- fob = Py_None;
- Py_INCREF(fob);
- }
- pathobj = PyUnicode_DecodeFSDefault(pathname);
- ret = Py_BuildValue("NN(ssi)",
- fob, pathobj, fdp->suffix, fdp->mode, fdp->type);
- PyMem_FREE(found_encoding);
- PyMem_FREE(pathname);
- return ret;
-
-error_exit:
- PyMem_FREE(pathname);
- return NULL;
-}
-
-static PyObject *
-imp_find_module(PyObject *self, PyObject *args)
-{
- PyObject *name;
- PyObject *ret, *path = NULL;
- if (!PyArg_ParseTuple(args, "O&|O:find_module",
- PyUnicode_FSConverter, &name,
- &path))
- return NULL;
- ret = call_find_module(PyBytes_AS_STRING(name), path);
- Py_DECREF(name);
- return ret;
-}
-
-static PyObject *
imp_init_builtin(PyObject *self, PyObject *args)
{
- char *name;
+ PyObject *name;
int ret;
PyObject *m;
- if (!PyArg_ParseTuple(args, "s:init_builtin", &name))
+ if (!PyArg_ParseTuple(args, "U:init_builtin", &name))
return NULL;
ret = init_builtin(name);
if (ret < 0)
@@ -3331,7 +1707,7 @@ imp_init_builtin(PyObject *self, PyObject *args)
Py_INCREF(Py_None);
return Py_None;
}
- m = PyImport_AddModule(name);
+ m = PyImport_AddModuleObject(name);
Py_XINCREF(m);
return m;
}
@@ -3339,19 +1715,19 @@ imp_init_builtin(PyObject *self, PyObject *args)
static PyObject *
imp_init_frozen(PyObject *self, PyObject *args)
{
- char *name;
+ PyObject *name;
int ret;
PyObject *m;
- if (!PyArg_ParseTuple(args, "s:init_frozen", &name))
+ if (!PyArg_ParseTuple(args, "U:init_frozen", &name))
return NULL;
- ret = PyImport_ImportFrozenModule(name);
+ ret = PyImport_ImportFrozenModuleObject(name);
if (ret < 0)
return NULL;
if (ret == 0) {
Py_INCREF(Py_None);
return Py_None;
}
- m = PyImport_AddModule(name);
+ m = PyImport_AddModuleObject(name);
Py_XINCREF(m);
return m;
}
@@ -3359,9 +1735,9 @@ imp_init_frozen(PyObject *self, PyObject *args)
static PyObject *
imp_get_frozen_object(PyObject *self, PyObject *args)
{
- char *name;
+ PyObject *name;
- if (!PyArg_ParseTuple(args, "s:get_frozen_object", &name))
+ if (!PyArg_ParseTuple(args, "U:get_frozen_object", &name))
return NULL;
return get_frozen_object(name);
}
@@ -3369,9 +1745,9 @@ imp_get_frozen_object(PyObject *self, PyObject *args)
static PyObject *
imp_is_frozen_package(PyObject *self, PyObject *args)
{
- char *name;
+ PyObject *name;
- if (!PyArg_ParseTuple(args, "s:is_frozen_package", &name))
+ if (!PyArg_ParseTuple(args, "U:is_frozen_package", &name))
return NULL;
return is_frozen_package(name);
}
@@ -3379,8 +1755,8 @@ imp_is_frozen_package(PyObject *self, PyObject *args)
static PyObject *
imp_is_builtin(PyObject *self, PyObject *args)
{
- char *name;
- if (!PyArg_ParseTuple(args, "s:is_builtin", &name))
+ PyObject *name;
+ if (!PyArg_ParseTuple(args, "U:is_builtin", &name))
return NULL;
return PyLong_FromLong(is_builtin(name));
}
@@ -3388,333 +1764,54 @@ imp_is_builtin(PyObject *self, PyObject *args)
static PyObject *
imp_is_frozen(PyObject *self, PyObject *args)
{
- char *name;
+ PyObject *name;
struct _frozen *p;
- if (!PyArg_ParseTuple(args, "s:is_frozen", &name))
+ if (!PyArg_ParseTuple(args, "U:is_frozen", &name))
return NULL;
p = find_frozen(name);
return PyBool_FromLong((long) (p == NULL ? 0 : p->size));
}
-static FILE *
-get_file(char *pathname, PyObject *fob, char *mode)
-{
- FILE *fp;
- if (mode[0] == 'U')
- mode = "r" PY_STDIOTEXTMODE;
- if (fob == NULL) {
- fp = fopen(pathname, mode);
- }
- else {
- int fd = PyObject_AsFileDescriptor(fob);
- if (fd == -1)
- return NULL;
- if (!_PyVerify_fd(fd))
- goto error;
- /* the FILE struct gets a new fd, so that it can be closed
- * independently of the file descriptor given
- */
- fd = dup(fd);
- if (fd == -1)
- goto error;
- fp = fdopen(fd, mode);
- }
- if (fp)
- return fp;
-error:
- PyErr_SetFromErrno(PyExc_IOError);
- return NULL;
-}
-
-static PyObject *
-imp_load_compiled(PyObject *self, PyObject *args)
-{
- char *name;
- PyObject *pathname;
- PyObject *fob = NULL;
- PyObject *m;
- FILE *fp;
- if (!PyArg_ParseTuple(args, "sO&|O:load_compiled",
- &name,
- PyUnicode_FSConverter, &pathname,
- &fob))
- return NULL;
- fp = get_file(PyBytes_AS_STRING(pathname), fob, "rb");
- if (fp == NULL) {
- Py_DECREF(pathname);
- return NULL;
- }
- m = load_compiled_module(name, PyBytes_AS_STRING(pathname), fp);
- fclose(fp);
- Py_DECREF(pathname);
- return m;
-}
-
#ifdef HAVE_DYNAMIC_LOADING
static PyObject *
imp_load_dynamic(PyObject *self, PyObject *args)
{
- char *name;
- PyObject *pathbytes;
- char *pathname;
- PyObject *fob = NULL;
- PyObject *m;
- FILE *fp = NULL;
- if (!PyArg_ParseTuple(args, "sO&|O:load_dynamic",
- &name, PyUnicode_FSConverter, &pathbytes, &fob))
- return NULL;
- pathname = PyBytes_AS_STRING(pathbytes);
- if (fob) {
- fp = get_file(pathname, fob, "r");
- if (fp == NULL) {
- Py_DECREF(pathbytes);
- return NULL;
- }
- }
- m = _PyImport_LoadDynamicModule(name, pathname, fp);
- Py_DECREF(pathbytes);
- if (fp)
- fclose(fp);
- return m;
-}
-
-#endif /* HAVE_DYNAMIC_LOADING */
-
-static PyObject *
-imp_load_source(PyObject *self, PyObject *args)
-{
- char *name;
- PyObject *pathname;
- PyObject *fob = NULL;
- PyObject *m;
+ PyObject *name, *pathname, *fob = NULL, *mod;
FILE *fp;
- if (!PyArg_ParseTuple(args, "sO&|O:load_source",
- &name,
- PyUnicode_FSConverter, &pathname,
- &fob))
- return NULL;
- fp = get_file(PyBytes_AS_STRING(pathname), fob, "r");
- if (fp == NULL) {
- Py_DECREF(pathname);
- return NULL;
- }
- m = load_source_module(name, PyBytes_AS_STRING(pathname), fp);
- Py_DECREF(pathname);
- fclose(fp);
- return m;
-}
-static PyObject *
-imp_load_module(PyObject *self, PyObject *args)
-{
- char *name;
- PyObject *fob;
- PyObject *pathname;
- PyObject * ret;
- char *suffix; /* Unused */
- char *mode;
- int type;
- FILE *fp;
-
- if (!PyArg_ParseTuple(args, "sOO&(ssi):load_module",
- &name, &fob,
- PyUnicode_FSConverter, &pathname,
- &suffix, &mode, &type))
+ if (!PyArg_ParseTuple(args, "UO&|O:load_dynamic",
+ &name, PyUnicode_FSDecoder, &pathname, &fob))
return NULL;
- if (*mode) {
- /* Mode must start with 'r' or 'U' and must not contain '+'.
- Implicit in this test is the assumption that the mode
- may contain other modifiers like 'b' or 't'. */
-
- if (!(*mode == 'r' || *mode == 'U') || strchr(mode, '+')) {
- PyErr_Format(PyExc_ValueError,
- "invalid file open mode %.200s", mode);
- Py_DECREF(pathname);
- return NULL;
- }
- }
- if (fob == Py_None)
- fp = NULL;
- else {
- fp = get_file(NULL, fob, mode);
+ if (fob != NULL) {
+ fp = _Py_fopen(pathname, "r");
if (fp == NULL) {
Py_DECREF(pathname);
+ if (!PyErr_Occurred())
+ PyErr_SetFromErrno(PyExc_IOError);
return NULL;
}
}
- ret = load_module(name, fp, PyBytes_AS_STRING(pathname), type, NULL);
+ else
+ fp = NULL;
+ mod = _PyImport_LoadDynamicModule(name, pathname, fp);
Py_DECREF(pathname);
if (fp)
fclose(fp);
- return ret;
-}
-
-static PyObject *
-imp_load_package(PyObject *self, PyObject *args)
-{
- char *name;
- PyObject *pathname;
- PyObject * ret;
- if (!PyArg_ParseTuple(args, "sO&:load_package",
- &name, PyUnicode_FSConverter, &pathname))
- return NULL;
- ret = load_package(name, PyBytes_AS_STRING(pathname));
- Py_DECREF(pathname);
- return ret;
-}
-
-static PyObject *
-imp_new_module(PyObject *self, PyObject *args)
-{
- char *name;
- if (!PyArg_ParseTuple(args, "s:new_module", &name))
- return NULL;
- return PyModule_New(name);
-}
-
-static PyObject *
-imp_reload(PyObject *self, PyObject *v)
-{
- return PyImport_ReloadModule(v);
-}
-
-PyDoc_STRVAR(doc_reload,
-"reload(module) -> module\n\
-\n\
-Reload the module. The module must have been successfully imported before.");
-
-static PyObject *
-imp_cache_from_source(PyObject *self, PyObject *args, PyObject *kws)
-{
- static char *kwlist[] = {"path", "debug_override", NULL};
-
- char *buf;
- PyObject *pathbytes;
- char *cpathname;
- PyObject *debug_override = NULL;
- int debug = !Py_OptimizeFlag;
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kws, "O&|O", kwlist,
- PyUnicode_FSConverter, &pathbytes, &debug_override))
- return NULL;
-
- if (debug_override != NULL &&
- (debug = PyObject_IsTrue(debug_override)) < 0) {
- Py_DECREF(pathbytes);
- return NULL;
- }
-
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- return PyErr_NoMemory();
- }
- cpathname = make_compiled_pathname(
- PyBytes_AS_STRING(pathbytes),
- buf, MAXPATHLEN+1, debug);
- Py_DECREF(pathbytes);
-
- if (cpathname == NULL) {
- PyErr_Format(PyExc_SystemError, "path buffer too short");
- PyMem_FREE(buf);
- return NULL;
- }
- {
- PyObject *ret = PyUnicode_DecodeFSDefault(buf);
- PyMem_FREE(buf);
- return ret;
- }
+ return mod;
}
-PyDoc_STRVAR(doc_cache_from_source,
-"cache_from_source(path, [debug_override]) -> path\n\
-Given the path to a .py file, return the path to its .pyc/.pyo file.\n\
-\n\
-The .py file does not need to exist; this simply returns the path to the\n\
-.pyc/.pyo file calculated as if the .py file were imported. The extension\n\
-will be .pyc unless __debug__ is not defined, then it will be .pyo.\n\
-\n\
-If debug_override is not None, then it must be a boolean and is taken as\n\
-the value of __debug__ instead.");
-
-static PyObject *
-imp_source_from_cache(PyObject *self, PyObject *args, PyObject *kws)
-{
- static char *kwlist[] = {"path", NULL};
-
- PyObject *pathname_obj;
- char *pathname;
- char *buf;
-
- if (!PyArg_ParseTupleAndKeywords(
- args, kws, "O&", kwlist,
- PyUnicode_FSConverter, &pathname_obj))
- return NULL;
-
- pathname = PyBytes_AS_STRING(pathname_obj);
- buf = PyMem_MALLOC(MAXPATHLEN+1);
- if (buf == NULL) {
- return PyErr_NoMemory();
- }
- if (make_source_pathname(pathname, buf) == NULL) {
- PyErr_Format(PyExc_ValueError, "Not a PEP 3147 pyc path: %s",
- pathname);
- Py_DECREF(pathname_obj);
- PyMem_FREE(buf);
- return NULL;
- }
- Py_DECREF(pathname_obj);
- {
- PyObject *ret = PyUnicode_FromString(buf);
- PyMem_FREE(buf);
- return ret;
- }
-}
+#endif /* HAVE_DYNAMIC_LOADING */
-PyDoc_STRVAR(doc_source_from_cache,
-"source_from_cache(path) -> path\n\
-Given the path to a .pyc./.pyo file, return the path to its .py file.\n\
-\n\
-The .pyc/.pyo file does not need to exist; this simply returns the path to\n\
-the .py file calculated to correspond to the .pyc/.pyo file. If path\n\
-does not conform to PEP 3147 format, ValueError will be raised.");
/* Doc strings */
PyDoc_STRVAR(doc_imp,
-"This module provides the components needed to build your own\n\
-__import__ function. Undocumented functions are obsolete.");
-
-PyDoc_STRVAR(doc_find_module,
-"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
-Search for a module. If path is omitted or None, search for a\n\
-built-in, frozen or special module and continue search in sys.path.\n\
-The module name cannot contain '.'; to search for a submodule of a\n\
-package, pass the submodule name and the package's __path__.");
-
-PyDoc_STRVAR(doc_load_module,
-"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
-Load a module, given information returned by find_module().\n\
-The module name must include the full package name, if any.");
-
-PyDoc_STRVAR(doc_get_magic,
-"get_magic() -> string\n\
-Return the magic number for .pyc or .pyo files.");
-
-PyDoc_STRVAR(doc_get_tag,
-"get_tag() -> string\n\
-Return the magic tag for .pyc or .pyo files.");
-
-PyDoc_STRVAR(doc_get_suffixes,
-"get_suffixes() -> [(suffix, mode, type), ...]\n\
-Return a list of (suffix, mode, type) tuples describing the files\n\
-that find_module() looks for.");
-
-PyDoc_STRVAR(doc_new_module,
-"new_module(name) -> module\n\
-Create a new module. Do not enter it in sys.modules.\n\
-The module name must include the full package name, if any.");
+"(Extremely) low-level import machinery bits as used by importlib and imp.");
+
+PyDoc_STRVAR(doc_extension_suffixes,
+"extension_suffixes() -> list of strings\n\
+Returns the list of file suffixes used to identify extension modules.");
PyDoc_STRVAR(doc_lock_held,
"lock_held() -> boolean\n\
@@ -3734,179 +1831,28 @@ Release the interpreter's import lock.\n\
On platforms without threads, this function does nothing.");
static PyMethodDef imp_methods[] = {
- {"find_module", imp_find_module, METH_VARARGS, doc_find_module},
- {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
- {"get_tag", imp_get_tag, METH_NOARGS, doc_get_tag},
- {"get_suffixes", imp_get_suffixes, METH_NOARGS, doc_get_suffixes},
- {"load_module", imp_load_module, METH_VARARGS, doc_load_module},
- {"new_module", imp_new_module, METH_VARARGS, doc_new_module},
+ {"extension_suffixes", imp_extension_suffixes, METH_NOARGS,
+ doc_extension_suffixes},
{"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},
{"acquire_lock", imp_acquire_lock, METH_NOARGS, doc_acquire_lock},
{"release_lock", imp_release_lock, METH_NOARGS, doc_release_lock},
- {"reload", imp_reload, METH_O, doc_reload},
- {"cache_from_source", (PyCFunction)imp_cache_from_source,
- METH_VARARGS | METH_KEYWORDS, doc_cache_from_source},
- {"source_from_cache", (PyCFunction)imp_source_from_cache,
- METH_VARARGS | METH_KEYWORDS, doc_source_from_cache},
- /* The rest are obsolete */
{"get_frozen_object", imp_get_frozen_object, METH_VARARGS},
{"is_frozen_package", imp_is_frozen_package, METH_VARARGS},
{"init_builtin", imp_init_builtin, METH_VARARGS},
{"init_frozen", imp_init_frozen, METH_VARARGS},
{"is_builtin", imp_is_builtin, METH_VARARGS},
{"is_frozen", imp_is_frozen, METH_VARARGS},
- {"load_compiled", imp_load_compiled, METH_VARARGS},
#ifdef HAVE_DYNAMIC_LOADING
{"load_dynamic", imp_load_dynamic, METH_VARARGS},
#endif
- {"load_package", imp_load_package, METH_VARARGS},
- {"load_source", imp_load_source, METH_VARARGS},
+ {"_fix_co_filename", imp_fix_co_filename, METH_VARARGS},
{NULL, NULL} /* sentinel */
};
-static int
-setint(PyObject *d, char *name, int value)
-{
- PyObject *v;
- int err;
-
- v = PyLong_FromLong((long)value);
- err = PyDict_SetItemString(d, name, v);
- Py_XDECREF(v);
- return err;
-}
-
-typedef struct {
- PyObject_HEAD
-} NullImporter;
-
-static int
-NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
-{
-#ifndef MS_WINDOWS
- PyObject *path;
- struct stat statbuf;
- int rv;
-
- if (!_PyArg_NoKeywords("NullImporter()", kwds))
- return -1;
-
- if (!PyArg_ParseTuple(args, "O&:NullImporter",
- PyUnicode_FSConverter, &path))
- return -1;
-
- if (PyBytes_GET_SIZE(path) == 0) {
- Py_DECREF(path);
- PyErr_SetString(PyExc_ImportError, "empty pathname");
- return -1;
- }
-
- rv = stat(PyBytes_AS_STRING(path), &statbuf);
- Py_DECREF(path);
- if (rv == 0) {
- /* it exists */
- if (S_ISDIR(statbuf.st_mode)) {
- /* it's a directory */
- PyErr_SetString(PyExc_ImportError, "existing directory");
- return -1;
- }
- }
-#else /* MS_WINDOWS */
- PyObject *pathobj;
- DWORD rv;
- wchar_t *path;
-
- if (!_PyArg_NoKeywords("NullImporter()", kwds))
- return -1;
-
- if (!PyArg_ParseTuple(args, "U:NullImporter",
- &pathobj))
- return -1;
-
- if (PyUnicode_GET_SIZE(pathobj) == 0) {
- PyErr_SetString(PyExc_ImportError, "empty pathname");
- return -1;
- }
-
- path = PyUnicode_AsWideCharString(pathobj, NULL);
- if (path == NULL)
- return -1;
- /* see issue1293 and issue3677:
- * stat() on Windows doesn't recognise paths like
- * "e:\\shared\\" and "\\\\whiterab-c2znlh\\shared" as dirs.
- */
- rv = GetFileAttributesW(path);
- PyMem_Free(path);
- if (rv != INVALID_FILE_ATTRIBUTES) {
- /* it exists */
- if (rv & FILE_ATTRIBUTE_DIRECTORY) {
- /* it's a directory */
- PyErr_SetString(PyExc_ImportError, "existing directory");
- return -1;
- }
- }
-#endif
- return 0;
-}
-
-static PyObject *
-NullImporter_find_module(NullImporter *self, PyObject *args)
-{
- Py_RETURN_NONE;
-}
-
-static PyMethodDef NullImporter_methods[] = {
- {"find_module", (PyCFunction)NullImporter_find_module, METH_VARARGS,
- "Always return None"
- },
- {NULL} /* Sentinel */
-};
-
-
-PyTypeObject PyNullImporter_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "imp.NullImporter", /*tp_name*/
- sizeof(NullImporter), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- 0, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_reserved*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_flags*/
- "Null importer object", /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- NullImporter_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)NullImporter_init, /* tp_init */
- 0, /* tp_alloc */
- PyType_GenericNew /* tp_new */
-};
static struct PyModuleDef impmodule = {
PyModuleDef_HEAD_INIT,
- "imp",
+ "_imp",
doc_imp,
0,
imp_methods,
@@ -3921,9 +1867,6 @@ PyInit_imp(void)
{
PyObject *m, *d;
- if (PyType_Ready(&PyNullImporter_Type) < 0)
- return NULL;
-
m = PyModule_Create(&impmodule);
if (m == NULL)
goto failure;
@@ -3931,19 +1874,6 @@ PyInit_imp(void)
if (d == NULL)
goto failure;
- if (setint(d, "SEARCH_ERROR", SEARCH_ERROR) < 0) goto failure;
- if (setint(d, "PY_SOURCE", PY_SOURCE) < 0) goto failure;
- if (setint(d, "PY_COMPILED", PY_COMPILED) < 0) goto failure;
- if (setint(d, "C_EXTENSION", C_EXTENSION) < 0) goto failure;
- if (setint(d, "PY_RESOURCE", PY_RESOURCE) < 0) goto failure;
- if (setint(d, "PKG_DIRECTORY", PKG_DIRECTORY) < 0) goto failure;
- if (setint(d, "C_BUILTIN", C_BUILTIN) < 0) goto failure;
- if (setint(d, "PY_FROZEN", PY_FROZEN) < 0) goto failure;
- if (setint(d, "PY_CODERESOURCE", PY_CODERESOURCE) < 0) goto failure;
- if (setint(d, "IMP_HOOK", IMP_HOOK) < 0) goto failure;
-
- Py_INCREF(&PyNullImporter_Type);
- PyModule_AddObject(m, "NullImporter", (PyObject *)&PyNullImporter_Type);
return m;
failure:
Py_XDECREF(m);
diff --git a/Python/importdl.c b/Python/importdl.c
index 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..e0e013c
--- /dev/null
+++ b/Python/importlib.h
@@ -0,0 +1,4385 @@
+/* Auto-generated by Modules/_freeze_importlib.c */
+unsigned char _Py_M__importlib[] = {
+ 99,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,
+ 0,64,0,0,0,115,206,3,0,0,100,0,0,90,0,0,
+ 100,129,0,90,1,0,100,4,0,100,5,0,132,0,0,90,
+ 2,0,100,6,0,100,7,0,132,0,0,90,3,0,100,8,
+ 0,100,9,0,132,0,0,90,4,0,100,10,0,100,11,0,
+ 132,0,0,90,5,0,100,12,0,100,13,0,132,0,0,90,
+ 6,0,100,14,0,100,15,0,132,0,0,90,7,0,100,16,
+ 0,100,17,0,132,0,0,90,8,0,100,18,0,100,19,0,
+ 132,0,0,90,9,0,100,20,0,100,21,0,100,22,0,132,
+ 1,0,90,10,0,100,23,0,100,24,0,132,0,0,90,11,
+ 0,101,12,0,101,11,0,106,13,0,131,1,0,90,14,0,
+ 100,25,0,100,26,0,132,0,0,90,15,0,105,0,0,90,
+ 16,0,105,0,0,90,17,0,71,100,27,0,100,28,0,132,
+ 0,0,100,28,0,101,18,0,131,3,0,90,19,0,71,100,
+ 29,0,100,30,0,132,0,0,100,30,0,131,2,0,90,20,
+ 0,71,100,31,0,100,32,0,132,0,0,100,32,0,131,2,
+ 0,90,21,0,100,33,0,100,34,0,132,0,0,90,22,0,
+ 100,35,0,100,36,0,132,0,0,90,23,0,100,37,0,100,
+ 38,0,132,0,0,90,24,0,100,39,0,101,25,0,100,40,
+ 0,131,1,0,100,41,0,62,66,101,25,0,100,42,0,131,
+ 1,0,100,43,0,62,66,90,26,0,101,27,0,100,44,0,
+ 100,45,0,132,0,0,101,28,0,100,46,0,100,47,0,100,
+ 48,0,131,3,0,68,131,1,0,131,1,0,90,29,0,100,
+ 49,0,90,30,0,100,50,0,103,1,0,90,31,0,100,51,
+ 0,103,1,0,90,32,0,100,52,0,103,1,0,90,33,0,
+ 101,32,0,90,34,0,100,128,0,100,53,0,100,54,0,132,
+ 1,0,90,36,0,100,55,0,100,56,0,132,0,0,90,37,
+ 0,100,57,0,100,58,0,132,0,0,90,38,0,100,59,0,
+ 100,60,0,132,0,0,90,39,0,100,61,0,100,62,0,132,
+ 0,0,90,40,0,100,63,0,100,64,0,132,0,0,90,41,
+ 0,100,65,0,100,66,0,132,0,0,90,42,0,100,67,0,
+ 100,68,0,132,0,0,90,43,0,100,69,0,100,70,0,132,
+ 0,0,90,44,0,100,71,0,100,72,0,132,0,0,90,45,
+ 0,100,73,0,100,74,0,132,0,0,90,46,0,71,100,75,
+ 0,100,76,0,132,0,0,100,76,0,131,2,0,90,47,0,
+ 71,100,77,0,100,78,0,132,0,0,100,78,0,131,2,0,
+ 90,48,0,71,100,79,0,100,80,0,132,0,0,100,80,0,
+ 131,2,0,90,49,0,71,100,81,0,100,82,0,132,0,0,
+ 100,82,0,131,2,0,90,50,0,71,100,83,0,100,84,0,
+ 132,0,0,100,84,0,101,50,0,131,3,0,90,51,0,71,
+ 100,85,0,100,86,0,132,0,0,100,86,0,131,2,0,90,
+ 52,0,71,100,87,0,100,88,0,132,0,0,100,88,0,101,
+ 52,0,101,51,0,131,4,0,90,53,0,71,100,89,0,100,
+ 90,0,132,0,0,100,90,0,101,52,0,101,50,0,131,4,
+ 0,90,54,0,103,0,0,90,55,0,71,100,91,0,100,92,
+ 0,132,0,0,100,92,0,131,2,0,90,56,0,71,100,93,
+ 0,100,94,0,132,0,0,100,94,0,131,2,0,90,57,0,
+ 71,100,95,0,100,96,0,132,0,0,100,96,0,131,2,0,
+ 90,58,0,71,100,97,0,100,98,0,132,0,0,100,98,0,
+ 131,2,0,90,59,0,71,100,99,0,100,100,0,132,0,0,
+ 100,100,0,131,2,0,90,60,0,71,100,101,0,100,102,0,
+ 132,0,0,100,102,0,131,2,0,90,61,0,100,103,0,100,
+ 104,0,132,0,0,90,62,0,100,105,0,100,106,0,132,0,
+ 0,90,63,0,100,107,0,100,108,0,132,0,0,90,64,0,
+ 100,109,0,90,65,0,100,110,0,100,111,0,132,0,0,90,
+ 66,0,100,112,0,100,113,0,132,0,0,90,67,0,100,128,
+ 0,100,46,0,100,114,0,100,115,0,132,2,0,90,68,0,
+ 100,116,0,100,117,0,132,0,0,90,69,0,100,118,0,100,
+ 119,0,132,0,0,90,70,0,100,120,0,100,121,0,132,0,
+ 0,90,71,0,100,128,0,100,128,0,102,0,0,100,46,0,
+ 100,122,0,100,123,0,132,4,0,90,72,0,100,124,0,100,
+ 125,0,132,0,0,90,73,0,100,126,0,100,127,0,132,0,
+ 0,90,74,0,100,128,0,83,40,130,0,0,0,117,83,1,
+ 0,0,67,111,114,101,32,105,109,112,108,101,109,101,110,116,
+ 97,116,105,111,110,32,111,102,32,105,109,112,111,114,116,46,
+ 10,10,84,104,105,115,32,109,111,100,117,108,101,32,105,115,
+ 32,78,79,84,32,109,101,97,110,116,32,116,111,32,98,101,
+ 32,100,105,114,101,99,116,108,121,32,105,109,112,111,114,116,
+ 101,100,33,32,73,116,32,104,97,115,32,98,101,101,110,32,
+ 100,101,115,105,103,110,101,100,32,115,117,99,104,10,116,104,
+ 97,116,32,105,116,32,99,97,110,32,98,101,32,98,111,111,
+ 116,115,116,114,97,112,112,101,100,32,105,110,116,111,32,80,
+ 121,116,104,111,110,32,97,115,32,116,104,101,32,105,109,112,
+ 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,105,
+ 109,112,111,114,116,46,32,65,115,10,115,117,99,104,32,105,
+ 116,32,114,101,113,117,105,114,101,115,32,116,104,101,32,105,
+ 110,106,101,99,116,105,111,110,32,111,102,32,115,112,101,99,
+ 105,102,105,99,32,109,111,100,117,108,101,115,32,97,110,100,
+ 32,97,116,116,114,105,98,117,116,101,115,32,105,110,32,111,
+ 114,100,101,114,32,116,111,10,119,111,114,107,46,32,79,110,
+ 101,32,115,104,111,117,108,100,32,117,115,101,32,105,109,112,
+ 111,114,116,108,105,98,32,97,115,32,116,104,101,32,112,117,
+ 98,108,105,99,45,102,97,99,105,110,103,32,118,101,114,115,
+ 105,111,110,32,111,102,32,116,104,105,115,32,109,111,100,117,
+ 108,101,46,10,10,117,3,0,0,0,119,105,110,117,6,0,
+ 0,0,99,121,103,119,105,110,117,6,0,0,0,100,97,114,
+ 119,105,110,99,0,0,0,0,0,0,0,0,1,0,0,0,
+ 2,0,0,0,67,0,0,0,115,49,0,0,0,116,0,0,
+ 106,1,0,106,2,0,116,3,0,131,1,0,114,33,0,100,
+ 1,0,100,2,0,132,0,0,125,0,0,110,12,0,100,3,
+ 0,100,2,0,132,0,0,125,0,0,124,0,0,83,40,4,
+ 0,0,0,78,99,0,0,0,0,0,0,0,0,0,0,0,
+ 0,2,0,0,0,83,0,0,0,115,13,0,0,0,100,1,
+ 0,116,0,0,106,1,0,107,6,0,83,40,2,0,0,0,
+ 117,53,0,0,0,84,114,117,101,32,105,102,32,102,105,108,
+ 101,110,97,109,101,115,32,109,117,115,116,32,98,101,32,99,
+ 104,101,99,107,101,100,32,99,97,115,101,45,105,110,115,101,
+ 110,115,105,116,105,118,101,108,121,46,115,12,0,0,0,80,
+ 89,84,72,79,78,67,65,83,69,79,75,40,2,0,0,0,
+ 117,3,0,0,0,95,111,115,117,7,0,0,0,101,110,118,
+ 105,114,111,110,40,0,0,0,0,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,11,0,0,0,95,114,101,108,97,120,
+ 95,99,97,115,101,34,0,0,0,115,2,0,0,0,0,2,
+ 117,37,0,0,0,95,109,97,107,101,95,114,101,108,97,120,
+ 95,99,97,115,101,46,60,108,111,99,97,108,115,62,46,95,
+ 114,101,108,97,120,95,99,97,115,101,99,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,83,0,0,0,115,
+ 4,0,0,0,100,1,0,83,40,2,0,0,0,117,53,0,
+ 0,0,84,114,117,101,32,105,102,32,102,105,108,101,110,97,
+ 109,101,115,32,109,117,115,116,32,98,101,32,99,104,101,99,
+ 107,101,100,32,99,97,115,101,45,105,110,115,101,110,115,105,
+ 116,105,118,101,108,121,46,70,40,1,0,0,0,117,5,0,
+ 0,0,70,97,108,115,101,40,0,0,0,0,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,11,0,0,0,95,114,101,
+ 108,97,120,95,99,97,115,101,38,0,0,0,115,2,0,0,
+ 0,0,2,40,4,0,0,0,117,3,0,0,0,115,121,115,
+ 117,8,0,0,0,112,108,97,116,102,111,114,109,117,10,0,
+ 0,0,115,116,97,114,116,115,119,105,116,104,117,27,0,0,
+ 0,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73,
+ 86,69,95,80,76,65,84,70,79,82,77,83,40,1,0,0,
+ 0,117,11,0,0,0,95,114,101,108,97,120,95,99,97,115,
+ 101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,16,0,
+ 0,0,95,109,97,107,101,95,114,101,108,97,120,95,99,97,
+ 115,101,32,0,0,0,115,8,0,0,0,0,1,18,1,15,
+ 4,12,3,117,16,0,0,0,95,109,97,107,101,95,114,101,
+ 108,97,120,95,99,97,115,101,99,1,0,0,0,0,0,0,
+ 0,2,0,0,0,3,0,0,0,67,0,0,0,115,108,0,
+ 0,0,116,0,0,124,0,0,131,1,0,125,0,0,103,0,
+ 0,125,1,0,124,1,0,106,1,0,124,0,0,100,1,0,
+ 64,131,1,0,1,124,1,0,106,1,0,124,0,0,100,2,
+ 0,63,100,1,0,64,131,1,0,1,124,1,0,106,1,0,
+ 124,0,0,100,3,0,63,100,1,0,64,131,1,0,1,124,
+ 1,0,106,1,0,124,0,0,100,4,0,63,100,1,0,64,
+ 131,1,0,1,116,2,0,124,1,0,131,1,0,83,40,5,
+ 0,0,0,117,111,0,0,0,67,111,110,118,101,114,116,32,
+ 97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,
+ 32,116,111,32,108,105,116,116,108,101,45,101,110,100,105,97,
+ 110,46,10,10,32,32,32,32,88,88,88,32,84,101,109,112,
+ 111,114,97,114,121,32,117,110,116,105,108,32,109,97,114,115,
+ 104,97,108,39,115,32,108,111,110,103,32,102,117,110,99,116,
+ 105,111,110,115,32,97,114,101,32,101,120,112,111,115,101,100,
+ 46,10,10,32,32,32,32,105,255,0,0,0,105,8,0,0,
+ 0,105,16,0,0,0,105,24,0,0,0,40,3,0,0,0,
+ 117,3,0,0,0,105,110,116,117,6,0,0,0,97,112,112,
+ 101,110,100,117,9,0,0,0,98,121,116,101,97,114,114,97,
+ 121,40,2,0,0,0,117,1,0,0,0,120,117,9,0,0,
+ 0,105,110,116,95,98,121,116,101,115,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,7,0,0,0,95,119,95,108,111,
+ 110,103,45,0,0,0,115,14,0,0,0,0,6,12,1,6,
+ 1,17,1,21,1,21,1,21,1,117,7,0,0,0,95,119,
+ 95,108,111,110,103,99,1,0,0,0,0,0,0,0,2,0,
+ 0,0,3,0,0,0,67,0,0,0,115,68,0,0,0,124,
+ 0,0,100,1,0,25,125,1,0,124,1,0,124,0,0,100,
+ 2,0,25,100,3,0,62,79,125,1,0,124,1,0,124,0,
+ 0,100,4,0,25,100,5,0,62,79,125,1,0,124,1,0,
+ 124,0,0,100,6,0,25,100,7,0,62,79,125,1,0,124,
+ 1,0,83,40,8,0,0,0,117,115,0,0,0,67,111,110,
+ 118,101,114,116,32,52,32,98,121,116,101,115,32,105,110,32,
+ 108,105,116,116,108,101,45,101,110,100,105,97,110,32,116,111,
+ 32,97,110,32,105,110,116,101,103,101,114,46,10,10,32,32,
+ 32,32,88,88,88,32,84,101,109,112,111,114,97,114,121,32,
+ 117,110,116,105,108,32,109,97,114,115,104,97,108,39,115,32,
+ 108,111,110,103,32,102,117,110,99,116,105,111,110,32,97,114,
+ 101,32,101,120,112,111,115,101,100,46,10,10,32,32,32,32,
+ 105,0,0,0,0,105,1,0,0,0,105,8,0,0,0,105,
+ 2,0,0,0,105,16,0,0,0,105,3,0,0,0,105,24,
+ 0,0,0,40,0,0,0,0,40,2,0,0,0,117,9,0,
+ 0,0,105,110,116,95,98,121,116,101,115,117,1,0,0,0,
+ 120,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,7,0,
+ 0,0,95,114,95,108,111,110,103,61,0,0,0,115,10,0,
+ 0,0,0,6,10,1,18,1,18,1,18,1,117,7,0,0,
+ 0,95,114,95,108,111,110,103,99,0,0,0,0,0,0,0,
+ 0,3,0,0,0,4,0,0,0,71,0,0,0,115,103,0,
+ 0,0,103,0,0,125,1,0,120,71,0,124,0,0,68,93,
+ 63,0,125,2,0,124,2,0,115,31,0,113,13,0,110,0,
+ 0,124,1,0,106,0,0,124,2,0,131,1,0,1,124,2,
+ 0,100,4,0,25,116,1,0,107,7,0,114,13,0,124,1,
+ 0,106,0,0,116,2,0,131,1,0,1,113,13,0,113,13,
+ 0,87,100,2,0,106,3,0,124,1,0,100,3,0,100,5,
+ 0,133,2,0,25,131,1,0,83,40,6,0,0,0,117,31,
+ 0,0,0,82,101,112,108,97,99,101,109,101,110,116,32,102,
+ 111,114,32,111,115,46,112,97,116,104,46,106,111,105,110,40,
+ 41,46,105,1,0,0,0,117,0,0,0,0,78,105,255,255,
+ 255,255,105,255,255,255,255,40,4,0,0,0,117,6,0,0,
+ 0,97,112,112,101,110,100,117,15,0,0,0,112,97,116,104,
+ 95,115,101,112,97,114,97,116,111,114,115,117,8,0,0,0,
+ 112,97,116,104,95,115,101,112,117,4,0,0,0,106,111,105,
+ 110,40,3,0,0,0,117,10,0,0,0,112,97,116,104,95,
+ 112,97,114,116,115,117,9,0,0,0,110,101,119,95,112,97,
+ 114,116,115,117,4,0,0,0,112,97,114,116,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,10,0,0,0,95,112,97,
+ 116,104,95,106,111,105,110,74,0,0,0,115,16,0,0,0,
+ 0,2,6,1,13,1,6,1,6,1,13,1,16,1,20,1,
+ 117,10,0,0,0,95,112,97,116,104,95,106,111,105,110,99,
+ 1,0,0,0,0,0,0,0,6,0,0,0,3,0,0,0,
+ 67,0,0,0,115,85,0,0,0,120,48,0,116,0,0,124,
+ 0,0,131,1,0,68,93,28,0,125,1,0,124,1,0,116,
+ 1,0,107,6,0,114,13,0,124,1,0,125,2,0,80,113,
+ 13,0,113,13,0,87,116,2,0,125,2,0,124,0,0,106,
+ 3,0,124,2,0,131,1,0,92,3,0,125,3,0,125,4,
+ 0,125,5,0,124,3,0,124,5,0,102,2,0,83,40,1,
+ 0,0,0,117,32,0,0,0,82,101,112,108,97,99,101,109,
+ 101,110,116,32,102,111,114,32,111,115,46,112,97,116,104,46,
+ 115,112,108,105,116,40,41,46,40,4,0,0,0,117,8,0,
+ 0,0,114,101,118,101,114,115,101,100,117,15,0,0,0,112,
+ 97,116,104,95,115,101,112,97,114,97,116,111,114,115,117,8,
+ 0,0,0,112,97,116,104,95,115,101,112,117,10,0,0,0,
+ 114,112,97,114,116,105,116,105,111,110,40,6,0,0,0,117,
+ 4,0,0,0,112,97,116,104,117,1,0,0,0,120,117,3,
+ 0,0,0,115,101,112,117,5,0,0,0,102,114,111,110,116,
+ 117,1,0,0,0,95,117,4,0,0,0,116,97,105,108,40,
+ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,11,0,0,0,
+ 95,112,97,116,104,95,115,112,108,105,116,86,0,0,0,115,
+ 14,0,0,0,0,2,19,1,12,1,6,1,8,2,6,1,
+ 24,1,117,11,0,0,0,95,112,97,116,104,95,115,112,108,
+ 105,116,99,2,0,0,0,0,0,0,0,3,0,0,0,11,
+ 0,0,0,67,0,0,0,115,61,0,0,0,121,19,0,116,
+ 0,0,106,1,0,124,0,0,131,1,0,125,2,0,87,110,
+ 22,0,4,116,2,0,107,10,0,114,43,0,1,1,1,100,
+ 2,0,83,89,110,1,0,88,124,2,0,106,4,0,100,1,
+ 0,64,124,1,0,107,2,0,83,40,3,0,0,0,117,49,
+ 0,0,0,84,101,115,116,32,119,104,101,116,104,101,114,32,
+ 116,104,101,32,112,97,116,104,32,105,115,32,116,104,101,32,
+ 115,112,101,99,105,102,105,101,100,32,109,111,100,101,32,116,
+ 121,112,101,46,105,0,240,0,0,70,40,5,0,0,0,117,
+ 3,0,0,0,95,111,115,117,4,0,0,0,115,116,97,116,
+ 117,7,0,0,0,79,83,69,114,114,111,114,117,5,0,0,
+ 0,70,97,108,115,101,117,7,0,0,0,115,116,95,109,111,
+ 100,101,40,3,0,0,0,117,4,0,0,0,112,97,116,104,
+ 117,4,0,0,0,109,111,100,101,117,9,0,0,0,115,116,
+ 97,116,95,105,110,102,111,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,18,0,0,0,95,112,97,116,104,95,105,115,
+ 95,109,111,100,101,95,116,121,112,101,98,0,0,0,115,10,
+ 0,0,0,0,2,3,1,19,1,13,1,9,1,117,18,0,
+ 0,0,95,112,97,116,104,95,105,115,95,109,111,100,101,95,
+ 116,121,112,101,99,1,0,0,0,0,0,0,0,1,0,0,
+ 0,3,0,0,0,67,0,0,0,115,13,0,0,0,116,0,
+ 0,124,0,0,100,1,0,131,2,0,83,40,2,0,0,0,
+ 117,31,0,0,0,82,101,112,108,97,99,101,109,101,110,116,
+ 32,102,111,114,32,111,115,46,112,97,116,104,46,105,115,102,
+ 105,108,101,46,105,0,128,0,0,40,1,0,0,0,117,18,
+ 0,0,0,95,112,97,116,104,95,105,115,95,109,111,100,101,
+ 95,116,121,112,101,40,1,0,0,0,117,4,0,0,0,112,
+ 97,116,104,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 12,0,0,0,95,112,97,116,104,95,105,115,102,105,108,101,
+ 108,0,0,0,115,2,0,0,0,0,2,117,12,0,0,0,
+ 95,112,97,116,104,95,105,115,102,105,108,101,99,1,0,0,
+ 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,
+ 0,115,34,0,0,0,124,0,0,115,21,0,116,0,0,106,
+ 1,0,131,0,0,125,0,0,110,0,0,116,2,0,124,0,
+ 0,100,1,0,131,2,0,83,40,2,0,0,0,117,30,0,
+ 0,0,82,101,112,108,97,99,101,109,101,110,116,32,102,111,
+ 114,32,111,115,46,112,97,116,104,46,105,115,100,105,114,46,
+ 105,0,64,0,0,40,3,0,0,0,117,3,0,0,0,95,
+ 111,115,117,6,0,0,0,103,101,116,99,119,100,117,18,0,
+ 0,0,95,112,97,116,104,95,105,115,95,109,111,100,101,95,
+ 116,121,112,101,40,1,0,0,0,117,4,0,0,0,112,97,
+ 116,104,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,
+ 0,0,0,95,112,97,116,104,95,105,115,100,105,114,114,0,
+ 0,0,115,6,0,0,0,0,2,6,1,15,1,117,11,0,
+ 0,0,95,112,97,116,104,95,105,115,100,105,114,105,182,1,
+ 0,0,99,3,0,0,0,0,0,0,0,6,0,0,0,17,
+ 0,0,0,67,0,0,0,115,192,0,0,0,100,1,0,106,
+ 0,0,124,0,0,116,1,0,124,0,0,131,1,0,131,2,
+ 0,125,3,0,116,2,0,106,3,0,124,3,0,116,2,0,
+ 106,4,0,116,2,0,106,5,0,66,116,2,0,106,6,0,
+ 66,124,2,0,100,2,0,64,131,3,0,125,4,0,121,60,
+ 0,116,7,0,106,8,0,124,4,0,100,3,0,131,2,0,
+ 143,20,0,125,5,0,124,5,0,106,9,0,124,1,0,131,
+ 1,0,1,87,100,4,0,81,88,116,2,0,106,10,0,124,
+ 3,0,124,0,0,131,2,0,1,87,110,59,0,4,116,11,
+ 0,107,10,0,114,187,0,1,1,1,121,17,0,116,2,0,
+ 106,12,0,124,3,0,131,1,0,1,87,110,18,0,4,116,
+ 11,0,107,10,0,114,179,0,1,1,1,89,110,1,0,88,
+ 130,0,0,89,110,1,0,88,100,4,0,83,40,5,0,0,
+ 0,117,162,0,0,0,66,101,115,116,45,101,102,102,111,114,
+ 116,32,102,117,110,99,116,105,111,110,32,116,111,32,119,114,
+ 105,116,101,32,100,97,116,97,32,116,111,32,97,32,112,97,
+ 116,104,32,97,116,111,109,105,99,97,108,108,121,46,10,32,
+ 32,32,32,66,101,32,112,114,101,112,97,114,101,100,32,116,
+ 111,32,104,97,110,100,108,101,32,97,32,70,105,108,101,69,
+ 120,105,115,116,115,69,114,114,111,114,32,105,102,32,99,111,
+ 110,99,117,114,114,101,110,116,32,119,114,105,116,105,110,103,
+ 32,111,102,32,116,104,101,10,32,32,32,32,116,101,109,112,
+ 111,114,97,114,121,32,102,105,108,101,32,105,115,32,97,116,
+ 116,101,109,112,116,101,100,46,117,5,0,0,0,123,125,46,
+ 123,125,105,182,1,0,0,117,2,0,0,0,119,98,78,40,
+ 13,0,0,0,117,6,0,0,0,102,111,114,109,97,116,117,
+ 2,0,0,0,105,100,117,3,0,0,0,95,111,115,117,4,
+ 0,0,0,111,112,101,110,117,6,0,0,0,79,95,69,88,
+ 67,76,117,7,0,0,0,79,95,67,82,69,65,84,117,8,
+ 0,0,0,79,95,87,82,79,78,76,89,117,3,0,0,0,
+ 95,105,111,117,6,0,0,0,70,105,108,101,73,79,117,5,
+ 0,0,0,119,114,105,116,101,117,7,0,0,0,114,101,112,
+ 108,97,99,101,117,7,0,0,0,79,83,69,114,114,111,114,
+ 117,6,0,0,0,117,110,108,105,110,107,40,6,0,0,0,
+ 117,4,0,0,0,112,97,116,104,117,4,0,0,0,100,97,
+ 116,97,117,4,0,0,0,109,111,100,101,117,8,0,0,0,
+ 112,97,116,104,95,116,109,112,117,2,0,0,0,102,100,117,
+ 4,0,0,0,102,105,108,101,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,13,0,0,0,95,119,114,105,116,101,95,
+ 97,116,111,109,105,99,121,0,0,0,115,26,0,0,0,0,
+ 5,24,1,9,1,33,1,3,3,21,1,19,1,20,1,13,
+ 1,3,1,17,1,13,1,5,1,117,13,0,0,0,95,119,
+ 114,105,116,101,95,97,116,111,109,105,99,99,2,0,0,0,
+ 0,0,0,0,3,0,0,0,7,0,0,0,67,0,0,0,
+ 115,95,0,0,0,120,69,0,100,1,0,100,2,0,100,3,
+ 0,100,4,0,103,4,0,68,93,49,0,125,2,0,116,0,
+ 0,124,1,0,124,2,0,131,2,0,114,19,0,116,1,0,
+ 124,0,0,124,2,0,116,2,0,124,1,0,124,2,0,131,
+ 2,0,131,3,0,1,113,19,0,113,19,0,87,124,0,0,
+ 106,3,0,106,4,0,124,1,0,106,3,0,131,1,0,1,
+ 100,5,0,83,40,6,0,0,0,117,47,0,0,0,83,105,
+ 109,112,108,101,32,115,117,98,115,116,105,116,117,116,101,32,
+ 102,111,114,32,102,117,110,99,116,111,111,108,115,46,117,112,
+ 100,97,116,101,95,119,114,97,112,112,101,114,46,117,10,0,
+ 0,0,95,95,109,111,100,117,108,101,95,95,117,8,0,0,
+ 0,95,95,110,97,109,101,95,95,117,12,0,0,0,95,95,
+ 113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,95,
+ 95,100,111,99,95,95,78,40,5,0,0,0,117,7,0,0,
+ 0,104,97,115,97,116,116,114,117,7,0,0,0,115,101,116,
+ 97,116,116,114,117,7,0,0,0,103,101,116,97,116,116,114,
+ 117,8,0,0,0,95,95,100,105,99,116,95,95,117,6,0,
+ 0,0,117,112,100,97,116,101,40,3,0,0,0,117,3,0,
+ 0,0,110,101,119,117,3,0,0,0,111,108,100,117,7,0,
+ 0,0,114,101,112,108,97,99,101,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,5,0,0,0,95,119,114,97,112,143,
+ 0,0,0,115,8,0,0,0,0,2,25,1,15,1,32,1,
+ 117,5,0,0,0,95,119,114,97,112,99,1,0,0,0,0,
+ 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,
+ 16,0,0,0,116,0,0,116,1,0,131,1,0,124,0,0,
+ 131,1,0,83,40,1,0,0,0,117,75,0,0,0,67,114,
+ 101,97,116,101,32,97,32,110,101,119,32,109,111,100,117,108,
+ 101,46,10,10,32,32,32,32,84,104,101,32,109,111,100,117,
+ 108,101,32,105,115,32,110,111,116,32,101,110,116,101,114,101,
+ 100,32,105,110,116,111,32,115,121,115,46,109,111,100,117,108,
+ 101,115,46,10,10,32,32,32,32,40,2,0,0,0,117,4,
+ 0,0,0,116,121,112,101,117,3,0,0,0,95,105,111,40,
+ 1,0,0,0,117,4,0,0,0,110,97,109,101,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,10,0,0,0,110,101,
+ 119,95,109,111,100,117,108,101,154,0,0,0,115,2,0,0,
+ 0,0,6,117,10,0,0,0,110,101,119,95,109,111,100,117,
+ 108,101,99,1,0,0,0,0,0,0,0,1,0,0,0,1,
+ 0,0,0,66,0,0,0,115,20,0,0,0,124,0,0,69,
+ 101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,83,
+ 40,2,0,0,0,117,14,0,0,0,95,68,101,97,100,108,
+ 111,99,107,69,114,114,111,114,78,40,3,0,0,0,117,8,
+ 0,0,0,95,95,110,97,109,101,95,95,117,10,0,0,0,
+ 95,95,109,111,100,117,108,101,95,95,117,12,0,0,0,95,
+ 95,113,117,97,108,110,97,109,101,95,95,40,1,0,0,0,
+ 117,10,0,0,0,95,95,108,111,99,97,108,115,95,95,40,
+ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,14,0,0,0,
+ 95,68,101,97,100,108,111,99,107,69,114,114,111,114,171,0,
+ 0,0,115,2,0,0,0,16,1,117,14,0,0,0,95,68,
+ 101,97,100,108,111,99,107,69,114,114,111,114,99,1,0,0,
+ 0,0,0,0,0,1,0,0,0,2,0,0,0,66,0,0,
+ 0,115,86,0,0,0,124,0,0,69,101,0,0,90,1,0,
+ 100,0,0,90,2,0,100,1,0,90,3,0,100,2,0,100,
+ 3,0,132,0,0,90,4,0,100,4,0,100,5,0,132,0,
+ 0,90,5,0,100,6,0,100,7,0,132,0,0,90,6,0,
+ 100,8,0,100,9,0,132,0,0,90,7,0,100,10,0,100,
+ 11,0,132,0,0,90,8,0,100,12,0,83,40,13,0,0,
+ 0,117,11,0,0,0,95,77,111,100,117,108,101,76,111,99,
+ 107,117,169,0,0,0,65,32,114,101,99,117,114,115,105,118,
+ 101,32,108,111,99,107,32,105,109,112,108,101,109,101,110,116,
+ 97,116,105,111,110,32,119,104,105,99,104,32,105,115,32,97,
+ 98,108,101,32,116,111,32,100,101,116,101,99,116,32,100,101,
+ 97,100,108,111,99,107,115,10,32,32,32,32,40,101,46,103,
+ 46,32,116,104,114,101,97,100,32,49,32,116,114,121,105,110,
+ 103,32,116,111,32,116,97,107,101,32,108,111,99,107,115,32,
+ 65,32,116,104,101,110,32,66,44,32,97,110,100,32,116,104,
+ 114,101,97,100,32,50,32,116,114,121,105,110,103,32,116,111,
+ 10,32,32,32,32,116,97,107,101,32,108,111,99,107,115,32,
+ 66,32,116,104,101,110,32,65,41,46,10,32,32,32,32,99,
+ 2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,
+ 67,0,0,0,115,70,0,0,0,116,0,0,106,1,0,131,
+ 0,0,124,0,0,95,2,0,116,0,0,106,1,0,131,0,
+ 0,124,0,0,95,3,0,124,1,0,124,0,0,95,4,0,
+ 100,0,0,124,0,0,95,6,0,100,1,0,124,0,0,95,
+ 7,0,100,1,0,124,0,0,95,8,0,100,0,0,83,40,
+ 2,0,0,0,78,105,0,0,0,0,40,9,0,0,0,117,
+ 7,0,0,0,95,116,104,114,101,97,100,117,13,0,0,0,
+ 97,108,108,111,99,97,116,101,95,108,111,99,107,117,4,0,
+ 0,0,108,111,99,107,117,6,0,0,0,119,97,107,101,117,
+ 112,117,4,0,0,0,110,97,109,101,117,4,0,0,0,78,
+ 111,110,101,117,5,0,0,0,111,119,110,101,114,117,5,0,
+ 0,0,99,111,117,110,116,117,7,0,0,0,119,97,105,116,
+ 101,114,115,40,2,0,0,0,117,4,0,0,0,115,101,108,
+ 102,117,4,0,0,0,110,97,109,101,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,8,0,0,0,95,95,105,110,105,
+ 116,95,95,181,0,0,0,115,12,0,0,0,0,1,15,1,
+ 15,1,9,1,9,1,9,1,117,20,0,0,0,95,77,111,
+ 100,117,108,101,76,111,99,107,46,95,95,105,110,105,116,95,
+ 95,99,1,0,0,0,0,0,0,0,4,0,0,0,2,0,
+ 0,0,67,0,0,0,115,87,0,0,0,116,0,0,106,1,
+ 0,131,0,0,125,1,0,124,0,0,106,2,0,125,2,0,
+ 120,59,0,116,3,0,106,4,0,124,2,0,131,1,0,125,
+ 3,0,124,3,0,100,0,0,107,8,0,114,55,0,100,1,
+ 0,83,124,3,0,106,2,0,125,2,0,124,2,0,124,1,
+ 0,107,2,0,114,24,0,100,2,0,83,113,24,0,100,0,
+ 0,83,40,3,0,0,0,78,70,84,40,8,0,0,0,117,
+ 7,0,0,0,95,116,104,114,101,97,100,117,9,0,0,0,
+ 103,101,116,95,105,100,101,110,116,117,5,0,0,0,111,119,
+ 110,101,114,117,12,0,0,0,95,98,108,111,99,107,105,110,
+ 103,95,111,110,117,3,0,0,0,103,101,116,117,4,0,0,
+ 0,78,111,110,101,117,5,0,0,0,70,97,108,115,101,117,
+ 4,0,0,0,84,114,117,101,40,4,0,0,0,117,4,0,
+ 0,0,115,101,108,102,117,2,0,0,0,109,101,117,3,0,
+ 0,0,116,105,100,117,4,0,0,0,108,111,99,107,40,0,
+ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,12,0,0,0,104,
+ 97,115,95,100,101,97,100,108,111,99,107,189,0,0,0,115,
+ 18,0,0,0,0,2,12,1,9,1,3,1,15,1,12,1,
+ 4,1,9,1,12,1,117,24,0,0,0,95,77,111,100,117,
+ 108,101,76,111,99,107,46,104,97,115,95,100,101,97,100,108,
+ 111,99,107,99,1,0,0,0,0,0,0,0,2,0,0,0,
+ 17,0,0,0,67,0,0,0,115,214,0,0,0,116,0,0,
+ 106,1,0,131,0,0,125,1,0,124,0,0,116,2,0,124,
+ 1,0,60,122,177,0,120,170,0,124,0,0,106,3,0,143,
+ 130,0,1,124,0,0,106,4,0,100,1,0,107,2,0,115,
+ 68,0,124,0,0,106,5,0,124,1,0,107,2,0,114,96,
+ 0,124,1,0,124,0,0,95,5,0,124,0,0,4,106,4,
+ 0,100,2,0,55,2,95,4,0,100,5,0,83,124,0,0,
+ 106,7,0,131,0,0,114,127,0,116,8,0,100,3,0,124,
+ 0,0,22,131,1,0,130,1,0,110,0,0,124,0,0,106,
+ 9,0,106,10,0,100,6,0,131,1,0,114,163,0,124,0,
+ 0,4,106,12,0,100,2,0,55,2,95,12,0,110,0,0,
+ 87,100,4,0,81,88,124,0,0,106,9,0,106,10,0,131,
+ 0,0,1,124,0,0,106,9,0,106,13,0,131,0,0,1,
+ 113,28,0,87,100,4,0,116,2,0,124,1,0,61,88,100,
+ 4,0,83,40,7,0,0,0,117,185,0,0,0,10,32,32,
+ 32,32,32,32,32,32,65,99,113,117,105,114,101,32,116,104,
+ 101,32,109,111,100,117,108,101,32,108,111,99,107,46,32,32,
+ 73,102,32,97,32,112,111,116,101,110,116,105,97,108,32,100,
+ 101,97,100,108,111,99,107,32,105,115,32,100,101,116,101,99,
+ 116,101,100,44,10,32,32,32,32,32,32,32,32,97,32,95,
+ 68,101,97,100,108,111,99,107,69,114,114,111,114,32,105,115,
+ 32,114,97,105,115,101,100,46,10,32,32,32,32,32,32,32,
+ 32,79,116,104,101,114,119,105,115,101,44,32,116,104,101,32,
+ 108,111,99,107,32,105,115,32,97,108,119,97,121,115,32,97,
+ 99,113,117,105,114,101,100,32,97,110,100,32,84,114,117,101,
+ 32,105,115,32,114,101,116,117,114,110,101,100,46,10,32,32,
+ 32,32,32,32,32,32,105,0,0,0,0,105,1,0,0,0,
+ 117,23,0,0,0,100,101,97,100,108,111,99,107,32,100,101,
+ 116,101,99,116,101,100,32,98,121,32,37,114,78,84,70,40,
+ 14,0,0,0,117,7,0,0,0,95,116,104,114,101,97,100,
+ 117,9,0,0,0,103,101,116,95,105,100,101,110,116,117,12,
+ 0,0,0,95,98,108,111,99,107,105,110,103,95,111,110,117,
+ 4,0,0,0,108,111,99,107,117,5,0,0,0,99,111,117,
+ 110,116,117,5,0,0,0,111,119,110,101,114,117,4,0,0,
+ 0,84,114,117,101,117,12,0,0,0,104,97,115,95,100,101,
+ 97,100,108,111,99,107,117,14,0,0,0,95,68,101,97,100,
+ 108,111,99,107,69,114,114,111,114,117,6,0,0,0,119,97,
+ 107,101,117,112,117,7,0,0,0,97,99,113,117,105,114,101,
+ 117,5,0,0,0,70,97,108,115,101,117,7,0,0,0,119,
+ 97,105,116,101,114,115,117,7,0,0,0,114,101,108,101,97,
+ 115,101,40,2,0,0,0,117,4,0,0,0,115,101,108,102,
+ 117,3,0,0,0,116,105,100,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,7,0,0,0,97,99,113,117,105,114,101,
+ 201,0,0,0,115,32,0,0,0,0,6,12,1,10,1,3,
+ 1,3,1,10,1,30,1,9,1,15,1,4,1,12,1,19,
+ 1,18,1,24,2,13,1,20,2,117,19,0,0,0,95,77,
+ 111,100,117,108,101,76,111,99,107,46,97,99,113,117,105,114,
+ 101,99,1,0,0,0,0,0,0,0,2,0,0,0,10,0,
+ 0,0,67,0,0,0,115,165,0,0,0,116,0,0,106,1,
+ 0,131,0,0,125,1,0,124,0,0,106,2,0,143,138,0,
+ 1,124,0,0,106,3,0,124,1,0,107,3,0,114,52,0,
+ 116,4,0,100,1,0,131,1,0,130,1,0,110,0,0,124,
+ 0,0,106,5,0,100,2,0,107,4,0,115,73,0,116,6,
+ 0,130,1,0,124,0,0,4,106,5,0,100,3,0,56,2,
+ 95,5,0,124,0,0,106,5,0,100,2,0,107,2,0,114,
+ 155,0,100,0,0,124,0,0,95,3,0,124,0,0,106,8,
+ 0,114,155,0,124,0,0,4,106,8,0,100,3,0,56,2,
+ 95,8,0,124,0,0,106,9,0,106,10,0,131,0,0,1,
+ 113,155,0,110,0,0,87,100,0,0,81,88,100,0,0,83,
+ 40,4,0,0,0,78,117,31,0,0,0,99,97,110,110,111,
+ 116,32,114,101,108,101,97,115,101,32,117,110,45,97,99,113,
+ 117,105,114,101,100,32,108,111,99,107,105,0,0,0,0,105,
+ 1,0,0,0,40,11,0,0,0,117,7,0,0,0,95,116,
+ 104,114,101,97,100,117,9,0,0,0,103,101,116,95,105,100,
+ 101,110,116,117,4,0,0,0,108,111,99,107,117,5,0,0,
+ 0,111,119,110,101,114,117,12,0,0,0,82,117,110,116,105,
+ 109,101,69,114,114,111,114,117,5,0,0,0,99,111,117,110,
+ 116,117,14,0,0,0,65,115,115,101,114,116,105,111,110,69,
+ 114,114,111,114,117,4,0,0,0,78,111,110,101,117,7,0,
+ 0,0,119,97,105,116,101,114,115,117,6,0,0,0,119,97,
+ 107,101,117,112,117,7,0,0,0,114,101,108,101,97,115,101,
+ 40,2,0,0,0,117,4,0,0,0,115,101,108,102,117,3,
+ 0,0,0,116,105,100,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,7,0,0,0,114,101,108,101,97,115,101,226,0,
+ 0,0,115,22,0,0,0,0,1,12,1,10,1,15,1,15,
+ 1,21,1,15,1,15,1,9,1,9,1,15,1,117,19,0,
+ 0,0,95,77,111,100,117,108,101,76,111,99,107,46,114,101,
+ 108,101,97,115,101,99,1,0,0,0,0,0,0,0,1,0,
+ 0,0,4,0,0,0,67,0,0,0,115,23,0,0,0,100,
+ 1,0,124,0,0,106,0,0,116,1,0,124,0,0,131,1,
+ 0,102,2,0,22,83,40,2,0,0,0,78,117,21,0,0,
+ 0,95,77,111,100,117,108,101,76,111,99,107,40,37,114,41,
+ 32,97,116,32,37,100,40,2,0,0,0,117,4,0,0,0,
+ 110,97,109,101,117,2,0,0,0,105,100,40,1,0,0,0,
+ 117,4,0,0,0,115,101,108,102,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,8,0,0,0,95,95,114,101,112,114,
+ 95,95,239,0,0,0,115,2,0,0,0,0,1,117,20,0,
+ 0,0,95,77,111,100,117,108,101,76,111,99,107,46,95,95,
+ 114,101,112,114,95,95,78,40,9,0,0,0,117,8,0,0,
+ 0,95,95,110,97,109,101,95,95,117,10,0,0,0,95,95,
+ 109,111,100,117,108,101,95,95,117,12,0,0,0,95,95,113,
+ 117,97,108,110,97,109,101,95,95,117,7,0,0,0,95,95,
+ 100,111,99,95,95,117,8,0,0,0,95,95,105,110,105,116,
+ 95,95,117,12,0,0,0,104,97,115,95,100,101,97,100,108,
+ 111,99,107,117,7,0,0,0,97,99,113,117,105,114,101,117,
+ 7,0,0,0,114,101,108,101,97,115,101,117,8,0,0,0,
+ 95,95,114,101,112,114,95,95,40,1,0,0,0,117,10,0,
+ 0,0,95,95,108,111,99,97,108,115,95,95,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,11,0,0,0,95,77,111,
+ 100,117,108,101,76,111,99,107,175,0,0,0,115,12,0,0,
+ 0,16,4,6,2,12,8,12,12,12,25,12,13,117,11,0,
+ 0,0,95,77,111,100,117,108,101,76,111,99,107,99,1,0,
+ 0,0,0,0,0,0,1,0,0,0,2,0,0,0,66,0,
+ 0,0,115,74,0,0,0,124,0,0,69,101,0,0,90,1,
+ 0,100,0,0,90,2,0,100,1,0,90,3,0,100,2,0,
+ 100,3,0,132,0,0,90,4,0,100,4,0,100,5,0,132,
+ 0,0,90,5,0,100,6,0,100,7,0,132,0,0,90,6,
+ 0,100,8,0,100,9,0,132,0,0,90,7,0,100,10,0,
+ 83,40,11,0,0,0,117,16,0,0,0,95,68,117,109,109,
+ 121,77,111,100,117,108,101,76,111,99,107,117,86,0,0,0,
+ 65,32,115,105,109,112,108,101,32,95,77,111,100,117,108,101,
+ 76,111,99,107,32,101,113,117,105,118,97,108,101,110,116,32,
+ 102,111,114,32,80,121,116,104,111,110,32,98,117,105,108,100,
+ 115,32,119,105,116,104,111,117,116,10,32,32,32,32,109,117,
+ 108,116,105,45,116,104,114,101,97,100,105,110,103,32,115,117,
+ 112,112,111,114,116,46,99,2,0,0,0,0,0,0,0,2,
+ 0,0,0,2,0,0,0,67,0,0,0,115,22,0,0,0,
+ 124,1,0,124,0,0,95,0,0,100,1,0,124,0,0,95,
+ 1,0,100,0,0,83,40,2,0,0,0,78,105,0,0,0,
+ 0,40,2,0,0,0,117,4,0,0,0,110,97,109,101,117,
+ 5,0,0,0,99,111,117,110,116,40,2,0,0,0,117,4,
+ 0,0,0,115,101,108,102,117,4,0,0,0,110,97,109,101,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,
+ 0,95,95,105,110,105,116,95,95,247,0,0,0,115,4,0,
+ 0,0,0,1,9,1,117,25,0,0,0,95,68,117,109,109,
+ 121,77,111,100,117,108,101,76,111,99,107,46,95,95,105,110,
+ 105,116,95,95,99,1,0,0,0,0,0,0,0,1,0,0,
+ 0,3,0,0,0,67,0,0,0,115,19,0,0,0,124,0,
+ 0,4,106,0,0,100,1,0,55,2,95,0,0,100,2,0,
+ 83,40,3,0,0,0,78,105,1,0,0,0,84,40,2,0,
+ 0,0,117,5,0,0,0,99,111,117,110,116,117,4,0,0,
+ 0,84,114,117,101,40,1,0,0,0,117,4,0,0,0,115,
+ 101,108,102,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 7,0,0,0,97,99,113,117,105,114,101,251,0,0,0,115,
+ 4,0,0,0,0,1,15,1,117,24,0,0,0,95,68,117,
+ 109,109,121,77,111,100,117,108,101,76,111,99,107,46,97,99,
+ 113,117,105,114,101,99,1,0,0,0,0,0,0,0,1,0,
+ 0,0,3,0,0,0,67,0,0,0,115,49,0,0,0,124,
+ 0,0,106,0,0,100,1,0,107,2,0,114,30,0,116,1,
+ 0,100,2,0,131,1,0,130,1,0,110,0,0,124,0,0,
+ 4,106,0,0,100,3,0,56,2,95,0,0,100,0,0,83,
+ 40,4,0,0,0,78,105,0,0,0,0,117,31,0,0,0,
+ 99,97,110,110,111,116,32,114,101,108,101,97,115,101,32,117,
+ 110,45,97,99,113,117,105,114,101,100,32,108,111,99,107,105,
+ 1,0,0,0,40,2,0,0,0,117,5,0,0,0,99,111,
+ 117,110,116,117,12,0,0,0,82,117,110,116,105,109,101,69,
+ 114,114,111,114,40,1,0,0,0,117,4,0,0,0,115,101,
+ 108,102,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,7,
+ 0,0,0,114,101,108,101,97,115,101,255,0,0,0,115,6,
+ 0,0,0,0,1,15,1,15,1,117,24,0,0,0,95,68,
+ 117,109,109,121,77,111,100,117,108,101,76,111,99,107,46,114,
+ 101,108,101,97,115,101,99,1,0,0,0,0,0,0,0,1,
+ 0,0,0,4,0,0,0,67,0,0,0,115,23,0,0,0,
+ 100,1,0,124,0,0,106,0,0,116,1,0,124,0,0,131,
+ 1,0,102,2,0,22,83,40,2,0,0,0,78,117,26,0,
+ 0,0,95,68,117,109,109,121,77,111,100,117,108,101,76,111,
+ 99,107,40,37,114,41,32,97,116,32,37,100,40,2,0,0,
+ 0,117,4,0,0,0,110,97,109,101,117,2,0,0,0,105,
+ 100,40,1,0,0,0,117,4,0,0,0,115,101,108,102,40,
+ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,0,
+ 95,95,114,101,112,114,95,95,4,1,0,0,115,2,0,0,
+ 0,0,1,117,25,0,0,0,95,68,117,109,109,121,77,111,
+ 100,117,108,101,76,111,99,107,46,95,95,114,101,112,114,95,
+ 95,78,40,8,0,0,0,117,8,0,0,0,95,95,110,97,
+ 109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,108,
+ 101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,97,
+ 109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,95,
+ 117,8,0,0,0,95,95,105,110,105,116,95,95,117,7,0,
+ 0,0,97,99,113,117,105,114,101,117,7,0,0,0,114,101,
+ 108,101,97,115,101,117,8,0,0,0,95,95,114,101,112,114,
+ 95,95,40,1,0,0,0,117,10,0,0,0,95,95,108,111,
+ 99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,16,0,0,0,95,68,117,109,109,121,77,111,100,
+ 117,108,101,76,111,99,107,243,0,0,0,115,10,0,0,0,
+ 16,2,6,2,12,4,12,4,12,5,117,16,0,0,0,95,
+ 68,117,109,109,121,77,111,100,117,108,101,76,111,99,107,99,
+ 1,0,0,0,0,0,0,0,3,0,0,0,11,0,0,0,
+ 3,0,0,0,115,142,0,0,0,100,3,0,125,1,0,121,
+ 17,0,116,1,0,136,0,0,25,131,0,0,125,1,0,87,
+ 110,18,0,4,116,2,0,107,10,0,114,43,0,1,1,1,
+ 89,110,1,0,88,124,1,0,100,3,0,107,8,0,114,138,
+ 0,116,3,0,100,3,0,107,8,0,114,83,0,116,4,0,
+ 136,0,0,131,1,0,125,1,0,110,12,0,116,5,0,136,
+ 0,0,131,1,0,125,1,0,135,0,0,102,1,0,100,1,
+ 0,100,2,0,134,0,0,125,2,0,116,6,0,106,7,0,
+ 124,1,0,124,2,0,131,2,0,116,1,0,136,0,0,60,
+ 110,0,0,124,1,0,83,40,4,0,0,0,117,109,0,0,
+ 0,71,101,116,32,111,114,32,99,114,101,97,116,101,32,116,
+ 104,101,32,109,111,100,117,108,101,32,108,111,99,107,32,102,
+ 111,114,32,97,32,103,105,118,101,110,32,109,111,100,117,108,
+ 101,32,110,97,109,101,46,10,10,32,32,32,32,83,104,111,
+ 117,108,100,32,111,110,108,121,32,98,101,32,99,97,108,108,
+ 101,100,32,119,105,116,104,32,116,104,101,32,105,109,112,111,
+ 114,116,32,108,111,99,107,32,116,97,107,101,110,46,99,1,
+ 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,19,
+ 0,0,0,115,11,0,0,0,116,0,0,136,0,0,61,100,
+ 0,0,83,40,1,0,0,0,78,40,1,0,0,0,117,13,
+ 0,0,0,95,109,111,100,117,108,101,95,108,111,99,107,115,
+ 40,1,0,0,0,117,1,0,0,0,95,40,1,0,0,0,
+ 117,4,0,0,0,110,97,109,101,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,2,0,0,0,99,98,24,1,0,0,115,2,0,0,0,
+ 0,1,117,28,0,0,0,95,103,101,116,95,109,111,100,117,
+ 108,101,95,108,111,99,107,46,60,108,111,99,97,108,115,62,
+ 46,99,98,78,40,8,0,0,0,117,4,0,0,0,78,111,
+ 110,101,117,13,0,0,0,95,109,111,100,117,108,101,95,108,
+ 111,99,107,115,117,8,0,0,0,75,101,121,69,114,114,111,
+ 114,117,7,0,0,0,95,116,104,114,101,97,100,117,16,0,
+ 0,0,95,68,117,109,109,121,77,111,100,117,108,101,76,111,
+ 99,107,117,11,0,0,0,95,77,111,100,117,108,101,76,111,
+ 99,107,117,8,0,0,0,95,119,101,97,107,114,101,102,117,
+ 3,0,0,0,114,101,102,40,3,0,0,0,117,4,0,0,
+ 0,110,97,109,101,117,4,0,0,0,108,111,99,107,117,2,
+ 0,0,0,99,98,40,0,0,0,0,40,1,0,0,0,117,
+ 4,0,0,0,110,97,109,101,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,16,0,0,0,95,
+ 103,101,116,95,109,111,100,117,108,101,95,108,111,99,107,10,
+ 1,0,0,115,24,0,0,0,0,4,6,1,3,1,17,1,
+ 13,1,5,1,12,1,12,1,15,2,12,1,18,2,25,1,
+ 117,16,0,0,0,95,103,101,116,95,109,111,100,117,108,101,
+ 95,108,111,99,107,99,1,0,0,0,0,0,0,0,2,0,
+ 0,0,11,0,0,0,67,0,0,0,115,71,0,0,0,116,
+ 0,0,124,0,0,131,1,0,125,1,0,116,1,0,106,2,
+ 0,131,0,0,1,121,14,0,124,1,0,106,3,0,131,0,
+ 0,1,87,110,18,0,4,116,4,0,107,10,0,114,56,0,
+ 1,1,1,89,110,11,0,88,124,1,0,106,5,0,131,0,
+ 0,1,100,1,0,83,40,2,0,0,0,117,21,1,0,0,
+ 82,101,108,101,97,115,101,32,116,104,101,32,103,108,111,98,
+ 97,108,32,105,109,112,111,114,116,32,108,111,99,107,44,32,
+ 97,110,100,32,97,99,113,117,105,114,101,115,32,116,104,101,
+ 110,32,114,101,108,101,97,115,101,32,116,104,101,10,32,32,
+ 32,32,109,111,100,117,108,101,32,108,111,99,107,32,102,111,
+ 114,32,97,32,103,105,118,101,110,32,109,111,100,117,108,101,
+ 32,110,97,109,101,46,10,32,32,32,32,84,104,105,115,32,
+ 105,115,32,117,115,101,100,32,116,111,32,101,110,115,117,114,
+ 101,32,97,32,109,111,100,117,108,101,32,105,115,32,99,111,
+ 109,112,108,101,116,101,108,121,32,105,110,105,116,105,97,108,
+ 105,122,101,100,44,32,105,110,32,116,104,101,10,32,32,32,
+ 32,101,118,101,110,116,32,105,116,32,105,115,32,98,101,105,
+ 110,103,32,105,109,112,111,114,116,101,100,32,98,121,32,97,
+ 110,111,116,104,101,114,32,116,104,114,101,97,100,46,10,10,
+ 32,32,32,32,83,104,111,117,108,100,32,111,110,108,121,32,
+ 98,101,32,99,97,108,108,101,100,32,119,105,116,104,32,116,
+ 104,101,32,105,109,112,111,114,116,32,108,111,99,107,32,116,
+ 97,107,101,110,46,78,40,6,0,0,0,117,16,0,0,0,
+ 95,103,101,116,95,109,111,100,117,108,101,95,108,111,99,107,
+ 117,4,0,0,0,95,105,109,112,117,12,0,0,0,114,101,
+ 108,101,97,115,101,95,108,111,99,107,117,7,0,0,0,97,
+ 99,113,117,105,114,101,117,14,0,0,0,95,68,101,97,100,
+ 108,111,99,107,69,114,114,111,114,117,7,0,0,0,114,101,
+ 108,101,97,115,101,40,2,0,0,0,117,4,0,0,0,110,
+ 97,109,101,117,4,0,0,0,108,111,99,107,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,19,0,0,0,95,108,111,
+ 99,107,95,117,110,108,111,99,107,95,109,111,100,117,108,101,
+ 29,1,0,0,115,14,0,0,0,0,7,12,1,10,1,3,
+ 1,14,1,13,3,5,2,117,19,0,0,0,95,108,111,99,
+ 107,95,117,110,108,111,99,107,95,109,111,100,117,108,101,99,
+ 1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
+ 79,0,0,0,115,13,0,0,0,124,0,0,124,1,0,124,
+ 2,0,142,0,0,83,40,1,0,0,0,117,46,1,0,0,
+ 114,101,109,111,118,101,95,105,109,112,111,114,116,108,105,98,
+ 95,102,114,97,109,101,115,32,105,110,32,105,109,112,111,114,
+ 116,46,99,32,119,105,108,108,32,97,108,119,97,121,115,32,
+ 114,101,109,111,118,101,32,115,101,113,117,101,110,99,101,115,
+ 10,32,32,32,32,111,102,32,105,109,112,111,114,116,108,105,
+ 98,32,102,114,97,109,101,115,32,116,104,97,116,32,101,110,
+ 100,32,119,105,116,104,32,97,32,99,97,108,108,32,116,111,
+ 32,116,104,105,115,32,102,117,110,99,116,105,111,110,10,10,
+ 32,32,32,32,85,115,101,32,105,116,32,105,110,115,116,101,
+ 97,100,32,111,102,32,97,32,110,111,114,109,97,108,32,99,
+ 97,108,108,32,105,110,32,112,108,97,99,101,115,32,119,104,
+ 101,114,101,32,105,110,99,108,117,100,105,110,103,32,116,104,
+ 101,32,105,109,112,111,114,116,108,105,98,10,32,32,32,32,
+ 102,114,97,109,101,115,32,105,110,116,114,111,100,117,99,101,
+ 115,32,117,110,119,97,110,116,101,100,32,110,111,105,115,101,
+ 32,105,110,116,111,32,116,104,101,32,116,114,97,99,101,98,
+ 97,99,107,32,40,101,46,103,46,32,119,104,101,110,32,101,
+ 120,101,99,117,116,105,110,103,10,32,32,32,32,109,111,100,
+ 117,108,101,32,99,111,100,101,41,10,32,32,32,32,40,0,
+ 0,0,0,40,3,0,0,0,117,1,0,0,0,102,117,4,
+ 0,0,0,97,114,103,115,117,4,0,0,0,107,119,100,115,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,25,0,0,
+ 0,95,99,97,108,108,95,119,105,116,104,95,102,114,97,109,
+ 101,115,95,114,101,109,111,118,101,100,49,1,0,0,115,2,
+ 0,0,0,0,8,117,25,0,0,0,95,99,97,108,108,95,
+ 119,105,116,104,95,102,114,97,109,101,115,95,114,101,109,111,
+ 118,101,100,105,158,12,0,0,117,1,0,0,0,13,105,16,
+ 0,0,0,117,1,0,0,0,10,105,24,0,0,0,99,1,
+ 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,99,
+ 0,0,0,115,29,0,0,0,124,0,0,93,19,0,125,1,
+ 0,116,0,0,124,1,0,63,100,0,0,64,86,1,113,3,
+ 0,100,1,0,83,40,2,0,0,0,105,255,0,0,0,78,
+ 40,1,0,0,0,117,17,0,0,0,95,82,65,87,95,77,
+ 65,71,73,67,95,78,85,77,66,69,82,40,2,0,0,0,
+ 117,2,0,0,0,46,48,117,1,0,0,0,110,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,9,0,0,0,60,103,
+ 101,110,101,120,112,114,62,150,1,0,0,115,2,0,0,0,
+ 6,0,117,9,0,0,0,60,103,101,110,101,120,112,114,62,
+ 105,0,0,0,0,105,25,0,0,0,105,8,0,0,0,117,
+ 11,0,0,0,95,95,112,121,99,97,99,104,101,95,95,117,
+ 3,0,0,0,46,112,121,117,4,0,0,0,46,112,121,99,
+ 117,4,0,0,0,46,112,121,111,99,2,0,0,0,0,0,
+ 0,0,11,0,0,0,6,0,0,0,67,0,0,0,115,173,
+ 0,0,0,124,1,0,100,5,0,107,8,0,114,18,0,116,
+ 1,0,110,3,0,124,1,0,125,2,0,124,2,0,114,39,
+ 0,116,2,0,125,3,0,110,6,0,116,3,0,125,3,0,
+ 116,4,0,124,0,0,131,1,0,92,2,0,125,4,0,125,
+ 5,0,124,5,0,106,5,0,100,1,0,131,1,0,92,3,
+ 0,125,6,0,125,7,0,125,8,0,116,6,0,106,7,0,
+ 106,8,0,125,9,0,124,9,0,100,5,0,107,8,0,114,
+ 126,0,116,9,0,100,2,0,131,1,0,130,1,0,110,0,
+ 0,100,3,0,106,10,0,124,6,0,124,7,0,124,9,0,
+ 124,3,0,100,4,0,25,103,4,0,131,1,0,125,10,0,
+ 116,11,0,124,4,0,116,12,0,124,10,0,131,3,0,83,
+ 40,6,0,0,0,117,242,1,0,0,71,105,118,101,110,32,
+ 116,104,101,32,112,97,116,104,32,116,111,32,97,32,46,112,
+ 121,32,102,105,108,101,44,32,114,101,116,117,114,110,32,116,
+ 104,101,32,112,97,116,104,32,116,111,32,105,116,115,32,46,
+ 112,121,99,47,46,112,121,111,32,102,105,108,101,46,10,10,
+ 32,32,32,32,84,104,101,32,46,112,121,32,102,105,108,101,
+ 32,100,111,101,115,32,110,111,116,32,110,101,101,100,32,116,
+ 111,32,101,120,105,115,116,59,32,116,104,105,115,32,115,105,
+ 109,112,108,121,32,114,101,116,117,114,110,115,32,116,104,101,
+ 32,112,97,116,104,32,116,111,32,116,104,101,10,32,32,32,
+ 32,46,112,121,99,47,46,112,121,111,32,102,105,108,101,32,
+ 99,97,108,99,117,108,97,116,101,100,32,97,115,32,105,102,
+ 32,116,104,101,32,46,112,121,32,102,105,108,101,32,119,101,
+ 114,101,32,105,109,112,111,114,116,101,100,46,32,32,84,104,
+ 101,32,101,120,116,101,110,115,105,111,110,10,32,32,32,32,
+ 119,105,108,108,32,98,101,32,46,112,121,99,32,117,110,108,
+ 101,115,115,32,95,95,100,101,98,117,103,95,95,32,105,115,
+ 32,110,111,116,32,100,101,102,105,110,101,100,44,32,116,104,
+ 101,110,32,105,116,32,119,105,108,108,32,98,101,32,46,112,
+ 121,111,46,10,10,32,32,32,32,73,102,32,100,101,98,117,
+ 103,95,111,118,101,114,114,105,100,101,32,105,115,32,110,111,
+ 116,32,78,111,110,101,44,32,116,104,101,110,32,105,116,32,
+ 109,117,115,116,32,98,101,32,97,32,98,111,111,108,101,97,
+ 110,32,97,110,100,32,105,115,32,116,97,107,101,110,32,97,
+ 115,10,32,32,32,32,116,104,101,32,118,97,108,117,101,32,
+ 111,102,32,95,95,100,101,98,117,103,95,95,32,105,110,115,
+ 116,101,97,100,46,10,10,32,32,32,32,73,102,32,115,121,
+ 115,46,105,109,112,108,101,109,101,110,116,97,116,105,111,110,
+ 46,99,97,99,104,101,95,116,97,103,32,105,115,32,78,111,
+ 110,101,32,116,104,101,110,32,78,111,116,73,109,112,108,101,
+ 109,101,110,116,101,100,69,114,114,111,114,32,105,115,32,114,
+ 97,105,115,101,100,46,10,10,32,32,32,32,117,1,0,0,
+ 0,46,117,36,0,0,0,115,121,115,46,105,109,112,108,101,
+ 109,101,110,116,97,116,105,111,110,46,99,97,99,104,101,95,
+ 116,97,103,32,105,115,32,78,111,110,101,117,0,0,0,0,
+ 105,0,0,0,0,78,40,13,0,0,0,117,4,0,0,0,
+ 78,111,110,101,117,9,0,0,0,95,95,100,101,98,117,103,
+ 95,95,117,23,0,0,0,68,69,66,85,71,95,66,89,84,
+ 69,67,79,68,69,95,83,85,70,70,73,88,69,83,117,27,
+ 0,0,0,79,80,84,73,77,73,90,69,68,95,66,89,84,
+ 69,67,79,68,69,95,83,85,70,70,73,88,69,83,117,11,
+ 0,0,0,95,112,97,116,104,95,115,112,108,105,116,117,9,
+ 0,0,0,112,97,114,116,105,116,105,111,110,117,3,0,0,
+ 0,115,121,115,117,14,0,0,0,105,109,112,108,101,109,101,
+ 110,116,97,116,105,111,110,117,9,0,0,0,99,97,99,104,
+ 101,95,116,97,103,117,19,0,0,0,78,111,116,73,109,112,
+ 108,101,109,101,110,116,101,100,69,114,114,111,114,117,4,0,
+ 0,0,106,111,105,110,117,10,0,0,0,95,112,97,116,104,
+ 95,106,111,105,110,117,8,0,0,0,95,80,89,67,65,67,
+ 72,69,40,11,0,0,0,117,4,0,0,0,112,97,116,104,
+ 117,14,0,0,0,100,101,98,117,103,95,111,118,101,114,114,
+ 105,100,101,117,5,0,0,0,100,101,98,117,103,117,8,0,
+ 0,0,115,117,102,102,105,120,101,115,117,4,0,0,0,104,
+ 101,97,100,117,4,0,0,0,116,97,105,108,117,13,0,0,
+ 0,98,97,115,101,95,102,105,108,101,110,97,109,101,117,3,
+ 0,0,0,115,101,112,117,1,0,0,0,95,117,3,0,0,
+ 0,116,97,103,117,8,0,0,0,102,105,108,101,110,97,109,
+ 101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,17,0,
+ 0,0,99,97,99,104,101,95,102,114,111,109,95,115,111,117,
+ 114,99,101,163,1,0,0,115,22,0,0,0,0,13,24,1,
+ 6,1,9,2,6,1,18,1,24,1,12,1,12,1,15,1,
+ 31,1,117,17,0,0,0,99,97,99,104,101,95,102,114,111,
+ 109,95,115,111,117,114,99,101,99,1,0,0,0,0,0,0,
+ 0,5,0,0,0,5,0,0,0,67,0,0,0,115,193,0,
+ 0,0,116,0,0,106,1,0,106,2,0,100,7,0,107,8,
+ 0,114,33,0,116,4,0,100,1,0,131,1,0,130,1,0,
+ 110,0,0,116,5,0,124,0,0,131,1,0,92,2,0,125,
+ 1,0,125,2,0,116,5,0,124,1,0,131,1,0,92,2,
+ 0,125,1,0,125,3,0,124,3,0,116,6,0,107,3,0,
+ 114,108,0,116,7,0,100,2,0,106,8,0,116,6,0,124,
+ 0,0,131,2,0,131,1,0,130,1,0,110,0,0,124,2,
+ 0,106,9,0,100,3,0,131,1,0,100,4,0,107,3,0,
+ 114,153,0,116,7,0,100,5,0,106,8,0,124,2,0,131,
+ 1,0,131,1,0,130,1,0,110,0,0,124,2,0,106,10,
+ 0,100,3,0,131,1,0,100,6,0,25,125,4,0,116,11,
+ 0,124,1,0,124,4,0,116,12,0,100,6,0,25,23,131,
+ 2,0,83,40,8,0,0,0,117,121,1,0,0,71,105,118,
+ 101,110,32,116,104,101,32,112,97,116,104,32,116,111,32,97,
+ 32,46,112,121,99,46,47,46,112,121,111,32,102,105,108,101,
+ 44,32,114,101,116,117,114,110,32,116,104,101,32,112,97,116,
+ 104,32,116,111,32,105,116,115,32,46,112,121,32,102,105,108,
+ 101,46,10,10,32,32,32,32,84,104,101,32,46,112,121,99,
+ 47,46,112,121,111,32,102,105,108,101,32,100,111,101,115,32,
+ 110,111,116,32,110,101,101,100,32,116,111,32,101,120,105,115,
+ 116,59,32,116,104,105,115,32,115,105,109,112,108,121,32,114,
+ 101,116,117,114,110,115,32,116,104,101,32,112,97,116,104,32,
+ 116,111,10,32,32,32,32,116,104,101,32,46,112,121,32,102,
+ 105,108,101,32,99,97,108,99,117,108,97,116,101,100,32,116,
+ 111,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,
+ 116,104,101,32,46,112,121,99,47,46,112,121,111,32,102,105,
+ 108,101,46,32,32,73,102,32,112,97,116,104,32,100,111,101,
+ 115,10,32,32,32,32,110,111,116,32,99,111,110,102,111,114,
+ 109,32,116,111,32,80,69,80,32,51,49,52,55,32,102,111,
+ 114,109,97,116,44,32,86,97,108,117,101,69,114,114,111,114,
+ 32,119,105,108,108,32,98,101,32,114,97,105,115,101,100,46,
+ 32,73,102,10,32,32,32,32,115,121,115,46,105,109,112,108,
+ 101,109,101,110,116,97,116,105,111,110,46,99,97,99,104,101,
+ 95,116,97,103,32,105,115,32,78,111,110,101,32,116,104,101,
+ 110,32,78,111,116,73,109,112,108,101,109,101,110,116,101,100,
+ 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46,
+ 10,10,32,32,32,32,117,36,0,0,0,115,121,115,46,105,
+ 109,112,108,101,109,101,110,116,97,116,105,111,110,46,99,97,
+ 99,104,101,95,116,97,103,32,105,115,32,78,111,110,101,117,
+ 37,0,0,0,123,125,32,110,111,116,32,98,111,116,116,111,
+ 109,45,108,101,118,101,108,32,100,105,114,101,99,116,111,114,
+ 121,32,105,110,32,123,33,114,125,117,1,0,0,0,46,105,
+ 2,0,0,0,117,28,0,0,0,101,120,112,101,99,116,101,
+ 100,32,111,110,108,121,32,50,32,100,111,116,115,32,105,110,
+ 32,123,33,114,125,105,0,0,0,0,78,40,13,0,0,0,
+ 117,3,0,0,0,115,121,115,117,14,0,0,0,105,109,112,
+ 108,101,109,101,110,116,97,116,105,111,110,117,9,0,0,0,
+ 99,97,99,104,101,95,116,97,103,117,4,0,0,0,78,111,
+ 110,101,117,19,0,0,0,78,111,116,73,109,112,108,101,109,
+ 101,110,116,101,100,69,114,114,111,114,117,11,0,0,0,95,
+ 112,97,116,104,95,115,112,108,105,116,117,8,0,0,0,95,
+ 80,89,67,65,67,72,69,117,10,0,0,0,86,97,108,117,
+ 101,69,114,114,111,114,117,6,0,0,0,102,111,114,109,97,
+ 116,117,5,0,0,0,99,111,117,110,116,117,9,0,0,0,
+ 112,97,114,116,105,116,105,111,110,117,10,0,0,0,95,112,
+ 97,116,104,95,106,111,105,110,117,15,0,0,0,83,79,85,
+ 82,67,69,95,83,85,70,70,73,88,69,83,40,5,0,0,
+ 0,117,4,0,0,0,112,97,116,104,117,4,0,0,0,104,
+ 101,97,100,117,16,0,0,0,112,121,99,97,99,104,101,95,
+ 102,105,108,101,110,97,109,101,117,7,0,0,0,112,121,99,
+ 97,99,104,101,117,13,0,0,0,98,97,115,101,95,102,105,
+ 108,101,110,97,109,101,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,17,0,0,0,115,111,117,114,99,101,95,102,114,
+ 111,109,95,99,97,99,104,101,190,1,0,0,115,24,0,0,
+ 0,0,9,18,1,15,1,18,1,18,1,12,1,9,1,18,
+ 1,21,1,9,1,15,1,19,1,117,17,0,0,0,115,111,
+ 117,114,99,101,95,102,114,111,109,95,99,97,99,104,101,99,
+ 1,0,0,0,0,0,0,0,5,0,0,0,13,0,0,0,
+ 67,0,0,0,115,164,0,0,0,116,0,0,124,0,0,131,
+ 1,0,100,1,0,107,2,0,114,22,0,100,6,0,83,124,
+ 0,0,106,2,0,100,2,0,131,1,0,92,3,0,125,1,
+ 0,125,2,0,125,3,0,124,1,0,12,115,81,0,124,3,
+ 0,106,3,0,131,0,0,100,7,0,100,8,0,133,2,0,
+ 25,100,5,0,107,3,0,114,85,0,124,0,0,83,121,16,
+ 0,116,4,0,124,0,0,131,1,0,125,4,0,87,110,40,
+ 0,4,116,5,0,116,6,0,102,2,0,107,10,0,114,143,
+ 0,1,1,1,116,7,0,100,9,0,100,6,0,133,2,0,
+ 25,125,4,0,89,110,1,0,88,116,8,0,116,9,0,131,
+ 1,0,114,160,0,124,4,0,83,124,0,0,83,40,10,0,
+ 0,0,117,188,0,0,0,67,111,110,118,101,114,116,32,97,
+ 32,98,121,116,101,99,111,100,101,32,102,105,108,101,32,112,
+ 97,116,104,32,116,111,32,97,32,115,111,117,114,99,101,32,
+ 112,97,116,104,32,40,105,102,32,112,111,115,115,105,98,108,
+ 101,41,46,10,10,32,32,32,32,84,104,105,115,32,102,117,
+ 110,99,116,105,111,110,32,101,120,105,115,116,115,32,112,117,
+ 114,101,108,121,32,102,111,114,32,98,97,99,107,119,97,114,
+ 100,115,45,99,111,109,112,97,116,105,98,105,108,105,116,121,
+ 32,102,111,114,10,32,32,32,32,80,121,73,109,112,111,114,
+ 116,95,69,120,101,99,67,111,100,101,77,111,100,117,108,101,
+ 87,105,116,104,70,105,108,101,110,97,109,101,115,40,41,32,
+ 105,110,32,116,104,101,32,67,32,65,80,73,46,10,10,32,
+ 32,32,32,105,0,0,0,0,117,1,0,0,0,46,105,3,
+ 0,0,0,105,1,0,0,0,117,3,0,0,0,46,112,121,
+ 78,105,253,255,255,255,105,255,255,255,255,105,255,255,255,255,
+ 40,10,0,0,0,117,3,0,0,0,108,101,110,117,4,0,
+ 0,0,78,111,110,101,117,9,0,0,0,114,112,97,114,105,
+ 116,105,111,110,117,5,0,0,0,108,111,119,101,114,117,17,
+ 0,0,0,115,111,117,114,99,101,95,102,114,111,109,95,99,
+ 97,99,104,101,117,19,0,0,0,78,111,116,73,109,112,108,
+ 101,109,101,110,116,101,100,69,114,114,111,114,117,10,0,0,
+ 0,86,97,108,117,101,69,114,114,111,114,117,12,0,0,0,
+ 98,121,116,99,111,100,101,95,112,97,116,104,117,12,0,0,
+ 0,95,112,97,116,104,95,105,115,102,105,108,101,117,12,0,
+ 0,0,115,111,117,114,99,101,95,115,116,97,116,115,40,5,
+ 0,0,0,117,13,0,0,0,98,121,116,101,99,111,100,101,
+ 95,112,97,116,104,117,4,0,0,0,114,101,115,116,117,1,
+ 0,0,0,95,117,9,0,0,0,101,120,116,101,110,115,105,
+ 111,110,117,11,0,0,0,115,111,117,114,99,101,95,112,97,
+ 116,104,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,15,
+ 0,0,0,95,103,101,116,95,115,111,117,114,99,101,102,105,
+ 108,101,213,1,0,0,115,20,0,0,0,0,7,18,1,4,
+ 1,24,1,35,1,4,2,3,1,16,1,19,1,21,2,117,
+ 15,0,0,0,95,103,101,116,95,115,111,117,114,99,101,102,
+ 105,108,101,99,1,0,0,0,0,0,0,0,2,0,0,0,
+ 4,0,0,0,71,0,0,0,115,75,0,0,0,116,0,0,
+ 106,1,0,106,2,0,114,71,0,124,0,0,106,3,0,100,
+ 6,0,131,1,0,115,40,0,100,3,0,124,0,0,23,125,
+ 0,0,110,0,0,116,4,0,124,0,0,106,5,0,124,1,
+ 0,140,0,0,100,4,0,116,0,0,106,6,0,131,1,1,
+ 1,110,0,0,100,5,0,83,40,7,0,0,0,117,61,0,
+ 0,0,80,114,105,110,116,32,116,104,101,32,109,101,115,115,
+ 97,103,101,32,116,111,32,115,116,100,101,114,114,32,105,102,
+ 32,45,118,47,80,89,84,72,79,78,86,69,82,66,79,83,
+ 69,32,105,115,32,116,117,114,110,101,100,32,111,110,46,117,
+ 1,0,0,0,35,117,7,0,0,0,105,109,112,111,114,116,
+ 32,117,2,0,0,0,35,32,117,4,0,0,0,102,105,108,
+ 101,78,40,2,0,0,0,117,1,0,0,0,35,117,7,0,
+ 0,0,105,109,112,111,114,116,32,40,7,0,0,0,117,3,
+ 0,0,0,115,121,115,117,5,0,0,0,102,108,97,103,115,
+ 117,7,0,0,0,118,101,114,98,111,115,101,117,10,0,0,
+ 0,115,116,97,114,116,115,119,105,116,104,117,5,0,0,0,
+ 112,114,105,110,116,117,6,0,0,0,102,111,114,109,97,116,
+ 117,6,0,0,0,115,116,100,101,114,114,40,2,0,0,0,
+ 117,7,0,0,0,109,101,115,115,97,103,101,117,4,0,0,
+ 0,97,114,103,115,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,16,0,0,0,95,118,101,114,98,111,115,101,95,109,
+ 101,115,115,97,103,101,234,1,0,0,115,8,0,0,0,0,
+ 2,12,1,15,1,13,1,117,16,0,0,0,95,118,101,114,
+ 98,111,115,101,95,109,101,115,115,97,103,101,99,1,0,0,
+ 0,0,0,0,0,2,0,0,0,3,0,0,0,3,0,0,
+ 0,115,35,0,0,0,135,0,0,102,1,0,100,1,0,100,
+ 2,0,134,0,0,125,1,0,116,0,0,124,1,0,136,0,
+ 0,131,2,0,1,124,1,0,83,40,3,0,0,0,117,39,
+ 0,0,0,83,101,116,32,95,95,112,97,99,107,97,103,101,
+ 95,95,32,111,110,32,116,104,101,32,114,101,116,117,114,110,
+ 101,100,32,109,111,100,117,108,101,46,99,0,0,0,0,0,
+ 0,0,0,3,0,0,0,4,0,0,0,31,0,0,0,115,
+ 101,0,0,0,136,0,0,124,0,0,124,1,0,142,0,0,
+ 125,2,0,116,0,0,124,2,0,100,1,0,100,0,0,131,
+ 3,0,100,0,0,107,8,0,114,97,0,124,2,0,106,2,
+ 0,124,2,0,95,3,0,116,4,0,124,2,0,100,2,0,
+ 131,2,0,115,97,0,124,2,0,106,3,0,106,5,0,100,
+ 3,0,131,1,0,100,4,0,25,124,2,0,95,3,0,113,
+ 97,0,110,0,0,124,2,0,83,40,5,0,0,0,78,117,
+ 11,0,0,0,95,95,112,97,99,107,97,103,101,95,95,117,
+ 8,0,0,0,95,95,112,97,116,104,95,95,117,1,0,0,
+ 0,46,105,0,0,0,0,40,6,0,0,0,117,7,0,0,
+ 0,103,101,116,97,116,116,114,117,4,0,0,0,78,111,110,
+ 101,117,8,0,0,0,95,95,110,97,109,101,95,95,117,11,
+ 0,0,0,95,95,112,97,99,107,97,103,101,95,95,117,7,
+ 0,0,0,104,97,115,97,116,116,114,117,10,0,0,0,114,
+ 112,97,114,116,105,116,105,111,110,40,3,0,0,0,117,4,
+ 0,0,0,97,114,103,115,117,6,0,0,0,107,119,97,114,
+ 103,115,117,6,0,0,0,109,111,100,117,108,101,40,1,0,
+ 0,0,117,3,0,0,0,102,120,110,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,19,0,0,0,115,101,116,95,112,97,99,107,97,103,
+ 101,95,119,114,97,112,112,101,114,244,1,0,0,115,12,0,
+ 0,0,0,1,15,1,24,1,12,1,15,1,31,1,117,40,
+ 0,0,0,115,101,116,95,112,97,99,107,97,103,101,46,60,
+ 108,111,99,97,108,115,62,46,115,101,116,95,112,97,99,107,
+ 97,103,101,95,119,114,97,112,112,101,114,40,1,0,0,0,
+ 117,5,0,0,0,95,119,114,97,112,40,2,0,0,0,117,
+ 3,0,0,0,102,120,110,117,19,0,0,0,115,101,116,95,
+ 112,97,99,107,97,103,101,95,119,114,97,112,112,101,114,40,
+ 0,0,0,0,40,1,0,0,0,117,3,0,0,0,102,120,
+ 110,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,11,0,0,0,115,101,116,95,112,97,99,107,
+ 97,103,101,242,1,0,0,115,6,0,0,0,0,2,18,7,
+ 13,1,117,11,0,0,0,115,101,116,95,112,97,99,107,97,
+ 103,101,99,1,0,0,0,0,0,0,0,2,0,0,0,3,
+ 0,0,0,3,0,0,0,115,35,0,0,0,135,0,0,102,
+ 1,0,100,1,0,100,2,0,134,0,0,125,1,0,116,0,
+ 0,124,1,0,136,0,0,131,2,0,1,124,1,0,83,40,
+ 3,0,0,0,117,38,0,0,0,83,101,116,32,95,95,108,
+ 111,97,100,101,114,95,95,32,111,110,32,116,104,101,32,114,
+ 101,116,117,114,110,101,100,32,109,111,100,117,108,101,46,99,
+ 1,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,
+ 31,0,0,0,115,49,0,0,0,136,0,0,124,0,0,124,
+ 1,0,124,2,0,142,1,0,125,3,0,116,0,0,124,3,
+ 0,100,1,0,131,2,0,115,45,0,124,0,0,124,3,0,
+ 95,1,0,110,0,0,124,3,0,83,40,2,0,0,0,78,
+ 117,10,0,0,0,95,95,108,111,97,100,101,114,95,95,40,
+ 2,0,0,0,117,7,0,0,0,104,97,115,97,116,116,114,
+ 117,10,0,0,0,95,95,108,111,97,100,101,114,95,95,40,
+ 4,0,0,0,117,4,0,0,0,115,101,108,102,117,4,0,
+ 0,0,97,114,103,115,117,6,0,0,0,107,119,97,114,103,
+ 115,117,6,0,0,0,109,111,100,117,108,101,40,1,0,0,
+ 0,117,3,0,0,0,102,120,110,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,18,0,0,0,115,101,116,95,108,111,97,100,101,114,95,
+ 119,114,97,112,112,101,114,1,2,0,0,115,8,0,0,0,
+ 0,1,18,1,15,1,12,1,117,38,0,0,0,115,101,116,
+ 95,108,111,97,100,101,114,46,60,108,111,99,97,108,115,62,
+ 46,115,101,116,95,108,111,97,100,101,114,95,119,114,97,112,
+ 112,101,114,40,1,0,0,0,117,5,0,0,0,95,119,114,
+ 97,112,40,2,0,0,0,117,3,0,0,0,102,120,110,117,
+ 18,0,0,0,115,101,116,95,108,111,97,100,101,114,95,119,
+ 114,97,112,112,101,114,40,0,0,0,0,40,1,0,0,0,
+ 117,3,0,0,0,102,120,110,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,10,0,0,0,115,
+ 101,116,95,108,111,97,100,101,114,255,1,0,0,115,6,0,
+ 0,0,0,2,18,5,13,1,117,10,0,0,0,115,101,116,
+ 95,108,111,97,100,101,114,99,1,0,0,0,0,0,0,0,
+ 2,0,0,0,3,0,0,0,3,0,0,0,115,35,0,0,
+ 0,135,0,0,102,1,0,100,1,0,100,2,0,134,0,0,
+ 125,1,0,116,0,0,124,1,0,136,0,0,131,2,0,1,
+ 124,1,0,83,40,3,0,0,0,117,42,3,0,0,68,101,
+ 99,111,114,97,116,111,114,32,116,111,32,104,97,110,100,108,
+ 101,32,115,101,108,101,99,116,105,110,103,32,116,104,101,32,
+ 112,114,111,112,101,114,32,109,111,100,117,108,101,32,102,111,
+ 114,32,108,111,97,100,101,114,115,46,10,10,32,32,32,32,
+ 84,104,101,32,100,101,99,111,114,97,116,101,100,32,102,117,
+ 110,99,116,105,111,110,32,105,115,32,112,97,115,115,101,100,
+ 32,116,104,101,32,109,111,100,117,108,101,32,116,111,32,117,
+ 115,101,32,105,110,115,116,101,97,100,32,111,102,32,116,104,
+ 101,32,109,111,100,117,108,101,10,32,32,32,32,110,97,109,
+ 101,46,32,84,104,101,32,109,111,100,117,108,101,32,112,97,
+ 115,115,101,100,32,105,110,32,116,111,32,116,104,101,32,102,
+ 117,110,99,116,105,111,110,32,105,115,32,101,105,116,104,101,
+ 114,32,102,114,111,109,32,115,121,115,46,109,111,100,117,108,
+ 101,115,32,105,102,10,32,32,32,32,105,116,32,97,108,114,
+ 101,97,100,121,32,101,120,105,115,116,115,32,111,114,32,105,
+ 115,32,97,32,110,101,119,32,109,111,100,117,108,101,46,32,
+ 73,102,32,116,104,101,32,109,111,100,117,108,101,32,105,115,
+ 32,110,101,119,44,32,116,104,101,110,32,95,95,110,97,109,
+ 101,95,95,10,32,32,32,32,105,115,32,115,101,116,32,116,
+ 104,101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,
+ 116,32,116,111,32,116,104,101,32,109,101,116,104,111,100,44,
+ 32,95,95,108,111,97,100,101,114,95,95,32,105,115,32,115,
+ 101,116,32,116,111,32,115,101,108,102,44,32,97,110,100,10,
+ 32,32,32,32,95,95,112,97,99,107,97,103,101,95,95,32,
+ 105,115,32,115,101,116,32,97,99,99,111,114,100,105,110,103,
+ 108,121,32,40,105,102,32,115,101,108,102,46,105,115,95,112,
+ 97,99,107,97,103,101,40,41,32,105,115,32,100,101,102,105,
+ 110,101,100,41,32,119,105,108,108,32,98,101,32,115,101,116,
+ 10,32,32,32,32,98,101,102,111,114,101,32,105,116,32,105,
+ 115,32,112,97,115,115,101,100,32,116,111,32,116,104,101,32,
+ 100,101,99,111,114,97,116,101,100,32,102,117,110,99,116,105,
+ 111,110,32,40,105,102,32,115,101,108,102,46,105,115,95,112,
+ 97,99,107,97,103,101,40,41,32,100,111,101,115,10,32,32,
+ 32,32,110,111,116,32,119,111,114,107,32,102,111,114,32,116,
+ 104,101,32,109,111,100,117,108,101,32,105,116,32,119,105,108,
+ 108,32,98,101,32,115,101,116,32,112,111,115,116,45,108,111,
+ 97,100,41,46,10,10,32,32,32,32,73,102,32,97,110,32,
+ 101,120,99,101,112,116,105,111,110,32,105,115,32,114,97,105,
+ 115,101,100,32,97,110,100,32,116,104,101,32,100,101,99,111,
+ 114,97,116,111,114,32,99,114,101,97,116,101,100,32,116,104,
+ 101,32,109,111,100,117,108,101,32,105,116,32,105,115,10,32,
+ 32,32,32,115,117,98,115,101,113,117,101,110,116,108,121,32,
+ 114,101,109,111,118,101,100,32,102,114,111,109,32,115,121,115,
+ 46,109,111,100,117,108,101,115,46,10,10,32,32,32,32,84,
+ 104,101,32,100,101,99,111,114,97,116,111,114,32,97,115,115,
+ 117,109,101,115,32,116,104,97,116,32,116,104,101,32,100,101,
+ 99,111,114,97,116,101,100,32,102,117,110,99,116,105,111,110,
+ 32,116,97,107,101,115,32,116,104,101,32,109,111,100,117,108,
+ 101,32,110,97,109,101,32,97,115,10,32,32,32,32,116,104,
+ 101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,
+ 116,46,10,10,32,32,32,32,99,2,0,0,0,0,0,0,
+ 0,7,0,0,0,25,0,0,0,31,0,0,0,115,254,0,
+ 0,0,116,0,0,106,1,0,106,2,0,124,1,0,131,1,
+ 0,125,4,0,124,4,0,100,0,0,107,9,0,125,5,0,
+ 124,5,0,115,168,0,116,4,0,124,1,0,131,1,0,125,
+ 4,0,100,3,0,124,4,0,95,6,0,124,4,0,116,0,
+ 0,106,1,0,124,1,0,60,124,0,0,124,4,0,95,7,
+ 0,121,19,0,124,0,0,106,8,0,124,1,0,131,1,0,
+ 125,6,0,87,110,24,0,4,116,9,0,116,10,0,102,2,
+ 0,107,10,0,114,124,0,1,1,1,89,113,177,0,88,124,
+ 6,0,114,143,0,124,1,0,124,4,0,95,11,0,113,177,
+ 0,124,1,0,106,12,0,100,1,0,131,1,0,100,2,0,
+ 25,124,4,0,95,11,0,110,9,0,100,3,0,124,4,0,
+ 95,6,0,122,60,0,121,23,0,136,0,0,124,0,0,124,
+ 4,0,124,2,0,124,3,0,142,2,0,83,87,110,30,0,
+ 1,1,1,124,5,0,115,228,0,116,0,0,106,1,0,124,
+ 1,0,61,110,0,0,130,0,0,89,110,1,0,88,87,100,
+ 0,0,100,4,0,124,4,0,95,6,0,88,100,0,0,83,
+ 40,5,0,0,0,78,117,1,0,0,0,46,105,0,0,0,
+ 0,84,70,40,14,0,0,0,117,3,0,0,0,115,121,115,
+ 117,7,0,0,0,109,111,100,117,108,101,115,117,3,0,0,
+ 0,103,101,116,117,4,0,0,0,78,111,110,101,117,10,0,
+ 0,0,110,101,119,95,109,111,100,117,108,101,117,4,0,0,
+ 0,84,114,117,101,117,16,0,0,0,95,95,105,110,105,116,
+ 105,97,108,105,122,105,110,103,95,95,117,10,0,0,0,95,
+ 95,108,111,97,100,101,114,95,95,117,10,0,0,0,105,115,
+ 95,112,97,99,107,97,103,101,117,11,0,0,0,73,109,112,
+ 111,114,116,69,114,114,111,114,117,14,0,0,0,65,116,116,
+ 114,105,98,117,116,101,69,114,114,111,114,117,11,0,0,0,
+ 95,95,112,97,99,107,97,103,101,95,95,117,10,0,0,0,
+ 114,112,97,114,116,105,116,105,111,110,117,5,0,0,0,70,
+ 97,108,115,101,40,7,0,0,0,117,4,0,0,0,115,101,
+ 108,102,117,8,0,0,0,102,117,108,108,110,97,109,101,117,
+ 4,0,0,0,97,114,103,115,117,6,0,0,0,107,119,97,
+ 114,103,115,117,6,0,0,0,109,111,100,117,108,101,117,9,
+ 0,0,0,105,115,95,114,101,108,111,97,100,117,10,0,0,
+ 0,105,115,95,112,97,99,107,97,103,101,40,1,0,0,0,
+ 117,3,0,0,0,102,120,110,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 25,0,0,0,109,111,100,117,108,101,95,102,111,114,95,108,
+ 111,97,100,101,114,95,119,114,97,112,112,101,114,28,2,0,
+ 0,115,44,0,0,0,0,1,18,1,12,1,6,4,12,3,
+ 9,1,13,1,9,1,3,1,19,1,19,1,5,2,6,1,
+ 12,2,25,2,9,1,6,2,23,1,3,1,6,1,13,1,
+ 12,2,117,52,0,0,0,109,111,100,117,108,101,95,102,111,
+ 114,95,108,111,97,100,101,114,46,60,108,111,99,97,108,115,
+ 62,46,109,111,100,117,108,101,95,102,111,114,95,108,111,97,
+ 100,101,114,95,119,114,97,112,112,101,114,40,1,0,0,0,
+ 117,5,0,0,0,95,119,114,97,112,40,2,0,0,0,117,
+ 3,0,0,0,102,120,110,117,25,0,0,0,109,111,100,117,
+ 108,101,95,102,111,114,95,108,111,97,100,101,114,95,119,114,
+ 97,112,112,101,114,40,0,0,0,0,40,1,0,0,0,117,
+ 3,0,0,0,102,120,110,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,17,0,0,0,109,111,
+ 100,117,108,101,95,102,111,114,95,108,111,97,100,101,114,10,
+ 2,0,0,115,6,0,0,0,0,18,18,33,13,1,117,17,
+ 0,0,0,109,111,100,117,108,101,95,102,111,114,95,108,111,
+ 97,100,101,114,99,1,0,0,0,0,0,0,0,2,0,0,
+ 0,4,0,0,0,3,0,0,0,115,38,0,0,0,100,3,
+ 0,135,0,0,102,1,0,100,1,0,100,2,0,134,1,0,
+ 125,1,0,116,1,0,124,1,0,136,0,0,131,2,0,1,
+ 124,1,0,83,40,4,0,0,0,117,252,0,0,0,68,101,
+ 99,111,114,97,116,111,114,32,116,111,32,118,101,114,105,102,
+ 121,32,116,104,97,116,32,116,104,101,32,109,111,100,117,108,
+ 101,32,98,101,105,110,103,32,114,101,113,117,101,115,116,101,
+ 100,32,109,97,116,99,104,101,115,32,116,104,101,32,111,110,
+ 101,32,116,104,101,10,32,32,32,32,108,111,97,100,101,114,
+ 32,99,97,110,32,104,97,110,100,108,101,46,10,10,32,32,
+ 32,32,84,104,101,32,102,105,114,115,116,32,97,114,103,117,
+ 109,101,110,116,32,40,115,101,108,102,41,32,109,117,115,116,
+ 32,100,101,102,105,110,101,32,95,110,97,109,101,32,119,104,
+ 105,99,104,32,116,104,101,32,115,101,99,111,110,100,32,97,
+ 114,103,117,109,101,110,116,32,105,115,10,32,32,32,32,99,
+ 111,109,112,97,114,101,100,32,97,103,97,105,110,115,116,46,
+ 32,73,102,32,116,104,101,32,99,111,109,112,97,114,105,115,
+ 111,110,32,102,97,105,108,115,32,116,104,101,110,32,73,109,
+ 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105,
+ 115,101,100,46,10,10,32,32,32,32,99,2,0,0,0,0,
+ 0,0,0,4,0,0,0,5,0,0,0,31,0,0,0,115,
+ 83,0,0,0,124,1,0,100,0,0,107,8,0,114,24,0,
+ 124,0,0,106,1,0,125,1,0,110,40,0,124,0,0,106,
+ 1,0,124,1,0,107,3,0,114,64,0,116,2,0,100,1,
+ 0,124,1,0,22,100,2,0,124,1,0,131,1,1,130,1,
+ 0,110,0,0,136,0,0,124,0,0,124,1,0,124,2,0,
+ 124,3,0,142,2,0,83,40,3,0,0,0,78,117,23,0,
+ 0,0,108,111,97,100,101,114,32,99,97,110,110,111,116,32,
+ 104,97,110,100,108,101,32,37,115,117,4,0,0,0,110,97,
+ 109,101,40,3,0,0,0,117,4,0,0,0,78,111,110,101,
+ 117,4,0,0,0,110,97,109,101,117,11,0,0,0,73,109,
+ 112,111,114,116,69,114,114,111,114,40,4,0,0,0,117,4,
+ 0,0,0,115,101,108,102,117,4,0,0,0,110,97,109,101,
+ 117,4,0,0,0,97,114,103,115,117,6,0,0,0,107,119,
+ 97,114,103,115,40,1,0,0,0,117,6,0,0,0,109,101,
+ 116,104,111,100,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,19,0,0,0,
+ 95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,
+ 112,101,114,73,2,0,0,115,10,0,0,0,0,1,12,1,
+ 12,1,15,1,25,1,117,40,0,0,0,95,99,104,101,99,
+ 107,95,110,97,109,101,46,60,108,111,99,97,108,115,62,46,
+ 95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,
+ 112,101,114,78,40,2,0,0,0,117,4,0,0,0,78,111,
+ 110,101,117,5,0,0,0,95,119,114,97,112,40,2,0,0,
+ 0,117,6,0,0,0,109,101,116,104,111,100,117,19,0,0,
+ 0,95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,
+ 112,112,101,114,40,0,0,0,0,40,1,0,0,0,117,6,
+ 0,0,0,109,101,116,104,111,100,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,11,0,0,0,
+ 95,99,104,101,99,107,95,110,97,109,101,65,2,0,0,115,
+ 6,0,0,0,0,8,21,6,13,1,117,11,0,0,0,95,
+ 99,104,101,99,107,95,110,97,109,101,99,1,0,0,0,0,
+ 0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,
+ 35,0,0,0,135,0,0,102,1,0,100,1,0,100,2,0,
+ 134,0,0,125,1,0,116,0,0,124,1,0,136,0,0,131,
+ 2,0,1,124,1,0,83,40,3,0,0,0,117,49,0,0,
+ 0,68,101,99,111,114,97,116,111,114,32,116,111,32,118,101,
+ 114,105,102,121,32,116,104,101,32,110,97,109,101,100,32,109,
+ 111,100,117,108,101,32,105,115,32,98,117,105,108,116,45,105,
+ 110,46,99,2,0,0,0,0,0,0,0,2,0,0,0,4,
+ 0,0,0,19,0,0,0,115,58,0,0,0,124,1,0,116,
+ 0,0,106,1,0,107,7,0,114,45,0,116,2,0,100,1,
+ 0,106,3,0,124,1,0,131,1,0,100,2,0,124,1,0,
+ 131,1,1,130,1,0,110,0,0,136,0,0,124,0,0,124,
+ 1,0,131,2,0,83,40,3,0,0,0,78,117,27,0,0,
+ 0,123,125,32,105,115,32,110,111,116,32,97,32,98,117,105,
+ 108,116,45,105,110,32,109,111,100,117,108,101,117,4,0,0,
+ 0,110,97,109,101,40,4,0,0,0,117,3,0,0,0,115,
+ 121,115,117,20,0,0,0,98,117,105,108,116,105,110,95,109,
+ 111,100,117,108,101,95,110,97,109,101,115,117,11,0,0,0,
+ 73,109,112,111,114,116,69,114,114,111,114,117,6,0,0,0,
+ 102,111,114,109,97,116,40,2,0,0,0,117,4,0,0,0,
+ 115,101,108,102,117,8,0,0,0,102,117,108,108,110,97,109,
+ 101,40,1,0,0,0,117,3,0,0,0,102,120,110,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,25,0,0,0,95,114,101,113,117,105,
+ 114,101,115,95,98,117,105,108,116,105,110,95,119,114,97,112,
+ 112,101,114,85,2,0,0,115,8,0,0,0,0,1,15,1,
+ 18,1,12,1,117,52,0,0,0,95,114,101,113,117,105,114,
+ 101,115,95,98,117,105,108,116,105,110,46,60,108,111,99,97,
+ 108,115,62,46,95,114,101,113,117,105,114,101,115,95,98,117,
+ 105,108,116,105,110,95,119,114,97,112,112,101,114,40,1,0,
+ 0,0,117,5,0,0,0,95,119,114,97,112,40,2,0,0,
+ 0,117,3,0,0,0,102,120,110,117,25,0,0,0,95,114,
+ 101,113,117,105,114,101,115,95,98,117,105,108,116,105,110,95,
+ 119,114,97,112,112,101,114,40,0,0,0,0,40,1,0,0,
+ 0,117,3,0,0,0,102,120,110,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,17,0,0,0,
+ 95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,105,
+ 110,83,2,0,0,115,6,0,0,0,0,2,18,5,13,1,
+ 117,17,0,0,0,95,114,101,113,117,105,114,101,115,95,98,
+ 117,105,108,116,105,110,99,1,0,0,0,0,0,0,0,2,
+ 0,0,0,3,0,0,0,3,0,0,0,115,35,0,0,0,
+ 135,0,0,102,1,0,100,1,0,100,2,0,134,0,0,125,
+ 1,0,116,0,0,124,1,0,136,0,0,131,2,0,1,124,
+ 1,0,83,40,3,0,0,0,117,47,0,0,0,68,101,99,
+ 111,114,97,116,111,114,32,116,111,32,118,101,114,105,102,121,
+ 32,116,104,101,32,110,97,109,101,100,32,109,111,100,117,108,
+ 101,32,105,115,32,102,114,111,122,101,110,46,99,2,0,0,
+ 0,0,0,0,0,2,0,0,0,4,0,0,0,19,0,0,
+ 0,115,58,0,0,0,116,0,0,106,1,0,124,1,0,131,
+ 1,0,115,45,0,116,2,0,100,1,0,106,3,0,124,1,
+ 0,131,1,0,100,2,0,124,1,0,131,1,1,130,1,0,
+ 110,0,0,136,0,0,124,0,0,124,1,0,131,2,0,83,
+ 40,3,0,0,0,78,117,25,0,0,0,123,125,32,105,115,
+ 32,110,111,116,32,97,32,102,114,111,122,101,110,32,109,111,
+ 100,117,108,101,117,4,0,0,0,110,97,109,101,40,4,0,
+ 0,0,117,4,0,0,0,95,105,109,112,117,9,0,0,0,
+ 105,115,95,102,114,111,122,101,110,117,11,0,0,0,73,109,
+ 112,111,114,116,69,114,114,111,114,117,6,0,0,0,102,111,
+ 114,109,97,116,40,2,0,0,0,117,4,0,0,0,115,101,
+ 108,102,117,8,0,0,0,102,117,108,108,110,97,109,101,40,
+ 1,0,0,0,117,3,0,0,0,102,120,110,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,24,0,0,0,95,114,101,113,117,105,114,101,
+ 115,95,102,114,111,122,101,110,95,119,114,97,112,112,101,114,
+ 96,2,0,0,115,8,0,0,0,0,1,15,1,18,1,12,
+ 1,117,50,0,0,0,95,114,101,113,117,105,114,101,115,95,
+ 102,114,111,122,101,110,46,60,108,111,99,97,108,115,62,46,
+ 95,114,101,113,117,105,114,101,115,95,102,114,111,122,101,110,
+ 95,119,114,97,112,112,101,114,40,1,0,0,0,117,5,0,
+ 0,0,95,119,114,97,112,40,2,0,0,0,117,3,0,0,
+ 0,102,120,110,117,24,0,0,0,95,114,101,113,117,105,114,
+ 101,115,95,102,114,111,122,101,110,95,119,114,97,112,112,101,
+ 114,40,0,0,0,0,40,1,0,0,0,117,3,0,0,0,
+ 102,120,110,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,16,0,0,0,95,114,101,113,117,105,
+ 114,101,115,95,102,114,111,122,101,110,94,2,0,0,115,6,
+ 0,0,0,0,2,18,5,13,1,117,16,0,0,0,95,114,
+ 101,113,117,105,114,101,115,95,102,114,111,122,101,110,99,2,
+ 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,
+ 0,0,0,115,87,0,0,0,124,0,0,106,0,0,124,1,
+ 0,131,1,0,92,2,0,125,2,0,125,3,0,124,2,0,
+ 100,3,0,107,8,0,114,83,0,116,2,0,124,3,0,131,
+ 1,0,114,83,0,100,1,0,125,4,0,116,3,0,106,4,
+ 0,124,4,0,106,5,0,124,3,0,100,2,0,25,131,1,
+ 0,116,6,0,131,2,0,1,110,0,0,124,2,0,83,40,
+ 4,0,0,0,117,86,0,0,0,84,114,121,32,116,111,32,
+ 102,105,110,100,32,97,32,108,111,97,100,101,114,32,102,111,
+ 114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,
+ 109,111,100,117,108,101,32,98,121,32,100,101,108,101,103,97,
+ 116,105,110,103,32,116,111,10,32,32,32,32,115,101,108,102,
+ 46,102,105,110,100,95,108,111,97,100,101,114,40,41,46,117,
+ 44,0,0,0,78,111,116,32,105,109,112,111,114,116,105,110,
+ 103,32,100,105,114,101,99,116,111,114,121,32,123,125,58,32,
+ 109,105,115,115,105,110,103,32,95,95,105,110,105,116,95,95,
+ 105,0,0,0,0,78,40,7,0,0,0,117,11,0,0,0,
+ 102,105,110,100,95,108,111,97,100,101,114,117,4,0,0,0,
+ 78,111,110,101,117,3,0,0,0,108,101,110,117,9,0,0,
+ 0,95,119,97,114,110,105,110,103,115,117,4,0,0,0,119,
+ 97,114,110,117,6,0,0,0,102,111,114,109,97,116,117,13,
+ 0,0,0,73,109,112,111,114,116,87,97,114,110,105,110,103,
+ 40,5,0,0,0,117,4,0,0,0,115,101,108,102,117,8,
+ 0,0,0,102,117,108,108,110,97,109,101,117,6,0,0,0,
+ 108,111,97,100,101,114,117,8,0,0,0,112,111,114,116,105,
+ 111,110,115,117,3,0,0,0,109,115,103,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,17,0,0,0,95,102,105,110,
+ 100,95,109,111,100,117,108,101,95,115,104,105,109,105,2,0,
+ 0,115,10,0,0,0,0,6,21,1,24,1,6,1,32,1,
+ 117,17,0,0,0,95,102,105,110,100,95,109,111,100,117,108,
+ 101,95,115,104,105,109,99,1,0,0,0,0,0,0,0,1,
+ 0,0,0,6,0,0,0,66,0,0,0,115,173,0,0,0,
+ 124,0,0,69,101,0,0,90,1,0,100,0,0,90,2,0,
+ 100,1,0,90,3,0,101,4,0,100,2,0,100,3,0,132,
+ 0,0,131,1,0,90,5,0,101,4,0,100,14,0,100,4,
+ 0,100,5,0,132,1,0,131,1,0,90,7,0,101,4,0,
+ 101,8,0,101,9,0,101,10,0,100,6,0,100,7,0,132,
+ 0,0,131,1,0,131,1,0,131,1,0,131,1,0,90,11,
+ 0,101,4,0,101,10,0,100,8,0,100,9,0,132,0,0,
+ 131,1,0,131,1,0,90,12,0,101,4,0,101,10,0,100,
+ 10,0,100,11,0,132,0,0,131,1,0,131,1,0,90,13,
+ 0,101,4,0,101,10,0,100,12,0,100,13,0,132,0,0,
+ 131,1,0,131,1,0,90,14,0,100,14,0,83,40,15,0,
+ 0,0,117,15,0,0,0,66,117,105,108,116,105,110,73,109,
+ 112,111,114,116,101,114,117,144,0,0,0,77,101,116,97,32,
+ 112,97,116,104,32,105,109,112,111,114,116,32,102,111,114,32,
+ 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,
+ 46,10,10,32,32,32,32,65,108,108,32,109,101,116,104,111,
+ 100,115,32,97,114,101,32,101,105,116,104,101,114,32,99,108,
+ 97,115,115,32,111,114,32,115,116,97,116,105,99,32,109,101,
+ 116,104,111,100,115,32,116,111,32,97,118,111,105,100,32,116,
+ 104,101,32,110,101,101,100,32,116,111,10,32,32,32,32,105,
+ 110,115,116,97,110,116,105,97,116,101,32,116,104,101,32,99,
+ 108,97,115,115,46,10,10,32,32,32,32,99,2,0,0,0,
+ 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,
+ 115,16,0,0,0,100,1,0,106,0,0,124,1,0,106,1,
+ 0,131,1,0,83,40,2,0,0,0,78,117,24,0,0,0,
+ 60,109,111,100,117,108,101,32,39,123,125,39,32,40,98,117,
+ 105,108,116,45,105,110,41,62,40,2,0,0,0,117,6,0,
+ 0,0,102,111,114,109,97,116,117,8,0,0,0,95,95,110,
+ 97,109,101,95,95,40,2,0,0,0,117,3,0,0,0,99,
+ 108,115,117,6,0,0,0,109,111,100,117,108,101,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,11,0,0,0,109,111,
+ 100,117,108,101,95,114,101,112,114,131,2,0,0,115,2,0,
+ 0,0,0,2,117,27,0,0,0,66,117,105,108,116,105,110,
+ 73,109,112,111,114,116,101,114,46,109,111,100,117,108,101,95,
+ 114,101,112,114,99,3,0,0,0,0,0,0,0,3,0,0,
+ 0,2,0,0,0,67,0,0,0,115,39,0,0,0,124,2,
+ 0,100,1,0,107,9,0,114,16,0,100,1,0,83,116,1,
+ 0,106,2,0,124,1,0,131,1,0,114,35,0,124,0,0,
+ 83,100,1,0,83,40,2,0,0,0,117,113,0,0,0,70,
+ 105,110,100,32,116,104,101,32,98,117,105,108,116,45,105,110,
+ 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,
+ 32,32,73,102,32,39,112,97,116,104,39,32,105,115,32,101,
+ 118,101,114,32,115,112,101,99,105,102,105,101,100,32,116,104,
+ 101,110,32,116,104,101,32,115,101,97,114,99,104,32,105,115,
+ 32,99,111,110,115,105,100,101,114,101,100,32,97,32,102,97,
+ 105,108,117,114,101,46,10,10,32,32,32,32,32,32,32,32,
+ 78,40,3,0,0,0,117,4,0,0,0,78,111,110,101,117,
+ 4,0,0,0,95,105,109,112,117,10,0,0,0,105,115,95,
+ 98,117,105,108,116,105,110,40,3,0,0,0,117,3,0,0,
+ 0,99,108,115,117,8,0,0,0,102,117,108,108,110,97,109,
+ 101,117,4,0,0,0,112,97,116,104,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,11,0,0,0,102,105,110,100,95,
+ 109,111,100,117,108,101,135,2,0,0,115,6,0,0,0,0,
+ 7,12,1,4,1,117,27,0,0,0,66,117,105,108,116,105,
+ 110,73,109,112,111,114,116,101,114,46,102,105,110,100,95,109,
+ 111,100,117,108,101,99,2,0,0,0,0,0,0,0,3,0,
+ 0,0,9,0,0,0,67,0,0,0,115,88,0,0,0,124,
+ 1,0,116,0,0,106,1,0,107,6,0,125,2,0,121,20,
+ 0,116,2,0,116,3,0,106,4,0,124,1,0,131,2,0,
+ 83,87,110,46,0,1,1,1,124,2,0,12,114,76,0,124,
+ 1,0,116,0,0,106,1,0,107,6,0,114,76,0,116,0,
+ 0,106,1,0,124,1,0,61,110,0,0,130,0,0,89,110,
+ 1,0,88,100,1,0,83,40,2,0,0,0,117,23,0,0,
+ 0,76,111,97,100,32,97,32,98,117,105,108,116,45,105,110,
+ 32,109,111,100,117,108,101,46,78,40,5,0,0,0,117,3,
+ 0,0,0,115,121,115,117,7,0,0,0,109,111,100,117,108,
+ 101,115,117,25,0,0,0,95,99,97,108,108,95,119,105,116,
+ 104,95,102,114,97,109,101,115,95,114,101,109,111,118,101,100,
+ 117,4,0,0,0,95,105,109,112,117,12,0,0,0,105,110,
+ 105,116,95,98,117,105,108,116,105,110,40,3,0,0,0,117,
+ 3,0,0,0,99,108,115,117,8,0,0,0,102,117,108,108,
+ 110,97,109,101,117,9,0,0,0,105,115,95,114,101,108,111,
+ 97,100,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,
+ 0,0,0,108,111,97,100,95,109,111,100,117,108,101,146,2,
+ 0,0,115,14,0,0,0,0,6,15,1,3,1,20,1,3,
+ 1,22,1,13,1,117,27,0,0,0,66,117,105,108,116,105,
+ 110,73,109,112,111,114,116,101,114,46,108,111,97,100,95,109,
+ 111,100,117,108,101,99,2,0,0,0,0,0,0,0,2,0,
+ 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,
+ 1,0,83,40,2,0,0,0,117,57,0,0,0,82,101,116,
+ 117,114,110,32,78,111,110,101,32,97,115,32,98,117,105,108,
+ 116,45,105,110,32,109,111,100,117,108,101,115,32,100,111,32,
+ 110,111,116,32,104,97,118,101,32,99,111,100,101,32,111,98,
+ 106,101,99,116,115,46,78,40,1,0,0,0,117,4,0,0,
+ 0,78,111,110,101,40,2,0,0,0,117,3,0,0,0,99,
+ 108,115,117,8,0,0,0,102,117,108,108,110,97,109,101,40,
+ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,0,
+ 103,101,116,95,99,111,100,101,160,2,0,0,115,2,0,0,
+ 0,0,4,117,24,0,0,0,66,117,105,108,116,105,110,73,
+ 109,112,111,114,116,101,114,46,103,101,116,95,99,111,100,101,
+ 99,2,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
+ 0,67,0,0,0,115,4,0,0,0,100,1,0,83,40,2,
+ 0,0,0,117,56,0,0,0,82,101,116,117,114,110,32,78,
+ 111,110,101,32,97,115,32,98,117,105,108,116,45,105,110,32,
+ 109,111,100,117,108,101,115,32,100,111,32,110,111,116,32,104,
+ 97,118,101,32,115,111,117,114,99,101,32,99,111,100,101,46,
+ 78,40,1,0,0,0,117,4,0,0,0,78,111,110,101,40,
+ 2,0,0,0,117,3,0,0,0,99,108,115,117,8,0,0,
+ 0,102,117,108,108,110,97,109,101,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,10,0,0,0,103,101,116,95,115,111,
+ 117,114,99,101,166,2,0,0,115,2,0,0,0,0,4,117,
+ 26,0,0,0,66,117,105,108,116,105,110,73,109,112,111,114,
+ 116,101,114,46,103,101,116,95,115,111,117,114,99,101,99,2,
+ 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,
+ 0,0,0,115,4,0,0,0,100,1,0,83,40,2,0,0,
+ 0,117,52,0,0,0,82,101,116,117,114,110,32,70,97,108,
+ 115,101,32,97,115,32,98,117,105,108,116,45,105,110,32,109,
+ 111,100,117,108,101,115,32,97,114,101,32,110,101,118,101,114,
+ 32,112,97,99,107,97,103,101,115,46,70,40,1,0,0,0,
+ 117,5,0,0,0,70,97,108,115,101,40,2,0,0,0,117,
+ 3,0,0,0,99,108,115,117,8,0,0,0,102,117,108,108,
+ 110,97,109,101,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,10,0,0,0,105,115,95,112,97,99,107,97,103,101,172,
+ 2,0,0,115,2,0,0,0,0,4,117,26,0,0,0,66,
+ 117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,105,
+ 115,95,112,97,99,107,97,103,101,78,40,15,0,0,0,117,
+ 8,0,0,0,95,95,110,97,109,101,95,95,117,10,0,0,
+ 0,95,95,109,111,100,117,108,101,95,95,117,12,0,0,0,
+ 95,95,113,117,97,108,110,97,109,101,95,95,117,7,0,0,
+ 0,95,95,100,111,99,95,95,117,11,0,0,0,99,108,97,
+ 115,115,109,101,116,104,111,100,117,11,0,0,0,109,111,100,
+ 117,108,101,95,114,101,112,114,117,4,0,0,0,78,111,110,
+ 101,117,11,0,0,0,102,105,110,100,95,109,111,100,117,108,
+ 101,117,11,0,0,0,115,101,116,95,112,97,99,107,97,103,
+ 101,117,10,0,0,0,115,101,116,95,108,111,97,100,101,114,
+ 117,17,0,0,0,95,114,101,113,117,105,114,101,115,95,98,
+ 117,105,108,116,105,110,117,11,0,0,0,108,111,97,100,95,
+ 109,111,100,117,108,101,117,8,0,0,0,103,101,116,95,99,
+ 111,100,101,117,10,0,0,0,103,101,116,95,115,111,117,114,
+ 99,101,117,10,0,0,0,105,115,95,112,97,99,107,97,103,
+ 101,40,1,0,0,0,117,10,0,0,0,95,95,108,111,99,
+ 97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,15,0,0,0,66,117,105,108,116,105,110,73,109,112,
+ 111,114,116,101,114,122,2,0,0,115,28,0,0,0,16,7,
+ 6,2,18,4,3,1,18,10,3,1,3,1,3,1,27,11,
+ 3,1,21,5,3,1,21,5,3,1,117,15,0,0,0,66,
+ 117,105,108,116,105,110,73,109,112,111,114,116,101,114,99,1,
+ 0,0,0,0,0,0,0,1,0,0,0,6,0,0,0,66,
+ 0,0,0,115,173,0,0,0,124,0,0,69,101,0,0,90,
+ 1,0,100,0,0,90,2,0,100,1,0,90,3,0,101,4,
+ 0,100,2,0,100,3,0,132,0,0,131,1,0,90,5,0,
+ 101,4,0,100,14,0,100,4,0,100,5,0,132,1,0,131,
+ 1,0,90,7,0,101,4,0,101,8,0,101,9,0,101,10,
+ 0,100,6,0,100,7,0,132,0,0,131,1,0,131,1,0,
+ 131,1,0,131,1,0,90,11,0,101,4,0,101,10,0,100,
+ 8,0,100,9,0,132,0,0,131,1,0,131,1,0,90,12,
+ 0,101,4,0,101,10,0,100,10,0,100,11,0,132,0,0,
+ 131,1,0,131,1,0,90,13,0,101,4,0,101,10,0,100,
+ 12,0,100,13,0,132,0,0,131,1,0,131,1,0,90,14,
+ 0,100,14,0,83,40,15,0,0,0,117,14,0,0,0,70,
+ 114,111,122,101,110,73,109,112,111,114,116,101,114,117,142,0,
+ 0,0,77,101,116,97,32,112,97,116,104,32,105,109,112,111,
+ 114,116,32,102,111,114,32,102,114,111,122,101,110,32,109,111,
+ 100,117,108,101,115,46,10,10,32,32,32,32,65,108,108,32,
+ 109,101,116,104,111,100,115,32,97,114,101,32,101,105,116,104,
+ 101,114,32,99,108,97,115,115,32,111,114,32,115,116,97,116,
+ 105,99,32,109,101,116,104,111,100,115,32,116,111,32,97,118,
+ 111,105,100,32,116,104,101,32,110,101,101,100,32,116,111,10,
+ 32,32,32,32,105,110,115,116,97,110,116,105,97,116,101,32,
+ 116,104,101,32,99,108,97,115,115,46,10,10,32,32,32,32,
+ 99,2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,
+ 0,67,0,0,0,115,16,0,0,0,100,1,0,106,0,0,
+ 124,1,0,106,1,0,131,1,0,83,40,2,0,0,0,78,
+ 117,22,0,0,0,60,109,111,100,117,108,101,32,39,123,125,
+ 39,32,40,102,114,111,122,101,110,41,62,40,2,0,0,0,
+ 117,6,0,0,0,102,111,114,109,97,116,117,8,0,0,0,
+ 95,95,110,97,109,101,95,95,40,2,0,0,0,117,3,0,
+ 0,0,99,108,115,117,1,0,0,0,109,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,11,0,0,0,109,111,100,117,
+ 108,101,95,114,101,112,114,188,2,0,0,115,2,0,0,0,
+ 0,2,117,26,0,0,0,70,114,111,122,101,110,73,109,112,
+ 111,114,116,101,114,46,109,111,100,117,108,101,95,114,101,112,
+ 114,99,3,0,0,0,0,0,0,0,3,0,0,0,2,0,
+ 0,0,67,0,0,0,115,23,0,0,0,116,0,0,106,1,
+ 0,124,1,0,131,1,0,114,19,0,124,0,0,83,100,1,
+ 0,83,40,2,0,0,0,117,21,0,0,0,70,105,110,100,
+ 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101,
+ 46,78,40,3,0,0,0,117,4,0,0,0,95,105,109,112,
+ 117,9,0,0,0,105,115,95,102,114,111,122,101,110,117,4,
+ 0,0,0,78,111,110,101,40,3,0,0,0,117,3,0,0,
+ 0,99,108,115,117,8,0,0,0,102,117,108,108,110,97,109,
+ 101,117,4,0,0,0,112,97,116,104,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,11,0,0,0,102,105,110,100,95,
+ 109,111,100,117,108,101,192,2,0,0,115,2,0,0,0,0,
+ 3,117,26,0,0,0,70,114,111,122,101,110,73,109,112,111,
+ 114,116,101,114,46,102,105,110,100,95,109,111,100,117,108,101,
+ 99,2,0,0,0,0,0,0,0,4,0,0,0,9,0,0,
+ 0,67,0,0,0,115,100,0,0,0,124,1,0,116,0,0,
+ 106,1,0,107,6,0,125,2,0,121,32,0,116,2,0,116,
+ 3,0,106,4,0,124,1,0,131,2,0,125,3,0,124,3,
+ 0,96,5,0,124,3,0,83,87,110,46,0,1,1,1,124,
+ 2,0,12,114,88,0,124,1,0,116,0,0,106,1,0,107,
+ 6,0,114,88,0,116,0,0,106,1,0,124,1,0,61,110,
+ 0,0,130,0,0,89,110,1,0,88,100,1,0,83,40,2,
+ 0,0,0,117,21,0,0,0,76,111,97,100,32,97,32,102,
+ 114,111,122,101,110,32,109,111,100,117,108,101,46,78,40,6,
+ 0,0,0,117,3,0,0,0,115,121,115,117,7,0,0,0,
+ 109,111,100,117,108,101,115,117,25,0,0,0,95,99,97,108,
+ 108,95,119,105,116,104,95,102,114,97,109,101,115,95,114,101,
+ 109,111,118,101,100,117,4,0,0,0,95,105,109,112,117,11,
+ 0,0,0,105,110,105,116,95,102,114,111,122,101,110,117,8,
+ 0,0,0,95,95,102,105,108,101,95,95,40,4,0,0,0,
+ 117,3,0,0,0,99,108,115,117,8,0,0,0,102,117,108,
+ 108,110,97,109,101,117,9,0,0,0,105,115,95,114,101,108,
+ 111,97,100,117,1,0,0,0,109,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,11,0,0,0,108,111,97,100,95,109,
+ 111,100,117,108,101,197,2,0,0,115,18,0,0,0,0,6,
+ 15,1,3,1,18,2,6,1,8,1,3,1,22,1,13,1,
+ 117,26,0,0,0,70,114,111,122,101,110,73,109,112,111,114,
+ 116,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99,
+ 2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,
+ 67,0,0,0,115,13,0,0,0,116,0,0,106,1,0,124,
+ 1,0,131,1,0,83,40,1,0,0,0,117,45,0,0,0,
+ 82,101,116,117,114,110,32,116,104,101,32,99,111,100,101,32,
+ 111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,102,
+ 114,111,122,101,110,32,109,111,100,117,108,101,46,40,2,0,
+ 0,0,117,4,0,0,0,95,105,109,112,117,17,0,0,0,
+ 103,101,116,95,102,114,111,122,101,110,95,111,98,106,101,99,
+ 116,40,2,0,0,0,117,3,0,0,0,99,108,115,117,8,
+ 0,0,0,102,117,108,108,110,97,109,101,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,8,0,0,0,103,101,116,95,
+ 99,111,100,101,214,2,0,0,115,2,0,0,0,0,4,117,
+ 23,0,0,0,70,114,111,122,101,110,73,109,112,111,114,116,
+ 101,114,46,103,101,116,95,99,111,100,101,99,2,0,0,0,
+ 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,
+ 115,4,0,0,0,100,1,0,83,40,2,0,0,0,117,54,
+ 0,0,0,82,101,116,117,114,110,32,78,111,110,101,32,97,
+ 115,32,102,114,111,122,101,110,32,109,111,100,117,108,101,115,
+ 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117,
+ 114,99,101,32,99,111,100,101,46,78,40,1,0,0,0,117,
+ 4,0,0,0,78,111,110,101,40,2,0,0,0,117,3,0,
+ 0,0,99,108,115,117,8,0,0,0,102,117,108,108,110,97,
+ 109,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,10,
+ 0,0,0,103,101,116,95,115,111,117,114,99,101,220,2,0,
+ 0,115,2,0,0,0,0,4,117,25,0,0,0,70,114,111,
+ 122,101,110,73,109,112,111,114,116,101,114,46,103,101,116,95,
+ 115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,2,
+ 0,0,0,2,0,0,0,67,0,0,0,115,13,0,0,0,
+ 116,0,0,106,1,0,124,1,0,131,1,0,83,40,1,0,
+ 0,0,117,46,0,0,0,82,101,116,117,114,110,32,84,114,
+ 117,101,32,105,102,32,116,104,101,32,102,114,111,122,101,110,
+ 32,109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,
+ 107,97,103,101,46,40,2,0,0,0,117,4,0,0,0,95,
+ 105,109,112,117,17,0,0,0,105,115,95,102,114,111,122,101,
+ 110,95,112,97,99,107,97,103,101,40,2,0,0,0,117,3,
+ 0,0,0,99,108,115,117,8,0,0,0,102,117,108,108,110,
+ 97,109,101,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 10,0,0,0,105,115,95,112,97,99,107,97,103,101,226,2,
+ 0,0,115,2,0,0,0,0,4,117,25,0,0,0,70,114,
+ 111,122,101,110,73,109,112,111,114,116,101,114,46,105,115,95,
+ 112,97,99,107,97,103,101,78,40,15,0,0,0,117,8,0,
+ 0,0,95,95,110,97,109,101,95,95,117,10,0,0,0,95,
+ 95,109,111,100,117,108,101,95,95,117,12,0,0,0,95,95,
+ 113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,95,
+ 95,100,111,99,95,95,117,11,0,0,0,99,108,97,115,115,
+ 109,101,116,104,111,100,117,11,0,0,0,109,111,100,117,108,
+ 101,95,114,101,112,114,117,4,0,0,0,78,111,110,101,117,
+ 11,0,0,0,102,105,110,100,95,109,111,100,117,108,101,117,
+ 11,0,0,0,115,101,116,95,112,97,99,107,97,103,101,117,
+ 10,0,0,0,115,101,116,95,108,111,97,100,101,114,117,16,
+ 0,0,0,95,114,101,113,117,105,114,101,115,95,102,114,111,
+ 122,101,110,117,11,0,0,0,108,111,97,100,95,109,111,100,
+ 117,108,101,117,8,0,0,0,103,101,116,95,99,111,100,101,
+ 117,10,0,0,0,103,101,116,95,115,111,117,114,99,101,117,
+ 10,0,0,0,105,115,95,112,97,99,107,97,103,101,40,1,
+ 0,0,0,117,10,0,0,0,95,95,108,111,99,97,108,115,
+ 95,95,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,14,
+ 0,0,0,70,114,111,122,101,110,73,109,112,111,114,116,101,
+ 114,179,2,0,0,115,28,0,0,0,16,7,6,2,18,4,
+ 3,1,18,4,3,1,3,1,3,1,27,14,3,1,21,5,
+ 3,1,21,5,3,1,117,14,0,0,0,70,114,111,122,101,
+ 110,73,109,112,111,114,116,101,114,99,1,0,0,0,0,0,
+ 0,0,1,0,0,0,4,0,0,0,66,0,0,0,115,101,
+ 0,0,0,124,0,0,69,101,0,0,90,1,0,100,0,0,
+ 90,2,0,100,1,0,90,3,0,100,2,0,90,4,0,100,
+ 3,0,90,5,0,100,11,0,90,7,0,101,8,0,100,4,
+ 0,100,5,0,132,0,0,131,1,0,90,9,0,101,8,0,
+ 100,6,0,100,7,0,132,0,0,131,1,0,90,10,0,101,
+ 8,0,100,10,0,100,8,0,100,9,0,132,1,0,131,1,
+ 0,90,12,0,100,10,0,83,40,12,0,0,0,117,21,0,
+ 0,0,87,105,110,100,111,119,115,82,101,103,105,115,116,114,
+ 121,70,105,110,100,101,114,117,67,0,0,0,77,101,116,97,
+ 32,112,97,116,104,32,102,105,110,100,101,114,32,102,111,114,
+ 32,109,111,100,117,108,101,115,32,100,101,99,108,97,114,101,
+ 100,32,105,110,32,116,104,101,32,87,105,110,100,111,119,115,
+ 32,114,101,103,105,115,116,114,121,46,10,32,32,32,32,117,
+ 59,0,0,0,83,111,102,116,119,97,114,101,92,80,121,116,
+ 104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,
+ 115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,
+ 117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,117,
+ 65,0,0,0,83,111,102,116,119,97,114,101,92,80,121,116,
+ 104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,
+ 115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,
+ 117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,92,
+ 68,101,98,117,103,99,2,0,0,0,0,0,0,0,2,0,
+ 0,0,11,0,0,0,67,0,0,0,115,67,0,0,0,121,
+ 23,0,116,0,0,106,1,0,116,0,0,106,2,0,124,1,
+ 0,131,2,0,83,87,110,37,0,4,116,3,0,107,10,0,
+ 114,62,0,1,1,1,116,0,0,106,1,0,116,0,0,106,
+ 4,0,124,1,0,131,2,0,83,89,110,1,0,88,100,0,
+ 0,83,40,1,0,0,0,78,40,5,0,0,0,117,7,0,
+ 0,0,95,119,105,110,114,101,103,117,7,0,0,0,79,112,
+ 101,110,75,101,121,117,17,0,0,0,72,75,69,89,95,67,
+ 85,82,82,69,78,84,95,85,83,69,82,117,12,0,0,0,
+ 87,105,110,100,111,119,115,69,114,114,111,114,117,18,0,0,
+ 0,72,75,69,89,95,76,79,67,65,76,95,77,65,67,72,
+ 73,78,69,40,2,0,0,0,117,3,0,0,0,99,108,115,
+ 117,3,0,0,0,107,101,121,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,14,0,0,0,95,111,112,101,110,95,114,
+ 101,103,105,115,116,114,121,246,2,0,0,115,8,0,0,0,
+ 0,2,3,1,23,1,13,1,117,36,0,0,0,87,105,110,
+ 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,
+ 101,114,46,95,111,112,101,110,95,114,101,103,105,115,116,114,
+ 121,99,2,0,0,0,0,0,0,0,6,0,0,0,16,0,
+ 0,0,67,0,0,0,115,142,0,0,0,124,0,0,106,0,
+ 0,114,21,0,124,0,0,106,1,0,125,2,0,110,9,0,
+ 124,0,0,106,2,0,125,2,0,124,2,0,106,3,0,100,
+ 1,0,124,1,0,100,2,0,116,4,0,106,5,0,100,0,
+ 0,100,3,0,133,2,0,25,131,0,2,125,3,0,121,46,
+ 0,124,0,0,106,6,0,124,3,0,131,1,0,143,25,0,
+ 125,4,0,116,7,0,106,8,0,124,4,0,100,4,0,131,
+ 2,0,125,5,0,87,100,0,0,81,88,87,110,22,0,4,
+ 116,9,0,107,10,0,114,137,0,1,1,1,100,0,0,83,
+ 89,110,1,0,88,124,5,0,83,40,5,0,0,0,78,117,
+ 8,0,0,0,102,117,108,108,110,97,109,101,117,11,0,0,
+ 0,115,121,115,95,118,101,114,115,105,111,110,105,3,0,0,
+ 0,117,0,0,0,0,40,11,0,0,0,117,11,0,0,0,
+ 68,69,66,85,71,95,66,85,73,76,68,117,18,0,0,0,
+ 82,69,71,73,83,84,82,89,95,75,69,89,95,68,69,66,
+ 85,71,117,12,0,0,0,82,69,71,73,83,84,82,89,95,
+ 75,69,89,117,6,0,0,0,102,111,114,109,97,116,117,3,
+ 0,0,0,115,121,115,117,7,0,0,0,118,101,114,115,105,
+ 111,110,117,14,0,0,0,95,111,112,101,110,95,114,101,103,
+ 105,115,116,114,121,117,7,0,0,0,95,119,105,110,114,101,
+ 103,117,10,0,0,0,81,117,101,114,121,86,97,108,117,101,
+ 117,12,0,0,0,87,105,110,100,111,119,115,69,114,114,111,
+ 114,117,4,0,0,0,78,111,110,101,40,6,0,0,0,117,
+ 3,0,0,0,99,108,115,117,8,0,0,0,102,117,108,108,
+ 110,97,109,101,117,12,0,0,0,114,101,103,105,115,116,114,
+ 121,95,107,101,121,117,3,0,0,0,107,101,121,117,4,0,
+ 0,0,104,107,101,121,117,8,0,0,0,102,105,108,101,112,
+ 97,116,104,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 16,0,0,0,95,115,101,97,114,99,104,95,114,101,103,105,
+ 115,116,114,121,253,2,0,0,115,22,0,0,0,0,2,9,
+ 1,12,2,9,1,15,1,22,1,3,1,18,1,28,1,13,
+ 1,9,1,117,38,0,0,0,87,105,110,100,111,119,115,82,
+ 101,103,105,115,116,114,121,70,105,110,100,101,114,46,95,115,
+ 101,97,114,99,104,95,114,101,103,105,115,116,114,121,99,3,
+ 0,0,0,0,0,0,0,7,0,0,0,12,0,0,0,67,
+ 0,0,0,115,140,0,0,0,124,0,0,106,0,0,124,1,
+ 0,131,1,0,125,3,0,124,3,0,100,1,0,107,8,0,
+ 114,31,0,100,1,0,83,121,17,0,116,2,0,106,3,0,
+ 124,3,0,131,1,0,1,87,110,22,0,4,116,4,0,107,
+ 10,0,114,72,0,1,1,1,100,1,0,83,89,110,1,0,
+ 88,120,60,0,116,5,0,131,0,0,68,93,49,0,92,3,
+ 0,125,4,0,125,5,0,125,6,0,124,3,0,106,6,0,
+ 116,7,0,124,5,0,131,1,0,131,1,0,114,83,0,124,
+ 4,0,124,1,0,124,3,0,131,2,0,83,113,83,0,87,
+ 100,1,0,83,40,2,0,0,0,117,34,0,0,0,70,105,
+ 110,100,32,109,111,100,117,108,101,32,110,97,109,101,100,32,
+ 105,110,32,116,104,101,32,114,101,103,105,115,116,114,121,46,
+ 78,40,8,0,0,0,117,16,0,0,0,95,115,101,97,114,
+ 99,104,95,114,101,103,105,115,116,114,121,117,4,0,0,0,
+ 78,111,110,101,117,3,0,0,0,95,111,115,117,4,0,0,
+ 0,115,116,97,116,117,7,0,0,0,79,83,69,114,114,111,
+ 114,117,27,0,0,0,95,103,101,116,95,115,117,112,112,111,
+ 114,116,101,100,95,102,105,108,101,95,108,111,97,100,101,114,
+ 115,117,8,0,0,0,101,110,100,115,119,105,116,104,117,5,
+ 0,0,0,116,117,112,108,101,40,7,0,0,0,117,3,0,
+ 0,0,99,108,115,117,8,0,0,0,102,117,108,108,110,97,
+ 109,101,117,4,0,0,0,112,97,116,104,117,8,0,0,0,
+ 102,105,108,101,112,97,116,104,117,6,0,0,0,108,111,97,
+ 100,101,114,117,8,0,0,0,115,117,102,102,105,120,101,115,
+ 117,1,0,0,0,95,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,11,0,0,0,102,105,110,100,95,109,111,100,117,
+ 108,101,12,3,0,0,115,20,0,0,0,0,3,15,1,12,
+ 1,4,1,3,1,17,1,13,1,9,1,25,1,21,1,117,
+ 33,0,0,0,87,105,110,100,111,119,115,82,101,103,105,115,
+ 116,114,121,70,105,110,100,101,114,46,102,105,110,100,95,109,
+ 111,100,117,108,101,78,70,40,13,0,0,0,117,8,0,0,
+ 0,95,95,110,97,109,101,95,95,117,10,0,0,0,95,95,
+ 109,111,100,117,108,101,95,95,117,12,0,0,0,95,95,113,
+ 117,97,108,110,97,109,101,95,95,117,7,0,0,0,95,95,
+ 100,111,99,95,95,117,12,0,0,0,82,69,71,73,83,84,
+ 82,89,95,75,69,89,117,18,0,0,0,82,69,71,73,83,
+ 84,82,89,95,75,69,89,95,68,69,66,85,71,117,5,0,
+ 0,0,70,97,108,115,101,117,11,0,0,0,68,69,66,85,
+ 71,95,66,85,73,76,68,117,11,0,0,0,99,108,97,115,
+ 115,109,101,116,104,111,100,117,14,0,0,0,95,111,112,101,
+ 110,95,114,101,103,105,115,116,114,121,117,16,0,0,0,95,
+ 115,101,97,114,99,104,95,114,101,103,105,115,116,114,121,117,
+ 4,0,0,0,78,111,110,101,117,11,0,0,0,102,105,110,
+ 100,95,109,111,100,117,108,101,40,1,0,0,0,117,10,0,
+ 0,0,95,95,108,111,99,97,108,115,95,95,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,21,0,0,0,87,105,110,
+ 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,
+ 101,114,233,2,0,0,115,16,0,0,0,16,3,6,3,6,
+ 3,6,2,6,2,18,7,18,15,3,1,117,21,0,0,0,
+ 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,
+ 105,110,100,101,114,99,1,0,0,0,0,0,0,0,1,0,
+ 0,0,5,0,0,0,66,0,0,0,115,74,0,0,0,124,
+ 0,0,69,101,0,0,90,1,0,100,0,0,90,2,0,100,
+ 1,0,90,3,0,100,2,0,100,3,0,132,0,0,90,4,
+ 0,100,4,0,100,5,0,132,0,0,90,5,0,101,6,0,
+ 100,6,0,100,10,0,100,7,0,100,8,0,132,0,1,131,
+ 1,0,90,8,0,100,9,0,83,40,11,0,0,0,117,13,
+ 0,0,0,95,76,111,97,100,101,114,66,97,115,105,99,115,
+ 117,83,0,0,0,66,97,115,101,32,99,108,97,115,115,32,
+ 111,102,32,99,111,109,109,111,110,32,99,111,100,101,32,110,
+ 101,101,100,101,100,32,98,121,32,98,111,116,104,32,83,111,
+ 117,114,99,101,76,111,97,100,101,114,32,97,110,100,10,32,
+ 32,32,32,83,111,117,114,99,101,108,101,115,115,70,105,108,
+ 101,76,111,97,100,101,114,46,99,2,0,0,0,0,0,0,
+ 0,5,0,0,0,3,0,0,0,67,0,0,0,115,88,0,
+ 0,0,116,0,0,124,0,0,106,1,0,124,1,0,131,1,
+ 0,131,1,0,100,1,0,25,125,2,0,124,2,0,106,2,
+ 0,100,2,0,100,1,0,131,2,0,100,3,0,25,125,3,
+ 0,124,1,0,106,3,0,100,2,0,131,1,0,100,4,0,
+ 25,125,4,0,124,3,0,100,5,0,107,2,0,111,87,0,
+ 124,4,0,100,5,0,107,3,0,83,40,6,0,0,0,117,
+ 141,0,0,0,67,111,110,99,114,101,116,101,32,105,109,112,
+ 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73,
+ 110,115,112,101,99,116,76,111,97,100,101,114,46,105,115,95,
+ 112,97,99,107,97,103,101,32,98,121,32,99,104,101,99,107,
+ 105,110,103,32,105,102,10,32,32,32,32,32,32,32,32,116,
+ 104,101,32,112,97,116,104,32,114,101,116,117,114,110,101,100,
+ 32,98,121,32,103,101,116,95,102,105,108,101,110,97,109,101,
+ 32,104,97,115,32,97,32,102,105,108,101,110,97,109,101,32,
+ 111,102,32,39,95,95,105,110,105,116,95,95,46,112,121,39,
+ 46,105,1,0,0,0,117,1,0,0,0,46,105,0,0,0,
+ 0,105,2,0,0,0,117,8,0,0,0,95,95,105,110,105,
+ 116,95,95,40,4,0,0,0,117,11,0,0,0,95,112,97,
+ 116,104,95,115,112,108,105,116,117,12,0,0,0,103,101,116,
+ 95,102,105,108,101,110,97,109,101,117,6,0,0,0,114,115,
+ 112,108,105,116,117,10,0,0,0,114,112,97,114,116,105,116,
+ 105,111,110,40,5,0,0,0,117,4,0,0,0,115,101,108,
+ 102,117,8,0,0,0,102,117,108,108,110,97,109,101,117,8,
+ 0,0,0,102,105,108,101,110,97,109,101,117,13,0,0,0,
+ 102,105,108,101,110,97,109,101,95,98,97,115,101,117,9,0,
+ 0,0,116,97,105,108,95,110,97,109,101,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,10,0,0,0,105,115,95,112,
+ 97,99,107,97,103,101,32,3,0,0,115,8,0,0,0,0,
+ 3,25,1,22,1,19,1,117,24,0,0,0,95,76,111,97,
+ 100,101,114,66,97,115,105,99,115,46,105,115,95,112,97,99,
+ 107,97,103,101,99,5,0,0,0,0,0,0,0,12,0,0,
+ 0,22,0,0,0,67,0,0,0,115,198,1,0,0,124,2,
+ 0,100,1,0,100,2,0,133,2,0,25,125,5,0,124,2,
+ 0,100,2,0,100,3,0,133,2,0,25,125,6,0,124,2,
+ 0,100,3,0,100,4,0,133,2,0,25,125,7,0,124,5,
+ 0,116,0,0,107,3,0,114,105,0,100,5,0,106,1,0,
+ 124,1,0,124,5,0,131,2,0,125,8,0,116,2,0,124,
+ 8,0,100,6,0,124,1,0,100,7,0,124,3,0,131,1,
+ 2,130,1,0,110,116,0,116,3,0,124,6,0,131,1,0,
+ 100,2,0,107,3,0,114,163,0,100,8,0,106,1,0,124,
+ 1,0,131,1,0,125,9,0,116,4,0,124,9,0,131,1,
+ 0,1,116,5,0,124,9,0,131,1,0,130,1,0,110,58,
+ 0,116,3,0,124,7,0,131,1,0,100,2,0,107,3,0,
+ 114,221,0,100,9,0,106,1,0,124,1,0,131,1,0,125,
+ 9,0,116,4,0,124,9,0,131,1,0,1,116,5,0,124,
+ 9,0,131,1,0,130,1,0,110,0,0,124,4,0,100,1,
+ 0,107,9,0,114,184,1,121,20,0,116,7,0,124,4,0,
+ 100,10,0,25,131,1,0,125,10,0,87,110,18,0,4,116,
+ 8,0,107,10,0,114,17,1,1,1,1,89,110,71,0,88,
+ 116,9,0,124,6,0,131,1,0,124,10,0,107,3,0,114,
+ 88,1,100,11,0,106,1,0,124,1,0,131,1,0,125,9,
+ 0,116,4,0,124,9,0,131,1,0,1,116,2,0,124,9,
+ 0,100,6,0,124,1,0,100,7,0,124,3,0,131,1,2,
+ 130,1,0,110,0,0,121,18,0,124,4,0,100,12,0,25,
+ 100,13,0,64,125,11,0,87,110,18,0,4,116,8,0,107,
+ 10,0,114,126,1,1,1,1,89,113,184,1,88,116,9,0,
+ 124,7,0,131,1,0,124,11,0,107,3,0,114,184,1,116,
+ 2,0,100,11,0,106,1,0,124,1,0,131,1,0,100,6,
+ 0,124,1,0,100,7,0,124,3,0,131,1,2,130,1,0,
+ 113,184,1,110,0,0,124,2,0,100,4,0,100,1,0,133,
+ 2,0,25,83,40,14,0,0,0,117,193,0,0,0,82,101,
+ 116,117,114,110,32,116,104,101,32,109,97,114,115,104,97,108,
+ 108,101,100,32,98,121,116,101,115,32,102,114,111,109,32,98,
+ 121,116,101,99,111,100,101,44,32,118,101,114,105,102,121,105,
+ 110,103,32,116,104,101,32,109,97,103,105,99,10,32,32,32,
+ 32,32,32,32,32,110,117,109,98,101,114,44,32,116,105,109,
+ 101,115,116,97,109,112,32,97,110,100,32,115,111,117,114,99,
+ 101,32,115,105,122,101,32,97,108,111,110,103,32,116,104,101,
+ 32,119,97,121,46,10,10,32,32,32,32,32,32,32,32,73,
+ 102,32,115,111,117,114,99,101,95,115,116,97,116,115,32,105,
+ 115,32,78,111,110,101,32,116,104,101,110,32,115,107,105,112,
+ 32,116,104,101,32,116,105,109,101,115,116,97,109,112,32,99,
+ 104,101,99,107,46,10,10,32,32,32,32,32,32,32,32,78,
+ 105,4,0,0,0,105,8,0,0,0,105,12,0,0,0,117,
+ 30,0,0,0,98,97,100,32,109,97,103,105,99,32,110,117,
+ 109,98,101,114,32,105,110,32,123,33,114,125,58,32,123,33,
+ 114,125,117,4,0,0,0,110,97,109,101,117,4,0,0,0,
+ 112,97,116,104,117,19,0,0,0,98,97,100,32,116,105,109,
+ 101,115,116,97,109,112,32,105,110,32,123,125,117,14,0,0,
+ 0,98,97,100,32,115,105,122,101,32,105,110,32,123,125,117,
+ 5,0,0,0,109,116,105,109,101,117,24,0,0,0,98,121,
+ 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32,
+ 102,111,114,32,123,125,117,4,0,0,0,115,105,122,101,108,
+ 3,0,0,0,255,127,255,127,3,0,40,10,0,0,0,117,
+ 12,0,0,0,95,77,65,71,73,67,95,66,89,84,69,83,
+ 117,6,0,0,0,102,111,114,109,97,116,117,11,0,0,0,
+ 73,109,112,111,114,116,69,114,114,111,114,117,3,0,0,0,
+ 108,101,110,117,16,0,0,0,95,118,101,114,98,111,115,101,
+ 95,109,101,115,115,97,103,101,117,8,0,0,0,69,79,70,
+ 69,114,114,111,114,117,4,0,0,0,78,111,110,101,117,3,
+ 0,0,0,105,110,116,117,8,0,0,0,75,101,121,69,114,
+ 114,111,114,117,7,0,0,0,95,114,95,108,111,110,103,40,
+ 12,0,0,0,117,4,0,0,0,115,101,108,102,117,8,0,
+ 0,0,102,117,108,108,110,97,109,101,117,4,0,0,0,100,
+ 97,116,97,117,13,0,0,0,98,121,116,101,99,111,100,101,
+ 95,112,97,116,104,117,12,0,0,0,115,111,117,114,99,101,
+ 95,115,116,97,116,115,117,5,0,0,0,109,97,103,105,99,
+ 117,13,0,0,0,114,97,119,95,116,105,109,101,115,116,97,
+ 109,112,117,8,0,0,0,114,97,119,95,115,105,122,101,117,
+ 3,0,0,0,109,115,103,117,7,0,0,0,109,101,115,115,
+ 97,103,101,117,12,0,0,0,115,111,117,114,99,101,95,109,
+ 116,105,109,101,117,11,0,0,0,115,111,117,114,99,101,95,
+ 115,105,122,101,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,20,0,0,0,95,98,121,116,101,115,95,102,114,111,109,
+ 95,98,121,116,101,99,111,100,101,40,3,0,0,115,66,0,
+ 0,0,0,7,16,1,16,1,16,1,12,1,18,1,27,1,
+ 18,1,15,1,10,1,15,1,18,1,15,1,10,1,15,1,
+ 12,1,3,1,20,1,13,1,5,2,18,1,15,1,10,1,
+ 15,1,12,1,3,1,18,1,13,1,5,2,18,1,3,1,
+ 15,1,21,3,117,34,0,0,0,95,76,111,97,100,101,114,
+ 66,97,115,105,99,115,46,95,98,121,116,101,115,95,102,114,
+ 111,109,95,98,121,116,101,99,111,100,101,117,10,0,0,0,
+ 115,111,117,114,99,101,108,101,115,115,99,2,0,0,0,1,
+ 0,0,0,5,0,0,0,12,0,0,0,67,0,0,0,115,
+ 227,0,0,0,124,1,0,106,0,0,125,3,0,124,0,0,
+ 106,1,0,124,3,0,131,1,0,125,4,0,124,0,0,106,
+ 2,0,124,3,0,131,1,0,124,1,0,95,3,0,124,2,
+ 0,115,106,0,121,22,0,116,4,0,124,1,0,106,3,0,
+ 131,1,0,124,1,0,95,5,0,87,113,118,0,4,116,6,
+ 0,107,10,0,114,102,0,1,1,1,124,1,0,106,3,0,
+ 124,1,0,95,5,0,89,113,118,0,88,110,12,0,124,1,
+ 0,106,3,0,124,1,0,95,5,0,124,3,0,124,1,0,
+ 95,7,0,124,0,0,106,8,0,124,3,0,131,1,0,114,
+ 170,0,116,9,0,124,1,0,106,3,0,131,1,0,100,1,
+ 0,25,103,1,0,124,1,0,95,10,0,110,25,0,124,1,
+ 0,106,7,0,106,11,0,100,2,0,131,1,0,100,1,0,
+ 25,124,1,0,95,7,0,124,0,0,124,1,0,95,12,0,
+ 116,13,0,116,14,0,124,4,0,124,1,0,106,15,0,131,
+ 3,0,1,124,1,0,83,40,3,0,0,0,117,82,0,0,
+ 0,72,101,108,112,101,114,32,102,111,114,32,108,111,97,100,
+ 95,109,111,100,117,108,101,32,97,98,108,101,32,116,111,32,
+ 104,97,110,100,108,101,32,101,105,116,104,101,114,32,115,111,
+ 117,114,99,101,32,111,114,32,115,111,117,114,99,101,108,101,
+ 115,115,10,32,32,32,32,32,32,32,32,108,111,97,100,105,
+ 110,103,46,105,0,0,0,0,117,1,0,0,0,46,40,16,
+ 0,0,0,117,8,0,0,0,95,95,110,97,109,101,95,95,
+ 117,8,0,0,0,103,101,116,95,99,111,100,101,117,12,0,
+ 0,0,103,101,116,95,102,105,108,101,110,97,109,101,117,8,
+ 0,0,0,95,95,102,105,108,101,95,95,117,17,0,0,0,
+ 99,97,99,104,101,95,102,114,111,109,95,115,111,117,114,99,
+ 101,117,10,0,0,0,95,95,99,97,99,104,101,100,95,95,
+ 117,19,0,0,0,78,111,116,73,109,112,108,101,109,101,110,
+ 116,101,100,69,114,114,111,114,117,11,0,0,0,95,95,112,
+ 97,99,107,97,103,101,95,95,117,10,0,0,0,105,115,95,
+ 112,97,99,107,97,103,101,117,11,0,0,0,95,112,97,116,
+ 104,95,115,112,108,105,116,117,8,0,0,0,95,95,112,97,
+ 116,104,95,95,117,10,0,0,0,114,112,97,114,116,105,116,
+ 105,111,110,117,10,0,0,0,95,95,108,111,97,100,101,114,
+ 95,95,117,25,0,0,0,95,99,97,108,108,95,119,105,116,
+ 104,95,102,114,97,109,101,115,95,114,101,109,111,118,101,100,
+ 117,4,0,0,0,101,120,101,99,117,8,0,0,0,95,95,
+ 100,105,99,116,95,95,40,5,0,0,0,117,4,0,0,0,
+ 115,101,108,102,117,6,0,0,0,109,111,100,117,108,101,117,
+ 10,0,0,0,115,111,117,114,99,101,108,101,115,115,117,4,
+ 0,0,0,110,97,109,101,117,11,0,0,0,99,111,100,101,
+ 95,111,98,106,101,99,116,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,12,0,0,0,95,108,111,97,100,95,109,111,
+ 100,117,108,101,85,3,0,0,115,32,0,0,0,0,4,9,
+ 1,15,1,18,1,6,1,3,1,22,1,13,1,20,2,12,
+ 1,9,1,15,1,28,2,25,1,9,1,19,1,117,26,0,
+ 0,0,95,76,111,97,100,101,114,66,97,115,105,99,115,46,
+ 95,108,111,97,100,95,109,111,100,117,108,101,78,70,40,9,
+ 0,0,0,117,8,0,0,0,95,95,110,97,109,101,95,95,
+ 117,10,0,0,0,95,95,109,111,100,117,108,101,95,95,117,
+ 12,0,0,0,95,95,113,117,97,108,110,97,109,101,95,95,
+ 117,7,0,0,0,95,95,100,111,99,95,95,117,10,0,0,
+ 0,105,115,95,112,97,99,107,97,103,101,117,20,0,0,0,
+ 95,98,121,116,101,115,95,102,114,111,109,95,98,121,116,101,
+ 99,111,100,101,117,17,0,0,0,109,111,100,117,108,101,95,
+ 102,111,114,95,108,111,97,100,101,114,117,5,0,0,0,70,
+ 97,108,115,101,117,12,0,0,0,95,108,111,97,100,95,109,
+ 111,100,117,108,101,40,1,0,0,0,117,10,0,0,0,95,
+ 95,108,111,99,97,108,115,95,95,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,13,0,0,0,95,76,111,97,100,101,
+ 114,66,97,115,105,99,115,27,3,0,0,115,10,0,0,0,
+ 16,3,6,2,12,8,12,45,6,1,117,13,0,0,0,95,
+ 76,111,97,100,101,114,66,97,115,105,99,115,99,1,0,0,
+ 0,0,0,0,0,1,0,0,0,2,0,0,0,66,0,0,
+ 0,115,104,0,0,0,124,0,0,69,101,0,0,90,1,0,
+ 100,0,0,90,2,0,100,1,0,100,2,0,132,0,0,90,
+ 3,0,100,3,0,100,4,0,132,0,0,90,4,0,100,5,
+ 0,100,6,0,132,0,0,90,5,0,100,7,0,100,8,0,
+ 132,0,0,90,6,0,100,9,0,100,10,0,132,0,0,90,
+ 7,0,100,11,0,100,12,0,132,0,0,90,8,0,100,13,
+ 0,100,14,0,132,0,0,90,9,0,100,15,0,83,40,16,
+ 0,0,0,117,12,0,0,0,83,111,117,114,99,101,76,111,
+ 97,100,101,114,99,2,0,0,0,0,0,0,0,2,0,0,
+ 0,1,0,0,0,67,0,0,0,115,10,0,0,0,116,0,
+ 0,130,1,0,100,1,0,83,40,2,0,0,0,117,121,0,
+ 0,0,79,112,116,105,111,110,97,108,32,109,101,116,104,111,
+ 100,32,116,104,97,116,32,114,101,116,117,114,110,115,32,116,
+ 104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,
+ 116,105,109,101,32,40,97,110,32,105,110,116,41,32,102,111,
+ 114,32,116,104,101,10,32,32,32,32,32,32,32,32,115,112,
+ 101,99,105,102,105,101,100,32,112,97,116,104,44,32,119,104,
+ 101,114,101,32,112,97,116,104,32,105,115,32,97,32,115,116,
+ 114,46,10,32,32,32,32,32,32,32,32,78,40,1,0,0,
+ 0,117,19,0,0,0,78,111,116,73,109,112,108,101,109,101,
+ 110,116,101,100,69,114,114,111,114,40,2,0,0,0,117,4,
+ 0,0,0,115,101,108,102,117,4,0,0,0,112,97,116,104,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,10,0,0,
+ 0,112,97,116,104,95,109,116,105,109,101,111,3,0,0,115,
+ 2,0,0,0,0,4,117,23,0,0,0,83,111,117,114,99,
+ 101,76,111,97,100,101,114,46,112,97,116,104,95,109,116,105,
+ 109,101,99,2,0,0,0,0,0,0,0,2,0,0,0,3,
+ 0,0,0,67,0,0,0,115,20,0,0,0,105,1,0,124,
+ 0,0,106,0,0,124,1,0,131,1,0,100,1,0,54,83,
+ 40,2,0,0,0,117,114,1,0,0,79,112,116,105,111,110,
+ 97,108,32,109,101,116,104,111,100,32,114,101,116,117,114,110,
+ 105,110,103,32,97,32,109,101,116,97,100,97,116,97,32,100,
+ 105,99,116,32,102,111,114,32,116,104,101,32,115,112,101,99,
+ 105,102,105,101,100,32,112,97,116,104,10,32,32,32,32,32,
+ 32,32,32,116,111,32,98,121,32,116,104,101,32,112,97,116,
+ 104,32,40,115,116,114,41,46,10,32,32,32,32,32,32,32,
+ 32,80,111,115,115,105,98,108,101,32,107,101,121,115,58,10,
+ 32,32,32,32,32,32,32,32,45,32,39,109,116,105,109,101,
+ 39,32,40,109,97,110,100,97,116,111,114,121,41,32,105,115,
+ 32,116,104,101,32,110,117,109,101,114,105,99,32,116,105,109,
+ 101,115,116,97,109,112,32,111,102,32,108,97,115,116,32,115,
+ 111,117,114,99,101,10,32,32,32,32,32,32,32,32,32,32,
+ 99,111,100,101,32,109,111,100,105,102,105,99,97,116,105,111,
+ 110,59,10,32,32,32,32,32,32,32,32,45,32,39,115,105,
+ 122,101,39,32,40,111,112,116,105,111,110,97,108,41,32,105,
+ 115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,
+ 116,101,115,32,111,102,32,116,104,101,32,115,111,117,114,99,
+ 101,32,99,111,100,101,46,10,10,32,32,32,32,32,32,32,
+ 32,73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,
+ 105,115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,
+ 32,116,104,101,32,108,111,97,100,101,114,32,116,111,32,114,
+ 101,97,100,32,98,121,116,101,99,111,100,101,32,102,105,108,
+ 101,115,46,10,32,32,32,32,32,32,32,32,117,5,0,0,
+ 0,109,116,105,109,101,40,1,0,0,0,117,10,0,0,0,
+ 112,97,116,104,95,109,116,105,109,101,40,2,0,0,0,117,
+ 4,0,0,0,115,101,108,102,117,4,0,0,0,112,97,116,
+ 104,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,10,0,
+ 0,0,112,97,116,104,95,115,116,97,116,115,117,3,0,0,
+ 115,2,0,0,0,0,10,117,23,0,0,0,83,111,117,114,
+ 99,101,76,111,97,100,101,114,46,112,97,116,104,95,115,116,
+ 97,116,115,99,4,0,0,0,0,0,0,0,4,0,0,0,
+ 3,0,0,0,67,0,0,0,115,16,0,0,0,124,0,0,
+ 106,0,0,124,2,0,124,3,0,131,2,0,83,40,1,0,
+ 0,0,117,228,0,0,0,79,112,116,105,111,110,97,108,32,
+ 109,101,116,104,111,100,32,119,104,105,99,104,32,119,114,105,
+ 116,101,115,32,100,97,116,97,32,40,98,121,116,101,115,41,
+ 32,116,111,32,97,32,102,105,108,101,32,112,97,116,104,32,
+ 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,
+ 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116,
+ 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119,
+ 115,32,102,111,114,32,116,104,101,32,119,114,105,116,105,110,
+ 103,32,111,102,32,98,121,116,101,99,111,100,101,32,102,105,
+ 108,101,115,46,10,10,32,32,32,32,32,32,32,32,84,104,
+ 101,32,115,111,117,114,99,101,32,112,97,116,104,32,105,115,
+ 32,110,101,101,100,101,100,32,105,110,32,111,114,100,101,114,
+ 32,116,111,32,99,111,114,114,101,99,116,108,121,32,116,114,
+ 97,110,115,102,101,114,32,112,101,114,109,105,115,115,105,111,
+ 110,115,10,32,32,32,32,32,32,32,32,40,1,0,0,0,
+ 117,8,0,0,0,115,101,116,95,100,97,116,97,40,4,0,
+ 0,0,117,4,0,0,0,115,101,108,102,117,11,0,0,0,
+ 115,111,117,114,99,101,95,112,97,116,104,117,10,0,0,0,
+ 99,97,99,104,101,95,112,97,116,104,117,4,0,0,0,100,
+ 97,116,97,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 15,0,0,0,95,99,97,99,104,101,95,98,121,116,101,99,
+ 111,100,101,129,3,0,0,115,2,0,0,0,0,8,117,28,
+ 0,0,0,83,111,117,114,99,101,76,111,97,100,101,114,46,
+ 95,99,97,99,104,101,95,98,121,116,101,99,111,100,101,99,
+ 3,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0,
+ 67,0,0,0,115,10,0,0,0,116,0,0,130,1,0,100,
+ 1,0,83,40,2,0,0,0,117,151,0,0,0,79,112,116,
+ 105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,105,
+ 99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,40,
+ 98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,101,
+ 32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,
+ 32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,110,
+ 116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,100,
+ 32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,32,
+ 119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,99,
+ 111,100,101,32,102,105,108,101,115,46,10,10,32,32,32,32,
+ 32,32,32,32,78,40,1,0,0,0,117,19,0,0,0,78,
+ 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,
+ 111,114,40,3,0,0,0,117,4,0,0,0,115,101,108,102,
+ 117,4,0,0,0,112,97,116,104,117,4,0,0,0,100,97,
+ 116,97,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,8,
+ 0,0,0,115,101,116,95,100,97,116,97,139,3,0,0,115,
+ 2,0,0,0,0,6,117,21,0,0,0,83,111,117,114,99,
+ 101,76,111,97,100,101,114,46,115,101,116,95,100,97,116,97,
+ 99,2,0,0,0,0,0,0,0,9,0,0,0,44,0,0,
+ 0,67,0,0,0,115,62,1,0,0,100,1,0,100,2,0,
+ 108,0,0,125,2,0,124,0,0,106,1,0,124,1,0,131,
+ 1,0,125,3,0,121,19,0,124,0,0,106,2,0,124,3,
+ 0,131,1,0,125,4,0,87,110,58,0,4,116,3,0,107,
+ 10,0,114,106,0,1,125,5,0,1,122,26,0,116,4,0,
+ 100,3,0,100,4,0,124,1,0,131,1,1,124,5,0,130,
+ 2,0,87,89,100,2,0,100,2,0,125,5,0,126,5,0,
+ 88,110,1,0,88,116,5,0,106,6,0,124,4,0,131,1,
+ 0,106,7,0,125,6,0,121,19,0,124,2,0,106,8,0,
+ 124,6,0,131,1,0,125,7,0,87,110,58,0,4,116,9,
+ 0,107,10,0,114,204,0,1,125,5,0,1,122,26,0,116,
+ 4,0,100,5,0,100,4,0,124,1,0,131,1,1,124,5,
+ 0,130,2,0,87,89,100,2,0,100,2,0,125,5,0,126,
+ 5,0,88,110,1,0,88,116,5,0,106,10,0,100,2,0,
+ 100,7,0,131,2,0,125,8,0,121,30,0,124,8,0,106,
+ 13,0,124,4,0,106,13,0,124,7,0,100,1,0,25,131,
+ 1,0,131,1,0,83,87,110,58,0,4,116,14,0,107,10,
+ 0,114,57,1,1,125,5,0,1,122,26,0,116,4,0,100,
+ 6,0,100,4,0,124,1,0,131,1,1,124,5,0,130,2,
+ 0,87,89,100,2,0,100,2,0,125,5,0,126,5,0,88,
+ 110,1,0,88,100,2,0,83,40,8,0,0,0,117,52,0,
+ 0,0,67,111,110,99,114,101,116,101,32,105,109,112,108,101,
+ 109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,115,
+ 112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,115,
+ 111,117,114,99,101,46,105,0,0,0,0,78,117,39,0,0,
+ 0,115,111,117,114,99,101,32,110,111,116,32,97,118,97,105,
+ 108,97,98,108,101,32,116,104,114,111,117,103,104,32,103,101,
+ 116,95,100,97,116,97,40,41,117,4,0,0,0,110,97,109,
+ 101,117,25,0,0,0,70,97,105,108,101,100,32,116,111,32,
+ 100,101,116,101,99,116,32,101,110,99,111,100,105,110,103,117,
+ 28,0,0,0,70,97,105,108,101,100,32,116,111,32,100,101,
+ 99,111,100,101,32,115,111,117,114,99,101,32,102,105,108,101,
+ 84,40,15,0,0,0,117,8,0,0,0,116,111,107,101,110,
+ 105,122,101,117,12,0,0,0,103,101,116,95,102,105,108,101,
+ 110,97,109,101,117,8,0,0,0,103,101,116,95,100,97,116,
+ 97,117,7,0,0,0,73,79,69,114,114,111,114,117,11,0,
+ 0,0,73,109,112,111,114,116,69,114,114,111,114,117,3,0,
+ 0,0,95,105,111,117,7,0,0,0,66,121,116,101,115,73,
+ 79,117,8,0,0,0,114,101,97,100,108,105,110,101,117,15,
+ 0,0,0,100,101,116,101,99,116,95,101,110,99,111,100,105,
+ 110,103,117,11,0,0,0,83,121,110,116,97,120,69,114,114,
+ 111,114,117,25,0,0,0,73,110,99,114,101,109,101,110,116,
+ 97,108,78,101,119,108,105,110,101,68,101,99,111,100,101,114,
+ 117,4,0,0,0,78,111,110,101,117,4,0,0,0,84,114,
+ 117,101,117,6,0,0,0,100,101,99,111,100,101,117,18,0,
+ 0,0,85,110,105,99,111,100,101,68,101,99,111,100,101,69,
+ 114,114,111,114,40,9,0,0,0,117,4,0,0,0,115,101,
+ 108,102,117,8,0,0,0,102,117,108,108,110,97,109,101,117,
+ 8,0,0,0,116,111,107,101,110,105,122,101,117,4,0,0,
+ 0,112,97,116,104,117,12,0,0,0,115,111,117,114,99,101,
+ 95,98,121,116,101,115,117,3,0,0,0,101,120,99,117,10,
+ 0,0,0,114,101,97,100,115,111,117,114,99,101,117,8,0,
+ 0,0,101,110,99,111,100,105,110,103,117,15,0,0,0,110,
+ 101,119,108,105,110,101,95,100,101,99,111,100,101,114,40,0,
+ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,10,0,0,0,103,
+ 101,116,95,115,111,117,114,99,101,148,3,0,0,115,38,0,
+ 0,0,0,2,12,1,15,1,3,1,19,1,18,1,9,1,
+ 31,1,18,1,3,1,19,1,18,1,9,1,31,1,18,1,
+ 3,1,30,1,18,1,9,1,117,23,0,0,0,83,111,117,
+ 114,99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,
+ 117,114,99,101,99,2,0,0,0,0,0,0,0,12,0,0,
+ 0,45,0,0,0,67,0,0,0,115,52,2,0,0,124,0,
+ 0,106,0,0,124,1,0,131,1,0,125,2,0,100,10,0,
+ 125,3,0,121,16,0,116,2,0,124,2,0,131,1,0,125,
+ 4,0,87,110,24,0,4,116,3,0,107,10,0,114,63,0,
+ 1,1,1,100,10,0,125,4,0,89,110,14,1,88,121,19,
+ 0,124,0,0,106,4,0,124,2,0,131,1,0,125,5,0,
+ 87,110,18,0,4,116,3,0,107,10,0,114,103,0,1,1,
+ 1,89,110,230,0,88,116,5,0,124,5,0,100,1,0,25,
+ 131,1,0,125,3,0,121,19,0,124,0,0,106,6,0,124,
+ 4,0,131,1,0,125,6,0,87,110,18,0,4,116,7,0,
+ 107,10,0,114,159,0,1,1,1,89,110,174,0,88,121,28,
+ 0,124,0,0,106,8,0,124,1,0,124,6,0,124,4,0,
+ 124,5,0,131,4,0,125,7,0,87,110,24,0,4,116,9,
+ 0,116,10,0,102,2,0,107,10,0,114,214,0,1,1,1,
+ 89,110,119,0,88,116,11,0,100,2,0,124,4,0,124,2,
+ 0,131,3,0,1,116,12,0,106,13,0,124,7,0,131,1,
+ 0,125,8,0,116,14,0,124,8,0,116,15,0,131,2,0,
+ 114,38,1,116,16,0,106,17,0,124,8,0,124,2,0,131,
+ 2,0,1,116,11,0,100,3,0,124,4,0,131,2,0,1,
+ 124,8,0,83,100,4,0,125,9,0,116,9,0,124,9,0,
+ 106,18,0,124,4,0,131,1,0,100,5,0,124,1,0,100,
+ 6,0,124,4,0,131,1,2,130,1,0,124,0,0,106,6,
+ 0,124,2,0,131,1,0,125,10,0,116,19,0,116,20,0,
+ 124,10,0,124,2,0,100,7,0,100,8,0,100,11,0,131,
+ 4,1,125,11,0,116,11,0,100,3,0,124,2,0,131,2,
+ 0,1,116,22,0,106,23,0,12,114,48,2,124,4,0,100,
+ 10,0,107,9,0,114,48,2,124,3,0,100,10,0,107,9,
+ 0,114,48,2,116,24,0,116,25,0,131,1,0,125,6,0,
+ 124,6,0,106,26,0,116,27,0,124,3,0,131,1,0,131,
+ 1,0,1,124,6,0,106,26,0,116,27,0,116,28,0,124,
+ 10,0,131,1,0,131,1,0,131,1,0,1,124,6,0,106,
+ 26,0,116,12,0,106,29,0,124,11,0,131,1,0,131,1,
+ 0,1,121,36,0,124,0,0,106,30,0,124,2,0,124,4,
+ 0,124,6,0,131,3,0,1,116,11,0,100,9,0,124,4,
+ 0,131,2,0,1,87,113,48,2,4,116,3,0,107,10,0,
+ 114,44,2,1,1,1,89,113,48,2,88,110,0,0,124,11,
+ 0,83,40,12,0,0,0,117,190,0,0,0,67,111,110,99,
+ 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,
+ 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111,
+ 97,100,101,114,46,103,101,116,95,99,111,100,101,46,10,10,
+ 32,32,32,32,32,32,32,32,82,101,97,100,105,110,103,32,
+ 111,102,32,98,121,116,101,99,111,100,101,32,114,101,113,117,
+ 105,114,101,115,32,112,97,116,104,95,115,116,97,116,115,32,
+ 116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,
+ 100,46,32,84,111,32,119,114,105,116,101,10,32,32,32,32,
+ 32,32,32,32,98,121,116,101,99,111,100,101,44,32,115,101,
+ 116,95,100,97,116,97,32,109,117,115,116,32,97,108,115,111,
+ 32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,46,
+ 10,10,32,32,32,32,32,32,32,32,117,5,0,0,0,109,
+ 116,105,109,101,117,13,0,0,0,123,125,32,109,97,116,99,
+ 104,101,115,32,123,125,117,19,0,0,0,99,111,100,101,32,
+ 111,98,106,101,99,116,32,102,114,111,109,32,123,125,117,21,
+ 0,0,0,78,111,110,45,99,111,100,101,32,111,98,106,101,
+ 99,116,32,105,110,32,123,125,117,4,0,0,0,110,97,109,
+ 101,117,4,0,0,0,112,97,116,104,117,4,0,0,0,101,
+ 120,101,99,117,12,0,0,0,100,111,110,116,95,105,110,104,
+ 101,114,105,116,117,10,0,0,0,119,114,111,116,101,32,123,
+ 33,114,125,78,84,40,31,0,0,0,117,12,0,0,0,103,
+ 101,116,95,102,105,108,101,110,97,109,101,117,4,0,0,0,
+ 78,111,110,101,117,17,0,0,0,99,97,99,104,101,95,102,
+ 114,111,109,95,115,111,117,114,99,101,117,19,0,0,0,78,
+ 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,
+ 111,114,117,10,0,0,0,112,97,116,104,95,115,116,97,116,
+ 115,117,3,0,0,0,105,110,116,117,8,0,0,0,103,101,
+ 116,95,100,97,116,97,117,7,0,0,0,73,79,69,114,114,
+ 111,114,117,20,0,0,0,95,98,121,116,101,115,95,102,114,
+ 111,109,95,98,121,116,101,99,111,100,101,117,11,0,0,0,
+ 73,109,112,111,114,116,69,114,114,111,114,117,8,0,0,0,
+ 69,79,70,69,114,114,111,114,117,16,0,0,0,95,118,101,
+ 114,98,111,115,101,95,109,101,115,115,97,103,101,117,7,0,
+ 0,0,109,97,114,115,104,97,108,117,5,0,0,0,108,111,
+ 97,100,115,117,10,0,0,0,105,115,105,110,115,116,97,110,
+ 99,101,117,10,0,0,0,95,99,111,100,101,95,116,121,112,
+ 101,117,4,0,0,0,95,105,109,112,117,16,0,0,0,95,
+ 102,105,120,95,99,111,95,102,105,108,101,110,97,109,101,117,
+ 6,0,0,0,102,111,114,109,97,116,117,25,0,0,0,95,
+ 99,97,108,108,95,119,105,116,104,95,102,114,97,109,101,115,
+ 95,114,101,109,111,118,101,100,117,7,0,0,0,99,111,109,
+ 112,105,108,101,117,4,0,0,0,84,114,117,101,117,3,0,
+ 0,0,115,121,115,117,19,0,0,0,100,111,110,116,95,119,
+ 114,105,116,101,95,98,121,116,101,99,111,100,101,117,9,0,
+ 0,0,98,121,116,101,97,114,114,97,121,117,12,0,0,0,
+ 95,77,65,71,73,67,95,66,89,84,69,83,117,6,0,0,
+ 0,101,120,116,101,110,100,117,7,0,0,0,95,119,95,108,
+ 111,110,103,117,3,0,0,0,108,101,110,117,5,0,0,0,
+ 100,117,109,112,115,117,15,0,0,0,95,99,97,99,104,101,
+ 95,98,121,116,101,99,111,100,101,40,12,0,0,0,117,4,
+ 0,0,0,115,101,108,102,117,8,0,0,0,102,117,108,108,
+ 110,97,109,101,117,11,0,0,0,115,111,117,114,99,101,95,
+ 112,97,116,104,117,12,0,0,0,115,111,117,114,99,101,95,
+ 109,116,105,109,101,117,13,0,0,0,98,121,116,101,99,111,
+ 100,101,95,112,97,116,104,117,2,0,0,0,115,116,117,4,
+ 0,0,0,100,97,116,97,117,10,0,0,0,98,121,116,101,
+ 115,95,100,97,116,97,117,5,0,0,0,102,111,117,110,100,
+ 117,3,0,0,0,109,115,103,117,12,0,0,0,115,111,117,
+ 114,99,101,95,98,121,116,101,115,117,11,0,0,0,99,111,
+ 100,101,95,111,98,106,101,99,116,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,8,0,0,0,103,101,116,95,99,111,
+ 100,101,170,3,0,0,115,98,0,0,0,0,7,15,1,6,
+ 1,3,1,16,1,13,1,11,2,3,1,19,1,13,1,5,
+ 2,16,1,3,1,19,1,13,1,5,2,3,1,12,1,3,
+ 1,13,1,19,1,5,2,9,1,7,1,15,1,15,1,16,
+ 1,6,1,7,1,4,2,6,1,18,1,15,1,15,1,6,
+ 1,12,1,9,1,13,1,22,1,12,1,12,1,19,1,25,
+ 1,22,1,3,1,19,1,17,1,13,1,8,1,117,21,0,
+ 0,0,83,111,117,114,99,101,76,111,97,100,101,114,46,103,
+ 101,116,95,99,111,100,101,99,2,0,0,0,0,0,0,0,
+ 2,0,0,0,2,0,0,0,67,0,0,0,115,13,0,0,
+ 0,124,0,0,106,0,0,124,1,0,131,1,0,83,40,1,
+ 0,0,0,117,0,1,0,0,67,111,110,99,114,101,116,101,
+ 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,
+ 111,102,32,76,111,97,100,101,114,46,108,111,97,100,95,109,
+ 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,
+ 82,101,113,117,105,114,101,115,32,69,120,101,99,117,116,105,
+ 111,110,76,111,97,100,101,114,46,103,101,116,95,102,105,108,
+ 101,110,97,109,101,32,97,110,100,32,82,101,115,111,117,114,
+ 99,101,76,111,97,100,101,114,46,103,101,116,95,100,97,116,
+ 97,32,116,111,32,98,101,10,32,32,32,32,32,32,32,32,
+ 105,109,112,108,101,109,101,110,116,101,100,32,116,111,32,108,
+ 111,97,100,32,115,111,117,114,99,101,32,99,111,100,101,46,
+ 32,85,115,101,32,111,102,32,98,121,116,101,99,111,100,101,
+ 32,105,115,32,100,105,99,116,97,116,101,100,32,98,121,32,
+ 119,104,101,116,104,101,114,10,32,32,32,32,32,32,32,32,
+ 103,101,116,95,99,111,100,101,32,117,115,101,115,47,119,114,
+ 105,116,101,115,32,98,121,116,101,99,111,100,101,46,10,10,
+ 32,32,32,32,32,32,32,32,40,1,0,0,0,117,12,0,
+ 0,0,95,108,111,97,100,95,109,111,100,117,108,101,40,2,
+ 0,0,0,117,4,0,0,0,115,101,108,102,117,8,0,0,
+ 0,102,117,108,108,110,97,109,101,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,11,0,0,0,108,111,97,100,95,109,
+ 111,100,117,108,101,232,3,0,0,115,2,0,0,0,0,8,
+ 117,24,0,0,0,83,111,117,114,99,101,76,111,97,100,101,
+ 114,46,108,111,97,100,95,109,111,100,117,108,101,78,40,10,
+ 0,0,0,117,8,0,0,0,95,95,110,97,109,101,95,95,
+ 117,10,0,0,0,95,95,109,111,100,117,108,101,95,95,117,
+ 12,0,0,0,95,95,113,117,97,108,110,97,109,101,95,95,
+ 117,10,0,0,0,112,97,116,104,95,109,116,105,109,101,117,
+ 10,0,0,0,112,97,116,104,95,115,116,97,116,115,117,15,
+ 0,0,0,95,99,97,99,104,101,95,98,121,116,101,99,111,
+ 100,101,117,8,0,0,0,115,101,116,95,100,97,116,97,117,
+ 10,0,0,0,103,101,116,95,115,111,117,114,99,101,117,8,
+ 0,0,0,103,101,116,95,99,111,100,101,117,11,0,0,0,
+ 108,111,97,100,95,109,111,100,117,108,101,40,1,0,0,0,
+ 117,10,0,0,0,95,95,108,111,99,97,108,115,95,95,40,
+ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,12,0,0,0,
+ 83,111,117,114,99,101,76,111,97,100,101,114,109,3,0,0,
+ 115,14,0,0,0,16,2,12,6,12,12,12,10,12,9,12,
+ 22,12,62,117,12,0,0,0,83,111,117,114,99,101,76,111,
+ 97,100,101,114,99,1,0,0,0,0,0,0,0,1,0,0,
+ 0,4,0,0,0,2,0,0,0,115,92,0,0,0,124,0,
+ 0,69,101,0,0,90,1,0,100,0,0,90,2,0,100,1,
+ 0,90,3,0,100,2,0,100,3,0,132,0,0,90,4,0,
+ 101,5,0,135,0,0,102,1,0,100,4,0,100,5,0,134,
+ 0,0,131,1,0,90,6,0,101,5,0,100,6,0,100,7,
+ 0,132,0,0,131,1,0,90,7,0,100,8,0,100,9,0,
+ 132,0,0,90,8,0,135,0,0,83,40,10,0,0,0,117,
+ 10,0,0,0,70,105,108,101,76,111,97,100,101,114,117,103,
+ 0,0,0,66,97,115,101,32,102,105,108,101,32,108,111,97,
+ 100,101,114,32,99,108,97,115,115,32,119,104,105,99,104,32,
+ 105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,108,
+ 111,97,100,101,114,32,112,114,111,116,111,99,111,108,32,109,
+ 101,116,104,111,100,115,32,116,104,97,116,10,32,32,32,32,
+ 114,101,113,117,105,114,101,32,102,105,108,101,32,115,121,115,
+ 116,101,109,32,117,115,97,103,101,46,99,3,0,0,0,0,
+ 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115,
+ 22,0,0,0,124,1,0,124,0,0,95,0,0,124,2,0,
+ 124,0,0,95,1,0,100,1,0,83,40,2,0,0,0,117,
+ 75,0,0,0,67,97,99,104,101,32,116,104,101,32,109,111,
+ 100,117,108,101,32,110,97,109,101,32,97,110,100,32,116,104,
+ 101,32,112,97,116,104,32,116,111,32,116,104,101,32,102,105,
+ 108,101,32,102,111,117,110,100,32,98,121,32,116,104,101,10,
+ 32,32,32,32,32,32,32,32,102,105,110,100,101,114,46,78,
+ 40,2,0,0,0,117,4,0,0,0,110,97,109,101,117,4,
+ 0,0,0,112,97,116,104,40,3,0,0,0,117,4,0,0,
+ 0,115,101,108,102,117,8,0,0,0,102,117,108,108,110,97,
+ 109,101,117,4,0,0,0,112,97,116,104,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,8,0,0,0,95,95,105,110,
+ 105,116,95,95,248,3,0,0,115,4,0,0,0,0,3,9,
+ 1,117,19,0,0,0,70,105,108,101,76,111,97,100,101,114,
+ 46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,0,
+ 0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,22,
+ 0,0,0,116,0,0,116,1,0,124,0,0,131,2,0,106,
+ 2,0,124,1,0,131,1,0,83,40,1,0,0,0,117,26,
+ 0,0,0,76,111,97,100,32,97,32,109,111,100,117,108,101,
+ 32,102,114,111,109,32,97,32,102,105,108,101,46,40,3,0,
+ 0,0,117,5,0,0,0,115,117,112,101,114,117,10,0,0,
+ 0,70,105,108,101,76,111,97,100,101,114,117,11,0,0,0,
+ 108,111,97,100,95,109,111,100,117,108,101,40,2,0,0,0,
+ 117,4,0,0,0,115,101,108,102,117,8,0,0,0,102,117,
+ 108,108,110,97,109,101,40,1,0,0,0,117,9,0,0,0,
+ 95,95,99,108,97,115,115,95,95,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,11,0,0,0,108,111,97,100,95,109,111,100,117,108,101,
+ 254,3,0,0,115,2,0,0,0,0,5,117,22,0,0,0,
+ 70,105,108,101,76,111,97,100,101,114,46,108,111,97,100,95,
+ 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,2,
+ 0,0,0,1,0,0,0,67,0,0,0,115,7,0,0,0,
+ 124,0,0,106,0,0,83,40,1,0,0,0,117,58,0,0,
+ 0,82,101,116,117,114,110,32,116,104,101,32,112,97,116,104,
+ 32,116,111,32,116,104,101,32,115,111,117,114,99,101,32,102,
+ 105,108,101,32,97,115,32,102,111,117,110,100,32,98,121,32,
+ 116,104,101,32,102,105,110,100,101,114,46,40,1,0,0,0,
+ 117,4,0,0,0,112,97,116,104,40,2,0,0,0,117,4,
+ 0,0,0,115,101,108,102,117,8,0,0,0,102,117,108,108,
+ 110,97,109,101,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,12,0,0,0,103,101,116,95,102,105,108,101,110,97,109,
+ 101,5,4,0,0,115,2,0,0,0,0,3,117,23,0,0,
+ 0,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,
+ 102,105,108,101,110,97,109,101,99,2,0,0,0,0,0,0,
+ 0,3,0,0,0,8,0,0,0,67,0,0,0,115,41,0,
+ 0,0,116,0,0,106,1,0,124,1,0,100,1,0,131,2,
+ 0,143,17,0,125,2,0,124,2,0,106,2,0,131,0,0,
+ 83,87,100,2,0,81,88,100,2,0,83,40,3,0,0,0,
+ 117,39,0,0,0,82,101,116,117,114,110,32,116,104,101,32,
+ 100,97,116,97,32,102,114,111,109,32,112,97,116,104,32,97,
+ 115,32,114,97,119,32,98,121,116,101,115,46,117,1,0,0,
+ 0,114,78,40,3,0,0,0,117,3,0,0,0,95,105,111,
+ 117,6,0,0,0,70,105,108,101,73,79,117,4,0,0,0,
+ 114,101,97,100,40,3,0,0,0,117,4,0,0,0,115,101,
+ 108,102,117,4,0,0,0,112,97,116,104,117,4,0,0,0,
+ 102,105,108,101,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,8,0,0,0,103,101,116,95,100,97,116,97,10,4,0,
+ 0,115,4,0,0,0,0,2,21,1,117,19,0,0,0,70,
+ 105,108,101,76,111,97,100,101,114,46,103,101,116,95,100,97,
+ 116,97,40,9,0,0,0,117,8,0,0,0,95,95,110,97,
+ 109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,108,
+ 101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,97,
+ 109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,95,
+ 117,8,0,0,0,95,95,105,110,105,116,95,95,117,11,0,
+ 0,0,95,99,104,101,99,107,95,110,97,109,101,117,11,0,
+ 0,0,108,111,97,100,95,109,111,100,117,108,101,117,12,0,
+ 0,0,103,101,116,95,102,105,108,101,110,97,109,101,117,8,
+ 0,0,0,103,101,116,95,100,97,116,97,40,1,0,0,0,
+ 117,10,0,0,0,95,95,108,111,99,97,108,115,95,95,40,
+ 0,0,0,0,40,1,0,0,0,117,9,0,0,0,95,95,
+ 99,108,97,115,115,95,95,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,10,0,0,0,70,105,
+ 108,101,76,111,97,100,101,114,243,3,0,0,115,10,0,0,
+ 0,16,3,6,2,12,6,24,7,18,5,117,10,0,0,0,
+ 70,105,108,101,76,111,97,100,101,114,99,1,0,0,0,0,
+ 0,0,0,1,0,0,0,4,0,0,0,66,0,0,0,115,
+ 68,0,0,0,124,0,0,69,101,0,0,90,1,0,100,0,
+ 0,90,2,0,100,1,0,90,3,0,100,2,0,100,3,0,
+ 132,0,0,90,4,0,100,4,0,100,5,0,132,0,0,90,
+ 5,0,100,6,0,100,7,0,100,8,0,100,9,0,132,0,
+ 1,90,6,0,100,10,0,83,40,11,0,0,0,117,16,0,
+ 0,0,83,111,117,114,99,101,70,105,108,101,76,111,97,100,
+ 101,114,117,62,0,0,0,67,111,110,99,114,101,116,101,32,
+ 105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,
+ 102,32,83,111,117,114,99,101,76,111,97,100,101,114,32,117,
+ 115,105,110,103,32,116,104,101,32,102,105,108,101,32,115,121,
+ 115,116,101,109,46,99,2,0,0,0,0,0,0,0,3,0,
+ 0,0,3,0,0,0,67,0,0,0,115,39,0,0,0,116,
+ 0,0,106,1,0,124,1,0,131,1,0,125,2,0,105,2,
+ 0,124,2,0,106,2,0,100,1,0,54,124,2,0,106,3,
+ 0,100,2,0,54,83,40,3,0,0,0,117,33,0,0,0,
+ 82,101,116,117,114,110,32,116,104,101,32,109,101,116,97,100,
+ 97,116,97,32,102,111,114,32,116,104,101,32,112,97,116,104,
+ 46,117,5,0,0,0,109,116,105,109,101,117,4,0,0,0,
+ 115,105,122,101,40,4,0,0,0,117,3,0,0,0,95,111,
+ 115,117,4,0,0,0,115,116,97,116,117,8,0,0,0,115,
+ 116,95,109,116,105,109,101,117,7,0,0,0,115,116,95,115,
+ 105,122,101,40,3,0,0,0,117,4,0,0,0,115,101,108,
+ 102,117,4,0,0,0,112,97,116,104,117,2,0,0,0,115,
+ 116,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,10,0,
+ 0,0,112,97,116,104,95,115,116,97,116,115,20,4,0,0,
+ 115,4,0,0,0,0,2,15,1,117,27,0,0,0,83,111,
+ 117,114,99,101,70,105,108,101,76,111,97,100,101,114,46,112,
+ 97,116,104,95,115,116,97,116,115,99,4,0,0,0,0,0,
+ 0,0,5,0,0,0,13,0,0,0,67,0,0,0,115,71,
+ 0,0,0,121,22,0,116,0,0,106,1,0,124,1,0,131,
+ 1,0,106,2,0,125,4,0,87,110,24,0,4,116,3,0,
+ 107,10,0,114,48,0,1,1,1,100,1,0,125,4,0,89,
+ 110,1,0,88,124,0,0,106,4,0,124,2,0,124,3,0,
+ 100,2,0,124,4,0,131,2,1,83,40,3,0,0,0,78,
+ 105,182,1,0,0,117,5,0,0,0,95,109,111,100,101,40,
+ 5,0,0,0,117,3,0,0,0,95,111,115,117,4,0,0,
+ 0,115,116,97,116,117,7,0,0,0,115,116,95,109,111,100,
+ 101,117,7,0,0,0,79,83,69,114,114,111,114,117,8,0,
+ 0,0,115,101,116,95,100,97,116,97,40,5,0,0,0,117,
+ 4,0,0,0,115,101,108,102,117,11,0,0,0,115,111,117,
+ 114,99,101,95,112,97,116,104,117,13,0,0,0,98,121,116,
+ 101,99,111,100,101,95,112,97,116,104,117,4,0,0,0,100,
+ 97,116,97,117,4,0,0,0,109,111,100,101,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,15,0,0,0,95,99,97,
+ 99,104,101,95,98,121,116,101,99,111,100,101,25,4,0,0,
+ 115,10,0,0,0,0,2,3,1,22,1,13,1,11,1,117,
+ 32,0,0,0,83,111,117,114,99,101,70,105,108,101,76,111,
+ 97,100,101,114,46,95,99,97,99,104,101,95,98,121,116,101,
+ 99,111,100,101,117,5,0,0,0,95,109,111,100,101,105,182,
+ 1,0,0,99,3,0,0,0,1,0,0,0,8,0,0,0,
+ 13,0,0,0,67,0,0,0,115,245,0,0,0,116,0,0,
+ 124,1,0,131,1,0,92,2,0,125,4,0,125,5,0,103,
+ 0,0,125,6,0,120,54,0,124,4,0,114,80,0,116,1,
+ 0,124,4,0,131,1,0,12,114,80,0,116,0,0,124,4,
+ 0,131,1,0,92,2,0,125,4,0,125,7,0,124,6,0,
+ 106,2,0,124,7,0,131,1,0,1,113,27,0,87,120,97,
+ 0,116,3,0,124,6,0,131,1,0,68,93,83,0,125,7,
+ 0,116,4,0,124,4,0,124,7,0,131,2,0,125,4,0,
+ 121,17,0,116,5,0,106,6,0,124,4,0,131,1,0,1,
+ 87,113,94,0,4,116,7,0,107,10,0,114,155,0,1,1,
+ 1,119,94,0,89,113,94,0,4,116,8,0,107,10,0,114,
+ 176,0,1,1,1,100,1,0,83,89,113,94,0,88,113,94,
+ 0,87,121,33,0,116,9,0,124,1,0,124,2,0,124,3,
+ 0,131,3,0,1,116,10,0,100,2,0,124,1,0,131,2,
+ 0,1,87,110,24,0,4,116,8,0,116,7,0,102,2,0,
+ 107,10,0,114,240,0,1,1,1,89,110,1,0,88,100,1,
+ 0,83,40,3,0,0,0,117,27,0,0,0,87,114,105,116,
+ 101,32,98,121,116,101,115,32,100,97,116,97,32,116,111,32,
+ 97,32,102,105,108,101,46,78,117,12,0,0,0,99,114,101,
+ 97,116,101,100,32,123,33,114,125,40,11,0,0,0,117,11,
+ 0,0,0,95,112,97,116,104,95,115,112,108,105,116,117,11,
+ 0,0,0,95,112,97,116,104,95,105,115,100,105,114,117,6,
+ 0,0,0,97,112,112,101,110,100,117,8,0,0,0,114,101,
+ 118,101,114,115,101,100,117,10,0,0,0,95,112,97,116,104,
+ 95,106,111,105,110,117,3,0,0,0,95,111,115,117,5,0,
+ 0,0,109,107,100,105,114,117,15,0,0,0,70,105,108,101,
+ 69,120,105,115,116,115,69,114,114,111,114,117,15,0,0,0,
+ 80,101,114,109,105,115,115,105,111,110,69,114,114,111,114,117,
+ 13,0,0,0,95,119,114,105,116,101,95,97,116,111,109,105,
+ 99,117,16,0,0,0,95,118,101,114,98,111,115,101,95,109,
+ 101,115,115,97,103,101,40,8,0,0,0,117,4,0,0,0,
+ 115,101,108,102,117,4,0,0,0,112,97,116,104,117,4,0,
+ 0,0,100,97,116,97,117,5,0,0,0,95,109,111,100,101,
+ 117,6,0,0,0,112,97,114,101,110,116,117,8,0,0,0,
+ 102,105,108,101,110,97,109,101,117,10,0,0,0,112,97,116,
+ 104,95,112,97,114,116,115,117,4,0,0,0,112,97,114,116,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,
+ 0,115,101,116,95,100,97,116,97,33,4,0,0,115,36,0,
+ 0,0,0,2,18,1,6,2,22,1,18,1,17,2,19,1,
+ 15,1,3,1,17,1,13,2,7,1,13,3,13,1,3,1,
+ 16,1,17,1,19,3,117,25,0,0,0,83,111,117,114,99,
+ 101,70,105,108,101,76,111,97,100,101,114,46,115,101,116,95,
+ 100,97,116,97,78,40,7,0,0,0,117,8,0,0,0,95,
+ 95,110,97,109,101,95,95,117,10,0,0,0,95,95,109,111,
+ 100,117,108,101,95,95,117,12,0,0,0,95,95,113,117,97,
+ 108,110,97,109,101,95,95,117,7,0,0,0,95,95,100,111,
+ 99,95,95,117,10,0,0,0,112,97,116,104,95,115,116,97,
+ 116,115,117,15,0,0,0,95,99,97,99,104,101,95,98,121,
+ 116,101,99,111,100,101,117,8,0,0,0,115,101,116,95,100,
+ 97,116,97,40,1,0,0,0,117,10,0,0,0,95,95,108,
+ 111,99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,16,0,0,0,83,111,117,114,99,101,70,105,
+ 108,101,76,111,97,100,101,114,16,4,0,0,115,8,0,0,
+ 0,16,2,6,2,12,5,12,8,117,16,0,0,0,83,111,
+ 117,114,99,101,70,105,108,101,76,111,97,100,101,114,99,1,
+ 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,66,
+ 0,0,0,115,62,0,0,0,124,0,0,69,101,0,0,90,
+ 1,0,100,0,0,90,2,0,100,1,0,90,3,0,100,2,
+ 0,100,3,0,132,0,0,90,4,0,100,4,0,100,5,0,
+ 132,0,0,90,5,0,100,6,0,100,7,0,132,0,0,90,
+ 6,0,100,8,0,83,40,9,0,0,0,117,20,0,0,0,
+ 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,
+ 97,100,101,114,117,45,0,0,0,76,111,97,100,101,114,32,
+ 119,104,105,99,104,32,104,97,110,100,108,101,115,32,115,111,
+ 117,114,99,101,108,101,115,115,32,102,105,108,101,32,105,109,
+ 112,111,114,116,115,46,99,2,0,0,0,0,0,0,0,2,
+ 0,0,0,4,0,0,0,67,0,0,0,115,19,0,0,0,
+ 124,0,0,106,0,0,124,1,0,100,1,0,100,2,0,131,
+ 1,1,83,40,3,0,0,0,78,117,10,0,0,0,115,111,
+ 117,114,99,101,108,101,115,115,84,40,2,0,0,0,117,12,
+ 0,0,0,95,108,111,97,100,95,109,111,100,117,108,101,117,
+ 4,0,0,0,84,114,117,101,40,2,0,0,0,117,4,0,
+ 0,0,115,101,108,102,117,8,0,0,0,102,117,108,108,110,
+ 97,109,101,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 11,0,0,0,108,111,97,100,95,109,111,100,117,108,101,66,
+ 4,0,0,115,2,0,0,0,0,1,117,32,0,0,0,83,
+ 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,
+ 100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99,
+ 2,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,
+ 67,0,0,0,115,138,0,0,0,124,0,0,106,0,0,124,
+ 1,0,131,1,0,125,2,0,124,0,0,106,1,0,124,2,
+ 0,131,1,0,125,3,0,124,0,0,106,2,0,124,1,0,
+ 124,3,0,124,2,0,100,0,0,131,4,0,125,4,0,116,
+ 4,0,106,5,0,124,4,0,131,1,0,125,5,0,116,6,
+ 0,124,5,0,116,7,0,131,2,0,114,101,0,116,8,0,
+ 100,1,0,124,2,0,131,2,0,1,124,5,0,83,116,9,
+ 0,100,2,0,106,10,0,124,2,0,131,1,0,100,3,0,
+ 124,1,0,100,4,0,124,2,0,131,1,2,130,1,0,100,
+ 0,0,83,40,5,0,0,0,78,117,21,0,0,0,99,111,
+ 100,101,32,111,98,106,101,99,116,32,102,114,111,109,32,123,
+ 33,114,125,117,21,0,0,0,78,111,110,45,99,111,100,101,
+ 32,111,98,106,101,99,116,32,105,110,32,123,125,117,4,0,
+ 0,0,110,97,109,101,117,4,0,0,0,112,97,116,104,40,
+ 11,0,0,0,117,12,0,0,0,103,101,116,95,102,105,108,
+ 101,110,97,109,101,117,8,0,0,0,103,101,116,95,100,97,
+ 116,97,117,20,0,0,0,95,98,121,116,101,115,95,102,114,
+ 111,109,95,98,121,116,101,99,111,100,101,117,4,0,0,0,
+ 78,111,110,101,117,7,0,0,0,109,97,114,115,104,97,108,
+ 117,5,0,0,0,108,111,97,100,115,117,10,0,0,0,105,
+ 115,105,110,115,116,97,110,99,101,117,10,0,0,0,95,99,
+ 111,100,101,95,116,121,112,101,117,16,0,0,0,95,118,101,
+ 114,98,111,115,101,95,109,101,115,115,97,103,101,117,11,0,
+ 0,0,73,109,112,111,114,116,69,114,114,111,114,117,6,0,
+ 0,0,102,111,114,109,97,116,40,6,0,0,0,117,4,0,
+ 0,0,115,101,108,102,117,8,0,0,0,102,117,108,108,110,
+ 97,109,101,117,4,0,0,0,112,97,116,104,117,4,0,0,
+ 0,100,97,116,97,117,10,0,0,0,98,121,116,101,115,95,
+ 100,97,116,97,117,5,0,0,0,102,111,117,110,100,40,0,
+ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,8,0,0,0,103,
+ 101,116,95,99,111,100,101,69,4,0,0,115,18,0,0,0,
+ 0,1,15,1,15,1,24,1,15,1,15,1,13,1,4,2,
+ 18,1,117,29,0,0,0,83,111,117,114,99,101,108,101,115,
+ 115,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,
+ 99,111,100,101,99,2,0,0,0,0,0,0,0,2,0,0,
+ 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,
+ 0,83,40,2,0,0,0,117,39,0,0,0,82,101,116,117,
+ 114,110,32,78,111,110,101,32,97,115,32,116,104,101,114,101,
+ 32,105,115,32,110,111,32,115,111,117,114,99,101,32,99,111,
+ 100,101,46,78,40,1,0,0,0,117,4,0,0,0,78,111,
+ 110,101,40,2,0,0,0,117,4,0,0,0,115,101,108,102,
+ 117,8,0,0,0,102,117,108,108,110,97,109,101,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,10,0,0,0,103,101,
+ 116,95,115,111,117,114,99,101,81,4,0,0,115,2,0,0,
+ 0,0,2,117,31,0,0,0,83,111,117,114,99,101,108,101,
+ 115,115,70,105,108,101,76,111,97,100,101,114,46,103,101,116,
+ 95,115,111,117,114,99,101,78,40,7,0,0,0,117,8,0,
+ 0,0,95,95,110,97,109,101,95,95,117,10,0,0,0,95,
+ 95,109,111,100,117,108,101,95,95,117,12,0,0,0,95,95,
+ 113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,95,
+ 95,100,111,99,95,95,117,11,0,0,0,108,111,97,100,95,
+ 109,111,100,117,108,101,117,8,0,0,0,103,101,116,95,99,
+ 111,100,101,117,10,0,0,0,103,101,116,95,115,111,117,114,
+ 99,101,40,1,0,0,0,117,10,0,0,0,95,95,108,111,
+ 99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,20,0,0,0,83,111,117,114,99,101,108,101,115,
+ 115,70,105,108,101,76,111,97,100,101,114,62,4,0,0,115,
+ 8,0,0,0,16,2,6,2,12,3,12,12,117,20,0,0,
+ 0,83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,
+ 111,97,100,101,114,99,1,0,0,0,0,0,0,0,1,0,
+ 0,0,5,0,0,0,66,0,0,0,115,104,0,0,0,124,
+ 0,0,69,101,0,0,90,1,0,100,0,0,90,2,0,100,
+ 1,0,90,3,0,100,2,0,100,3,0,132,0,0,90,4,
+ 0,101,5,0,101,6,0,101,7,0,100,4,0,100,5,0,
+ 132,0,0,131,1,0,131,1,0,131,1,0,90,8,0,100,
+ 6,0,100,7,0,132,0,0,90,9,0,100,8,0,100,9,
+ 0,132,0,0,90,10,0,100,10,0,100,11,0,132,0,0,
+ 90,11,0,100,12,0,83,40,13,0,0,0,117,19,0,0,
+ 0,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,
+ 97,100,101,114,117,93,0,0,0,76,111,97,100,101,114,32,
+ 102,111,114,32,101,120,116,101,110,115,105,111,110,32,109,111,
+ 100,117,108,101,115,46,10,10,32,32,32,32,84,104,101,32,
+ 99,111,110,115,116,114,117,99,116,111,114,32,105,115,32,100,
+ 101,115,105,103,110,101,100,32,116,111,32,119,111,114,107,32,
+ 119,105,116,104,32,70,105,108,101,70,105,110,100,101,114,46,
+ 10,10,32,32,32,32,99,3,0,0,0,0,0,0,0,3,
+ 0,0,0,2,0,0,0,67,0,0,0,115,22,0,0,0,
+ 124,1,0,124,0,0,95,0,0,124,2,0,124,0,0,95,
+ 1,0,100,0,0,83,40,1,0,0,0,78,40,2,0,0,
+ 0,117,4,0,0,0,110,97,109,101,117,4,0,0,0,112,
+ 97,116,104,40,3,0,0,0,117,4,0,0,0,115,101,108,
+ 102,117,4,0,0,0,110,97,109,101,117,4,0,0,0,112,
+ 97,116,104,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 8,0,0,0,95,95,105,110,105,116,95,95,98,4,0,0,
+ 115,4,0,0,0,0,1,9,1,117,28,0,0,0,69,120,
+ 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
+ 114,46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,
+ 0,0,0,4,0,0,0,10,0,0,0,67,0,0,0,115,
+ 175,0,0,0,124,1,0,116,0,0,106,1,0,107,6,0,
+ 125,2,0,121,107,0,116,2,0,116,3,0,106,4,0,124,
+ 1,0,124,0,0,106,5,0,131,3,0,125,3,0,116,6,
+ 0,100,1,0,124,0,0,106,5,0,131,2,0,1,124,0,
+ 0,106,7,0,124,1,0,131,1,0,114,117,0,116,8,0,
+ 124,3,0,100,2,0,131,2,0,12,114,117,0,116,9,0,
+ 124,0,0,106,5,0,131,1,0,100,3,0,25,103,1,0,
+ 124,3,0,95,10,0,110,0,0,124,3,0,83,87,110,46,
+ 0,1,1,1,124,2,0,12,114,163,0,124,1,0,116,0,
+ 0,106,1,0,107,6,0,114,163,0,116,0,0,106,1,0,
+ 124,1,0,61,110,0,0,130,0,0,89,110,1,0,88,100,
+ 4,0,83,40,5,0,0,0,117,25,0,0,0,76,111,97,
+ 100,32,97,110,32,101,120,116,101,110,115,105,111,110,32,109,
+ 111,100,117,108,101,46,117,33,0,0,0,101,120,116,101,110,
+ 115,105,111,110,32,109,111,100,117,108,101,32,108,111,97,100,
+ 101,100,32,102,114,111,109,32,123,33,114,125,117,8,0,0,
+ 0,95,95,112,97,116,104,95,95,105,0,0,0,0,78,40,
+ 11,0,0,0,117,3,0,0,0,115,121,115,117,7,0,0,
+ 0,109,111,100,117,108,101,115,117,25,0,0,0,95,99,97,
+ 108,108,95,119,105,116,104,95,102,114,97,109,101,115,95,114,
+ 101,109,111,118,101,100,117,4,0,0,0,95,105,109,112,117,
+ 12,0,0,0,108,111,97,100,95,100,121,110,97,109,105,99,
+ 117,4,0,0,0,112,97,116,104,117,16,0,0,0,95,118,
+ 101,114,98,111,115,101,95,109,101,115,115,97,103,101,117,10,
+ 0,0,0,105,115,95,112,97,99,107,97,103,101,117,7,0,
+ 0,0,104,97,115,97,116,116,114,117,11,0,0,0,95,112,
+ 97,116,104,95,115,112,108,105,116,117,8,0,0,0,95,95,
+ 112,97,116,104,95,95,40,4,0,0,0,117,4,0,0,0,
+ 115,101,108,102,117,8,0,0,0,102,117,108,108,110,97,109,
+ 101,117,9,0,0,0,105,115,95,114,101,108,111,97,100,117,
+ 6,0,0,0,109,111,100,117,108,101,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,11,0,0,0,108,111,97,100,95,
+ 109,111,100,117,108,101,102,4,0,0,115,24,0,0,0,0,
+ 5,15,1,3,1,9,1,15,1,16,1,31,1,28,1,8,
+ 1,3,1,22,1,13,1,117,31,0,0,0,69,120,116,101,
+ 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,
+ 108,111,97,100,95,109,111,100,117,108,101,99,2,0,0,0,
+ 0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0,
+ 115,48,0,0,0,116,0,0,124,0,0,106,1,0,131,1,
+ 0,100,1,0,25,137,0,0,116,2,0,135,0,0,102,1,
+ 0,100,2,0,100,3,0,134,0,0,116,3,0,68,131,1,
+ 0,131,1,0,83,40,4,0,0,0,117,49,0,0,0,82,
+ 101,116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,
+ 101,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,
+ 108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,
+ 105,1,0,0,0,99,1,0,0,0,0,0,0,0,2,0,
+ 0,0,4,0,0,0,51,0,0,0,115,31,0,0,0,124,
+ 0,0,93,21,0,125,1,0,136,0,0,100,0,0,124,1,
+ 0,23,107,2,0,86,1,113,3,0,100,1,0,83,40,2,
+ 0,0,0,117,8,0,0,0,95,95,105,110,105,116,95,95,
+ 78,40,0,0,0,0,40,2,0,0,0,117,2,0,0,0,
+ 46,48,117,6,0,0,0,115,117,102,102,105,120,40,1,0,
+ 0,0,117,9,0,0,0,102,105,108,101,95,110,97,109,101,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,9,0,0,0,60,103,101,110,
+ 101,120,112,114,62,123,4,0,0,115,2,0,0,0,6,1,
+ 117,49,0,0,0,69,120,116,101,110,115,105,111,110,70,105,
+ 108,101,76,111,97,100,101,114,46,105,115,95,112,97,99,107,
+ 97,103,101,46,60,108,111,99,97,108,115,62,46,60,103,101,
+ 110,101,120,112,114,62,40,4,0,0,0,117,11,0,0,0,
+ 95,112,97,116,104,95,115,112,108,105,116,117,4,0,0,0,
+ 112,97,116,104,117,3,0,0,0,97,110,121,117,18,0,0,
+ 0,69,88,84,69,78,83,73,79,78,95,83,85,70,70,73,
+ 88,69,83,40,2,0,0,0,117,4,0,0,0,115,101,108,
+ 102,117,8,0,0,0,102,117,108,108,110,97,109,101,40,0,
+ 0,0,0,40,1,0,0,0,117,9,0,0,0,102,105,108,
+ 101,95,110,97,109,101,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,10,0,0,0,105,115,95,
+ 112,97,99,107,97,103,101,120,4,0,0,115,6,0,0,0,
+ 0,2,19,1,18,1,117,30,0,0,0,69,120,116,101,110,
+ 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,
+ 115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,
+ 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,
+ 0,0,0,100,1,0,83,40,2,0,0,0,117,63,0,0,
+ 0,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,
+ 97,110,32,101,120,116,101,110,115,105,111,110,32,109,111,100,
+ 117,108,101,32,99,97,110,110,111,116,32,99,114,101,97,116,
+ 101,32,97,32,99,111,100,101,32,111,98,106,101,99,116,46,
+ 78,40,1,0,0,0,117,4,0,0,0,78,111,110,101,40,
+ 2,0,0,0,117,4,0,0,0,115,101,108,102,117,8,0,
+ 0,0,102,117,108,108,110,97,109,101,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,8,0,0,0,103,101,116,95,99,
+ 111,100,101,126,4,0,0,115,2,0,0,0,0,2,117,28,
+ 0,0,0,69,120,116,101,110,115,105,111,110,70,105,108,101,
+ 76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,99,
+ 2,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,
+ 67,0,0,0,115,4,0,0,0,100,1,0,83,40,2,0,
+ 0,0,117,53,0,0,0,82,101,116,117,114,110,32,78,111,
+ 110,101,32,97,115,32,101,120,116,101,110,115,105,111,110,32,
+ 109,111,100,117,108,101,115,32,104,97,118,101,32,110,111,32,
+ 115,111,117,114,99,101,32,99,111,100,101,46,78,40,1,0,
+ 0,0,117,4,0,0,0,78,111,110,101,40,2,0,0,0,
+ 117,4,0,0,0,115,101,108,102,117,8,0,0,0,102,117,
+ 108,108,110,97,109,101,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,10,0,0,0,103,101,116,95,115,111,117,114,99,
+ 101,130,4,0,0,115,2,0,0,0,0,2,117,30,0,0,
+ 0,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,
+ 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,78,
+ 40,12,0,0,0,117,8,0,0,0,95,95,110,97,109,101,
+ 95,95,117,10,0,0,0,95,95,109,111,100,117,108,101,95,
+ 95,117,12,0,0,0,95,95,113,117,97,108,110,97,109,101,
+ 95,95,117,7,0,0,0,95,95,100,111,99,95,95,117,8,
+ 0,0,0,95,95,105,110,105,116,95,95,117,11,0,0,0,
+ 95,99,104,101,99,107,95,110,97,109,101,117,11,0,0,0,
+ 115,101,116,95,112,97,99,107,97,103,101,117,10,0,0,0,
+ 115,101,116,95,108,111,97,100,101,114,117,11,0,0,0,108,
+ 111,97,100,95,109,111,100,117,108,101,117,10,0,0,0,105,
+ 115,95,112,97,99,107,97,103,101,117,8,0,0,0,103,101,
+ 116,95,99,111,100,101,117,10,0,0,0,103,101,116,95,115,
+ 111,117,114,99,101,40,1,0,0,0,117,10,0,0,0,95,
+ 95,108,111,99,97,108,115,95,95,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,19,0,0,0,69,120,116,101,110,115,
+ 105,111,110,70,105,108,101,76,111,97,100,101,114,90,4,0,
+ 0,115,16,0,0,0,16,6,6,2,12,4,3,1,3,1,
+ 24,16,12,6,12,4,117,19,0,0,0,69,120,116,101,110,
+ 115,105,111,110,70,105,108,101,76,111,97,100,101,114,99,1,
+ 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,66,
+ 0,0,0,115,134,0,0,0,124,0,0,69,101,0,0,90,
+ 1,0,100,0,0,90,2,0,100,1,0,90,3,0,100,2,
+ 0,100,3,0,132,0,0,90,4,0,100,4,0,100,5,0,
+ 132,0,0,90,5,0,100,6,0,100,7,0,132,0,0,90,
+ 6,0,100,8,0,100,9,0,132,0,0,90,7,0,100,10,
+ 0,100,11,0,132,0,0,90,8,0,100,12,0,100,13,0,
+ 132,0,0,90,9,0,100,14,0,100,15,0,132,0,0,90,
+ 10,0,100,16,0,100,17,0,132,0,0,90,11,0,100,18,
+ 0,100,19,0,132,0,0,90,12,0,100,20,0,83,40,21,
+ 0,0,0,117,14,0,0,0,95,78,97,109,101,115,112,97,
+ 99,101,80,97,116,104,117,37,1,0,0,82,101,112,114,101,
+ 115,101,110,116,115,32,97,32,110,97,109,101,115,112,97,99,
+ 101,32,112,97,99,107,97,103,101,39,115,32,112,97,116,104,
+ 46,32,32,73,116,32,117,115,101,115,32,116,104,101,32,109,
+ 111,100,117,108,101,32,110,97,109,101,10,32,32,32,32,116,
+ 111,32,102,105,110,100,32,105,116,115,32,112,97,114,101,110,
+ 116,32,109,111,100,117,108,101,44,32,97,110,100,32,102,114,
+ 111,109,32,116,104,101,114,101,32,105,116,32,108,111,111,107,
+ 115,32,117,112,32,116,104,101,32,112,97,114,101,110,116,39,
+ 115,10,32,32,32,32,95,95,112,97,116,104,95,95,46,32,
+ 32,87,104,101,110,32,116,104,105,115,32,99,104,97,110,103,
+ 101,115,44,32,116,104,101,32,109,111,100,117,108,101,39,115,
+ 32,111,119,110,32,112,97,116,104,32,105,115,32,114,101,99,
+ 111,109,112,117,116,101,100,44,10,32,32,32,32,117,115,105,
+ 110,103,32,112,97,116,104,95,102,105,110,100,101,114,46,32,
+ 32,70,111,114,32,116,111,112,45,108,101,118,101,32,109,111,
+ 100,117,108,101,115,44,32,116,104,101,32,112,97,114,101,110,
+ 116,32,109,111,100,117,108,101,39,115,32,112,97,116,104,10,
+ 32,32,32,32,105,115,32,115,121,115,46,112,97,116,104,46,
+ 99,4,0,0,0,0,0,0,0,4,0,0,0,2,0,0,
+ 0,67,0,0,0,115,52,0,0,0,124,1,0,124,0,0,
+ 95,0,0,124,2,0,124,0,0,95,1,0,116,2,0,124,
+ 0,0,106,3,0,131,0,0,131,1,0,124,0,0,95,4,
+ 0,124,3,0,124,0,0,95,5,0,100,0,0,83,40,1,
+ 0,0,0,78,40,6,0,0,0,117,5,0,0,0,95,110,
+ 97,109,101,117,5,0,0,0,95,112,97,116,104,117,5,0,
+ 0,0,116,117,112,108,101,117,16,0,0,0,95,103,101,116,
+ 95,112,97,114,101,110,116,95,112,97,116,104,117,17,0,0,
+ 0,95,108,97,115,116,95,112,97,114,101,110,116,95,112,97,
+ 116,104,117,12,0,0,0,95,112,97,116,104,95,102,105,110,
+ 100,101,114,40,4,0,0,0,117,4,0,0,0,115,101,108,
+ 102,117,4,0,0,0,110,97,109,101,117,4,0,0,0,112,
+ 97,116,104,117,11,0,0,0,112,97,116,104,95,102,105,110,
+ 100,101,114,40,0,0,0,0,40,0,0,0,0,117,29,0,
+ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,
+ 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,
+ 8,0,0,0,95,95,105,110,105,116,95,95,142,4,0,0,
+ 115,8,0,0,0,0,1,9,1,9,1,21,1,117,23,0,
+ 0,0,95,78,97,109,101,115,112,97,99,101,80,97,116,104,
+ 46,95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,
+ 0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,53,
+ 0,0,0,124,0,0,106,0,0,106,1,0,100,1,0,131,
+ 1,0,92,3,0,125,1,0,125,2,0,125,3,0,124,2,
+ 0,100,2,0,107,2,0,114,43,0,100,6,0,83,124,1,
+ 0,100,5,0,102,2,0,83,40,7,0,0,0,117,62,0,
+ 0,0,82,101,116,117,114,110,115,32,97,32,116,117,112,108,
+ 101,32,111,102,32,40,112,97,114,101,110,116,45,109,111,100,
+ 117,108,101,45,110,97,109,101,44,32,112,97,114,101,110,116,
+ 45,112,97,116,104,45,97,116,116,114,45,110,97,109,101,41,
+ 117,1,0,0,0,46,117,0,0,0,0,117,3,0,0,0,
+ 115,121,115,117,4,0,0,0,112,97,116,104,117,8,0,0,
+ 0,95,95,112,97,116,104,95,95,40,2,0,0,0,117,3,
+ 0,0,0,115,121,115,117,4,0,0,0,112,97,116,104,40,
+ 2,0,0,0,117,5,0,0,0,95,110,97,109,101,117,10,
+ 0,0,0,114,112,97,114,116,105,116,105,111,110,40,4,0,
+ 0,0,117,4,0,0,0,115,101,108,102,117,6,0,0,0,
+ 112,97,114,101,110,116,117,3,0,0,0,100,111,116,117,2,
+ 0,0,0,109,101,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,23,0,0,0,95,102,105,110,100,95,112,97,114,101,
+ 110,116,95,112,97,116,104,95,110,97,109,101,115,148,4,0,
+ 0,115,8,0,0,0,0,2,27,1,12,2,4,3,117,38,
+ 0,0,0,95,78,97,109,101,115,112,97,99,101,80,97,116,
+ 104,46,95,102,105,110,100,95,112,97,114,101,110,116,95,112,
+ 97,116,104,95,110,97,109,101,115,99,1,0,0,0,0,0,
+ 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,38,
+ 0,0,0,124,0,0,106,0,0,131,0,0,92,2,0,125,
+ 1,0,125,2,0,116,1,0,116,2,0,106,3,0,124,1,
+ 0,25,124,2,0,131,2,0,83,40,1,0,0,0,78,40,
+ 4,0,0,0,117,23,0,0,0,95,102,105,110,100,95,112,
+ 97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,115,
+ 117,7,0,0,0,103,101,116,97,116,116,114,117,3,0,0,
+ 0,115,121,115,117,7,0,0,0,109,111,100,117,108,101,115,
+ 40,3,0,0,0,117,4,0,0,0,115,101,108,102,117,18,
+ 0,0,0,112,97,114,101,110,116,95,109,111,100,117,108,101,
+ 95,110,97,109,101,117,14,0,0,0,112,97,116,104,95,97,
+ 116,116,114,95,110,97,109,101,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,16,0,0,0,95,103,101,116,95,112,97,
+ 114,101,110,116,95,112,97,116,104,158,4,0,0,115,4,0,
+ 0,0,0,1,18,1,117,31,0,0,0,95,78,97,109,101,
+ 115,112,97,99,101,80,97,116,104,46,95,103,101,116,95,112,
+ 97,114,101,110,116,95,112,97,116,104,99,1,0,0,0,0,
+ 0,0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,
+ 103,0,0,0,116,0,0,124,0,0,106,1,0,131,0,0,
+ 131,1,0,125,1,0,124,1,0,124,0,0,106,2,0,107,
+ 3,0,114,96,0,124,0,0,106,3,0,124,0,0,106,4,
+ 0,124,1,0,131,2,0,92,2,0,125,2,0,125,3,0,
+ 124,2,0,100,0,0,107,8,0,114,84,0,124,3,0,124,
+ 0,0,95,6,0,110,0,0,124,1,0,124,0,0,95,2,
+ 0,110,0,0,124,0,0,106,6,0,83,40,1,0,0,0,
+ 78,40,7,0,0,0,117,5,0,0,0,116,117,112,108,101,
+ 117,16,0,0,0,95,103,101,116,95,112,97,114,101,110,116,
+ 95,112,97,116,104,117,17,0,0,0,95,108,97,115,116,95,
+ 112,97,114,101,110,116,95,112,97,116,104,117,12,0,0,0,
+ 95,112,97,116,104,95,102,105,110,100,101,114,117,5,0,0,
+ 0,95,110,97,109,101,117,4,0,0,0,78,111,110,101,117,
+ 5,0,0,0,95,112,97,116,104,40,4,0,0,0,117,4,
+ 0,0,0,115,101,108,102,117,11,0,0,0,112,97,114,101,
+ 110,116,95,112,97,116,104,117,6,0,0,0,108,111,97,100,
+ 101,114,117,8,0,0,0,110,101,119,95,112,97,116,104,40,
+ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,
+ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,
+ 95,98,111,111,116,115,116,114,97,112,62,117,12,0,0,0,
+ 95,114,101,99,97,108,99,117,108,97,116,101,162,4,0,0,
+ 115,14,0,0,0,0,2,18,1,15,1,27,3,12,1,12,
+ 1,12,1,117,27,0,0,0,95,78,97,109,101,115,112,97,
+ 99,101,80,97,116,104,46,95,114,101,99,97,108,99,117,108,
+ 97,116,101,99,1,0,0,0,0,0,0,0,1,0,0,0,
+ 2,0,0,0,67,0,0,0,115,16,0,0,0,116,0,0,
+ 124,0,0,106,1,0,131,0,0,131,1,0,83,40,1,0,
+ 0,0,78,40,2,0,0,0,117,4,0,0,0,105,116,101,
+ 114,117,12,0,0,0,95,114,101,99,97,108,99,117,108,97,
+ 116,101,40,1,0,0,0,117,4,0,0,0,115,101,108,102,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0,
+ 0,95,95,105,116,101,114,95,95,174,4,0,0,115,2,0,
+ 0,0,0,1,117,23,0,0,0,95,78,97,109,101,115,112,
+ 97,99,101,80,97,116,104,46,95,95,105,116,101,114,95,95,
+ 99,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,
+ 0,67,0,0,0,115,16,0,0,0,116,0,0,124,0,0,
+ 106,1,0,131,0,0,131,1,0,83,40,1,0,0,0,78,
+ 40,2,0,0,0,117,3,0,0,0,108,101,110,117,12,0,
+ 0,0,95,114,101,99,97,108,99,117,108,97,116,101,40,1,
+ 0,0,0,117,4,0,0,0,115,101,108,102,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,7,0,0,0,95,95,108,
+ 101,110,95,95,177,4,0,0,115,2,0,0,0,0,1,117,
+ 22,0,0,0,95,78,97,109,101,115,112,97,99,101,80,97,
+ 116,104,46,95,95,108,101,110,95,95,99,1,0,0,0,0,
+ 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,
+ 16,0,0,0,100,1,0,106,0,0,124,0,0,106,1,0,
+ 131,1,0,83,40,2,0,0,0,78,117,20,0,0,0,95,
+ 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33,
+ 114,125,41,40,2,0,0,0,117,6,0,0,0,102,111,114,
+ 109,97,116,117,5,0,0,0,95,112,97,116,104,40,1,0,
+ 0,0,117,4,0,0,0,115,101,108,102,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,8,0,0,0,95,95,114,101,
+ 112,114,95,95,180,4,0,0,115,2,0,0,0,0,1,117,
+ 23,0,0,0,95,78,97,109,101,115,112,97,99,101,80,97,
+ 116,104,46,95,95,114,101,112,114,95,95,99,2,0,0,0,
+ 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,
+ 115,16,0,0,0,124,1,0,124,0,0,106,0,0,131,0,
+ 0,107,6,0,83,40,1,0,0,0,78,40,1,0,0,0,
+ 117,12,0,0,0,95,114,101,99,97,108,99,117,108,97,116,
+ 101,40,2,0,0,0,117,4,0,0,0,115,101,108,102,117,
+ 4,0,0,0,105,116,101,109,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,12,0,0,0,95,95,99,111,110,116,97,
+ 105,110,115,95,95,183,4,0,0,115,2,0,0,0,0,1,
+ 117,27,0,0,0,95,78,97,109,101,115,112,97,99,101,80,
+ 97,116,104,46,95,95,99,111,110,116,97,105,110,115,95,95,
+ 99,2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,
+ 0,67,0,0,0,115,20,0,0,0,124,0,0,106,0,0,
+ 106,1,0,124,1,0,131,1,0,1,100,0,0,83,40,1,
+ 0,0,0,78,40,2,0,0,0,117,5,0,0,0,95,112,
+ 97,116,104,117,6,0,0,0,97,112,112,101,110,100,40,2,
+ 0,0,0,117,4,0,0,0,115,101,108,102,117,4,0,0,
+ 0,105,116,101,109,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,6,0,0,0,97,112,112,101,110,100,186,4,0,0,
+ 115,2,0,0,0,0,1,117,21,0,0,0,95,78,97,109,
+ 101,115,112,97,99,101,80,97,116,104,46,97,112,112,101,110,
+ 100,78,40,13,0,0,0,117,8,0,0,0,95,95,110,97,
+ 109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,108,
+ 101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,97,
+ 109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,95,
+ 117,8,0,0,0,95,95,105,110,105,116,95,95,117,23,0,
+ 0,0,95,102,105,110,100,95,112,97,114,101,110,116,95,112,
+ 97,116,104,95,110,97,109,101,115,117,16,0,0,0,95,103,
+ 101,116,95,112,97,114,101,110,116,95,112,97,116,104,117,12,
+ 0,0,0,95,114,101,99,97,108,99,117,108,97,116,101,117,
+ 8,0,0,0,95,95,105,116,101,114,95,95,117,7,0,0,
+ 0,95,95,108,101,110,95,95,117,8,0,0,0,95,95,114,
+ 101,112,114,95,95,117,12,0,0,0,95,95,99,111,110,116,
+ 97,105,110,115,95,95,117,6,0,0,0,97,112,112,101,110,
+ 100,40,1,0,0,0,117,10,0,0,0,95,95,108,111,99,
+ 97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,14,0,0,0,95,78,97,109,101,115,112,97,99,101,
+ 80,97,116,104,135,4,0,0,115,20,0,0,0,16,5,6,
+ 2,12,6,12,10,12,4,12,12,12,3,12,3,12,3,12,
+ 3,117,14,0,0,0,95,78,97,109,101,115,112,97,99,101,
+ 80,97,116,104,99,1,0,0,0,0,0,0,0,1,0,0,
+ 0,3,0,0,0,66,0,0,0,115,68,0,0,0,124,0,
+ 0,69,101,0,0,90,1,0,100,0,0,90,2,0,100,1,
+ 0,100,2,0,132,0,0,90,3,0,101,4,0,100,3,0,
+ 100,4,0,132,0,0,131,1,0,90,5,0,101,6,0,100,
+ 5,0,100,6,0,132,0,0,131,1,0,90,7,0,100,7,
+ 0,83,40,8,0,0,0,117,15,0,0,0,78,97,109,101,
+ 115,112,97,99,101,76,111,97,100,101,114,99,4,0,0,0,
+ 0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,
+ 115,25,0,0,0,116,0,0,124,1,0,124,2,0,124,3,
+ 0,131,3,0,124,0,0,95,1,0,100,0,0,83,40,1,
+ 0,0,0,78,40,2,0,0,0,117,14,0,0,0,95,78,
+ 97,109,101,115,112,97,99,101,80,97,116,104,117,5,0,0,
+ 0,95,112,97,116,104,40,4,0,0,0,117,4,0,0,0,
+ 115,101,108,102,117,4,0,0,0,110,97,109,101,117,4,0,
+ 0,0,112,97,116,104,117,11,0,0,0,112,97,116,104,95,
+ 102,105,110,100,101,114,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,8,0,0,0,95,95,105,110,105,116,95,95,191,
+ 4,0,0,115,2,0,0,0,0,1,117,24,0,0,0,78,
+ 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,95,
+ 95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,
+ 2,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,
+ 0,100,1,0,106,0,0,124,1,0,106,1,0,131,1,0,
+ 83,40,2,0,0,0,78,117,25,0,0,0,60,109,111,100,
+ 117,108,101,32,39,123,125,39,32,40,110,97,109,101,115,112,
+ 97,99,101,41,62,40,2,0,0,0,117,6,0,0,0,102,
+ 111,114,109,97,116,117,8,0,0,0,95,95,110,97,109,101,
+ 95,95,40,2,0,0,0,117,3,0,0,0,99,108,115,117,
+ 6,0,0,0,109,111,100,117,108,101,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,11,0,0,0,109,111,100,117,108,
+ 101,95,114,101,112,114,194,4,0,0,115,2,0,0,0,0,
+ 2,117,27,0,0,0,78,97,109,101,115,112,97,99,101,76,
+ 111,97,100,101,114,46,109,111,100,117,108,101,95,114,101,112,
+ 114,99,2,0,0,0,0,0,0,0,2,0,0,0,3,0,
+ 0,0,67,0,0,0,115,32,0,0,0,116,0,0,100,1,
+ 0,124,0,0,106,1,0,131,2,0,1,124,0,0,106,1,
+ 0,124,1,0,95,2,0,124,1,0,83,40,2,0,0,0,
+ 117,24,0,0,0,76,111,97,100,32,97,32,110,97,109,101,
+ 115,112,97,99,101,32,109,111,100,117,108,101,46,117,38,0,
+ 0,0,110,97,109,101,115,112,97,99,101,32,109,111,100,117,
+ 108,101,32,108,111,97,100,101,100,32,119,105,116,104,32,112,
+ 97,116,104,32,123,33,114,125,40,3,0,0,0,117,16,0,
+ 0,0,95,118,101,114,98,111,115,101,95,109,101,115,115,97,
+ 103,101,117,5,0,0,0,95,112,97,116,104,117,8,0,0,
+ 0,95,95,112,97,116,104,95,95,40,2,0,0,0,117,4,
+ 0,0,0,115,101,108,102,117,6,0,0,0,109,111,100,117,
+ 108,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,
+ 0,0,0,108,111,97,100,95,109,111,100,117,108,101,198,4,
+ 0,0,115,6,0,0,0,0,3,16,1,12,1,117,27,0,
+ 0,0,78,97,109,101,115,112,97,99,101,76,111,97,100,101,
+ 114,46,108,111,97,100,95,109,111,100,117,108,101,78,40,8,
+ 0,0,0,117,8,0,0,0,95,95,110,97,109,101,95,95,
+ 117,10,0,0,0,95,95,109,111,100,117,108,101,95,95,117,
+ 12,0,0,0,95,95,113,117,97,108,110,97,109,101,95,95,
+ 117,8,0,0,0,95,95,105,110,105,116,95,95,117,11,0,
+ 0,0,99,108,97,115,115,109,101,116,104,111,100,117,11,0,
+ 0,0,109,111,100,117,108,101,95,114,101,112,114,117,17,0,
+ 0,0,109,111,100,117,108,101,95,102,111,114,95,108,111,97,
+ 100,101,114,117,11,0,0,0,108,111,97,100,95,109,111,100,
+ 117,108,101,40,1,0,0,0,117,10,0,0,0,95,95,108,
+ 111,99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,15,0,0,0,78,97,109,101,115,112,97,99,
+ 101,76,111,97,100,101,114,190,4,0,0,115,6,0,0,0,
+ 16,1,12,3,18,4,117,15,0,0,0,78,97,109,101,115,
+ 112,97,99,101,76,111,97,100,101,114,99,1,0,0,0,0,
+ 0,0,0,1,0,0,0,4,0,0,0,66,0,0,0,115,
+ 119,0,0,0,124,0,0,69,101,0,0,90,1,0,100,0,
+ 0,90,2,0,100,1,0,90,3,0,101,4,0,100,2,0,
+ 100,3,0,132,0,0,131,1,0,90,5,0,101,4,0,100,
+ 4,0,100,5,0,132,0,0,131,1,0,90,6,0,101,4,
+ 0,100,6,0,100,7,0,132,0,0,131,1,0,90,7,0,
+ 101,4,0,100,8,0,100,9,0,132,0,0,131,1,0,90,
+ 8,0,101,4,0,100,12,0,100,10,0,100,11,0,132,1,
+ 0,131,1,0,90,10,0,100,12,0,83,40,13,0,0,0,
+ 117,10,0,0,0,80,97,116,104,70,105,110,100,101,114,117,
+ 62,0,0,0,77,101,116,97,32,112,97,116,104,32,102,105,
+ 110,100,101,114,32,102,111,114,32,115,121,115,46,112,97,116,
+ 104,32,97,110,100,32,112,97,99,107,97,103,101,32,95,95,
+ 112,97,116,104,95,95,32,97,116,116,114,105,98,117,116,101,
+ 115,46,99,1,0,0,0,0,0,0,0,2,0,0,0,4,
+ 0,0,0,67,0,0,0,115,58,0,0,0,120,51,0,116,
+ 0,0,106,1,0,106,2,0,131,0,0,68,93,34,0,125,
+ 1,0,116,3,0,124,1,0,100,1,0,131,2,0,114,16,
+ 0,124,1,0,106,4,0,131,0,0,1,113,16,0,113,16,
+ 0,87,100,2,0,83,40,3,0,0,0,117,125,0,0,0,
+ 67,97,108,108,32,116,104,101,32,105,110,118,97,108,105,100,
+ 97,116,101,95,99,97,99,104,101,115,40,41,32,109,101,116,
+ 104,111,100,32,111,110,32,97,108,108,32,112,97,116,104,32,
+ 101,110,116,114,121,32,102,105,110,100,101,114,115,10,32,32,
+ 32,32,32,32,32,32,115,116,111,114,101,100,32,105,110,32,
+ 115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,
+ 114,95,99,97,99,104,101,115,32,40,119,104,101,114,101,32,
+ 105,109,112,108,101,109,101,110,116,101,100,41,46,117,17,0,
+ 0,0,105,110,118,97,108,105,100,97,116,101,95,99,97,99,
+ 104,101,115,78,40,5,0,0,0,117,3,0,0,0,115,121,
+ 115,117,19,0,0,0,112,97,116,104,95,105,109,112,111,114,
+ 116,101,114,95,99,97,99,104,101,117,6,0,0,0,118,97,
+ 108,117,101,115,117,7,0,0,0,104,97,115,97,116,116,114,
+ 117,17,0,0,0,105,110,118,97,108,105,100,97,116,101,95,
+ 99,97,99,104,101,115,40,2,0,0,0,117,3,0,0,0,
+ 99,108,115,117,6,0,0,0,102,105,110,100,101,114,40,0,
+ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,
+ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,
+ 98,111,111,116,115,116,114,97,112,62,117,17,0,0,0,105,
+ 110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,
+ 212,4,0,0,115,6,0,0,0,0,4,22,1,15,1,117,
+ 28,0,0,0,80,97,116,104,70,105,110,100,101,114,46,105,
+ 110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,
+ 99,2,0,0,0,0,0,0,0,3,0,0,0,12,0,0,
+ 0,67,0,0,0,115,94,0,0,0,116,0,0,106,1,0,
+ 115,28,0,116,2,0,106,3,0,100,1,0,116,4,0,131,
+ 2,0,1,110,0,0,120,59,0,116,0,0,106,1,0,68,
+ 93,44,0,125,2,0,121,14,0,124,2,0,124,1,0,131,
+ 1,0,83,87,113,38,0,4,116,5,0,107,10,0,114,81,
+ 0,1,1,1,119,38,0,89,113,38,0,88,113,38,0,87,
+ 100,2,0,83,100,2,0,83,40,3,0,0,0,117,113,0,
+ 0,0,83,101,97,114,99,104,32,115,101,113,117,101,110,99,
+ 101,32,111,102,32,104,111,111,107,115,32,102,111,114,32,97,
+ 32,102,105,110,100,101,114,32,102,111,114,32,39,112,97,116,
+ 104,39,46,10,10,32,32,32,32,32,32,32,32,73,102,32,
+ 39,104,111,111,107,115,39,32,105,115,32,102,97,108,115,101,
+ 32,116,104,101,110,32,117,115,101,32,115,121,115,46,112,97,
+ 116,104,95,104,111,111,107,115,46,10,10,32,32,32,32,32,
+ 32,32,32,117,23,0,0,0,115,121,115,46,112,97,116,104,
+ 95,104,111,111,107,115,32,105,115,32,101,109,112,116,121,78,
+ 40,7,0,0,0,117,3,0,0,0,115,121,115,117,10,0,
+ 0,0,112,97,116,104,95,104,111,111,107,115,117,9,0,0,
+ 0,95,119,97,114,110,105,110,103,115,117,4,0,0,0,119,
+ 97,114,110,117,13,0,0,0,73,109,112,111,114,116,87,97,
+ 114,110,105,110,103,117,11,0,0,0,73,109,112,111,114,116,
+ 69,114,114,111,114,117,4,0,0,0,78,111,110,101,40,3,
+ 0,0,0,117,3,0,0,0,99,108,115,117,4,0,0,0,
+ 112,97,116,104,117,4,0,0,0,104,111,111,107,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,11,0,0,0,95,112,
+ 97,116,104,95,104,111,111,107,115,220,4,0,0,115,16,0,
+ 0,0,0,7,9,1,19,1,16,1,3,1,14,1,13,1,
+ 12,2,117,22,0,0,0,80,97,116,104,70,105,110,100,101,
+ 114,46,95,112,97,116,104,95,104,111,111,107,115,99,2,0,
+ 0,0,0,0,0,0,3,0,0,0,11,0,0,0,67,0,
+ 0,0,115,91,0,0,0,124,1,0,100,1,0,107,2,0,
+ 114,21,0,100,2,0,125,1,0,110,0,0,121,17,0,116,
+ 0,0,106,1,0,124,1,0,25,125,2,0,87,110,46,0,
+ 4,116,2,0,107,10,0,114,86,0,1,1,1,124,0,0,
+ 106,3,0,124,1,0,131,1,0,125,2,0,124,2,0,116,
+ 0,0,106,1,0,124,1,0,60,89,110,1,0,88,124,2,
+ 0,83,40,3,0,0,0,117,210,0,0,0,71,101,116,32,
+ 116,104,101,32,102,105,110,100,101,114,32,102,111,114,32,116,
+ 104,101,32,112,97,116,104,32,101,110,116,114,121,32,102,114,
+ 111,109,32,115,121,115,46,112,97,116,104,95,105,109,112,111,
+ 114,116,101,114,95,99,97,99,104,101,46,10,10,32,32,32,
+ 32,32,32,32,32,73,102,32,116,104,101,32,112,97,116,104,
+ 32,101,110,116,114,121,32,105,115,32,110,111,116,32,105,110,
+ 32,116,104,101,32,99,97,99,104,101,44,32,102,105,110,100,
+ 32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,
+ 32,102,105,110,100,101,114,10,32,32,32,32,32,32,32,32,
+ 97,110,100,32,99,97,99,104,101,32,105,116,46,32,73,102,
+ 32,110,111,32,102,105,110,100,101,114,32,105,115,32,97,118,
+ 97,105,108,97,98,108,101,44,32,115,116,111,114,101,32,78,
+ 111,110,101,46,10,10,32,32,32,32,32,32,32,32,117,0,
+ 0,0,0,117,1,0,0,0,46,40,4,0,0,0,117,3,
+ 0,0,0,115,121,115,117,19,0,0,0,112,97,116,104,95,
+ 105,109,112,111,114,116,101,114,95,99,97,99,104,101,117,8,
+ 0,0,0,75,101,121,69,114,114,111,114,117,11,0,0,0,
+ 95,112,97,116,104,95,104,111,111,107,115,40,3,0,0,0,
+ 117,3,0,0,0,99,108,115,117,4,0,0,0,112,97,116,
+ 104,117,6,0,0,0,102,105,110,100,101,114,40,0,0,0,
+ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,
+ 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,
+ 111,116,115,116,114,97,112,62,117,20,0,0,0,95,112,97,
+ 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
+ 101,237,4,0,0,115,16,0,0,0,0,8,12,1,9,1,
+ 3,1,17,1,13,1,15,1,18,1,117,31,0,0,0,80,
+ 97,116,104,70,105,110,100,101,114,46,95,112,97,116,104,95,
+ 105,109,112,111,114,116,101,114,95,99,97,99,104,101,99,3,
+ 0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,67,
+ 0,0,0,115,162,0,0,0,103,0,0,125,3,0,120,149,
+ 0,124,2,0,68,93,131,0,125,4,0,124,0,0,106,0,
+ 0,124,4,0,131,1,0,125,5,0,124,5,0,100,2,0,
+ 107,9,0,114,13,0,116,2,0,124,5,0,100,1,0,131,
+ 2,0,114,85,0,124,5,0,106,3,0,124,1,0,131,1,
+ 0,92,2,0,125,6,0,125,7,0,110,21,0,124,5,0,
+ 106,4,0,124,1,0,131,1,0,125,6,0,103,0,0,125,
+ 7,0,124,6,0,100,2,0,107,9,0,114,128,0,124,6,
+ 0,124,3,0,102,2,0,83,124,3,0,106,5,0,124,7,
+ 0,131,1,0,1,113,13,0,113,13,0,87,100,2,0,124,
+ 3,0,102,2,0,83,100,2,0,83,40,3,0,0,0,117,
+ 63,0,0,0,70,105,110,100,32,116,104,101,32,108,111,97,
+ 100,101,114,32,111,114,32,110,97,109,101,115,112,97,99,101,
+ 95,112,97,116,104,32,102,111,114,32,116,104,105,115,32,109,
+ 111,100,117,108,101,47,112,97,99,107,97,103,101,32,110,97,
+ 109,101,46,117,11,0,0,0,102,105,110,100,95,108,111,97,
+ 100,101,114,78,40,6,0,0,0,117,20,0,0,0,95,112,
+ 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,
+ 104,101,117,4,0,0,0,78,111,110,101,117,7,0,0,0,
+ 104,97,115,97,116,116,114,117,11,0,0,0,102,105,110,100,
+ 95,108,111,97,100,101,114,117,11,0,0,0,102,105,110,100,
+ 95,109,111,100,117,108,101,117,6,0,0,0,101,120,116,101,
+ 110,100,40,8,0,0,0,117,3,0,0,0,99,108,115,117,
+ 8,0,0,0,102,117,108,108,110,97,109,101,117,4,0,0,
+ 0,112,97,116,104,117,14,0,0,0,110,97,109,101,115,112,
+ 97,99,101,95,112,97,116,104,117,5,0,0,0,101,110,116,
+ 114,121,117,6,0,0,0,102,105,110,100,101,114,117,6,0,
+ 0,0,108,111,97,100,101,114,117,8,0,0,0,112,111,114,
+ 116,105,111,110,115,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,11,0,0,0,95,103,101,116,95,108,111,97,100,101,
+ 114,254,4,0,0,115,24,0,0,0,0,5,6,1,13,1,
+ 15,1,12,1,15,1,24,2,15,1,6,1,12,2,10,5,
+ 20,2,117,22,0,0,0,80,97,116,104,70,105,110,100,101,
+ 114,46,95,103,101,116,95,108,111,97,100,101,114,99,3,0,
+ 0,0,0,0,0,0,5,0,0,0,4,0,0,0,67,0,
+ 0,0,115,97,0,0,0,124,2,0,100,1,0,107,8,0,
+ 114,24,0,116,1,0,106,2,0,125,2,0,110,0,0,124,
+ 0,0,106,3,0,124,1,0,124,2,0,131,2,0,92,2,
+ 0,125,3,0,125,4,0,124,3,0,100,1,0,107,9,0,
+ 114,64,0,124,3,0,83,124,4,0,114,89,0,116,4,0,
+ 124,1,0,124,4,0,124,0,0,106,3,0,131,3,0,83,
+ 100,1,0,83,100,1,0,83,40,2,0,0,0,117,98,0,
+ 0,0,70,105,110,100,32,116,104,101,32,109,111,100,117,108,
+ 101,32,111,110,32,115,121,115,46,112,97,116,104,32,111,114,
+ 32,39,112,97,116,104,39,32,98,97,115,101,100,32,111,110,
+ 32,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,
+ 97,110,100,10,32,32,32,32,32,32,32,32,115,121,115,46,
+ 112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,
+ 99,104,101,46,78,40,5,0,0,0,117,4,0,0,0,78,
+ 111,110,101,117,3,0,0,0,115,121,115,117,4,0,0,0,
+ 112,97,116,104,117,11,0,0,0,95,103,101,116,95,108,111,
+ 97,100,101,114,117,15,0,0,0,78,97,109,101,115,112,97,
+ 99,101,76,111,97,100,101,114,40,5,0,0,0,117,3,0,
+ 0,0,99,108,115,117,8,0,0,0,102,117,108,108,110,97,
+ 109,101,117,4,0,0,0,112,97,116,104,117,6,0,0,0,
+ 108,111,97,100,101,114,117,14,0,0,0,110,97,109,101,115,
+ 112,97,99,101,95,112,97,116,104,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,11,0,0,0,102,105,110,100,95,109,
+ 111,100,117,108,101,23,5,0,0,115,16,0,0,0,0,4,
+ 12,1,12,1,24,1,12,1,4,2,6,3,19,2,117,22,
+ 0,0,0,80,97,116,104,70,105,110,100,101,114,46,102,105,
+ 110,100,95,109,111,100,117,108,101,78,40,11,0,0,0,117,
+ 8,0,0,0,95,95,110,97,109,101,95,95,117,10,0,0,
+ 0,95,95,109,111,100,117,108,101,95,95,117,12,0,0,0,
+ 95,95,113,117,97,108,110,97,109,101,95,95,117,7,0,0,
+ 0,95,95,100,111,99,95,95,117,11,0,0,0,99,108,97,
+ 115,115,109,101,116,104,111,100,117,17,0,0,0,105,110,118,
+ 97,108,105,100,97,116,101,95,99,97,99,104,101,115,117,11,
+ 0,0,0,95,112,97,116,104,95,104,111,111,107,115,117,20,
+ 0,0,0,95,112,97,116,104,95,105,109,112,111,114,116,101,
+ 114,95,99,97,99,104,101,117,11,0,0,0,95,103,101,116,
+ 95,108,111,97,100,101,114,117,4,0,0,0,78,111,110,101,
+ 117,11,0,0,0,102,105,110,100,95,109,111,100,117,108,101,
+ 40,1,0,0,0,117,10,0,0,0,95,95,108,111,99,97,
+ 108,115,95,95,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,10,0,0,0,80,97,116,104,70,105,110,100,101,114,208,
+ 4,0,0,115,14,0,0,0,16,2,6,2,18,8,18,17,
+ 18,17,18,25,3,1,117,10,0,0,0,80,97,116,104,70,
+ 105,110,100,101,114,99,1,0,0,0,0,0,0,0,1,0,
+ 0,0,3,0,0,0,66,0,0,0,115,110,0,0,0,124,
+ 0,0,69,101,0,0,90,1,0,100,0,0,90,2,0,100,
+ 1,0,90,3,0,100,2,0,100,3,0,132,0,0,90,4,
+ 0,100,4,0,100,5,0,132,0,0,90,5,0,101,6,0,
+ 90,7,0,100,6,0,100,7,0,132,0,0,90,8,0,100,
+ 8,0,100,9,0,132,0,0,90,9,0,101,10,0,100,10,
+ 0,100,11,0,132,0,0,131,1,0,90,11,0,100,12,0,
+ 100,13,0,132,0,0,90,12,0,100,14,0,83,40,15,0,
+ 0,0,117,10,0,0,0,70,105,108,101,70,105,110,100,101,
+ 114,117,172,0,0,0,70,105,108,101,45,98,97,115,101,100,
+ 32,102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,
+ 116,101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,
+ 116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,
+ 97,114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,
+ 101,114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,
+ 103,10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,
+ 119,104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,
+ 114,121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,
+ 32,104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,
+ 101,110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,
+ 32,32,99,2,0,0,0,0,0,0,0,5,0,0,0,5,
+ 0,0,0,7,0,0,0,115,122,0,0,0,103,0,0,125,
+ 3,0,120,52,0,124,2,0,68,93,44,0,92,2,0,137,
+ 0,0,125,4,0,124,3,0,106,0,0,135,0,0,102,1,
+ 0,100,1,0,100,2,0,134,0,0,124,4,0,68,131,1,
+ 0,131,1,0,1,113,13,0,87,124,3,0,124,0,0,95,
+ 1,0,124,1,0,112,79,0,100,3,0,124,0,0,95,2,
+ 0,100,6,0,124,0,0,95,3,0,116,4,0,131,0,0,
+ 124,0,0,95,5,0,116,4,0,131,0,0,124,0,0,95,
+ 6,0,100,5,0,83,40,7,0,0,0,117,201,0,0,0,
+ 73,110,105,116,105,97,108,105,122,101,32,119,105,116,104,32,
+ 116,104,101,32,112,97,116,104,32,116,111,32,115,101,97,114,
+ 99,104,32,111,110,32,97,110,100,32,97,32,118,97,114,105,
+ 97,98,108,101,32,110,117,109,98,101,114,32,111,102,10,32,
+ 32,32,32,32,32,32,32,51,45,116,117,112,108,101,115,32,
+ 99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,108,
+ 111,97,100,101,114,44,32,102,105,108,101,32,115,117,102,102,
+ 105,120,101,115,32,116,104,101,32,108,111,97,100,101,114,32,
+ 114,101,99,111,103,110,105,122,101,115,44,10,32,32,32,32,
+ 32,32,32,32,97,110,100,32,97,32,98,111,111,108,101,97,
+ 110,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,
+ 32,108,111,97,100,101,114,32,104,97,110,100,108,101,115,32,
+ 112,97,99,107,97,103,101,115,46,99,1,0,0,0,0,0,
+ 0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,27,
+ 0,0,0,124,0,0,93,17,0,125,1,0,124,1,0,136,
+ 0,0,102,2,0,86,1,113,3,0,100,0,0,83,40,1,
+ 0,0,0,78,40,0,0,0,0,40,2,0,0,0,117,2,
+ 0,0,0,46,48,117,6,0,0,0,115,117,102,102,105,120,
+ 40,1,0,0,0,117,6,0,0,0,108,111,97,100,101,114,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,9,0,0,0,60,103,101,110,
+ 101,120,112,114,62,56,5,0,0,115,2,0,0,0,6,0,
+ 117,38,0,0,0,70,105,108,101,70,105,110,100,101,114,46,
+ 95,95,105,110,105,116,95,95,46,60,108,111,99,97,108,115,
+ 62,46,60,103,101,110,101,120,112,114,62,117,1,0,0,0,
+ 46,105,1,0,0,0,78,105,255,255,255,255,40,7,0,0,
+ 0,117,6,0,0,0,101,120,116,101,110,100,117,8,0,0,
+ 0,95,108,111,97,100,101,114,115,117,4,0,0,0,112,97,
+ 116,104,117,11,0,0,0,95,112,97,116,104,95,109,116,105,
+ 109,101,117,3,0,0,0,115,101,116,117,11,0,0,0,95,
+ 112,97,116,104,95,99,97,99,104,101,117,19,0,0,0,95,
+ 114,101,108,97,120,101,100,95,112,97,116,104,95,99,97,99,
+ 104,101,40,5,0,0,0,117,4,0,0,0,115,101,108,102,
+ 117,4,0,0,0,112,97,116,104,117,7,0,0,0,100,101,
+ 116,97,105,108,115,117,7,0,0,0,108,111,97,100,101,114,
+ 115,117,8,0,0,0,115,117,102,102,105,120,101,115,40,0,
+ 0,0,0,40,1,0,0,0,117,6,0,0,0,108,111,97,
+ 100,101,114,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,8,0,0,0,95,95,105,110,105,116,
+ 95,95,50,5,0,0,115,16,0,0,0,0,4,6,1,19,
+ 1,36,1,9,2,15,1,9,1,12,1,117,19,0,0,0,
+ 70,105,108,101,70,105,110,100,101,114,46,95,95,105,110,105,
+ 116,95,95,99,1,0,0,0,0,0,0,0,1,0,0,0,
+ 2,0,0,0,67,0,0,0,115,13,0,0,0,100,3,0,
+ 124,0,0,95,0,0,100,2,0,83,40,4,0,0,0,117,
+ 31,0,0,0,73,110,118,97,108,105,100,97,116,101,32,116,
+ 104,101,32,100,105,114,101,99,116,111,114,121,32,109,116,105,
+ 109,101,46,105,1,0,0,0,78,105,255,255,255,255,40,1,
+ 0,0,0,117,11,0,0,0,95,112,97,116,104,95,109,116,
+ 105,109,101,40,1,0,0,0,117,4,0,0,0,115,101,108,
+ 102,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,
+ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,
+ 98,46,95,98,111,111,116,115,116,114,97,112,62,117,17,0,
+ 0,0,105,110,118,97,108,105,100,97,116,101,95,99,97,99,
+ 104,101,115,64,5,0,0,115,2,0,0,0,0,2,117,28,
+ 0,0,0,70,105,108,101,70,105,110,100,101,114,46,105,110,
+ 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,99,
+ 2,0,0,0,0,0,0,0,12,0,0,0,13,0,0,0,
+ 67,0,0,0,115,172,1,0,0,100,5,0,125,2,0,124,
+ 1,0,106,1,0,100,1,0,131,1,0,100,2,0,25,125,
+ 3,0,121,25,0,116,2,0,106,3,0,124,0,0,106,4,
+ 0,131,1,0,106,5,0,125,4,0,87,110,24,0,4,116,
+ 6,0,107,10,0,114,76,0,1,1,1,100,6,0,125,4,
+ 0,89,110,1,0,88,124,4,0,124,0,0,106,7,0,107,
+ 3,0,114,114,0,124,0,0,106,8,0,131,0,0,1,124,
+ 4,0,124,0,0,95,7,0,110,0,0,116,9,0,131,0,
+ 0,114,147,0,124,0,0,106,10,0,125,5,0,124,3,0,
+ 106,11,0,131,0,0,125,6,0,110,15,0,124,0,0,106,
+ 12,0,125,5,0,124,3,0,125,6,0,124,6,0,124,5,
+ 0,107,6,0,114,45,1,116,13,0,124,0,0,106,4,0,
+ 124,3,0,131,2,0,125,7,0,116,14,0,124,7,0,131,
+ 1,0,114,45,1,120,91,0,124,0,0,106,15,0,68,93,
+ 71,0,92,2,0,125,8,0,125,9,0,100,4,0,124,8,
+ 0,23,125,10,0,116,13,0,124,7,0,124,10,0,131,2,
+ 0,125,11,0,116,16,0,124,11,0,131,1,0,114,214,0,
+ 124,9,0,124,1,0,124,11,0,131,2,0,124,7,0,103,
+ 1,0,102,2,0,83,113,214,0,87,100,7,0,125,2,0,
+ 113,45,1,110,0,0,120,95,0,124,0,0,106,15,0,68,
+ 93,84,0,92,2,0,125,8,0,125,9,0,124,6,0,124,
+ 8,0,23,124,5,0,107,6,0,114,55,1,116,13,0,124,
+ 0,0,106,4,0,124,3,0,124,8,0,23,131,2,0,125,
+ 11,0,116,16,0,124,11,0,131,1,0,114,139,1,124,9,
+ 0,124,1,0,124,11,0,131,2,0,103,0,0,102,2,0,
+ 83,113,55,1,113,55,1,87,124,2,0,114,162,1,100,8,
+ 0,124,7,0,103,1,0,102,2,0,83,100,8,0,103,0,
+ 0,102,2,0,83,40,9,0,0,0,117,125,0,0,0,84,
+ 114,121,32,116,111,32,102,105,110,100,32,97,32,108,111,97,
+ 100,101,114,32,102,111,114,32,116,104,101,32,115,112,101,99,
+ 105,102,105,101,100,32,109,111,100,117,108,101,44,32,111,114,
+ 32,116,104,101,32,110,97,109,101,115,112,97,99,101,10,32,
+ 32,32,32,32,32,32,32,112,97,99,107,97,103,101,32,112,
+ 111,114,116,105,111,110,115,46,32,82,101,116,117,114,110,115,
+ 32,40,108,111,97,100,101,114,44,32,108,105,115,116,45,111,
+ 102,45,112,111,114,116,105,111,110,115,41,46,117,1,0,0,
+ 0,46,105,2,0,0,0,105,1,0,0,0,117,8,0,0,
+ 0,95,95,105,110,105,116,95,95,70,105,255,255,255,255,84,
+ 78,40,19,0,0,0,117,5,0,0,0,70,97,108,115,101,
+ 117,10,0,0,0,114,112,97,114,116,105,116,105,111,110,117,
+ 3,0,0,0,95,111,115,117,4,0,0,0,115,116,97,116,
+ 117,4,0,0,0,112,97,116,104,117,8,0,0,0,115,116,
+ 95,109,116,105,109,101,117,7,0,0,0,79,83,69,114,114,
+ 111,114,117,11,0,0,0,95,112,97,116,104,95,109,116,105,
+ 109,101,117,11,0,0,0,95,102,105,108,108,95,99,97,99,
+ 104,101,117,11,0,0,0,95,114,101,108,97,120,95,99,97,
+ 115,101,117,19,0,0,0,95,114,101,108,97,120,101,100,95,
+ 112,97,116,104,95,99,97,99,104,101,117,5,0,0,0,108,
+ 111,119,101,114,117,11,0,0,0,95,112,97,116,104,95,99,
+ 97,99,104,101,117,10,0,0,0,95,112,97,116,104,95,106,
+ 111,105,110,117,11,0,0,0,95,112,97,116,104,95,105,115,
+ 100,105,114,117,8,0,0,0,95,108,111,97,100,101,114,115,
+ 117,12,0,0,0,95,112,97,116,104,95,105,115,102,105,108,
+ 101,117,4,0,0,0,84,114,117,101,117,4,0,0,0,78,
+ 111,110,101,40,12,0,0,0,117,4,0,0,0,115,101,108,
+ 102,117,8,0,0,0,102,117,108,108,110,97,109,101,117,12,
+ 0,0,0,105,115,95,110,97,109,101,115,112,97,99,101,117,
+ 11,0,0,0,116,97,105,108,95,109,111,100,117,108,101,117,
+ 5,0,0,0,109,116,105,109,101,117,5,0,0,0,99,97,
+ 99,104,101,117,12,0,0,0,99,97,99,104,101,95,109,111,
+ 100,117,108,101,117,9,0,0,0,98,97,115,101,95,112,97,
+ 116,104,117,6,0,0,0,115,117,102,102,105,120,117,6,0,
+ 0,0,108,111,97,100,101,114,117,13,0,0,0,105,110,105,
+ 116,95,102,105,108,101,110,97,109,101,117,9,0,0,0,102,
+ 117,108,108,95,112,97,116,104,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,11,0,0,0,102,105,110,100,95,108,111,
+ 97,100,101,114,70,5,0,0,115,62,0,0,0,0,3,6,
+ 1,19,1,3,1,25,1,13,1,11,1,15,1,10,1,12,
+ 2,9,1,9,1,15,2,9,1,6,2,12,1,18,1,12,
+ 1,22,1,10,1,15,1,12,1,26,4,12,2,22,1,16,
+ 1,22,1,12,1,26,1,6,1,13,1,117,22,0,0,0,
+ 70,105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,
+ 108,111,97,100,101,114,99,1,0,0,0,0,0,0,0,9,
+ 0,0,0,12,0,0,0,67,0,0,0,115,255,0,0,0,
+ 124,0,0,106,0,0,125,1,0,121,19,0,116,1,0,106,
+ 2,0,124,1,0,131,1,0,125,2,0,87,110,24,0,4,
+ 116,3,0,107,10,0,114,54,0,1,1,1,103,0,0,125,
+ 2,0,89,110,1,0,88,116,4,0,106,5,0,106,6,0,
+ 100,1,0,131,1,0,115,91,0,116,7,0,124,2,0,131,
+ 1,0,124,0,0,95,8,0,110,111,0,116,7,0,131,0,
+ 0,125,3,0,120,90,0,124,2,0,68,93,82,0,125,4,
+ 0,124,4,0,106,9,0,100,2,0,131,1,0,92,3,0,
+ 125,5,0,125,6,0,125,7,0,124,6,0,114,170,0,100,
+ 3,0,106,10,0,124,5,0,124,7,0,106,11,0,131,0,
+ 0,131,2,0,125,8,0,110,6,0,124,5,0,125,8,0,
+ 124,3,0,106,12,0,124,8,0,131,1,0,1,113,107,0,
+ 87,124,3,0,124,0,0,95,8,0,116,4,0,106,5,0,
+ 106,6,0,116,13,0,131,1,0,114,251,0,116,7,0,100,
+ 4,0,100,5,0,132,0,0,124,2,0,68,131,1,0,131,
+ 1,0,124,0,0,95,14,0,110,0,0,100,6,0,83,40,
+ 7,0,0,0,117,68,0,0,0,70,105,108,108,32,116,104,
+ 101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110,
+ 116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100,
+ 32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104,
+ 105,115,32,100,105,114,101,99,116,111,114,121,46,117,3,0,
+ 0,0,119,105,110,117,1,0,0,0,46,117,5,0,0,0,
+ 123,125,46,123,125,99,1,0,0,0,0,0,0,0,2,0,
+ 0,0,2,0,0,0,115,0,0,0,115,27,0,0,0,124,
+ 0,0,93,17,0,125,1,0,124,1,0,106,0,0,131,0,
+ 0,86,1,113,3,0,100,0,0,83,40,1,0,0,0,78,
+ 40,1,0,0,0,117,5,0,0,0,108,111,119,101,114,40,
+ 2,0,0,0,117,2,0,0,0,46,48,117,2,0,0,0,
+ 102,110,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,9,
+ 0,0,0,60,103,101,110,101,120,112,114,62,140,5,0,0,
+ 115,2,0,0,0,6,0,117,41,0,0,0,70,105,108,101,
+ 70,105,110,100,101,114,46,95,102,105,108,108,95,99,97,99,
+ 104,101,46,60,108,111,99,97,108,115,62,46,60,103,101,110,
+ 101,120,112,114,62,78,40,15,0,0,0,117,4,0,0,0,
+ 112,97,116,104,117,3,0,0,0,95,111,115,117,7,0,0,
+ 0,108,105,115,116,100,105,114,117,17,0,0,0,70,105,108,
+ 101,78,111,116,70,111,117,110,100,69,114,114,111,114,117,3,
+ 0,0,0,115,121,115,117,8,0,0,0,112,108,97,116,102,
+ 111,114,109,117,10,0,0,0,115,116,97,114,116,115,119,105,
+ 116,104,117,3,0,0,0,115,101,116,117,11,0,0,0,95,
+ 112,97,116,104,95,99,97,99,104,101,117,9,0,0,0,112,
+ 97,114,116,105,116,105,111,110,117,6,0,0,0,102,111,114,
+ 109,97,116,117,5,0,0,0,108,111,119,101,114,117,3,0,
+ 0,0,97,100,100,117,27,0,0,0,95,67,65,83,69,95,
+ 73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,
+ 70,79,82,77,83,117,19,0,0,0,95,114,101,108,97,120,
+ 101,100,95,112,97,116,104,95,99,97,99,104,101,40,9,0,
+ 0,0,117,4,0,0,0,115,101,108,102,117,4,0,0,0,
+ 112,97,116,104,117,8,0,0,0,99,111,110,116,101,110,116,
+ 115,117,21,0,0,0,108,111,119,101,114,95,115,117,102,102,
+ 105,120,95,99,111,110,116,101,110,116,115,117,4,0,0,0,
+ 105,116,101,109,117,4,0,0,0,110,97,109,101,117,3,0,
+ 0,0,100,111,116,117,6,0,0,0,115,117,102,102,105,120,
+ 117,8,0,0,0,110,101,119,95,110,97,109,101,40,0,0,
+ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,
+ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,
+ 111,111,116,115,116,114,97,112,62,117,11,0,0,0,95,102,
+ 105,108,108,95,99,97,99,104,101,112,5,0,0,115,34,0,
+ 0,0,0,2,9,1,3,1,19,1,13,2,11,3,18,1,
+ 18,7,9,1,13,1,24,1,6,1,27,2,6,1,17,1,
+ 9,1,18,1,117,22,0,0,0,70,105,108,101,70,105,110,
+ 100,101,114,46,95,102,105,108,108,95,99,97,99,104,101,99,
+ 1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
+ 7,0,0,0,115,25,0,0,0,135,0,0,135,1,0,102,
+ 2,0,100,1,0,100,2,0,134,0,0,125,2,0,124,2,
+ 0,83,40,3,0,0,0,117,20,1,0,0,65,32,99,108,
+ 97,115,115,32,109,101,116,104,111,100,32,119,104,105,99,104,
+ 32,114,101,116,117,114,110,115,32,97,32,99,108,111,115,117,
+ 114,101,32,116,111,32,117,115,101,32,111,110,32,115,121,115,
+ 46,112,97,116,104,95,104,111,111,107,10,32,32,32,32,32,
+ 32,32,32,119,104,105,99,104,32,119,105,108,108,32,114,101,
+ 116,117,114,110,32,97,110,32,105,110,115,116,97,110,99,101,
+ 32,117,115,105,110,103,32,116,104,101,32,115,112,101,99,105,
+ 102,105,101,100,32,108,111,97,100,101,114,115,32,97,110,100,
+ 32,116,104,101,32,112,97,116,104,10,32,32,32,32,32,32,
+ 32,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32,
+ 99,108,111,115,117,114,101,46,10,10,32,32,32,32,32,32,
+ 32,32,73,102,32,116,104,101,32,112,97,116,104,32,99,97,
+ 108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115,
+ 117,114,101,32,105,115,32,110,111,116,32,97,32,100,105,114,
+ 101,99,116,111,114,121,44,32,73,109,112,111,114,116,69,114,
+ 114,111,114,32,105,115,10,32,32,32,32,32,32,32,32,114,
+ 97,105,115,101,100,46,10,10,32,32,32,32,32,32,32,32,
+ 99,1,0,0,0,0,0,0,0,1,0,0,0,4,0,0,
+ 0,19,0,0,0,115,46,0,0,0,116,0,0,124,0,0,
+ 131,1,0,115,33,0,116,1,0,100,1,0,100,2,0,124,
+ 0,0,131,1,1,130,1,0,110,0,0,136,0,0,124,0,
+ 0,136,1,0,140,1,0,83,40,3,0,0,0,117,45,0,
+ 0,0,80,97,116,104,32,104,111,111,107,32,102,111,114,32,
+ 105,109,112,111,114,116,108,105,98,46,109,97,99,104,105,110,
+ 101,114,121,46,70,105,108,101,70,105,110,100,101,114,46,117,
+ 30,0,0,0,111,110,108,121,32,100,105,114,101,99,116,111,
+ 114,105,101,115,32,97,114,101,32,115,117,112,112,111,114,116,
+ 101,100,117,4,0,0,0,112,97,116,104,40,2,0,0,0,
+ 117,11,0,0,0,95,112,97,116,104,95,105,115,100,105,114,
+ 117,11,0,0,0,73,109,112,111,114,116,69,114,114,111,114,
+ 40,1,0,0,0,117,4,0,0,0,112,97,116,104,40,2,
+ 0,0,0,117,3,0,0,0,99,108,115,117,14,0,0,0,
+ 108,111,97,100,101,114,95,100,101,116,97,105,108,115,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,24,0,0,0,112,97,116,104,95,104,
+ 111,111,107,95,102,111,114,95,70,105,108,101,70,105,110,100,
+ 101,114,152,5,0,0,115,6,0,0,0,0,2,12,1,21,
+ 1,117,54,0,0,0,70,105,108,101,70,105,110,100,101,114,
+ 46,112,97,116,104,95,104,111,111,107,46,60,108,111,99,97,
+ 108,115,62,46,112,97,116,104,95,104,111,111,107,95,102,111,
+ 114,95,70,105,108,101,70,105,110,100,101,114,40,0,0,0,
+ 0,40,3,0,0,0,117,3,0,0,0,99,108,115,117,14,
+ 0,0,0,108,111,97,100,101,114,95,100,101,116,97,105,108,
+ 115,117,24,0,0,0,112,97,116,104,95,104,111,111,107,95,
+ 102,111,114,95,70,105,108,101,70,105,110,100,101,114,40,0,
+ 0,0,0,40,2,0,0,0,117,3,0,0,0,99,108,115,
+ 117,14,0,0,0,108,111,97,100,101,114,95,100,101,116,97,
+ 105,108,115,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,9,0,0,0,112,97,116,104,95,104,
+ 111,111,107,142,5,0,0,115,4,0,0,0,0,10,21,6,
+ 117,20,0,0,0,70,105,108,101,70,105,110,100,101,114,46,
+ 112,97,116,104,95,104,111,111,107,99,1,0,0,0,0,0,
+ 0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,14,
+ 0,0,0,100,1,0,124,0,0,106,0,0,102,1,0,22,
+ 83,40,2,0,0,0,78,117,14,0,0,0,70,105,108,101,
+ 70,105,110,100,101,114,40,37,114,41,40,1,0,0,0,117,
+ 4,0,0,0,112,97,116,104,40,1,0,0,0,117,4,0,
+ 0,0,115,101,108,102,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,8,0,0,0,95,95,114,101,112,114,95,95,160,
+ 5,0,0,115,2,0,0,0,0,1,117,19,0,0,0,70,
+ 105,108,101,70,105,110,100,101,114,46,95,95,114,101,112,114,
+ 95,95,78,40,13,0,0,0,117,8,0,0,0,95,95,110,
+ 97,109,101,95,95,117,10,0,0,0,95,95,109,111,100,117,
+ 108,101,95,95,117,12,0,0,0,95,95,113,117,97,108,110,
+ 97,109,101,95,95,117,7,0,0,0,95,95,100,111,99,95,
+ 95,117,8,0,0,0,95,95,105,110,105,116,95,95,117,17,
+ 0,0,0,105,110,118,97,108,105,100,97,116,101,95,99,97,
+ 99,104,101,115,117,17,0,0,0,95,102,105,110,100,95,109,
+ 111,100,117,108,101,95,115,104,105,109,117,11,0,0,0,102,
+ 105,110,100,95,109,111,100,117,108,101,117,11,0,0,0,102,
+ 105,110,100,95,108,111,97,100,101,114,117,11,0,0,0,95,
+ 102,105,108,108,95,99,97,99,104,101,117,11,0,0,0,99,
+ 108,97,115,115,109,101,116,104,111,100,117,9,0,0,0,112,
+ 97,116,104,95,104,111,111,107,117,8,0,0,0,95,95,114,
+ 101,112,114,95,95,40,1,0,0,0,117,10,0,0,0,95,
+ 95,108,111,99,97,108,115,95,95,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,10,0,0,0,70,105,108,101,70,105,
+ 110,100,101,114,41,5,0,0,115,16,0,0,0,16,7,6,
+ 2,12,14,12,4,6,2,12,42,12,30,18,18,117,10,0,
+ 0,0,70,105,108,101,70,105,110,100,101,114,99,1,0,0,
+ 0,0,0,0,0,1,0,0,0,2,0,0,0,66,0,0,
+ 0,115,50,0,0,0,124,0,0,69,101,0,0,90,1,0,
+ 100,0,0,90,2,0,100,1,0,90,3,0,100,2,0,100,
+ 3,0,132,0,0,90,4,0,100,4,0,100,5,0,132,0,
+ 0,90,5,0,100,6,0,83,40,7,0,0,0,117,18,0,
+ 0,0,95,73,109,112,111,114,116,76,111,99,107,67,111,110,
+ 116,101,120,116,117,36,0,0,0,67,111,110,116,101,120,116,
+ 32,109,97,110,97,103,101,114,32,102,111,114,32,116,104,101,
+ 32,105,109,112,111,114,116,32,108,111,99,107,46,99,1,0,
+ 0,0,0,0,0,0,1,0,0,0,1,0,0,0,67,0,
+ 0,0,115,14,0,0,0,116,0,0,106,1,0,131,0,0,
+ 1,100,1,0,83,40,2,0,0,0,117,24,0,0,0,65,
+ 99,113,117,105,114,101,32,116,104,101,32,105,109,112,111,114,
+ 116,32,108,111,99,107,46,78,40,2,0,0,0,117,4,0,
+ 0,0,95,105,109,112,117,12,0,0,0,97,99,113,117,105,
+ 114,101,95,108,111,99,107,40,1,0,0,0,117,4,0,0,
+ 0,115,101,108,102,40,0,0,0,0,40,0,0,0,0,117,
+ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,
+ 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,
+ 62,117,9,0,0,0,95,95,101,110,116,101,114,95,95,170,
+ 5,0,0,115,2,0,0,0,0,2,117,28,0,0,0,95,
+ 73,109,112,111,114,116,76,111,99,107,67,111,110,116,101,120,
+ 116,46,95,95,101,110,116,101,114,95,95,99,4,0,0,0,
+ 0,0,0,0,4,0,0,0,1,0,0,0,67,0,0,0,
+ 115,14,0,0,0,116,0,0,106,1,0,131,0,0,1,100,
+ 1,0,83,40,2,0,0,0,117,60,0,0,0,82,101,108,
+ 101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32,
+ 108,111,99,107,32,114,101,103,97,114,100,108,101,115,115,32,
+ 111,102,32,97,110,121,32,114,97,105,115,101,100,32,101,120,
+ 99,101,112,116,105,111,110,115,46,78,40,2,0,0,0,117,
+ 4,0,0,0,95,105,109,112,117,12,0,0,0,114,101,108,
+ 101,97,115,101,95,108,111,99,107,40,4,0,0,0,117,4,
+ 0,0,0,115,101,108,102,117,8,0,0,0,101,120,99,95,
+ 116,121,112,101,117,9,0,0,0,101,120,99,95,118,97,108,
+ 117,101,117,13,0,0,0,101,120,99,95,116,114,97,99,101,
+ 98,97,99,107,40,0,0,0,0,40,0,0,0,0,117,29,
+ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,
+ 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,
+ 117,8,0,0,0,95,95,101,120,105,116,95,95,174,5,0,
+ 0,115,2,0,0,0,0,2,117,27,0,0,0,95,73,109,
+ 112,111,114,116,76,111,99,107,67,111,110,116,101,120,116,46,
+ 95,95,101,120,105,116,95,95,78,40,6,0,0,0,117,8,
+ 0,0,0,95,95,110,97,109,101,95,95,117,10,0,0,0,
+ 95,95,109,111,100,117,108,101,95,95,117,12,0,0,0,95,
+ 95,113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,
+ 95,95,100,111,99,95,95,117,9,0,0,0,95,95,101,110,
+ 116,101,114,95,95,117,8,0,0,0,95,95,101,120,105,116,
+ 95,95,40,1,0,0,0,117,10,0,0,0,95,95,108,111,
+ 99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0,
+ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,
+ 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,
+ 112,62,117,18,0,0,0,95,73,109,112,111,114,116,76,111,
+ 99,107,67,111,110,116,101,120,116,166,5,0,0,115,6,0,
+ 0,0,16,2,6,2,12,4,117,18,0,0,0,95,73,109,
+ 112,111,114,116,76,111,99,107,67,111,110,116,101,120,116,99,
+ 3,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,
+ 67,0,0,0,115,91,0,0,0,124,1,0,106,0,0,100,
+ 1,0,124,2,0,100,2,0,24,131,2,0,125,3,0,116,
+ 1,0,124,3,0,131,1,0,124,2,0,107,0,0,114,55,
+ 0,116,2,0,100,3,0,131,1,0,130,1,0,110,0,0,
+ 124,3,0,100,4,0,25,125,4,0,124,0,0,114,87,0,
+ 100,5,0,106,3,0,124,4,0,124,0,0,131,2,0,83,
+ 124,4,0,83,40,6,0,0,0,117,50,0,0,0,82,101,
+ 115,111,108,118,101,32,97,32,114,101,108,97,116,105,118,101,
+ 32,109,111,100,117,108,101,32,110,97,109,101,32,116,111,32,
+ 97,110,32,97,98,115,111,108,117,116,101,32,111,110,101,46,
+ 117,1,0,0,0,46,105,1,0,0,0,117,50,0,0,0,
+ 97,116,116,101,109,112,116,101,100,32,114,101,108,97,116,105,
+ 118,101,32,105,109,112,111,114,116,32,98,101,121,111,110,100,
+ 32,116,111,112,45,108,101,118,101,108,32,112,97,99,107,97,
+ 103,101,105,0,0,0,0,117,5,0,0,0,123,125,46,123,
+ 125,40,4,0,0,0,117,6,0,0,0,114,115,112,108,105,
+ 116,117,3,0,0,0,108,101,110,117,10,0,0,0,86,97,
+ 108,117,101,69,114,114,111,114,117,6,0,0,0,102,111,114,
+ 109,97,116,40,5,0,0,0,117,4,0,0,0,110,97,109,
+ 101,117,7,0,0,0,112,97,99,107,97,103,101,117,5,0,
+ 0,0,108,101,118,101,108,117,4,0,0,0,98,105,116,115,
+ 117,4,0,0,0,98,97,115,101,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,13,0,0,0,95,114,101,115,111,108,
+ 118,101,95,110,97,109,101,179,5,0,0,115,10,0,0,0,
+ 0,2,22,1,18,1,15,1,10,1,117,13,0,0,0,95,
+ 114,101,115,111,108,118,101,95,110,97,109,101,99,2,0,0,
+ 0,0,0,0,0,4,0,0,0,11,0,0,0,67,0,0,
+ 0,115,138,0,0,0,116,0,0,106,1,0,115,28,0,116,
+ 2,0,106,3,0,100,1,0,116,4,0,131,2,0,1,110,
+ 0,0,120,103,0,116,0,0,106,1,0,68,93,88,0,125,
+ 2,0,116,5,0,131,0,0,143,23,0,1,124,2,0,106,
+ 6,0,124,0,0,124,1,0,131,2,0,125,3,0,87,100,
+ 2,0,81,88,124,3,0,100,2,0,107,9,0,114,38,0,
+ 124,0,0,116,0,0,106,8,0,107,7,0,114,109,0,124,
+ 3,0,83,116,0,0,106,8,0,124,0,0,25,106,9,0,
+ 83,113,38,0,113,38,0,87,100,2,0,83,100,2,0,83,
+ 40,3,0,0,0,117,23,0,0,0,70,105,110,100,32,97,
+ 32,109,111,100,117,108,101,39,115,32,108,111,97,100,101,114,
+ 46,117,22,0,0,0,115,121,115,46,109,101,116,97,95,112,
+ 97,116,104,32,105,115,32,101,109,112,116,121,78,40,10,0,
+ 0,0,117,3,0,0,0,115,121,115,117,9,0,0,0,109,
+ 101,116,97,95,112,97,116,104,117,9,0,0,0,95,119,97,
+ 114,110,105,110,103,115,117,4,0,0,0,119,97,114,110,117,
+ 13,0,0,0,73,109,112,111,114,116,87,97,114,110,105,110,
+ 103,117,18,0,0,0,95,73,109,112,111,114,116,76,111,99,
+ 107,67,111,110,116,101,120,116,117,11,0,0,0,102,105,110,
+ 100,95,109,111,100,117,108,101,117,4,0,0,0,78,111,110,
+ 101,117,7,0,0,0,109,111,100,117,108,101,115,117,10,0,
+ 0,0,95,95,108,111,97,100,101,114,95,95,40,4,0,0,
+ 0,117,4,0,0,0,110,97,109,101,117,4,0,0,0,112,
+ 97,116,104,117,6,0,0,0,102,105,110,100,101,114,117,6,
+ 0,0,0,108,111,97,100,101,114,40,0,0,0,0,40,0,
+ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
+ 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
+ 116,114,97,112,62,117,12,0,0,0,95,102,105,110,100,95,
+ 109,111,100,117,108,101,188,5,0,0,115,20,0,0,0,0,
+ 2,9,1,19,1,16,1,10,1,24,1,12,2,15,1,4,
+ 2,21,2,117,12,0,0,0,95,102,105,110,100,95,109,111,
+ 100,117,108,101,99,3,0,0,0,0,0,0,0,4,0,0,
+ 0,4,0,0,0,67,0,0,0,115,194,0,0,0,116,0,
+ 0,124,0,0,116,1,0,131,2,0,115,45,0,116,2,0,
+ 100,1,0,106,3,0,116,4,0,124,0,0,131,1,0,131,
+ 1,0,131,1,0,130,1,0,110,0,0,124,2,0,100,2,
+ 0,107,0,0,114,72,0,116,5,0,100,3,0,131,1,0,
+ 130,1,0,110,0,0,124,1,0,114,156,0,116,0,0,124,
+ 1,0,116,1,0,131,2,0,115,108,0,116,2,0,100,4,
+ 0,131,1,0,130,1,0,113,156,0,124,1,0,116,6,0,
+ 106,7,0,107,7,0,114,156,0,100,5,0,125,3,0,116,
+ 8,0,124,3,0,106,3,0,124,1,0,131,1,0,131,1,
+ 0,130,1,0,113,156,0,110,0,0,124,0,0,12,114,190,
+ 0,124,2,0,100,2,0,107,2,0,114,190,0,116,5,0,
+ 100,6,0,131,1,0,130,1,0,110,0,0,100,7,0,83,
+ 40,8,0,0,0,117,28,0,0,0,86,101,114,105,102,121,
+ 32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,34,
+ 115,97,110,101,34,46,117,31,0,0,0,109,111,100,117,108,
+ 101,32,110,97,109,101,32,109,117,115,116,32,98,101,32,115,
+ 116,114,44,32,110,111,116,32,123,125,105,0,0,0,0,117,
+ 18,0,0,0,108,101,118,101,108,32,109,117,115,116,32,98,
+ 101,32,62,61,32,48,117,31,0,0,0,95,95,112,97,99,
+ 107,97,103,101,95,95,32,110,111,116,32,115,101,116,32,116,
+ 111,32,97,32,115,116,114,105,110,103,117,61,0,0,0,80,
+ 97,114,101,110,116,32,109,111,100,117,108,101,32,123,33,114,
+ 125,32,110,111,116,32,108,111,97,100,101,100,44,32,99,97,
+ 110,110,111,116,32,112,101,114,102,111,114,109,32,114,101,108,
+ 97,116,105,118,101,32,105,109,112,111,114,116,117,17,0,0,
+ 0,69,109,112,116,121,32,109,111,100,117,108,101,32,110,97,
+ 109,101,78,40,9,0,0,0,117,10,0,0,0,105,115,105,
+ 110,115,116,97,110,99,101,117,3,0,0,0,115,116,114,117,
+ 9,0,0,0,84,121,112,101,69,114,114,111,114,117,6,0,
+ 0,0,102,111,114,109,97,116,117,4,0,0,0,116,121,112,
+ 101,117,10,0,0,0,86,97,108,117,101,69,114,114,111,114,
+ 117,3,0,0,0,115,121,115,117,7,0,0,0,109,111,100,
+ 117,108,101,115,117,11,0,0,0,83,121,115,116,101,109,69,
+ 114,114,111,114,40,4,0,0,0,117,4,0,0,0,110,97,
+ 109,101,117,7,0,0,0,112,97,99,107,97,103,101,117,5,
+ 0,0,0,108,101,118,101,108,117,3,0,0,0,109,115,103,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,13,0,0,
+ 0,95,115,97,110,105,116,121,95,99,104,101,99,107,205,5,
+ 0,0,115,24,0,0,0,0,2,15,1,30,1,12,1,15,
+ 1,6,1,15,1,15,1,15,1,6,2,27,1,19,1,117,
+ 13,0,0,0,95,115,97,110,105,116,121,95,99,104,101,99,
+ 107,117,20,0,0,0,78,111,32,109,111,100,117,108,101,32,
+ 110,97,109,101,100,32,123,33,114,125,99,2,0,0,0,0,
+ 0,0,0,9,0,0,0,27,0,0,0,67,0,0,0,115,
+ 12,2,0,0,100,0,0,125,2,0,124,0,0,106,1,0,
+ 100,1,0,131,1,0,100,2,0,25,125,3,0,124,3,0,
+ 114,178,0,124,3,0,116,2,0,106,3,0,107,7,0,114,
+ 62,0,116,4,0,124,1,0,124,3,0,131,2,0,1,110,
+ 0,0,124,0,0,116,2,0,106,3,0,107,6,0,114,88,
+ 0,116,2,0,106,3,0,124,0,0,25,83,116,2,0,106,
+ 3,0,124,3,0,25,125,4,0,121,13,0,124,4,0,106,
+ 5,0,125,2,0,87,113,178,0,4,116,6,0,107,10,0,
+ 114,174,0,1,1,1,116,7,0,100,3,0,23,106,8,0,
+ 124,0,0,124,3,0,131,2,0,125,5,0,116,9,0,124,
+ 5,0,100,4,0,124,0,0,131,1,1,130,1,0,89,113,
+ 178,0,88,110,0,0,116,10,0,124,0,0,124,2,0,131,
+ 2,0,125,6,0,124,6,0,100,0,0,107,8,0,114,250,
+ 0,116,9,0,116,7,0,106,8,0,124,0,0,131,1,0,
+ 100,4,0,124,0,0,131,1,1,125,7,0,100,10,0,124,
+ 7,0,95,12,0,124,7,0,130,1,0,110,47,0,124,0,
+ 0,116,2,0,106,3,0,107,7,0,114,41,1,124,6,0,
+ 106,13,0,124,0,0,131,1,0,1,116,14,0,100,5,0,
+ 124,0,0,124,6,0,131,3,0,1,110,0,0,116,2,0,
+ 106,3,0,124,0,0,25,125,8,0,124,3,0,114,105,1,
+ 116,2,0,106,3,0,124,3,0,25,125,4,0,116,15,0,
+ 124,4,0,124,0,0,106,1,0,100,1,0,131,1,0,100,
+ 6,0,25,124,8,0,131,3,0,1,110,0,0,116,16,0,
+ 124,8,0,100,7,0,100,0,0,131,3,0,100,0,0,107,
+ 8,0,114,212,1,121,59,0,124,8,0,106,17,0,124,8,
+ 0,95,18,0,116,19,0,124,8,0,100,8,0,131,2,0,
+ 115,187,1,124,8,0,106,18,0,106,1,0,100,1,0,131,
+ 1,0,100,2,0,25,124,8,0,95,18,0,110,0,0,87,
+ 113,212,1,4,116,6,0,107,10,0,114,208,1,1,1,1,
+ 89,113,212,1,88,110,0,0,116,19,0,124,8,0,100,9,
+ 0,131,2,0,115,8,2,121,13,0,124,6,0,124,8,0,
+ 95,20,0,87,113,8,2,4,116,6,0,107,10,0,114,4,
+ 2,1,1,1,89,113,8,2,88,110,0,0,124,8,0,83,
+ 40,11,0,0,0,78,117,1,0,0,0,46,105,0,0,0,
+ 0,117,21,0,0,0,59,32,123,125,32,105,115,32,110,111,
+ 116,32,97,32,112,97,99,107,97,103,101,117,4,0,0,0,
+ 110,97,109,101,117,18,0,0,0,105,109,112,111,114,116,32,
+ 123,33,114,125,32,35,32,123,33,114,125,105,2,0,0,0,
+ 117,11,0,0,0,95,95,112,97,99,107,97,103,101,95,95,
+ 117,8,0,0,0,95,95,112,97,116,104,95,95,117,10,0,
+ 0,0,95,95,108,111,97,100,101,114,95,95,84,40,21,0,
+ 0,0,117,4,0,0,0,78,111,110,101,117,10,0,0,0,
+ 114,112,97,114,116,105,116,105,111,110,117,3,0,0,0,115,
+ 121,115,117,7,0,0,0,109,111,100,117,108,101,115,117,25,
+ 0,0,0,95,99,97,108,108,95,119,105,116,104,95,102,114,
+ 97,109,101,115,95,114,101,109,111,118,101,100,117,8,0,0,
+ 0,95,95,112,97,116,104,95,95,117,14,0,0,0,65,116,
+ 116,114,105,98,117,116,101,69,114,114,111,114,117,8,0,0,
+ 0,95,69,82,82,95,77,83,71,117,6,0,0,0,102,111,
+ 114,109,97,116,117,11,0,0,0,73,109,112,111,114,116,69,
+ 114,114,111,114,117,12,0,0,0,95,102,105,110,100,95,109,
+ 111,100,117,108,101,117,4,0,0,0,84,114,117,101,117,10,
+ 0,0,0,95,110,111,116,95,102,111,117,110,100,117,11,0,
+ 0,0,108,111,97,100,95,109,111,100,117,108,101,117,16,0,
+ 0,0,95,118,101,114,98,111,115,101,95,109,101,115,115,97,
+ 103,101,117,7,0,0,0,115,101,116,97,116,116,114,117,7,
+ 0,0,0,103,101,116,97,116,116,114,117,8,0,0,0,95,
+ 95,110,97,109,101,95,95,117,11,0,0,0,95,95,112,97,
+ 99,107,97,103,101,95,95,117,7,0,0,0,104,97,115,97,
+ 116,116,114,117,10,0,0,0,95,95,108,111,97,100,101,114,
+ 95,95,40,9,0,0,0,117,4,0,0,0,110,97,109,101,
+ 117,7,0,0,0,105,109,112,111,114,116,95,117,4,0,0,
+ 0,112,97,116,104,117,6,0,0,0,112,97,114,101,110,116,
+ 117,13,0,0,0,112,97,114,101,110,116,95,109,111,100,117,
+ 108,101,117,3,0,0,0,109,115,103,117,6,0,0,0,108,
+ 111,97,100,101,114,117,3,0,0,0,101,120,99,117,6,0,
+ 0,0,109,111,100,117,108,101,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,23,0,0,0,95,102,105,110,100,95,97,
+ 110,100,95,108,111,97,100,95,117,110,108,111,99,107,101,100,
+ 224,5,0,0,115,76,0,0,0,0,1,6,1,19,1,6,
+ 1,15,1,16,2,15,1,11,2,13,1,3,1,13,1,13,
+ 1,22,1,26,1,15,1,12,1,27,3,9,1,9,1,15,
+ 2,13,1,19,2,13,1,6,2,13,1,32,2,24,1,3,
+ 1,12,1,15,1,32,1,13,1,8,2,15,1,3,1,13,
+ 1,13,1,8,1,117,23,0,0,0,95,102,105,110,100,95,
+ 97,110,100,95,108,111,97,100,95,117,110,108,111,99,107,101,
+ 100,99,2,0,0,0,0,0,0,0,3,0,0,0,18,0,
+ 0,0,67,0,0,0,115,75,0,0,0,122,16,0,116,0,
+ 0,124,0,0,131,1,0,125,2,0,87,100,1,0,116,1,
+ 0,106,2,0,131,0,0,1,88,124,2,0,106,3,0,131,
+ 0,0,1,122,17,0,116,4,0,124,0,0,124,1,0,131,
+ 2,0,83,87,100,1,0,124,2,0,106,5,0,131,0,0,
+ 1,88,100,1,0,83,40,2,0,0,0,117,54,0,0,0,
+ 70,105,110,100,32,97,110,100,32,108,111,97,100,32,116,104,
+ 101,32,109,111,100,117,108,101,44,32,97,110,100,32,114,101,
+ 108,101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,
+ 32,108,111,99,107,46,78,40,6,0,0,0,117,16,0,0,
+ 0,95,103,101,116,95,109,111,100,117,108,101,95,108,111,99,
+ 107,117,4,0,0,0,95,105,109,112,117,12,0,0,0,114,
+ 101,108,101,97,115,101,95,108,111,99,107,117,7,0,0,0,
+ 97,99,113,117,105,114,101,117,23,0,0,0,95,102,105,110,
+ 100,95,97,110,100,95,108,111,97,100,95,117,110,108,111,99,
+ 107,101,100,117,7,0,0,0,114,101,108,101,97,115,101,40,
+ 3,0,0,0,117,4,0,0,0,110,97,109,101,117,7,0,
+ 0,0,105,109,112,111,114,116,95,117,4,0,0,0,108,111,
+ 99,107,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,14,
+ 0,0,0,95,102,105,110,100,95,97,110,100,95,108,111,97,
+ 100,18,6,0,0,115,14,0,0,0,0,2,3,1,16,2,
+ 11,1,10,1,3,1,17,2,117,14,0,0,0,95,102,105,
+ 110,100,95,97,110,100,95,108,111,97,100,99,3,0,0,0,
+ 0,0,0,0,5,0,0,0,4,0,0,0,67,0,0,0,
+ 115,172,0,0,0,116,0,0,124,0,0,124,1,0,124,2,
+ 0,131,3,0,1,124,2,0,100,1,0,107,4,0,114,49,
+ 0,116,1,0,124,0,0,124,1,0,124,2,0,131,3,0,
+ 125,0,0,110,0,0,116,2,0,106,3,0,131,0,0,1,
+ 124,0,0,116,4,0,106,5,0,107,7,0,114,87,0,116,
+ 6,0,124,0,0,116,7,0,131,2,0,83,116,4,0,106,
+ 5,0,124,0,0,25,125,3,0,124,3,0,100,4,0,107,
+ 8,0,114,158,0,116,2,0,106,9,0,131,0,0,1,100,
+ 2,0,106,10,0,124,0,0,131,1,0,125,4,0,116,11,
+ 0,124,4,0,100,3,0,124,0,0,131,1,1,130,1,0,
+ 110,0,0,116,12,0,124,0,0,131,1,0,1,124,3,0,
+ 83,40,5,0,0,0,117,50,1,0,0,73,109,112,111,114,
+ 116,32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,
+ 32,109,111,100,117,108,101,32,98,97,115,101,100,32,111,110,
+ 32,105,116,115,32,110,97,109,101,44,32,116,104,101,32,112,
+ 97,99,107,97,103,101,32,116,104,101,32,99,97,108,108,32,
+ 105,115,10,32,32,32,32,98,101,105,110,103,32,109,97,100,
+ 101,32,102,114,111,109,44,32,97,110,100,32,116,104,101,32,
+ 108,101,118,101,108,32,97,100,106,117,115,116,109,101,110,116,
+ 46,10,10,32,32,32,32,84,104,105,115,32,102,117,110,99,
+ 116,105,111,110,32,114,101,112,114,101,115,101,110,116,115,32,
+ 116,104,101,32,103,114,101,97,116,101,115,116,32,99,111,109,
+ 109,111,110,32,100,101,110,111,109,105,110,97,116,111,114,32,
+ 111,102,32,102,117,110,99,116,105,111,110,97,108,105,116,121,
+ 10,32,32,32,32,98,101,116,119,101,101,110,32,105,109,112,
+ 111,114,116,95,109,111,100,117,108,101,32,97,110,100,32,95,
+ 95,105,109,112,111,114,116,95,95,46,32,84,104,105,115,32,
+ 105,110,99,108,117,100,101,115,32,115,101,116,116,105,110,103,
+ 32,95,95,112,97,99,107,97,103,101,95,95,32,105,102,10,
+ 32,32,32,32,116,104,101,32,108,111,97,100,101,114,32,100,
+ 105,100,32,110,111,116,46,10,10,32,32,32,32,105,0,0,
+ 0,0,117,40,0,0,0,105,109,112,111,114,116,32,111,102,
+ 32,123,125,32,104,97,108,116,101,100,59,32,78,111,110,101,
+ 32,105,110,32,115,121,115,46,109,111,100,117,108,101,115,117,
+ 4,0,0,0,110,97,109,101,78,40,13,0,0,0,117,13,
+ 0,0,0,95,115,97,110,105,116,121,95,99,104,101,99,107,
+ 117,13,0,0,0,95,114,101,115,111,108,118,101,95,110,97,
+ 109,101,117,4,0,0,0,95,105,109,112,117,12,0,0,0,
+ 97,99,113,117,105,114,101,95,108,111,99,107,117,3,0,0,
+ 0,115,121,115,117,7,0,0,0,109,111,100,117,108,101,115,
+ 117,14,0,0,0,95,102,105,110,100,95,97,110,100,95,108,
+ 111,97,100,117,11,0,0,0,95,103,99,100,95,105,109,112,
+ 111,114,116,117,4,0,0,0,78,111,110,101,117,12,0,0,
+ 0,114,101,108,101,97,115,101,95,108,111,99,107,117,6,0,
+ 0,0,102,111,114,109,97,116,117,11,0,0,0,73,109,112,
+ 111,114,116,69,114,114,111,114,117,19,0,0,0,95,108,111,
+ 99,107,95,117,110,108,111,99,107,95,109,111,100,117,108,101,
+ 40,5,0,0,0,117,4,0,0,0,110,97,109,101,117,7,
+ 0,0,0,112,97,99,107,97,103,101,117,5,0,0,0,108,
+ 101,118,101,108,117,6,0,0,0,109,111,100,117,108,101,117,
+ 7,0,0,0,109,101,115,115,97,103,101,40,0,0,0,0,
+ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
+ 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
+ 116,115,116,114,97,112,62,117,11,0,0,0,95,103,99,100,
+ 95,105,109,112,111,114,116,31,6,0,0,115,28,0,0,0,
+ 0,9,16,1,12,1,21,1,10,1,15,1,13,1,13,1,
+ 12,1,10,1,6,1,9,1,21,1,10,1,117,11,0,0,
+ 0,95,103,99,100,95,105,109,112,111,114,116,99,3,0,0,
+ 0,0,0,0,0,5,0,0,0,17,0,0,0,67,0,0,
+ 0,115,233,0,0,0,116,0,0,124,0,0,100,1,0,131,
+ 2,0,114,229,0,100,2,0,124,1,0,107,6,0,114,89,
+ 0,116,1,0,124,1,0,131,1,0,125,1,0,124,1,0,
+ 106,2,0,100,2,0,131,1,0,1,116,0,0,124,0,0,
+ 100,3,0,131,2,0,114,89,0,124,1,0,106,3,0,124,
+ 0,0,106,4,0,131,1,0,1,113,89,0,110,0,0,120,
+ 137,0,124,1,0,68,93,126,0,125,3,0,116,0,0,124,
+ 0,0,124,3,0,131,2,0,115,96,0,121,32,0,116,5,
+ 0,124,2,0,100,4,0,106,6,0,124,0,0,106,7,0,
+ 124,3,0,131,2,0,131,2,0,1,87,113,222,0,4,116,
+ 8,0,107,10,0,114,218,0,1,125,4,0,1,122,35,0,
+ 116,0,0,124,4,0,100,5,0,131,2,0,114,197,0,124,
+ 4,0,106,9,0,114,197,0,110,3,0,130,0,0,87,89,
+ 100,6,0,100,6,0,125,4,0,126,4,0,88,113,222,0,
+ 88,113,96,0,113,96,0,87,110,0,0,124,0,0,83,40,
+ 7,0,0,0,117,238,0,0,0,70,105,103,117,114,101,32,
+ 111,117,116,32,119,104,97,116,32,95,95,105,109,112,111,114,
+ 116,95,95,32,115,104,111,117,108,100,32,114,101,116,117,114,
+ 110,46,10,10,32,32,32,32,84,104,101,32,105,109,112,111,
+ 114,116,95,32,112,97,114,97,109,101,116,101,114,32,105,115,
+ 32,97,32,99,97,108,108,97,98,108,101,32,119,104,105,99,
+ 104,32,116,97,107,101,115,32,116,104,101,32,110,97,109,101,
+ 32,111,102,32,109,111,100,117,108,101,32,116,111,10,32,32,
+ 32,32,105,109,112,111,114,116,46,32,73,116,32,105,115,32,
+ 114,101,113,117,105,114,101,100,32,116,111,32,100,101,99,111,
+ 117,112,108,101,32,116,104,101,32,102,117,110,99,116,105,111,
+ 110,32,102,114,111,109,32,97,115,115,117,109,105,110,103,32,
+ 105,109,112,111,114,116,108,105,98,39,115,10,32,32,32,32,
+ 105,109,112,111,114,116,32,105,109,112,108,101,109,101,110,116,
+ 97,116,105,111,110,32,105,115,32,100,101,115,105,114,101,100,
+ 46,10,10,32,32,32,32,117,8,0,0,0,95,95,112,97,
+ 116,104,95,95,117,1,0,0,0,42,117,7,0,0,0,95,
+ 95,97,108,108,95,95,117,5,0,0,0,123,125,46,123,125,
+ 117,10,0,0,0,95,110,111,116,95,102,111,117,110,100,78,
+ 40,10,0,0,0,117,7,0,0,0,104,97,115,97,116,116,
+ 114,117,4,0,0,0,108,105,115,116,117,6,0,0,0,114,
+ 101,109,111,118,101,117,6,0,0,0,101,120,116,101,110,100,
+ 117,7,0,0,0,95,95,97,108,108,95,95,117,25,0,0,
+ 0,95,99,97,108,108,95,119,105,116,104,95,102,114,97,109,
+ 101,115,95,114,101,109,111,118,101,100,117,6,0,0,0,102,
+ 111,114,109,97,116,117,8,0,0,0,95,95,110,97,109,101,
+ 95,95,117,11,0,0,0,73,109,112,111,114,116,69,114,114,
+ 111,114,117,10,0,0,0,95,110,111,116,95,102,111,117,110,
+ 100,40,5,0,0,0,117,6,0,0,0,109,111,100,117,108,
+ 101,117,8,0,0,0,102,114,111,109,108,105,115,116,117,7,
+ 0,0,0,105,109,112,111,114,116,95,117,1,0,0,0,120,
+ 117,3,0,0,0,101,120,99,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,16,0,0,0,95,104,97,110,100,108,101,
+ 95,102,114,111,109,108,105,115,116,55,6,0,0,115,32,0,
+ 0,0,0,10,15,1,12,1,12,1,13,1,15,1,22,1,
+ 13,1,15,1,3,1,6,1,26,1,18,6,24,1,3,2,
+ 32,1,117,16,0,0,0,95,104,97,110,100,108,101,95,102,
+ 114,111,109,108,105,115,116,99,1,0,0,0,0,0,0,0,
+ 2,0,0,0,2,0,0,0,67,0,0,0,115,78,0,0,
+ 0,124,0,0,106,0,0,100,1,0,131,1,0,125,1,0,
+ 124,1,0,100,6,0,107,8,0,114,74,0,124,0,0,100,
+ 2,0,25,125,1,0,100,3,0,124,0,0,107,7,0,114,
+ 74,0,124,1,0,106,2,0,100,4,0,131,1,0,100,5,
+ 0,25,125,1,0,113,74,0,110,0,0,124,1,0,83,40,
+ 7,0,0,0,117,167,0,0,0,67,97,108,99,117,108,97,
+ 116,101,32,119,104,97,116,32,95,95,112,97,99,107,97,103,
+ 101,95,95,32,115,104,111,117,108,100,32,98,101,46,10,10,
+ 32,32,32,32,95,95,112,97,99,107,97,103,101,95,95,32,
+ 105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,
+ 100,32,116,111,32,98,101,32,100,101,102,105,110,101,100,32,
+ 111,114,32,99,111,117,108,100,32,98,101,32,115,101,116,32,
+ 116,111,32,78,111,110,101,10,32,32,32,32,116,111,32,114,
+ 101,112,114,101,115,101,110,116,32,116,104,97,116,32,105,116,
+ 115,32,112,114,111,112,101,114,32,118,97,108,117,101,32,105,
+ 115,32,117,110,107,110,111,119,110,46,10,10,32,32,32,32,
+ 117,11,0,0,0,95,95,112,97,99,107,97,103,101,95,95,
+ 117,8,0,0,0,95,95,110,97,109,101,95,95,117,8,0,
+ 0,0,95,95,112,97,116,104,95,95,117,1,0,0,0,46,
+ 105,0,0,0,0,78,40,3,0,0,0,117,3,0,0,0,
+ 103,101,116,117,4,0,0,0,78,111,110,101,117,10,0,0,
+ 0,114,112,97,114,116,105,116,105,111,110,40,2,0,0,0,
+ 117,7,0,0,0,103,108,111,98,97,108,115,117,7,0,0,
+ 0,112,97,99,107,97,103,101,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,17,0,0,0,95,99,97,108,99,95,95,
+ 95,112,97,99,107,97,103,101,95,95,89,6,0,0,115,12,
+ 0,0,0,0,7,15,1,12,1,10,1,12,1,25,1,117,
+ 17,0,0,0,95,99,97,108,99,95,95,95,112,97,99,107,
+ 97,103,101,95,95,99,0,0,0,0,0,0,0,0,3,0,
+ 0,0,3,0,0,0,67,0,0,0,115,55,0,0,0,116,
+ 0,0,116,1,0,106,2,0,131,0,0,102,2,0,125,0,
+ 0,116,3,0,116,4,0,102,2,0,125,1,0,116,5,0,
+ 116,6,0,102,2,0,125,2,0,124,0,0,124,1,0,124,
+ 2,0,103,3,0,83,40,1,0,0,0,117,111,0,0,0,
+ 82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,
+ 102,32,102,105,108,101,45,98,97,115,101,100,32,109,111,100,
+ 117,108,101,32,108,111,97,100,101,114,115,46,10,10,32,32,
+ 32,32,69,97,99,104,32,105,116,101,109,32,105,115,32,97,
+ 32,116,117,112,108,101,32,40,108,111,97,100,101,114,44,32,
+ 115,117,102,102,105,120,101,115,44,32,97,108,108,111,119,95,
+ 112,97,99,107,97,103,101,115,41,46,10,32,32,32,32,40,
+ 7,0,0,0,117,19,0,0,0,69,120,116,101,110,115,105,
+ 111,110,70,105,108,101,76,111,97,100,101,114,117,4,0,0,
+ 0,95,105,109,112,117,18,0,0,0,101,120,116,101,110,115,
+ 105,111,110,95,115,117,102,102,105,120,101,115,117,16,0,0,
+ 0,83,111,117,114,99,101,70,105,108,101,76,111,97,100,101,
+ 114,117,15,0,0,0,83,79,85,82,67,69,95,83,85,70,
+ 70,73,88,69,83,117,20,0,0,0,83,111,117,114,99,101,
+ 108,101,115,115,70,105,108,101,76,111,97,100,101,114,117,17,
+ 0,0,0,66,89,84,69,67,79,68,69,95,83,85,70,70,
+ 73,88,69,83,40,3,0,0,0,117,10,0,0,0,101,120,
+ 116,101,110,115,105,111,110,115,117,6,0,0,0,115,111,117,
+ 114,99,101,117,8,0,0,0,98,121,116,101,99,111,100,101,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,27,0,0,
+ 0,95,103,101,116,95,115,117,112,112,111,114,116,101,100,95,
+ 102,105,108,101,95,108,111,97,100,101,114,115,104,6,0,0,
+ 115,8,0,0,0,0,5,18,1,12,1,12,1,117,27,0,
+ 0,0,95,103,101,116,95,115,117,112,112,111,114,116,101,100,
+ 95,102,105,108,101,95,108,111,97,100,101,114,115,99,5,0,
+ 0,0,0,0,0,0,9,0,0,0,5,0,0,0,67,0,
+ 0,0,115,227,0,0,0,124,4,0,100,1,0,107,2,0,
+ 114,27,0,116,0,0,124,0,0,131,1,0,125,5,0,110,
+ 54,0,124,1,0,100,3,0,107,9,0,114,45,0,124,1,
+ 0,110,3,0,105,0,0,125,6,0,116,2,0,124,6,0,
+ 131,1,0,125,7,0,116,0,0,124,0,0,124,7,0,124,
+ 4,0,131,3,0,125,5,0,124,3,0,115,207,0,124,4,
+ 0,100,1,0,107,2,0,114,122,0,116,0,0,124,0,0,
+ 106,3,0,100,2,0,131,1,0,100,1,0,25,131,1,0,
+ 83,124,0,0,115,132,0,124,5,0,83,116,4,0,124,0,
+ 0,131,1,0,116,4,0,124,0,0,106,3,0,100,2,0,
+ 131,1,0,100,1,0,25,131,1,0,24,125,8,0,116,5,
+ 0,106,6,0,124,5,0,106,7,0,100,3,0,116,4,0,
+ 124,5,0,106,7,0,131,1,0,124,8,0,24,133,2,0,
+ 25,25,83,110,16,0,116,8,0,124,5,0,124,3,0,116,
+ 0,0,131,3,0,83,100,3,0,83,40,4,0,0,0,117,
+ 214,1,0,0,73,109,112,111,114,116,32,97,32,109,111,100,
+ 117,108,101,46,10,10,32,32,32,32,84,104,101,32,39,103,
+ 108,111,98,97,108,115,39,32,97,114,103,117,109,101,110,116,
+ 32,105,115,32,117,115,101,100,32,116,111,32,105,110,102,101,
+ 114,32,119,104,101,114,101,32,116,104,101,32,105,109,112,111,
+ 114,116,32,105,115,32,111,99,99,117,114,105,110,103,32,102,
+ 114,111,109,10,32,32,32,32,116,111,32,104,97,110,100,108,
+ 101,32,114,101,108,97,116,105,118,101,32,105,109,112,111,114,
+ 116,115,46,32,84,104,101,32,39,108,111,99,97,108,115,39,
+ 32,97,114,103,117,109,101,110,116,32,105,115,32,105,103,110,
+ 111,114,101,100,46,32,84,104,101,10,32,32,32,32,39,102,
+ 114,111,109,108,105,115,116,39,32,97,114,103,117,109,101,110,
+ 116,32,115,112,101,99,105,102,105,101,115,32,119,104,97,116,
+ 32,115,104,111,117,108,100,32,101,120,105,115,116,32,97,115,
+ 32,97,116,116,114,105,98,117,116,101,115,32,111,110,32,116,
+ 104,101,32,109,111,100,117,108,101,10,32,32,32,32,98,101,
+ 105,110,103,32,105,109,112,111,114,116,101,100,32,40,101,46,
+ 103,46,32,96,96,102,114,111,109,32,109,111,100,117,108,101,
+ 32,105,109,112,111,114,116,32,60,102,114,111,109,108,105,115,
+ 116,62,96,96,41,46,32,32,84,104,101,32,39,108,101,118,
+ 101,108,39,10,32,32,32,32,97,114,103,117,109,101,110,116,
+ 32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,
+ 112,97,99,107,97,103,101,32,108,111,99,97,116,105,111,110,
+ 32,116,111,32,105,109,112,111,114,116,32,102,114,111,109,32,
+ 105,110,32,97,32,114,101,108,97,116,105,118,101,10,32,32,
+ 32,32,105,109,112,111,114,116,32,40,101,46,103,46,32,96,
+ 96,102,114,111,109,32,46,46,112,107,103,32,105,109,112,111,
+ 114,116,32,109,111,100,96,96,32,119,111,117,108,100,32,104,
+ 97,118,101,32,97,32,39,108,101,118,101,108,39,32,111,102,
+ 32,50,41,46,10,10,32,32,32,32,105,0,0,0,0,117,
+ 1,0,0,0,46,78,40,9,0,0,0,117,11,0,0,0,
+ 95,103,99,100,95,105,109,112,111,114,116,117,4,0,0,0,
+ 78,111,110,101,117,17,0,0,0,95,99,97,108,99,95,95,
+ 95,112,97,99,107,97,103,101,95,95,117,9,0,0,0,112,
+ 97,114,116,105,116,105,111,110,117,3,0,0,0,108,101,110,
+ 117,3,0,0,0,115,121,115,117,7,0,0,0,109,111,100,
+ 117,108,101,115,117,8,0,0,0,95,95,110,97,109,101,95,
+ 95,117,16,0,0,0,95,104,97,110,100,108,101,95,102,114,
+ 111,109,108,105,115,116,40,9,0,0,0,117,4,0,0,0,
+ 110,97,109,101,117,7,0,0,0,103,108,111,98,97,108,115,
+ 117,6,0,0,0,108,111,99,97,108,115,117,8,0,0,0,
+ 102,114,111,109,108,105,115,116,117,5,0,0,0,108,101,118,
+ 101,108,117,6,0,0,0,109,111,100,117,108,101,117,8,0,
+ 0,0,103,108,111,98,97,108,115,95,117,7,0,0,0,112,
+ 97,99,107,97,103,101,117,7,0,0,0,99,117,116,95,111,
+ 102,102,40,0,0,0,0,40,0,0,0,0,117,29,0,0,
+ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,
+ 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,10,
+ 0,0,0,95,95,105,109,112,111,114,116,95,95,115,6,0,
+ 0,115,26,0,0,0,0,11,12,1,15,2,24,1,12,1,
+ 18,1,6,3,12,1,23,1,6,1,4,2,35,1,40,2,
+ 117,10,0,0,0,95,95,105,109,112,111,114,116,95,95,99,
+ 2,0,0,0,0,0,0,0,14,0,0,0,13,0,0,0,
+ 67,0,0,0,115,169,2,0,0,124,1,0,97,0,0,124,
+ 0,0,97,1,0,120,47,0,116,0,0,116,1,0,102,2,
+ 0,68,93,33,0,125,2,0,116,2,0,124,2,0,100,1,
+ 0,131,2,0,115,25,0,116,3,0,124,2,0,95,4,0,
+ 113,25,0,113,25,0,87,116,1,0,106,5,0,116,6,0,
+ 25,125,3,0,120,76,0,100,28,0,68,93,68,0,125,4,
+ 0,124,4,0,116,1,0,106,5,0,107,7,0,114,121,0,
+ 116,3,0,106,7,0,124,4,0,131,1,0,125,5,0,110,
+ 13,0,116,1,0,106,5,0,124,4,0,25,125,5,0,116,
+ 8,0,124,3,0,124,4,0,124,5,0,131,3,0,1,113,
+ 82,0,87,100,6,0,100,7,0,103,1,0,102,2,0,100,
+ 8,0,100,9,0,100,7,0,103,2,0,102,2,0,100,10,
+ 0,100,9,0,100,7,0,103,2,0,102,2,0,102,3,0,
+ 125,6,0,120,189,0,124,6,0,68,93,169,0,92,2,0,
+ 125,7,0,125,8,0,116,9,0,100,11,0,100,12,0,132,
+ 0,0,124,8,0,68,131,1,0,131,1,0,115,252,0,116,
+ 10,0,130,1,0,124,8,0,100,13,0,25,125,9,0,124,
+ 7,0,116,1,0,106,5,0,107,6,0,114,38,1,116,1,
+ 0,106,5,0,124,7,0,25,125,10,0,80,113,209,0,121,
+ 60,0,116,3,0,106,7,0,124,7,0,131,1,0,125,10,
+ 0,124,7,0,100,10,0,107,2,0,114,96,1,100,14,0,
+ 116,1,0,106,11,0,107,6,0,114,96,1,124,8,0,100,
+ 15,0,25,125,9,0,110,0,0,80,87,113,209,0,4,116,
+ 12,0,107,10,0,114,121,1,1,1,1,119,209,0,89,113,
+ 209,0,88,113,209,0,87,116,12,0,100,16,0,131,1,0,
+ 130,1,0,121,19,0,116,3,0,106,7,0,100,17,0,131,
+ 1,0,125,11,0,87,110,24,0,4,116,12,0,107,10,0,
+ 114,183,1,1,1,1,100,27,0,125,11,0,89,110,1,0,
+ 88,116,3,0,106,7,0,100,18,0,131,1,0,125,12,0,
+ 124,7,0,100,8,0,107,2,0,114,245,1,116,3,0,106,
+ 7,0,100,19,0,131,1,0,125,13,0,116,8,0,124,3,
+ 0,100,20,0,124,13,0,131,3,0,1,110,0,0,116,8,
+ 0,124,3,0,100,21,0,124,10,0,131,3,0,1,116,8,
+ 0,124,3,0,100,17,0,124,11,0,131,3,0,1,116,8,
+ 0,124,3,0,100,18,0,124,12,0,131,3,0,1,116,8,
+ 0,124,3,0,100,22,0,124,9,0,131,3,0,1,116,8,
+ 0,124,3,0,100,23,0,116,14,0,124,8,0,131,1,0,
+ 131,3,0,1,116,8,0,124,3,0,100,24,0,116,15,0,
+ 131,0,0,131,3,0,1,116,16,0,106,17,0,116,0,0,
+ 106,18,0,131,0,0,131,1,0,1,124,7,0,100,8,0,
+ 107,2,0,114,165,2,116,19,0,106,20,0,100,25,0,131,
+ 1,0,1,100,26,0,116,16,0,107,6,0,114,165,2,100,
+ 29,0,116,22,0,95,23,0,113,165,2,110,0,0,100,27,
+ 0,83,40,30,0,0,0,117,250,0,0,0,83,101,116,117,
+ 112,32,105,109,112,111,114,116,108,105,98,32,98,121,32,105,
+ 109,112,111,114,116,105,110,103,32,110,101,101,100,101,100,32,
+ 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,
+ 32,97,110,100,32,105,110,106,101,99,116,105,110,103,32,116,
+ 104,101,109,10,32,32,32,32,105,110,116,111,32,116,104,101,
+ 32,103,108,111,98,97,108,32,110,97,109,101,115,112,97,99,
+ 101,46,10,10,32,32,32,32,65,115,32,115,121,115,32,105,
+ 115,32,110,101,101,100,101,100,32,102,111,114,32,115,121,115,
+ 46,109,111,100,117,108,101,115,32,97,99,99,101,115,115,32,
+ 97,110,100,32,95,105,109,112,32,105,115,32,110,101,101,100,
+ 101,100,32,116,111,32,108,111,97,100,32,98,117,105,108,116,
+ 45,105,110,10,32,32,32,32,109,111,100,117,108,101,115,44,
+ 32,116,104,111,115,101,32,116,119,111,32,109,111,100,117,108,
+ 101,115,32,109,117,115,116,32,98,101,32,101,120,112,108,105,
+ 99,105,116,108,121,32,112,97,115,115,101,100,32,105,110,46,
+ 10,10,32,32,32,32,117,10,0,0,0,95,95,108,111,97,
+ 100,101,114,95,95,117,3,0,0,0,95,105,111,117,9,0,
+ 0,0,95,119,97,114,110,105,110,103,115,117,8,0,0,0,
+ 98,117,105,108,116,105,110,115,117,7,0,0,0,109,97,114,
+ 115,104,97,108,117,5,0,0,0,112,111,115,105,120,117,1,
+ 0,0,0,47,117,2,0,0,0,110,116,117,1,0,0,0,
+ 92,117,3,0,0,0,111,115,50,99,1,0,0,0,0,0,
+ 0,0,2,0,0,0,3,0,0,0,115,0,0,0,115,33,
+ 0,0,0,124,0,0,93,23,0,125,1,0,116,0,0,124,
+ 1,0,131,1,0,100,0,0,107,2,0,86,1,113,3,0,
+ 100,1,0,83,40,2,0,0,0,105,1,0,0,0,78,40,
+ 1,0,0,0,117,3,0,0,0,108,101,110,40,2,0,0,
+ 0,117,2,0,0,0,46,48,117,3,0,0,0,115,101,112,
+ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,
+ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,
+ 46,95,98,111,111,116,115,116,114,97,112,62,117,9,0,0,
+ 0,60,103,101,110,101,120,112,114,62,174,6,0,0,115,2,
+ 0,0,0,6,0,117,25,0,0,0,95,115,101,116,117,112,
+ 46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,
+ 112,114,62,105,0,0,0,0,117,7,0,0,0,69,77,88,
+ 32,71,67,67,105,1,0,0,0,117,30,0,0,0,105,109,
+ 112,111,114,116,108,105,98,32,114,101,113,117,105,114,101,115,
+ 32,112,111,115,105,120,32,111,114,32,110,116,117,7,0,0,
+ 0,95,116,104,114,101,97,100,117,8,0,0,0,95,119,101,
+ 97,107,114,101,102,117,6,0,0,0,119,105,110,114,101,103,
+ 117,7,0,0,0,95,119,105,110,114,101,103,117,3,0,0,
+ 0,95,111,115,117,8,0,0,0,112,97,116,104,95,115,101,
+ 112,117,15,0,0,0,112,97,116,104,95,115,101,112,97,114,
+ 97,116,111,114,115,117,11,0,0,0,95,114,101,108,97,120,
+ 95,99,97,115,101,117,4,0,0,0,46,112,121,119,117,6,
+ 0,0,0,95,100,46,112,121,100,78,40,4,0,0,0,117,
+ 3,0,0,0,95,105,111,117,9,0,0,0,95,119,97,114,
+ 110,105,110,103,115,117,8,0,0,0,98,117,105,108,116,105,
+ 110,115,117,7,0,0,0,109,97,114,115,104,97,108,84,40,
+ 24,0,0,0,117,4,0,0,0,95,105,109,112,117,3,0,
+ 0,0,115,121,115,117,7,0,0,0,104,97,115,97,116,116,
+ 114,117,15,0,0,0,66,117,105,108,116,105,110,73,109,112,
+ 111,114,116,101,114,117,10,0,0,0,95,95,108,111,97,100,
+ 101,114,95,95,117,7,0,0,0,109,111,100,117,108,101,115,
+ 117,8,0,0,0,95,95,110,97,109,101,95,95,117,11,0,
+ 0,0,108,111,97,100,95,109,111,100,117,108,101,117,7,0,
+ 0,0,115,101,116,97,116,116,114,117,3,0,0,0,97,108,
+ 108,117,14,0,0,0,65,115,115,101,114,116,105,111,110,69,
+ 114,114,111,114,117,7,0,0,0,118,101,114,115,105,111,110,
+ 117,11,0,0,0,73,109,112,111,114,116,69,114,114,111,114,
+ 117,4,0,0,0,78,111,110,101,117,3,0,0,0,115,101,
+ 116,117,16,0,0,0,95,109,97,107,101,95,114,101,108,97,
+ 120,95,99,97,115,101,117,18,0,0,0,69,88,84,69,78,
+ 83,73,79,78,95,83,85,70,70,73,88,69,83,117,6,0,
+ 0,0,101,120,116,101,110,100,117,18,0,0,0,101,120,116,
+ 101,110,115,105,111,110,95,115,117,102,102,105,120,101,115,117,
+ 15,0,0,0,83,79,85,82,67,69,95,83,85,70,70,73,
+ 88,69,83,117,6,0,0,0,97,112,112,101,110,100,117,4,
+ 0,0,0,84,114,117,101,117,21,0,0,0,87,105,110,100,
+ 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,
+ 114,117,11,0,0,0,68,69,66,85,71,95,66,85,73,76,
+ 68,40,14,0,0,0,117,10,0,0,0,115,121,115,95,109,
+ 111,100,117,108,101,117,11,0,0,0,95,105,109,112,95,109,
+ 111,100,117,108,101,117,6,0,0,0,109,111,100,117,108,101,
+ 117,11,0,0,0,115,101,108,102,95,109,111,100,117,108,101,
+ 117,12,0,0,0,98,117,105,108,116,105,110,95,110,97,109,
+ 101,117,14,0,0,0,98,117,105,108,116,105,110,95,109,111,
+ 100,117,108,101,117,10,0,0,0,111,115,95,100,101,116,97,
+ 105,108,115,117,10,0,0,0,98,117,105,108,116,105,110,95,
+ 111,115,117,15,0,0,0,112,97,116,104,95,115,101,112,97,
+ 114,97,116,111,114,115,117,8,0,0,0,112,97,116,104,95,
+ 115,101,112,117,9,0,0,0,111,115,95,109,111,100,117,108,
+ 101,117,13,0,0,0,116,104,114,101,97,100,95,109,111,100,
+ 117,108,101,117,14,0,0,0,119,101,97,107,114,101,102,95,
+ 109,111,100,117,108,101,117,13,0,0,0,119,105,110,114,101,
+ 103,95,109,111,100,117,108,101,40,0,0,0,0,40,0,0,
+ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,
+ 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,
+ 114,97,112,62,117,6,0,0,0,95,115,101,116,117,112,147,
+ 6,0,0,115,90,0,0,0,0,9,6,1,6,2,19,1,
+ 15,1,16,2,13,1,13,1,15,1,18,2,13,1,20,2,
+ 48,1,19,2,31,1,10,1,15,1,13,1,4,2,3,1,
+ 15,2,27,1,13,1,5,1,13,1,12,2,12,2,3,1,
+ 19,1,13,2,11,1,15,2,12,1,15,1,19,2,16,1,
+ 16,1,16,1,16,1,22,2,19,1,19,1,12,1,13,1,
+ 12,1,117,6,0,0,0,95,115,101,116,117,112,99,2,0,
+ 0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,
+ 0,0,115,136,0,0,0,116,0,0,124,0,0,124,1,0,
+ 131,2,0,1,116,1,0,131,0,0,125,2,0,116,2,0,
+ 106,3,0,106,4,0,116,5,0,106,6,0,124,2,0,140,
+ 0,0,103,1,0,131,1,0,1,116,2,0,106,7,0,106,
+ 8,0,116,9,0,131,1,0,1,116,2,0,106,7,0,106,
+ 8,0,116,10,0,131,1,0,1,116,11,0,106,12,0,100,
+ 1,0,107,2,0,114,116,0,116,2,0,106,7,0,106,8,
+ 0,116,13,0,131,1,0,1,110,0,0,116,2,0,106,7,
+ 0,106,8,0,116,14,0,131,1,0,1,100,2,0,83,40,
+ 3,0,0,0,117,50,0,0,0,73,110,115,116,97,108,108,
+ 32,105,109,112,111,114,116,108,105,98,32,97,115,32,116,104,
+ 101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,
+ 32,111,102,32,105,109,112,111,114,116,46,117,2,0,0,0,
+ 110,116,78,40,15,0,0,0,117,6,0,0,0,95,115,101,
+ 116,117,112,117,27,0,0,0,95,103,101,116,95,115,117,112,
+ 112,111,114,116,101,100,95,102,105,108,101,95,108,111,97,100,
+ 101,114,115,117,3,0,0,0,115,121,115,117,10,0,0,0,
+ 112,97,116,104,95,104,111,111,107,115,117,6,0,0,0,101,
+ 120,116,101,110,100,117,10,0,0,0,70,105,108,101,70,105,
+ 110,100,101,114,117,9,0,0,0,112,97,116,104,95,104,111,
+ 111,107,117,9,0,0,0,109,101,116,97,95,112,97,116,104,
+ 117,6,0,0,0,97,112,112,101,110,100,117,15,0,0,0,
+ 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,117,
+ 14,0,0,0,70,114,111,122,101,110,73,109,112,111,114,116,
+ 101,114,117,3,0,0,0,95,111,115,117,8,0,0,0,95,
+ 95,110,97,109,101,95,95,117,21,0,0,0,87,105,110,100,
+ 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,
+ 114,117,10,0,0,0,80,97,116,104,70,105,110,100,101,114,
+ 40,3,0,0,0,117,10,0,0,0,115,121,115,95,109,111,
+ 100,117,108,101,117,11,0,0,0,95,105,109,112,95,109,111,
+ 100,117,108,101,117,17,0,0,0,115,117,112,112,111,114,116,
+ 101,100,95,108,111,97,100,101,114,115,40,0,0,0,0,40,
+ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,
+ 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,
+ 115,116,114,97,112,62,117,8,0,0,0,95,105,110,115,116,
+ 97,108,108,216,6,0,0,115,16,0,0,0,0,2,13,1,
+ 9,1,28,1,16,1,16,1,15,1,19,1,117,8,0,0,
+ 0,95,105,110,115,116,97,108,108,78,40,3,0,0,0,117,
+ 3,0,0,0,119,105,110,117,6,0,0,0,99,121,103,119,
+ 105,110,117,6,0,0,0,100,97,114,119,105,110,40,75,0,
+ 0,0,117,7,0,0,0,95,95,100,111,99,95,95,117,27,
+ 0,0,0,95,67,65,83,69,95,73,78,83,69,78,83,73,
+ 84,73,86,69,95,80,76,65,84,70,79,82,77,83,117,16,
+ 0,0,0,95,109,97,107,101,95,114,101,108,97,120,95,99,
+ 97,115,101,117,7,0,0,0,95,119,95,108,111,110,103,117,
+ 7,0,0,0,95,114,95,108,111,110,103,117,10,0,0,0,
+ 95,112,97,116,104,95,106,111,105,110,117,11,0,0,0,95,
+ 112,97,116,104,95,115,112,108,105,116,117,18,0,0,0,95,
+ 112,97,116,104,95,105,115,95,109,111,100,101,95,116,121,112,
+ 101,117,12,0,0,0,95,112,97,116,104,95,105,115,102,105,
+ 108,101,117,11,0,0,0,95,112,97,116,104,95,105,115,100,
+ 105,114,117,13,0,0,0,95,119,114,105,116,101,95,97,116,
+ 111,109,105,99,117,5,0,0,0,95,119,114,97,112,117,4,
+ 0,0,0,116,121,112,101,117,8,0,0,0,95,95,99,111,
+ 100,101,95,95,117,10,0,0,0,95,99,111,100,101,95,116,
+ 121,112,101,117,10,0,0,0,110,101,119,95,109,111,100,117,
+ 108,101,117,13,0,0,0,95,109,111,100,117,108,101,95,108,
+ 111,99,107,115,117,12,0,0,0,95,98,108,111,99,107,105,
+ 110,103,95,111,110,117,12,0,0,0,82,117,110,116,105,109,
+ 101,69,114,114,111,114,117,14,0,0,0,95,68,101,97,100,
+ 108,111,99,107,69,114,114,111,114,117,11,0,0,0,95,77,
+ 111,100,117,108,101,76,111,99,107,117,16,0,0,0,95,68,
+ 117,109,109,121,77,111,100,117,108,101,76,111,99,107,117,16,
+ 0,0,0,95,103,101,116,95,109,111,100,117,108,101,95,108,
+ 111,99,107,117,19,0,0,0,95,108,111,99,107,95,117,110,
+ 108,111,99,107,95,109,111,100,117,108,101,117,25,0,0,0,
+ 95,99,97,108,108,95,119,105,116,104,95,102,114,97,109,101,
+ 115,95,114,101,109,111,118,101,100,117,3,0,0,0,111,114,
+ 100,117,17,0,0,0,95,82,65,87,95,77,65,71,73,67,
+ 95,78,85,77,66,69,82,117,5,0,0,0,98,121,116,101,
+ 115,117,5,0,0,0,114,97,110,103,101,117,12,0,0,0,
+ 95,77,65,71,73,67,95,66,89,84,69,83,117,8,0,0,
+ 0,95,80,89,67,65,67,72,69,117,15,0,0,0,83,79,
+ 85,82,67,69,95,83,85,70,70,73,88,69,83,117,23,0,
+ 0,0,68,69,66,85,71,95,66,89,84,69,67,79,68,69,
+ 95,83,85,70,70,73,88,69,83,117,27,0,0,0,79,80,
+ 84,73,77,73,90,69,68,95,66,89,84,69,67,79,68,69,
+ 95,83,85,70,70,73,88,69,83,117,17,0,0,0,66,89,
+ 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,117,
+ 4,0,0,0,78,111,110,101,117,17,0,0,0,99,97,99,
+ 104,101,95,102,114,111,109,95,115,111,117,114,99,101,117,17,
+ 0,0,0,115,111,117,114,99,101,95,102,114,111,109,95,99,
+ 97,99,104,101,117,15,0,0,0,95,103,101,116,95,115,111,
+ 117,114,99,101,102,105,108,101,117,16,0,0,0,95,118,101,
+ 114,98,111,115,101,95,109,101,115,115,97,103,101,117,11,0,
+ 0,0,115,101,116,95,112,97,99,107,97,103,101,117,10,0,
+ 0,0,115,101,116,95,108,111,97,100,101,114,117,17,0,0,
+ 0,109,111,100,117,108,101,95,102,111,114,95,108,111,97,100,
+ 101,114,117,11,0,0,0,95,99,104,101,99,107,95,110,97,
+ 109,101,117,17,0,0,0,95,114,101,113,117,105,114,101,115,
+ 95,98,117,105,108,116,105,110,117,16,0,0,0,95,114,101,
+ 113,117,105,114,101,115,95,102,114,111,122,101,110,117,17,0,
+ 0,0,95,102,105,110,100,95,109,111,100,117,108,101,95,115,
+ 104,105,109,117,15,0,0,0,66,117,105,108,116,105,110,73,
+ 109,112,111,114,116,101,114,117,14,0,0,0,70,114,111,122,
+ 101,110,73,109,112,111,114,116,101,114,117,21,0,0,0,87,
+ 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,
+ 110,100,101,114,117,13,0,0,0,95,76,111,97,100,101,114,
+ 66,97,115,105,99,115,117,12,0,0,0,83,111,117,114,99,
+ 101,76,111,97,100,101,114,117,10,0,0,0,70,105,108,101,
+ 76,111,97,100,101,114,117,16,0,0,0,83,111,117,114,99,
+ 101,70,105,108,101,76,111,97,100,101,114,117,20,0,0,0,
+ 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,
+ 97,100,101,114,117,18,0,0,0,69,88,84,69,78,83,73,
+ 79,78,95,83,85,70,70,73,88,69,83,117,19,0,0,0,
+ 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,
+ 100,101,114,117,14,0,0,0,95,78,97,109,101,115,112,97,
+ 99,101,80,97,116,104,117,15,0,0,0,78,97,109,101,115,
+ 112,97,99,101,76,111,97,100,101,114,117,10,0,0,0,80,
+ 97,116,104,70,105,110,100,101,114,117,10,0,0,0,70,105,
+ 108,101,70,105,110,100,101,114,117,18,0,0,0,95,73,109,
+ 112,111,114,116,76,111,99,107,67,111,110,116,101,120,116,117,
+ 13,0,0,0,95,114,101,115,111,108,118,101,95,110,97,109,
+ 101,117,12,0,0,0,95,102,105,110,100,95,109,111,100,117,
+ 108,101,117,13,0,0,0,95,115,97,110,105,116,121,95,99,
+ 104,101,99,107,117,8,0,0,0,95,69,82,82,95,77,83,
+ 71,117,23,0,0,0,95,102,105,110,100,95,97,110,100,95,
+ 108,111,97,100,95,117,110,108,111,99,107,101,100,117,14,0,
+ 0,0,95,102,105,110,100,95,97,110,100,95,108,111,97,100,
+ 117,11,0,0,0,95,103,99,100,95,105,109,112,111,114,116,
+ 117,16,0,0,0,95,104,97,110,100,108,101,95,102,114,111,
+ 109,108,105,115,116,117,17,0,0,0,95,99,97,108,99,95,
+ 95,95,112,97,99,107,97,103,101,95,95,117,27,0,0,0,
+ 95,103,101,116,95,115,117,112,112,111,114,116,101,100,95,102,
+ 105,108,101,95,108,111,97,100,101,114,115,117,10,0,0,0,
+ 95,95,105,109,112,111,114,116,95,95,117,6,0,0,0,95,
+ 115,101,116,117,112,117,8,0,0,0,95,105,110,115,116,97,
+ 108,108,40,0,0,0,0,40,0,0,0,0,40,0,0,0,
+ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
+ 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
+ 97,112,62,117,8,0,0,0,60,109,111,100,117,108,101,62,
+ 8,0,0,0,115,134,0,0,0,6,21,6,3,12,13,12,
+ 16,12,13,12,12,12,12,12,10,12,6,12,7,15,22,12,
+ 8,15,3,12,12,6,2,6,3,22,4,19,68,19,23,12,
+ 19,12,20,12,100,34,1,37,2,6,2,9,2,9,1,9,
+ 2,6,4,15,27,12,23,12,21,12,8,12,13,12,11,12,
+ 55,12,18,12,11,12,11,12,17,19,57,19,54,19,50,19,
+ 82,22,134,19,29,25,46,25,25,6,3,19,45,19,55,19,
+ 18,19,89,19,125,19,13,12,9,12,17,12,17,6,2,12,
+ 50,12,13,18,24,12,34,12,15,12,11,24,32,12,69,
+};
diff --git a/Python/makeopcodetargets.py b/Python/makeopcodetargets.py
index 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 359eda8..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);
@@ -133,24 +183,6 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
break;
case BINARY_SUBSCR:
newconst = PyObject_GetItem(v, w);
- /* #5057: if v is unicode, there might be differences between
- wide and narrow builds in cases like '\U00012345'[0].
- Wide builds will return a non-BMP char, whereas narrow builds
- will return a surrogate. In both the cases skip the
- optimization in order to produce compatible pycs.
- */
- if (newconst != NULL &&
- PyUnicode_Check(v) && PyUnicode_Check(newconst)) {
- Py_UNICODE ch = PyUnicode_AS_UNICODE(newconst)[0];
-#ifdef Py_UNICODE_WIDE
- if (ch > 0xFFFF) {
-#else
- if (ch >= 0xD800 && ch <= 0xDFFF) {
-#endif
- Py_DECREF(newconst);
- return 0;
- }
- }
break;
case BINARY_LSHIFT:
newconst = PyNumber_Lshift(v, w);
@@ -198,16 +230,15 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
Py_DECREF(newconst);
/* Write NOP NOP NOP NOP LOAD_CONST newconst */
- memset(codestr, NOP, 4);
- codestr[4] = LOAD_CONST;
- SETARG(codestr, 4, len_consts);
+ codestr[-2] = LOAD_CONST;
+ SETARG(codestr, -2, len_consts);
return 1;
}
static int
-fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
+fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts, PyObject *v)
{
- PyObject *newconst=NULL, *v;
+ PyObject *newconst;
Py_ssize_t len_consts;
int opcode;
@@ -216,13 +247,10 @@ fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
assert(codestr[0] == LOAD_CONST);
/* Create new constant */
- v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
opcode = codestr[3];
switch (opcode) {
case UNARY_NEGATIVE:
- /* Preserve the sign of -0.0 */
- if (PyObject_IsTrue(v) == 1)
- newconst = PyNumber_Negative(v);
+ newconst = PyNumber_Negative(v);
break;
case UNARY_INVERT:
newconst = PyNumber_Invert(v);
@@ -358,7 +386,11 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
unsigned char *lineno;
int *addrmap = NULL;
int new_line, cum_orig_line, last_line, tabsiz;
- int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONSTs */
+ PyObject **const_stack = NULL;
+ Py_ssize_t *load_const_stack = NULL;
+ Py_ssize_t const_stack_top = -1;
+ Py_ssize_t const_stack_size = 0;
+ int in_consts = 0; /* whether we are in a LOAD_CONST sequence */
unsigned int *blocks = NULL;
char *name;
@@ -404,12 +436,16 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
goto exitError;
assert(PyList_Check(consts));
+ CONST_STACK_CREATE();
+
for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
reoptimize_current:
opcode = codestr[i];
- lastlc = cumlc;
- cumlc = 0;
+ if (!in_consts) {
+ CONST_STACK_RESET();
+ }
+ in_consts = 0;
switch (opcode) {
/* Replace UNARY_NOT POP_JUMP_IF_FALSE
@@ -450,21 +486,21 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
goto exitError;
else if (h == 0)
continue;
- cumlc = lastlc + 1;
+ CONST_STACK_PUSH_OP(i);
break;
/* Skip over LOAD_CONST trueconst
POP_JUMP_IF_FALSE xx. This improves
"while 1" performance. */
case LOAD_CONST:
- cumlc = lastlc + 1;
+ CONST_STACK_PUSH_OP(i);
j = GETARG(codestr, i);
if (codestr[i+3] != POP_JUMP_IF_FALSE ||
!ISBASICBLOCK(blocks,i,6) ||
!PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
continue;
memset(codestr+i, NOP, 6);
- cumlc = 0;
+ CONST_STACK_RESET();
break;
/* Try to fold tuples of constants (includes a case for lists and sets
@@ -476,19 +512,23 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
case BUILD_LIST:
case BUILD_SET:
j = GETARG(codestr, i);
- h = i - 3 * j;
- if (h >= 0 &&
- j <= lastlc &&
+ if (j == 0)
+ break;
+ h = CONST_STACK_OP_LASTN(j);
+ assert((h >= 0 || CONST_STACK_LEN() < j));
+ if (h >= 0 && j > 0 && j <= CONST_STACK_LEN() &&
((opcode == BUILD_TUPLE &&
- ISBASICBLOCK(blocks, h, 3*(j+1))) ||
+ ISBASICBLOCK(blocks, h, i-h+3)) ||
((opcode == BUILD_LIST || opcode == BUILD_SET) &&
codestr[i+3]==COMPARE_OP &&
- ISBASICBLOCK(blocks, h, 3*(j+2)) &&
+ ISBASICBLOCK(blocks, h, i-h+6) &&
(GETARG(codestr,i+3)==6 ||
GETARG(codestr,i+3)==7))) &&
- tuple_of_constants(&codestr[h], j, consts)) {
+ tuple_of_constants(&codestr[i], j, consts, CONST_STACK_LASTN(j))) {
assert(codestr[i] == LOAD_CONST);
- cumlc = 1;
+ memset(&codestr[h], NOP, i - h);
+ CONST_STACK_POP(j);
+ CONST_STACK_PUSH_OP(i);
break;
}
if (codestr[i+3] != UNPACK_SEQUENCE ||
@@ -501,10 +541,12 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
} else if (j == 2) {
codestr[i] = ROT_TWO;
memset(codestr+i+1, NOP, 5);
+ CONST_STACK_RESET();
} else if (j == 3) {
codestr[i] = ROT_THREE;
codestr[i+1] = ROT_TWO;
memset(codestr+i+2, NOP, 4);
+ CONST_STACK_RESET();
}
break;
@@ -523,12 +565,18 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
case BINARY_AND:
case BINARY_XOR:
case BINARY_OR:
- if (lastlc >= 2 &&
- ISBASICBLOCK(blocks, i-6, 7) &&
- fold_binops_on_constants(&codestr[i-6], consts)) {
+ /* NOTE: LOAD_CONST is saved at `i-2` since it has an arg
+ while BINOP hasn't */
+ h = CONST_STACK_OP_LASTN(2);
+ assert((h >= 0 || CONST_STACK_LEN() < 2));
+ if (h >= 0 &&
+ ISBASICBLOCK(blocks, h, i-h+1) &&
+ fold_binops_on_constants(&codestr[i], consts, CONST_STACK_LASTN(2))) {
i -= 2;
+ memset(&codestr[h], NOP, i - h);
assert(codestr[i] == LOAD_CONST);
- cumlc = 1;
+ CONST_STACK_POP(2);
+ CONST_STACK_PUSH_OP(i);
}
break;
@@ -537,12 +585,15 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
case UNARY_NEGATIVE:
case UNARY_INVERT:
case UNARY_POSITIVE:
- if (lastlc >= 1 &&
- ISBASICBLOCK(blocks, i-3, 4) &&
- fold_unaryops_on_constants(&codestr[i-3], consts)) {
+ h = CONST_STACK_OP_LASTN(1);
+ assert((h >= 0 || CONST_STACK_LEN() < 1));
+ if (h >= 0 &&
+ ISBASICBLOCK(blocks, h, i-h+1) &&
+ fold_unaryops_on_constants(&codestr[i-3], consts, CONST_STACK_TOP())) {
i -= 2;
assert(codestr[i] == LOAD_CONST);
- cumlc = 1;
+ CONST_STACK_POP(1);
+ CONST_STACK_PUSH_OP(i);
}
break;
@@ -699,6 +750,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
assert(h + nops == codelen);
code = PyBytes_FromStringAndSize((char *)codestr, h);
+ CONST_STACK_DELETE();
PyMem_Free(addrmap);
PyMem_Free(codestr);
PyMem_Free(blocks);
@@ -708,6 +760,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
code = NULL;
exitUnchanged:
+ CONST_STACK_DELETE();
if (blocks != NULL)
PyMem_Free(blocks);
if (addrmap != NULL)
diff --git a/Python/pystate.c b/Python/pystate.c
index 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 cf4e34c..b1ca125 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -52,7 +52,7 @@ extern wchar_t *Py_GetPath(void);
extern grammar _PyParser_Grammar; /* From graminit.c */
/* Forward */
-static void initmain(void);
+static void initmain(PyInterpreterState *interp);
static int initfsencoding(PyInterpreterState *interp);
static void initsite(void);
static int initstdio(void);
@@ -62,14 +62,17 @@ static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
PyCompilerFlags *);
static void err_input(perrdetail *);
+static void err_free(perrdetail *);
static void initsigs(void);
static void call_py_exitfuncs(void);
static void wait_for_thread_shutdown(void);
static void call_ll_exitfuncs(void);
-extern void _PyUnicode_Init(void);
+extern int _PyUnicode_Init(void);
extern void _PyUnicode_Fini(void);
extern int _PyLong_Init(void);
extern void PyLong_Fini(void);
+extern int _PyFaulthandler_Init(void);
+extern void _PyFaulthandler_Fini(void);
#ifdef WITH_THREAD
extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
@@ -139,12 +142,13 @@ get_codec_name(const char *encoding)
{
char *name_utf8, *name_str;
PyObject *codec, *name = NULL;
+ _Py_IDENTIFIER(name);
codec = _PyCodec_Lookup(encoding);
if (!codec)
goto error;
- name = PyObject_GetAttrString(codec, "name");
+ name = _PyObject_GetAttrId(codec, &PyId_name);
Py_CLEAR(codec);
if (!name)
goto error;
@@ -166,21 +170,79 @@ error:
return NULL;
}
-#if defined(HAVE_LANGINFO_H) && defined(CODESET)
static char*
-get_codeset(void)
+get_locale_encoding(void)
{
+#ifdef MS_WINDOWS
+ char codepage[100];
+ PyOS_snprintf(codepage, sizeof(codepage), "cp%d", GetACP());
+ return get_codec_name(codepage);
+#elif defined(HAVE_LANGINFO_H) && defined(CODESET)
char* codeset = nl_langinfo(CODESET);
if (!codeset || codeset[0] == '\0') {
PyErr_SetString(PyExc_ValueError, "CODESET is not set or empty");
return NULL;
}
return get_codec_name(codeset);
-}
+#else
+ PyErr_SetNone(PyExc_NotImplementedError);
+ return NULL;
#endif
+}
+
+static void
+import_init(PyInterpreterState *interp, PyObject *sysmod)
+{
+ PyObject *importlib;
+ PyObject *impmod;
+ PyObject *sys_modules;
+ PyObject *value;
+
+ /* Import _importlib through its frozen version, _frozen_importlib. */
+ if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) {
+ Py_FatalError("Py_Initialize: can't import _frozen_importlib");
+ }
+ else if (Py_VerboseFlag) {
+ PySys_FormatStderr("import _frozen_importlib # frozen\n");
+ }
+ importlib = PyImport_AddModule("_frozen_importlib");
+ if (importlib == NULL) {
+ Py_FatalError("Py_Initialize: couldn't get _frozen_importlib from "
+ "sys.modules");
+ }
+ interp->importlib = importlib;
+ Py_INCREF(interp->importlib);
+
+ /* Install _importlib as __import__ */
+ impmod = PyInit_imp();
+ if (impmod == NULL) {
+ Py_FatalError("Py_Initialize: can't import imp");
+ }
+ else if (Py_VerboseFlag) {
+ PySys_FormatStderr("import imp # builtin\n");
+ }
+ sys_modules = PyImport_GetModuleDict();
+ if (Py_VerboseFlag) {
+ PySys_FormatStderr("import sys # builtin\n");
+ }
+ if (PyDict_SetItemString(sys_modules, "_imp", impmod) < 0) {
+ Py_FatalError("Py_Initialize: can't save _imp to sys.modules");
+ }
+
+ value = PyObject_CallMethod(importlib, "_install", "OO", sysmod, impmod);
+ if (value == NULL) {
+ PyErr_Print();
+ Py_FatalError("Py_Initialize: importlib install failed");
+ }
+ Py_DECREF(value);
+ Py_DECREF(impmod);
+
+ _PyImportZip_Init();
+}
+
void
-Py_InitializeEx(int install_sigs)
+_Py_InitializeEx_Private(int install_sigs, int install_importlib)
{
PyInterpreterState *interp;
PyThreadState *tstate;
@@ -252,12 +314,10 @@ Py_InitializeEx(int install_sigs)
interp->modules = PyDict_New();
if (interp->modules == NULL)
Py_FatalError("Py_Initialize: can't make modules dictionary");
- interp->modules_reloading = PyDict_New();
- if (interp->modules_reloading == NULL)
- Py_FatalError("Py_Initialize: can't make modules_reloading dictionary");
/* Init Unicode implementation; relies on the codec registry */
- _PyUnicode_Init();
+ if (_PyUnicode_Init() < 0)
+ Py_FatalError("Py_Initialize: can't initialize unicode");
bimod = _PyBuiltin_Init();
if (bimod == NULL)
@@ -269,7 +329,7 @@ Py_InitializeEx(int install_sigs)
Py_INCREF(interp->builtins);
/* initialize builtin exceptions */
- _PyExc_Init();
+ _PyExc_Init(bimod);
sysmod = _PySys_Init();
if (sysmod == NULL)
@@ -299,6 +359,15 @@ Py_InitializeEx(int install_sigs)
/* Initialize _warnings. */
_PyWarnings_Init();
+ if (!install_importlib)
+ return;
+
+ import_init(interp, sysmod);
+
+ /* initialize the faulthandler module */
+ if (_PyFaulthandler_Init())
+ Py_FatalError("Py_Initialize: can't initialize faulthandler");
+
_PyTime_Init();
if (initfsencoding(interp) < 0)
@@ -307,7 +376,7 @@ Py_InitializeEx(int install_sigs)
if (install_sigs)
initsigs(); /* Signal handling stuff, including initintr() */
- initmain(); /* Module __main__ */
+ initmain(interp); /* Module __main__ */
if (initstdio() < 0)
Py_FatalError(
"Py_Initialize: can't initialize sys standard streams");
@@ -327,6 +396,12 @@ Py_InitializeEx(int install_sigs)
}
void
+Py_InitializeEx(int install_sigs)
+{
+ _Py_InitializeEx_Private(install_sigs, 1);
+}
+
+void
Py_Initialize(void)
{
Py_InitializeEx(1);
@@ -361,9 +436,10 @@ flush_std_files(void)
PyObject *fout = PySys_GetObject("stdout");
PyObject *ferr = PySys_GetObject("stderr");
PyObject *tmp;
+ _Py_IDENTIFIER(flush);
if (fout != NULL && fout != Py_None && !file_is_closed(fout)) {
- tmp = PyObject_CallMethod(fout, "flush", "");
+ tmp = _PyObject_CallMethodId(fout, &PyId_flush, "");
if (tmp == NULL)
PyErr_WriteUnraisable(fout);
else
@@ -371,7 +447,7 @@ flush_std_files(void)
}
if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) {
- tmp = PyObject_CallMethod(ferr, "flush", "");
+ tmp = _PyObject_CallMethodId(ferr, &PyId_flush, "");
if (tmp == NULL)
PyErr_Clear();
else
@@ -464,7 +540,7 @@ Py_Finalize(void)
flush_std_files();
/* Collect final garbage. This disposes of cycles created by
- * new-style class definitions, for example.
+ * class definitions, for example.
* XXX This is disabled because it caused too many problems. If
* XXX a __del__ or weakref callback triggers here, Python code has
* XXX a hard time running, because even the sys module has been
@@ -485,6 +561,9 @@ Py_Finalize(void)
/* Destroy the database used by _PyImport_{Fixup,Find}Extension */
_PyImport_Fini();
+ /* unload faulthandler module */
+ _PyFaulthandler_Fini();
+
/* Debugging stuff */
#ifdef COUNT_ALLOCS
dump_counts(stdout);
@@ -534,6 +613,7 @@ Py_Finalize(void)
PyLong_Fini();
PyFloat_Fini();
PyDict_Fini();
+ PySlice_Fini();
/* Cleanup Unicode implementation */
_PyUnicode_Fini();
@@ -562,7 +642,7 @@ Py_Finalize(void)
#endif /* Py_TRACE_REFS */
#ifdef PYMALLOC_DEBUG
if (Py_GETENV("PYTHONMALLOCSTATS"))
- _PyObject_DebugMallocStats();
+ _PyObject_DebugMallocStats(stderr);
#endif
call_ll_exitfuncs();
@@ -606,7 +686,6 @@ Py_NewInterpreter(void)
/* XXX The following is lax in error checking */
interp->modules = PyDict_New();
- interp->modules_reloading = PyDict_New();
bimod = _PyImport_FindBuiltin("builtins");
if (bimod != NULL) {
@@ -617,11 +696,12 @@ Py_NewInterpreter(void)
}
/* initialize builtin exceptions */
- _PyExc_Init();
+ _PyExc_Init(bimod);
sysmod = _PyImport_FindBuiltin("sys");
if (bimod != NULL && sysmod != NULL) {
PyObject *pstderr;
+
interp->sysdict = PyModule_GetDict(sysmod);
if (interp->sysdict == NULL)
goto handle_error;
@@ -640,13 +720,15 @@ Py_NewInterpreter(void)
_PyImportHooks_Init();
+ import_init(interp, sysmod);
+
if (initfsencoding(interp) < 0)
goto handle_error;
if (initstdio() < 0)
Py_FatalError(
"Py_Initialize: can't initialize sys standard streams");
- initmain();
+ initmain(interp);
if (!Py_NoSiteFlag)
initsite();
}
@@ -743,7 +825,7 @@ Py_GetPythonHome(void)
/* Create __main__ module */
static void
-initmain(void)
+initmain(PyInterpreterState *interp)
{
PyObject *m, *d;
m = PyImport_AddModule("__main__");
@@ -752,35 +834,48 @@ initmain(void)
d = PyModule_GetDict(m);
if (PyDict_GetItemString(d, "__builtins__") == NULL) {
PyObject *bimod = PyImport_ImportModule("builtins");
- if (bimod == NULL ||
- PyDict_SetItemString(d, "__builtins__", bimod) != 0)
- Py_FatalError("can't add __builtins__ to __main__");
+ if (bimod == NULL) {
+ Py_FatalError("Failed to retrieve builtins module");
+ }
+ if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) {
+ Py_FatalError("Failed to initialize __main__.__builtins__");
+ }
Py_DECREF(bimod);
}
+ /* Main is a little special - imp.is_builtin("__main__") will return
+ * False, but BuiltinImporter is still the most appropriate initial
+ * setting for its __loader__ attribute. A more suitable value will
+ * be set if __main__ gets further initialized later in the startup
+ * process.
+ */
+ if (PyDict_GetItemString(d, "__loader__") == NULL) {
+ PyObject *loader = PyObject_GetAttrString(interp->importlib,
+ "BuiltinImporter");
+ if (loader == NULL) {
+ Py_FatalError("Failed to retrieve BuiltinImporter");
+ }
+ if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
+ Py_FatalError("Failed to initialize __main__.__loader__");
+ }
+ Py_DECREF(loader);
+ }
}
static int
initfsencoding(PyInterpreterState *interp)
{
PyObject *codec;
-#if defined(HAVE_LANGINFO_H) && defined(CODESET)
- char *codeset = NULL;
-
- if (Py_FileSystemDefaultEncoding == NULL) {
- /* On Unix, set the file system encoding according to the
- user's preference, if the CODESET names a well-known
- Python codec, and Py_FileSystemDefaultEncoding isn't
- initialized by other means. */
- codeset = get_codeset();
- if (codeset == NULL)
+
+ if (Py_FileSystemDefaultEncoding == NULL)
+ {
+ Py_FileSystemDefaultEncoding = get_locale_encoding();
+ if (Py_FileSystemDefaultEncoding == NULL)
Py_FatalError("Py_Initialize: Unable to get the locale encoding");
- Py_FileSystemDefaultEncoding = codeset;
Py_HasFileSystemDefaultEncoding = 0;
interp->fscodec_initialized = 1;
return 0;
}
-#endif
/* the encoding is mbcs, utf-8 or ascii */
codec = _PyCodec_Lookup(Py_FileSystemDefaultEncoding);
@@ -822,6 +917,11 @@ create_stdio(PyObject* io,
const char* newline;
PyObject *line_buffering;
int buffering, isatty;
+ _Py_IDENTIFIER(open);
+ _Py_IDENTIFIER(isatty);
+ _Py_IDENTIFIER(TextIOWrapper);
+ _Py_IDENTIFIER(name);
+ _Py_IDENTIFIER(mode);
/* stdin is always opened in buffered mode, first because it shouldn't
make a difference in common use cases, second because TextIOWrapper
@@ -836,14 +936,15 @@ create_stdio(PyObject* io,
mode = "wb";
else
mode = "rb";
- buf = PyObject_CallMethod(io, "open", "isiOOOi",
- fd, mode, buffering,
- Py_None, Py_None, Py_None, 0);
+ buf = _PyObject_CallMethodId(io, &PyId_open, "isiOOOi",
+ fd, mode, buffering,
+ Py_None, Py_None, Py_None, 0);
if (buf == NULL)
goto error;
if (buffering) {
- raw = PyObject_GetAttrString(buf, "raw");
+ _Py_IDENTIFIER(raw);
+ raw = _PyObject_GetAttrId(buf, &PyId_raw);
if (raw == NULL)
goto error;
}
@@ -853,9 +954,9 @@ create_stdio(PyObject* io,
}
text = PyUnicode_FromString(name);
- if (text == NULL || PyObject_SetAttrString(raw, "name", text) < 0)
+ if (text == NULL || _PyObject_SetAttrId(raw, &PyId_name, text) < 0)
goto error;
- res = PyObject_CallMethod(raw, "isatty", "");
+ res = _PyObject_CallMethodId(raw, &PyId_isatty, "");
if (res == NULL)
goto error;
isatty = PyObject_IsTrue(res);
@@ -881,9 +982,9 @@ create_stdio(PyObject* io,
newline = "\n";
#endif
- stream = PyObject_CallMethod(io, "TextIOWrapper", "OsssO",
- buf, encoding, errors,
- newline, line_buffering);
+ stream = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "OsssO",
+ buf, encoding, errors,
+ newline, line_buffering);
Py_CLEAR(buf);
if (stream == NULL)
goto error;
@@ -893,7 +994,7 @@ create_stdio(PyObject* io,
else
mode = "r";
text = PyUnicode_FromString(mode);
- if (!text || PyObject_SetAttrString(stream, "mode", text) < 0)
+ if (!text || _PyObject_SetAttrId(stream, &PyId_mode, text) < 0)
goto error;
Py_CLEAR(text);
return stream;
@@ -1133,13 +1234,14 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags
PyArena *arena;
char *ps1 = "", *ps2 = "", *enc = NULL;
int errcode = 0;
+ _Py_IDENTIFIER(encoding);
if (fp == stdin) {
/* Fetch encoding from sys.stdin */
v = PySys_GetObject("stdin");
if (v == NULL || v == Py_None)
return -1;
- oenc = PyObject_GetAttrString(v, "encoding");
+ oenc = _PyObject_GetAttrId(v, &PyId_encoding);
if (!oenc)
return -1;
enc = _PyUnicode_AsString(oenc);
@@ -1252,6 +1354,32 @@ maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
}
int
+static set_main_loader(PyObject *d, const char *filename, const char *loader_name)
+{
+ PyInterpreterState *interp;
+ PyThreadState *tstate;
+ PyObject *loader_type, *loader;
+ int result = 0;
+ /* Get current thread state and interpreter pointer */
+ tstate = PyThreadState_GET();
+ interp = tstate->interp;
+ loader_type = PyObject_GetAttrString(interp->importlib, loader_name);
+ if (loader_type == NULL) {
+ return -1;
+ }
+ loader = PyObject_CallFunction(loader_type, "ss", "__main__", filename);
+ Py_DECREF(loader_type);
+ if (loader == NULL) {
+ return -1;
+ }
+ if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
+ result = -1;
+ }
+ Py_DECREF(loader);
+ return result;
+}
+
+int
PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
PyCompilerFlags *flags)
{
@@ -1283,10 +1411,11 @@ 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");
ret = -1;
goto done;
@@ -1294,8 +1423,23 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
/* Turn on optimization if a .pyo file is given */
if (strcmp(ext, ".pyo") == 0)
Py_OptimizeFlag = 1;
- 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 +1480,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 +1507,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 +1516,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 +1530,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 +1604,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 +1712,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 +1728,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 +1763,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 +1772,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 +1802,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 +1850,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 +1940,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 +1955,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 +1994,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 +2087,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 +2118,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 +2140,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 +2155,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 +2168,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 +2182,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 +2206,6 @@ err_input(perrdetail *err)
{
PyObject *v, *w, *errtype, *errtext;
PyObject *msg_obj = NULL;
- PyObject *filename;
char *msg = NULL;
errtype = PyExc_SyntaxError;
@@ -2111,6 +2277,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 +2294,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 +2319,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 +2391,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 +2401,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 992b5ae..36f59ae 100644
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -19,10 +19,6 @@
#define IMPORT_STAR_WARNING "import * only allowed at module level"
-#define RETURN_VAL_IN_GENERATOR \
- "'return' with argument inside generator"
-
-
static PySTEntryObject *
ste_new(struct symtable *st, identifier name, _Py_block_ty block,
void *key, int lineno, int col_offset)
@@ -185,6 +181,7 @@ static int symtable_visit_params(struct symtable *st, asdl_seq *args);
static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args);
static int symtable_implicit_arg(struct symtable *st, int pos);
static int symtable_visit_annotations(struct symtable *st, stmt_ty s);
+static int symtable_visit_withitem(struct symtable *st, withitem_ty item);
static identifier top = NULL, lambda = NULL, genexpr = NULL,
@@ -750,7 +747,7 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free,
goto error;
}
- /* Recursively call analyze_block() on each child block.
+ /* Recursively call analyze_child_block() on each child block.
newbound, newglobal now contain the names visible in
nested blocks. The free variables in the children will
@@ -893,18 +890,15 @@ symtable_warn(struct symtable *st, char *msg, int lineno)
static int
symtable_exit_block(struct symtable *st, void *ast)
{
- Py_ssize_t end;
-
- Py_CLEAR(st->st_cur);
- end = PyList_GET_SIZE(st->st_stack) - 1;
- if (end >= 0) {
- st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
- end);
- if (st->st_cur == NULL)
- return 0;
- Py_INCREF(st->st_cur);
- if (PySequence_DelItem(st->st_stack, end) < 0)
+ Py_ssize_t size;
+
+ st->st_cur = NULL;
+ size = PyList_GET_SIZE(st->st_stack);
+ if (size) {
+ if (PyList_SetSlice(st->st_stack, size - 1, size, NULL) < 0)
return 0;
+ if (--size)
+ st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack, size - 1);
}
return 1;
}
@@ -913,23 +907,23 @@ static int
symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
void *ast, int lineno, int col_offset)
{
- PySTEntryObject *prev = NULL;
+ PySTEntryObject *prev = NULL, *ste;
- if (st->st_cur) {
- prev = st->st_cur;
- if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
- return 0;
- }
- Py_DECREF(st->st_cur);
- }
- st->st_cur = ste_new(st, name, block, ast, lineno, col_offset);
- if (st->st_cur == NULL)
+ ste = ste_new(st, name, block, ast, lineno, col_offset);
+ if (ste == NULL)
return 0;
+ if (PyList_Append(st->st_stack, (PyObject *)ste) < 0) {
+ Py_DECREF(ste);
+ return 0;
+ }
+ prev = st->st_cur;
+ /* The entry is owned by the stack. Borrow it for st_cur. */
+ Py_DECREF(ste);
+ st->st_cur = ste;
if (block == ModuleBlock)
st->st_global = st->st_cur->ste_symbols;
if (prev) {
- if (PyList_Append(prev->ste_children,
- (PyObject *)st->st_cur) < 0) {
+ if (PyList_Append(prev->ste_children, (PyObject *)ste) < 0) {
return 0;
}
}
@@ -1023,12 +1017,6 @@ error:
if (!symtable_visit_ ## TYPE((ST), (V))) \
return 0;
-#define VISIT_IN_BLOCK(ST, TYPE, V, S) \
- if (!symtable_visit_ ## TYPE((ST), (V))) { \
- symtable_exit_block((ST), (S)); \
- return 0; \
- }
-
#define VISIT_SEQ(ST, TYPE, SEQ) { \
int i; \
asdl_seq *seq = (SEQ); /* avoid variable capture */ \
@@ -1039,18 +1027,6 @@ error:
} \
}
-#define VISIT_SEQ_IN_BLOCK(ST, TYPE, SEQ, S) { \
- int i; \
- asdl_seq *seq = (SEQ); /* avoid variable capture */ \
- for (i = 0; i < asdl_seq_LEN(seq); i++) { \
- TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
- if (!symtable_visit_ ## TYPE((ST), elt)) { \
- symtable_exit_block((ST), (S)); \
- return 0; \
- } \
- } \
-}
-
#define VISIT_SEQ_TAIL(ST, TYPE, SEQ, START) { \
int i; \
asdl_seq *seq = (SEQ); /* avoid variable capture */ \
@@ -1061,18 +1037,6 @@ error:
} \
}
-#define VISIT_SEQ_TAIL_IN_BLOCK(ST, TYPE, SEQ, START, S) { \
- int i; \
- asdl_seq *seq = (SEQ); /* avoid variable capture */ \
- for (i = (START); i < asdl_seq_LEN(seq); i++) { \
- TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, i); \
- if (!symtable_visit_ ## TYPE((ST), elt)) { \
- symtable_exit_block((ST), (S)); \
- return 0; \
- } \
- } \
-}
-
#define VISIT_KWONLYDEFAULTS(ST, KW_DEFAULTS) { \
int i = 0; \
asdl_seq *seq = (KW_DEFAULTS); /* avoid variable capture */ \
@@ -1122,8 +1086,8 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
FunctionBlock, (void *)s, s->lineno,
s->col_offset))
return 0;
- VISIT_IN_BLOCK(st, arguments, s->v.FunctionDef.args, s);
- VISIT_SEQ_IN_BLOCK(st, stmt, s->v.FunctionDef.body, s);
+ VISIT(st, arguments, s->v.FunctionDef.args);
+ VISIT_SEQ(st, stmt, s->v.FunctionDef.body);
if (!symtable_exit_block(st, s))
return 0;
break;
@@ -1151,7 +1115,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
}
tmp = st->st_private;
st->st_private = s->v.ClassDef.name;
- VISIT_SEQ_IN_BLOCK(st, stmt, s->v.ClassDef.body, s);
+ VISIT_SEQ(st, stmt, s->v.ClassDef.body);
st->st_private = tmp;
if (!symtable_exit_block(st, s))
return 0;
@@ -1161,14 +1125,6 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
if (s->v.Return.value) {
VISIT(st, expr, s->v.Return.value);
st->st_cur->ste_returns_value = 1;
- if (st->st_cur->ste_generator) {
- PyErr_SetString(PyExc_SyntaxError,
- RETURN_VAL_IN_GENERATOR);
- PyErr_SyntaxLocationEx(st->st_filename,
- s->lineno,
- s->col_offset);
- return 0;
- }
}
break;
case Delete_kind:
@@ -1205,19 +1161,16 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
case Raise_kind:
if (s->v.Raise.exc) {
VISIT(st, expr, s->v.Raise.exc);
- if (s->v.Raise.cause) {
- VISIT(st, expr, s->v.Raise.cause);
- }
+ if (s->v.Raise.cause) {
+ VISIT(st, expr, s->v.Raise.cause);
+ }
}
break;
- case TryExcept_kind:
- VISIT_SEQ(st, stmt, s->v.TryExcept.body);
- VISIT_SEQ(st, stmt, s->v.TryExcept.orelse);
- VISIT_SEQ(st, excepthandler, s->v.TryExcept.handlers);
- break;
- case TryFinally_kind:
- VISIT_SEQ(st, stmt, s->v.TryFinally.body);
- VISIT_SEQ(st, stmt, s->v.TryFinally.finalbody);
+ case Try_kind:
+ VISIT_SEQ(st, stmt, s->v.Try.body);
+ VISIT_SEQ(st, stmt, s->v.Try.orelse);
+ VISIT_SEQ(st, excepthandler, s->v.Try.handlers);
+ VISIT_SEQ(st, stmt, s->v.Try.finalbody);
break;
case Assert_kind:
VISIT(st, expr, s->v.Assert.test);
@@ -1305,10 +1258,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
/* nothing to do here */
break;
case With_kind:
- VISIT(st, expr, s->v.With.context_expr);
- if (s->v.With.optional_vars) {
- VISIT(st, expr, s->v.With.optional_vars);
- }
+ VISIT_SEQ(st, withitem, s->v.With.items);
VISIT_SEQ(st, stmt, s->v.With.body);
break;
}
@@ -1341,8 +1291,8 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
FunctionBlock, (void *)e, e->lineno,
e->col_offset))
return 0;
- VISIT_IN_BLOCK(st, arguments, e->v.Lambda.args, (void*)e);
- VISIT_IN_BLOCK(st, expr, e->v.Lambda.body, (void*)e);
+ VISIT(st, arguments, e->v.Lambda.args);
+ VISIT(st, expr, e->v.Lambda.body);
if (!symtable_exit_block(st, (void *)e))
return 0;
break;
@@ -1376,17 +1326,14 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
return 0;
break;
case Yield_kind:
- if (e->v.Yield.value)
- VISIT(st, expr, e->v.Yield.value);
+ case YieldFrom_kind: {
+ expr_ty value;
+ value = (e->kind == YieldFrom_kind) ? e->v.YieldFrom.value : e->v.Yield.value;
+ if (value)
+ VISIT(st, expr, value);
st->st_cur->ste_generator = 1;
- if (st->st_cur->ste_returns_value) {
- PyErr_SetString(PyExc_SyntaxError,
- RETURN_VAL_IN_GENERATOR);
- PyErr_SyntaxLocationEx(st->st_filename,
- e->lineno, e->col_offset);
- return 0;
- }
break;
+ }
case Compare_kind:
VISIT(st, expr, e->v.Compare.left);
VISIT_SEQ(st, expr, e->v.Compare.comparators);
@@ -1543,6 +1490,16 @@ symtable_visit_excepthandler(struct symtable *st, excepthandler_ty eh)
return 1;
}
+static int
+symtable_visit_withitem(struct symtable *st, withitem_ty item)
+{
+ VISIT(st, expr, item->context_expr);
+ if (item->optional_vars) {
+ VISIT(st, expr, item->optional_vars);
+ }
+ return 1;
+}
+
static int
symtable_visit_alias(struct symtable *st, alias_ty a)
@@ -1553,10 +1510,10 @@ symtable_visit_alias(struct symtable *st, alias_ty a)
*/
PyObject *store_name;
PyObject *name = (a->asname == NULL) ? a->name : a->asname;
- const Py_UNICODE *base = PyUnicode_AS_UNICODE(name);
- Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
- if (dot) {
- store_name = PyUnicode_FromUnicode(base, dot - base);
+ Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
+ PyUnicode_GET_LENGTH(name), 1);
+ if (dot != -1) {
+ store_name = PyUnicode_Substring(name, 0, dot);
if (!store_name)
return 0;
}
@@ -1653,13 +1610,12 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e,
symtable_exit_block(st, (void *)e);
return 0;
}
- VISIT_IN_BLOCK(st, expr, outermost->target, (void*)e);
- VISIT_SEQ_IN_BLOCK(st, expr, outermost->ifs, (void*)e);
- VISIT_SEQ_TAIL_IN_BLOCK(st, comprehension,
- generators, 1, (void*)e);
+ VISIT(st, expr, outermost->target);
+ VISIT_SEQ(st, expr, outermost->ifs);
+ VISIT_SEQ_TAIL(st, comprehension, generators, 1);
if (value)
- VISIT_IN_BLOCK(st, expr, value, (void*)e);
- VISIT_IN_BLOCK(st, expr, elt, (void*)e);
+ VISIT(st, expr, value);
+ VISIT(st, expr, elt);
return symtable_exit_block(st, (void *)e);
}
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 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 3cde035..5007aaf 100644
--- a/Python/thread_pthread.h
+++ b/Python/thread_pthread.h
@@ -148,7 +148,7 @@ typedef struct {
* Initialization.
*/
-#ifdef _HAVE_BSDI
+#if defined(_HAVE_BSDI)
static
void _noop(void)
{
@@ -244,8 +244,7 @@ PyThread_start_new_thread(void (*func)(void *), void *arg)
hosed" because:
- It does not guarantee the promise that a non-zero integer is returned.
- The cast to long is inherently unsafe.
- - It is not clear that the 'volatile' (for AIX?) and ugly casting in the
- latter return statement (for Alpha OSF/1) are any longer necessary.
+ - It is not clear that the 'volatile' (for AIX?) are any longer necessary.
*/
long
PyThread_get_thread_ident(void)
@@ -253,13 +252,8 @@ PyThread_get_thread_ident(void)
volatile pthread_t threadid;
if (!initialized)
PyThread_init_thread();
- /* Jump through some hoops for Alpha OSF/1 */
threadid = pthread_self();
-#if SIZEOF_PTHREAD_T <= SIZEOF_LONG
return (long) threadid;
-#else
- return (long) *(long *) &threadid;
-#endif
}
void
@@ -449,12 +443,15 @@ PyThread_free_lock(PyThread_type_lock lock)
dprintf(("PyThread_free_lock(%p) called\n", lock));
- status = pthread_mutex_destroy( &thelock->mut );
- CHECK_STATUS("pthread_mutex_destroy");
-
+ /* some pthread-like implementations tie the mutex to the cond
+ * and must have the cond destroyed first.
+ */
status = pthread_cond_destroy( &thelock->lock_released );
CHECK_STATUS("pthread_cond_destroy");
+ status = pthread_mutex_destroy( &thelock->mut );
+ CHECK_STATUS("pthread_mutex_destroy");
+
free((void *)thelock);
}
@@ -537,12 +534,12 @@ PyThread_release_lock(PyThread_type_lock lock)
thelock->locked = 0;
- status = pthread_mutex_unlock( &thelock->mut );
- CHECK_STATUS("pthread_mutex_unlock[3]");
-
/* wake up someone (anyone, if any) waiting on the lock */
status = pthread_cond_signal( &thelock->lock_released );
CHECK_STATUS("pthread_cond_signal");
+
+ status = pthread_mutex_unlock( &thelock->mut );
+ CHECK_STATUS("pthread_mutex_unlock[3]");
}
#endif /* USE_SEMAPHORES */
diff --git a/Python/thread_sgi.h b/Python/thread_sgi.h
deleted file mode 100644
index 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;
+}
+