diff options
author | Brandt Bucher <brandt@python.org> | 2021-05-02 13:02:10 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-02 13:02:10 -0700 |
commit | 0ad1e0384c8afc5259a6d03363491d89500a5d03 (patch) | |
tree | 66debec62434d9503dd8c3b60c22dc99dcd15f95 /Python | |
parent | 7d2b83e9f092a2ea1f715fe028f7c48324bee756 (diff) | |
download | cpython3-0ad1e0384c8afc5259a6d03363491d89500a5d03.tar.gz |
bpo-43754: Eliminate bindings for partial pattern matches (GH-25229)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/ceval.c | 8 | ||||
-rw-r--r-- | Python/compile.c | 593 | ||||
-rw-r--r-- | Python/importlib_external.h | 220 | ||||
-rw-r--r-- | Python/opcode_targets.h | 2 |
4 files changed, 483 insertions, 340 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index 866c57afdb..25548e34db 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4399,6 +4399,14 @@ main_loop: DISPATCH(); } + case TARGET(ROT_N): { + PyObject *top = TOP(); + memmove(&PEEK(oparg - 1), &PEEK(oparg), + sizeof(PyObject*) * (oparg - 1)); + PEEK(oparg) = top; + DISPATCH(); + } + case TARGET(EXTENDED_ARG): { int oldoparg = oparg; NEXTOPARG(); diff --git a/Python/compile.c b/Python/compile.c index 4411edb667..7cc75ada47 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -230,8 +230,28 @@ struct compiler { }; typedef struct { + // A list of strings corresponding to name captures. It is used to track: + // - Repeated name assignments in the same pattern. + // - Different name assignments in alternatives. + // - The order of name assignments in alternatives. PyObject *stores; + // If 0, any name captures against our subject will raise. int allow_irrefutable; + // An array of blocks to jump to on failure. Jumping to fail_pop[i] will pop + // i items off of the stack. The end result looks like this (with each block + // falling through to the next): + // fail_pop[4]: POP_TOP + // fail_pop[3]: POP_TOP + // fail_pop[2]: POP_TOP + // fail_pop[1]: POP_TOP + // fail_pop[0]: NOP + basicblock **fail_pop; + // The current length of fail_pop. + Py_ssize_t fail_pop_size; + // The number of items on top of the stack that need to *stay* on top of the + // stack. Variable captures go beneath these. All of them will be popped on + // failure. + Py_ssize_t on_top; } pattern_context; static int compiler_enter_scope(struct compiler *, identifier, int, void *, int); @@ -1188,6 +1208,8 @@ stack_effect(int opcode, int oparg, int jump) return 1; case MATCH_KEYS: return 2; + case ROT_N: + return 0; default: return PY_INVALID_STACK_EFFECT; } @@ -5594,11 +5616,15 @@ compiler_slice(struct compiler *c, expr_ty s) // PEP 634: Structural Pattern Matching -// To keep things simple, all compiler_pattern_* routines follow the convention -// of replacing TOS (the subject for the given pattern) with either True (match) -// or False (no match). We do this even for irrefutable patterns; the idea is -// that it's much easier to smooth out any redundant pushing, popping, and -// jumping in the peephole optimizer than to detect or predict it here. +// To keep things simple, all compiler_pattern_* and pattern_helper_* routines +// follow the convention of consuming TOS (the subject for the given pattern) +// and calling jump_to_fail_pop on failure (no match). + +// When calling into these routines, it's important that pc->on_top be kept +// updated to reflect the current number of items that we are using on the top +// of the stack: they will be popped on failure, and any name captures will be +// stored *underneath* them on success. This lets us defer all names stores +// until the *entire* pattern matches. #define WILDCARD_CHECK(N) \ ((N)->kind == MatchAs_kind && !(N)->v.MatchAs.name) @@ -5610,6 +5636,72 @@ compiler_slice(struct compiler *c, expr_ty s) #define MATCH_VALUE_EXPR(N) \ ((N)->kind == Constant_kind || (N)->kind == Attribute_kind) +// Allocate or resize pc->fail_pop to allow for n items to be popped on failure. +static int +ensure_fail_pop(struct compiler *c, pattern_context *pc, Py_ssize_t n) +{ + Py_ssize_t size = n + 1; + if (size <= pc->fail_pop_size) { + return 1; + } + Py_ssize_t needed = sizeof(basicblock*) * size; + basicblock **resized = PyObject_Realloc(pc->fail_pop, needed); + if (resized == NULL) { + PyErr_NoMemory(); + return 0; + } + pc->fail_pop = resized; + while (pc->fail_pop_size < size) { + basicblock *new_block; + RETURN_IF_FALSE(new_block = compiler_new_block(c)); + pc->fail_pop[pc->fail_pop_size++] = new_block; + } + return 1; +} + +// Use op to jump to the correct fail_pop block. +static int +jump_to_fail_pop(struct compiler *c, pattern_context *pc, int op) +{ + // Pop any items on the top of the stack, plus any objects we were going to + // capture on success: + Py_ssize_t pops = pc->on_top + PyList_GET_SIZE(pc->stores); + RETURN_IF_FALSE(ensure_fail_pop(c, pc, pops)); + ADDOP_JUMP(c, op, pc->fail_pop[pops]); + NEXT_BLOCK(c); + return 1; +} + +// Build all of the fail_pop blocks and reset fail_pop. +static int +emit_and_reset_fail_pop(struct compiler *c, pattern_context *pc) +{ + if (!pc->fail_pop_size) { + assert(pc->fail_pop == NULL); + NEXT_BLOCK(c); + return 1; + } + while (--pc->fail_pop_size) { + compiler_use_next_block(c, pc->fail_pop[pc->fail_pop_size]); + if (!compiler_addop(c, POP_TOP)) { + pc->fail_pop_size = 0; + PyObject_Free(pc->fail_pop); + pc->fail_pop = NULL; + return 0; + } + } + compiler_use_next_block(c, pc->fail_pop[0]); + PyObject_Free(pc->fail_pop); + pc->fail_pop = NULL; + return 1; +} + +static int +compiler_error_duplicate_store(struct compiler *c, identifier n) +{ + return compiler_error(c, "multiple assignments to name %R in pattern", n); +} + static int pattern_helper_store_name(struct compiler *c, identifier n, pattern_context *pc) { @@ -5621,22 +5713,16 @@ pattern_helper_store_name(struct compiler *c, identifier n, pattern_context *pc) return 0; } // Can't assign to the same name twice: - if (pc->stores == NULL) { - RETURN_IF_FALSE(pc->stores = PySet_New(NULL)); + int duplicate = PySequence_Contains(pc->stores, n); + if (duplicate < 0) { + return 0; } - else { - int duplicate = PySet_Contains(pc->stores, n); - if (duplicate < 0) { - return 0; - } - if (duplicate) { - const char *e = "multiple assignments to name %R in pattern"; - return compiler_error(c, e, n); - } + if (duplicate) { + return compiler_error_duplicate_store(c, n); } - RETURN_IF_FALSE(!PySet_Add(pc->stores, n)); - RETURN_IF_FALSE(compiler_nameop(c, n, Store)); - return 1; + // Rotate this object underneath any items we need to preserve: + ADDOP_I(c, ROT_N, pc->on_top + PyList_GET_SIZE(pc->stores) + 1); + return !PyList_Append(pc->stores, n); } @@ -5672,65 +5758,17 @@ pattern_helper_sequence_unpack(struct compiler *c, asdl_pattern_seq *patterns, Py_ssize_t star, pattern_context *pc) { RETURN_IF_FALSE(pattern_unpack_helper(c, patterns)); - // We've now got a bunch of new subjects on the stack. If any of them fail - // to match, we need to pop everything else off, then finally push False. - // fails is an array of blocks that correspond to the necessary amount of - // popping for each element: - basicblock **fails; Py_ssize_t size = asdl_seq_LEN(patterns); - fails = (basicblock **)PyObject_Malloc(sizeof(basicblock*) * size); - if (fails == NULL) { - PyErr_NoMemory(); - return 0; - } - // NOTE: Can't use our nice returning macros anymore: they'll leak memory! - // goto error on error. - for (Py_ssize_t i = 0; i < size; i++) { - fails[i] = compiler_new_block(c); - if (fails[i] == NULL) { - goto error; - } - } + // We've now got a bunch of new subjects on the stack. They need to remain + // there after each subpattern match: + pc->on_top += size; for (Py_ssize_t i = 0; i < size; i++) { + // One less item to keep track of each time we loop through: + pc->on_top--; pattern_ty pattern = asdl_seq_GET(patterns, i); - assert((i == star) == (pattern->kind == MatchStar_kind)); - if (!compiler_pattern_subpattern(c, pattern, pc) || - !compiler_addop_j(c, POP_JUMP_IF_FALSE, fails[i]) || - compiler_next_block(c) == NULL) - { - goto error; - } - } - // Success! - basicblock *end = compiler_new_block(c); - if (end == NULL || - !compiler_addop_load_const(c, Py_True) || - !compiler_addop_j(c, JUMP_FORWARD, end)) - { - goto error; - } - // This is where we handle failed sub-patterns. For a sequence pattern like - // [a, b, c, d], this will look like: - // fails[0]: POP_TOP - // fails[1]: POP_TOP - // fails[2]: POP_TOP - // fails[3]: LOAD_CONST False - for (Py_ssize_t i = 0; i < size - 1; i++) { - compiler_use_next_block(c, fails[i]); - if (!compiler_addop(c, POP_TOP)) { - goto error; - } - } - compiler_use_next_block(c, fails[size - 1]); - if (!compiler_addop_load_const(c, Py_False)) { - goto error; + RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc)); } - compiler_use_next_block(c, end); - PyObject_Free(fails); return 1; -error: - PyObject_Free(fails); - return 0; } // Like pattern_helper_sequence_unpack, but uses BINARY_SUBSCR instead of @@ -5740,9 +5778,8 @@ static int pattern_helper_sequence_subscr(struct compiler *c, asdl_pattern_seq *patterns, Py_ssize_t star, pattern_context *pc) { - basicblock *end, *fail_pop_1; - RETURN_IF_FALSE(end = compiler_new_block(c)); - RETURN_IF_FALSE(fail_pop_1 = compiler_new_block(c)); + // We need to keep the subject around for extracting elements: + pc->on_top++; Py_ssize_t size = asdl_seq_LEN(patterns); for (Py_ssize_t i = 0; i < size; i++) { pattern_ty pattern = asdl_seq_GET(patterns, i); @@ -5766,16 +5803,10 @@ pattern_helper_sequence_subscr(struct compiler *c, asdl_pattern_seq *patterns, } ADDOP(c, BINARY_SUBSCR); RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc)); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1); - NEXT_BLOCK(c); } + // Pop the subject, we're done with it: + pc->on_top--; ADDOP(c, POP_TOP); - ADDOP_LOAD_CONST(c, Py_True); - ADDOP_JUMP(c, JUMP_FORWARD, end); - compiler_use_next_block(c, fail_pop_1); - ADDOP(c, POP_TOP); - ADDOP_LOAD_CONST(c, Py_False); - compiler_use_next_block(c, end); return 1; } @@ -5804,26 +5835,15 @@ compiler_pattern_as(struct compiler *c, pattern_ty p, pattern_context *pc) const char *e = "wildcard makes remaining patterns unreachable"; return compiler_error(c, e); } - RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchAs.name, pc)); - ADDOP_LOAD_CONST(c, Py_True); - return 1; + return pattern_helper_store_name(c, p->v.MatchAs.name, pc); } - basicblock *end, *fail_pop_1; - RETURN_IF_FALSE(end = compiler_new_block(c)); - RETURN_IF_FALSE(fail_pop_1 = compiler_new_block(c)); // Need to make a copy for (possibly) storing later: + pc->on_top++; ADDOP(c, DUP_TOP); RETURN_IF_FALSE(compiler_pattern(c, p->v.MatchAs.pattern, pc)); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1); - NEXT_BLOCK(c); + // Success! Store it: + pc->on_top--; RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchAs.name, pc)); - ADDOP_LOAD_CONST(c, Py_True); - ADDOP_JUMP(c, JUMP_FORWARD, end); - compiler_use_next_block(c, fail_pop_1); - // Need to pop that unused copy from before: - ADDOP(c, POP_TOP); - ADDOP_LOAD_CONST(c, Py_False); - compiler_use_next_block(c, end); return 1; } @@ -5832,7 +5852,6 @@ compiler_pattern_star(struct compiler *c, pattern_ty p, pattern_context *pc) { assert(p->kind == MatchStar_kind); RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchStar.name, pc)); - ADDOP_LOAD_CONST(c, Py_True); return 1; } @@ -5884,9 +5903,6 @@ compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc) RETURN_IF_FALSE(!validate_kwd_attrs(c, kwd_attrs, kwd_patterns)); c->u->u_col_offset = p->col_offset; // validate_kwd_attrs moves this } - basicblock *end, *fail_pop_1; - RETURN_IF_FALSE(end = compiler_new_block(c)); - RETURN_IF_FALSE(fail_pop_1 = compiler_new_block(c)); VISIT(c, expr, p->v.MatchClass.cls); PyObject *attr_names; RETURN_IF_FALSE(attr_names = PyTuple_New(nattrs)); @@ -5898,9 +5914,9 @@ compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc) } ADDOP_LOAD_CONST_NEW(c, attr_names); ADDOP_I(c, MATCH_CLASS, nargs); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1); - NEXT_BLOCK(c); - // TOS is now a tuple of (nargs + nkwargs) attributes. + // TOS is now a tuple of (nargs + nattrs) attributes. Preserve it: + pc->on_top++; + RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE)); for (i = 0; i < nargs + nattrs; i++) { pattern_ty pattern; if (i < nargs) { @@ -5919,17 +5935,10 @@ compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc) ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(i)); ADDOP(c, BINARY_SUBSCR); RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc)); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1); - NEXT_BLOCK(c); } // Success! Pop the tuple of attributes: + pc->on_top--; ADDOP(c, POP_TOP); - ADDOP_LOAD_CONST(c, Py_True); - ADDOP_JUMP(c, JUMP_FORWARD, end); - compiler_use_next_block(c, fail_pop_1); - ADDOP(c, POP_TOP); - ADDOP_LOAD_CONST(c, Py_False); - compiler_use_next_block(c, end); return 1; } @@ -5937,10 +5946,6 @@ static int compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc) { assert(p->kind == MatchMapping_kind); - basicblock *end, *fail_pop_1, *fail_pop_3; - RETURN_IF_FALSE(end = compiler_new_block(c)); - RETURN_IF_FALSE(fail_pop_1 = compiler_new_block(c)); - RETURN_IF_FALSE(fail_pop_3 = compiler_new_block(c)); asdl_expr_seq *keys = p->v.MatchMapping.keys; asdl_pattern_seq *patterns = p->v.MatchMapping.patterns; Py_ssize_t size = asdl_seq_LEN(keys); @@ -5953,18 +5958,14 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc) } // We have a double-star target if "rest" is set PyObject *star_target = p->v.MatchMapping.rest; + // We need to keep the subject on top during the mapping and length checks: + pc->on_top++; ADDOP(c, MATCH_MAPPING); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1); - NEXT_BLOCK(c); + RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE)); if (!size && !star_target) { - // If the pattern is just "{}", we're done! - ADDOP(c, POP_TOP); - ADDOP_LOAD_CONST(c, Py_True); - ADDOP_JUMP(c, JUMP_FORWARD, end); - compiler_use_next_block(c, fail_pop_1); + // If the pattern is just "{}", we're done! Pop the subject: + pc->on_top--; ADDOP(c, POP_TOP); - ADDOP_LOAD_CONST(c, Py_False); - compiler_use_next_block(c, end); return 1; } if (size) { @@ -5972,8 +5973,7 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc) ADDOP(c, GET_LEN); ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size)); ADDOP_COMPARE(c, GtE); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1); - NEXT_BLOCK(c); + RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE)); } if (INT_MAX < size - 1) { return compiler_error(c, "too many sub-patterns in mapping pattern"); @@ -5996,9 +5996,10 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc) } ADDOP_I(c, BUILD_TUPLE, size); ADDOP(c, MATCH_KEYS); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_3); - NEXT_BLOCK(c); - // So far so good. There's now a tuple of values on the stack to match + // There's now a tuple of keys and a tuple of values on top of the subject: + pc->on_top += 2; + RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE)); + // So far so good. Use that tuple of values on the stack to match // sub-patterns against: for (Py_ssize_t i = 0; i < size; i++) { pattern_ty pattern = asdl_seq_GET(patterns, i); @@ -6009,10 +6010,10 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc) ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(i)); ADDOP(c, BINARY_SUBSCR); RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc)); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_3); - NEXT_BLOCK(c); } - // If we get this far, it's a match! We're done with that tuple of values. + // If we get this far, it's a match! We're done with the tuple of values, + // and whatever happens next should consume the tuple of keys underneath it: + pc->on_top -= 2; ADDOP(c, POP_TOP); if (star_target) { // If we have a starred name, bind a dict of remaining items to it: @@ -6024,19 +6025,8 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc) ADDOP(c, POP_TOP); } // Pop the subject: + pc->on_top--; ADDOP(c, POP_TOP); - ADDOP_LOAD_CONST(c, Py_True); - ADDOP_JUMP(c, JUMP_FORWARD, end); - // The top two items are a tuple of values or None, followed by a tuple of - // keys. Pop them both: - compiler_use_next_block(c, fail_pop_3); - ADDOP(c, POP_TOP); - ADDOP(c, POP_TOP); - compiler_use_next_block(c, fail_pop_1); - // Pop the subject: - ADDOP(c, POP_TOP); - ADDOP_LOAD_CONST(c, Py_False); - compiler_use_next_block(c, end); return 1; } @@ -6044,69 +6034,148 @@ static int compiler_pattern_or(struct compiler *c, pattern_ty p, pattern_context *pc) { assert(p->kind == MatchOr_kind); - // control is the set of names bound by the first alternative. If all of the - // others bind the same names (they should), then this becomes pc->stores. - PyObject *control = NULL; - basicblock *end, *pass_pop_1; + basicblock *end; RETURN_IF_FALSE(end = compiler_new_block(c)); - RETURN_IF_FALSE(pass_pop_1 = compiler_new_block(c)); Py_ssize_t size = asdl_seq_LEN(p->v.MatchOr.patterns); assert(size > 1); // We're going to be messing with pc. Keep the original info handy: - PyObject *stores_init = pc->stores; - int allow_irrefutable = pc->allow_irrefutable; + pattern_context old_pc = *pc; + Py_INCREF(pc->stores); + // control is the list of names bound by the first alternative. It is used + // for checking different name bindings in alternatives, and for correcting + // the order in which extracted elements are placed on the stack. + PyObject *control = NULL; + // NOTE: We can't use returning macros anymore! goto error on error. for (Py_ssize_t i = 0; i < size; i++) { - // NOTE: Can't use our nice returning macros in here: they'll leak sets! pattern_ty alt = asdl_seq_GET(p->v.MatchOr.patterns, i); - pc->stores = PySet_New(stores_init); - // An irrefutable sub-pattern must be last, if it is allowed at all: - int is_last = i == size - 1; - pc->allow_irrefutable = allow_irrefutable && is_last; SET_LOC(c, alt); - if (pc->stores == NULL || - // Only copy the subject if we're *not* on the last alternative: - (!is_last && !compiler_addop(c, DUP_TOP)) || - !compiler_pattern(c, alt, pc) || - // Only jump if we're *not* on the last alternative: - (!is_last && !compiler_addop_j(c, POP_JUMP_IF_TRUE, pass_pop_1)) || - !compiler_next_block(c)) - { - goto fail; + PyObject *pc_stores = PyList_New(0); + if (pc_stores == NULL) { + goto error; + } + Py_SETREF(pc->stores, pc_stores); + // An irrefutable sub-pattern must be last, if it is allowed at all: + pc->allow_irrefutable = (i == size - 1) && old_pc.allow_irrefutable; + pc->fail_pop = NULL; + pc->fail_pop_size = 0; + pc->on_top = 0; + if (!compiler_addop(c, DUP_TOP) || !compiler_pattern(c, alt, pc)) { + goto error; } + // Success! + Py_ssize_t nstores = PyList_GET_SIZE(pc->stores); if (!i) { - // If this is the first alternative, save its stores as a "control" - // for the others (they can't bind a different set of names): + // This is the first alternative, so save its stores as a "control" + // for the others (they can't bind a different set of names, and + // might need to be reordered): + assert(control == NULL); control = pc->stores; - continue; - } - if (PySet_GET_SIZE(pc->stores) || PySet_GET_SIZE(control)) { - // Otherwise, check to see if we differ from the control set: - PyObject *diff = PyNumber_InPlaceXor(pc->stores, control); - if (diff == NULL) { - goto fail; - } - if (PySet_GET_SIZE(diff)) { - // The names differ! Raise. - Py_DECREF(diff); - compiler_error(c, "alternative patterns bind different names"); - goto fail; + Py_INCREF(control); + } + else if (nstores != PyList_GET_SIZE(control)) { + goto diff; + } + else if (nstores) { + // There were captures. Check to see if we differ from control: + Py_ssize_t icontrol = nstores; + while (icontrol--) { + PyObject *name = PyList_GET_ITEM(control, icontrol); + Py_ssize_t istores = PySequence_Index(pc->stores, name); + if (istores < 0) { + PyErr_Clear(); + goto diff; + } + if (icontrol != istores) { + // Reorder the names on the stack to match the order of the + // names in control. There's probably a better way of doing + // this; the current solution is potentially very + // inefficient when each alternative subpattern binds lots + // of names in different orders. It's fine for reasonable + // cases, though. + assert(istores < icontrol); + Py_ssize_t rotations = istores + 1; + // Perfom the same rotation on pc->stores: + PyObject *rotated = PyList_GetSlice(pc->stores, 0, + rotations); + if (rotated == NULL || + PyList_SetSlice(pc->stores, 0, rotations, NULL) || + PyList_SetSlice(pc->stores, icontrol - istores, + icontrol - istores, rotated)) + { + Py_XDECREF(rotated); + goto error; + } + Py_DECREF(rotated); + // That just did: + // rotated = pc_stores[:rotations] + // del pc_stores[:rotations] + // pc_stores[icontrol-istores:icontrol-istores] = rotated + // Do the same thing to the stack, using several ROT_Ns: + while (rotations--) { + if (!compiler_addop_i(c, ROT_N, icontrol + 1)) { + goto error; + } + } + } } - Py_DECREF(diff); } - Py_DECREF(pc->stores); + assert(control); + if (!compiler_addop_j(c, JUMP_FORWARD, end) || + !compiler_next_block(c) || + !emit_and_reset_fail_pop(c, pc)) + { + goto error; + } + } + Py_DECREF(pc->stores); + *pc = old_pc; + Py_INCREF(pc->stores); + // Need to NULL this for the PyObject_Free call in the error block. + old_pc.fail_pop = NULL; + // No match. Pop the remaining copy of the subject and fail: + if (!compiler_addop(c, POP_TOP) || !jump_to_fail_pop(c, pc, JUMP_FORWARD)) { + goto error; } - Py_XDECREF(stores_init); - // Update pc->stores and restore pc->allow_irrefutable: - pc->stores = control; - pc->allow_irrefutable = allow_irrefutable; - ADDOP_JUMP(c, JUMP_FORWARD, end); - compiler_use_next_block(c, pass_pop_1); - ADDOP(c, POP_TOP); - ADDOP_LOAD_CONST(c, Py_True); compiler_use_next_block(c, end); + Py_ssize_t nstores = PyList_GET_SIZE(control); + // There's a bunch of stuff on the stack between any where the new stores + // are and where they need to be: + // - The other stores. + // - A copy of the subject. + // - Anything else that may be on top of the stack. + // - Any previous stores we've already stashed away on the stack. + int nrots = nstores + 1 + pc->on_top + PyList_GET_SIZE(pc->stores); + for (Py_ssize_t i = 0; i < nstores; i++) { + // Rotate this capture to its proper place on the stack: + if (!compiler_addop_i(c, ROT_N, nrots)) { + goto error; + } + // Update the list of previous stores with this new name, checking for + // duplicates: + PyObject *name = PyList_GET_ITEM(control, i); + int dupe = PySequence_Contains(pc->stores, name); + if (dupe < 0) { + goto error; + } + if (dupe) { + compiler_error_duplicate_store(c, name); + goto error; + } + if (PyList_Append(pc->stores, name)) { + goto error; + } + } + Py_DECREF(old_pc.stores); + Py_DECREF(control); + // NOTE: Returning macros are safe again. + // Pop the copy of the subject: + ADDOP(c, POP_TOP); return 1; -fail: - Py_XDECREF(stores_init); +diff: + compiler_error(c, "alternative patterns bind different names"); +error: + PyObject_Free(old_pc.fail_pop); + Py_DECREF(old_pc.stores); Py_XDECREF(control); return 0; } @@ -6136,32 +6205,29 @@ compiler_pattern_sequence(struct compiler *c, pattern_ty p, pattern_context *pc) } only_wildcard &= WILDCARD_CHECK(pattern); } - basicblock *end, *fail_pop_1; - RETURN_IF_FALSE(end = compiler_new_block(c)); - RETURN_IF_FALSE(fail_pop_1 = compiler_new_block(c)); + // We need to keep the subject on top during the sequence and length checks: + pc->on_top++; ADDOP(c, MATCH_SEQUENCE); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1); - NEXT_BLOCK(c); + RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE)); if (star < 0) { // No star: len(subject) == size ADDOP(c, GET_LEN); ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size)); ADDOP_COMPARE(c, Eq); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1); - NEXT_BLOCK(c); + RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE)); } else if (size > 1) { // Star: len(subject) >= size - 1 ADDOP(c, GET_LEN); ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size - 1)); ADDOP_COMPARE(c, GtE); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1); - NEXT_BLOCK(c); + RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE)); } + // Whatever comes next should consume the subject: + pc->on_top--; if (only_wildcard) { // Patterns like: [] / [_] / [_, _] / [*_] / [_, *_] / [_, _, *_] / etc. ADDOP(c, POP_TOP); - ADDOP_LOAD_CONST(c, Py_True); } else if (star_wildcard) { RETURN_IF_FALSE(pattern_helper_sequence_subscr(c, patterns, star, pc)); @@ -6169,11 +6235,6 @@ compiler_pattern_sequence(struct compiler *c, pattern_ty p, pattern_context *pc) else { RETURN_IF_FALSE(pattern_helper_sequence_unpack(c, patterns, star, pc)); } - ADDOP_JUMP(c, JUMP_FORWARD, end); - compiler_use_next_block(c, fail_pop_1); - ADDOP(c, POP_TOP) - ADDOP_LOAD_CONST(c, Py_False); - compiler_use_next_block(c, end); return 1; } @@ -6188,6 +6249,7 @@ compiler_pattern_value(struct compiler *c, pattern_ty p, pattern_context *pc) } VISIT(c, expr, value); ADDOP_COMPARE(c, Eq); + RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE)); return 1; } @@ -6197,6 +6259,7 @@ compiler_pattern_singleton(struct compiler *c, pattern_ty p, pattern_context *pc assert(p->kind == MatchSingleton_kind); ADDOP_LOAD_CONST(c, p->v.MatchSingleton.value); ADDOP_COMPARE(c, Is); + RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE)); return 1; } @@ -6229,39 +6292,48 @@ compiler_pattern(struct compiler *c, pattern_ty p, pattern_context *pc) } static int -compiler_match(struct compiler *c, stmt_ty s) +compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc) { VISIT(c, expr, s->v.Match.subject); - basicblock *next, *end; + basicblock *end; RETURN_IF_FALSE(end = compiler_new_block(c)); Py_ssize_t cases = asdl_seq_LEN(s->v.Match.cases); assert(cases > 0); - pattern_context pc; - // We use pc.stores to track: - // - Repeated name assignments in the same pattern. - // - Different name assignments in alternatives. - // It's a set of names, but we don't create it until it's needed: - pc.stores = NULL; match_case_ty m = asdl_seq_GET(s->v.Match.cases, cases - 1); int has_default = WILDCARD_CHECK(m->pattern) && 1 < cases; for (Py_ssize_t i = 0; i < cases - has_default; i++) { m = asdl_seq_GET(s->v.Match.cases, i); SET_LOC(c, m->pattern); - RETURN_IF_FALSE(next = compiler_new_block(c)); - // If pc.allow_irrefutable is 0, any name captures against our subject - // will raise. Irrefutable cases must be either guarded, last, or both: - pc.allow_irrefutable = m->guard != NULL || i == cases - 1; // Only copy the subject if we're *not* on the last case: if (i != cases - has_default - 1) { ADDOP(c, DUP_TOP); } - int result = compiler_pattern(c, m->pattern, &pc); - Py_CLEAR(pc.stores); - RETURN_IF_FALSE(result); - ADDOP_JUMP(c, POP_JUMP_IF_FALSE, next); - NEXT_BLOCK(c); + RETURN_IF_FALSE(pc->stores = PyList_New(0)); + // Irrefutable cases must be either guarded, last, or both: + pc->allow_irrefutable = m->guard != NULL || i == cases - 1; + pc->fail_pop = NULL; + pc->fail_pop_size = 0; + pc->on_top = 0; + // NOTE: Can't use returning macros here (they'll leak pc->stores)! + if (!compiler_pattern(c, m->pattern, pc)) { + Py_DECREF(pc->stores); + return 0; + } + assert(!pc->on_top); + // It's a match! Store all of the captured names (they're on the stack). + Py_ssize_t nstores = PyList_GET_SIZE(pc->stores); + for (Py_ssize_t n = 0; n < nstores; n++) { + PyObject *name = PyList_GET_ITEM(pc->stores, n); + if (!compiler_nameop(c, name, Store)) { + Py_DECREF(pc->stores); + return 0; + } + } + Py_DECREF(pc->stores); + // NOTE: Returning macros are safe again. if (m->guard) { - RETURN_IF_FALSE(compiler_jump_if(c, m->guard, next, 0)); + RETURN_IF_FALSE(ensure_fail_pop(c, pc, 0)); + RETURN_IF_FALSE(compiler_jump_if(c, m->guard, pc->fail_pop[0], 0)); } // Success! Pop the subject off, we're done with it: if (i != cases - has_default - 1) { @@ -6269,7 +6341,7 @@ compiler_match(struct compiler *c, stmt_ty s) } VISIT_SEQ(c, stmt, m->body); ADDOP_JUMP(c, JUMP_FORWARD, end); - compiler_use_next_block(c, next); + RETURN_IF_FALSE(emit_and_reset_fail_pop(c, pc)); } if (has_default) { if (cases == 1) { @@ -6289,6 +6361,16 @@ compiler_match(struct compiler *c, stmt_ty s) return 1; } +static int +compiler_match(struct compiler *c, stmt_ty s) +{ + pattern_context pc; + pc.fail_pop = NULL; + int result = compiler_match_inner(c, s, &pc); + PyObject_Free(pc.fail_pop); + return result; +} + #undef WILDCARD_CHECK #undef WILDCARD_STAR_CHECK @@ -7031,6 +7113,38 @@ fold_tuple_on_constants(struct compiler *c, } +// Eliminate n * ROT_N(n). +static void +fold_rotations(struct instr *inst, int n) +{ + for (int i = 0; i < n; i++) { + int rot; + switch (inst[i].i_opcode) { + case ROT_N: + rot = inst[i].i_oparg; + break; + case ROT_FOUR: + rot = 4; + break; + case ROT_THREE: + rot = 3; + break; + case ROT_TWO: + rot = 2; + break; + default: + return; + } + if (rot != n) { + return; + } + } + for (int i = 0; i < n; i++) { + inst[i].i_opcode = NOP; + } +} + + static int eliminate_jump_to_jump(basicblock *bb, int opcode) { assert (bb->b_iused > 0); @@ -7273,6 +7387,27 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts) bb->b_exit = 1; } } + break; + case ROT_N: + switch (oparg) { + case 0: + case 1: + inst->i_opcode = NOP; + continue; + case 2: + inst->i_opcode = ROT_TWO; + break; + case 3: + inst->i_opcode = ROT_THREE; + break; + case 4: + inst->i_opcode = ROT_FOUR; + break; + } + if (i >= oparg - 1) { + fold_rotations(inst - oparg + 1, oparg); + } + break; } } return 0; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 6b9bd0df81..8f4eeb0e53 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -357,7 +357,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,115,36,0,0,0,16,5,6,1,22,1,4,255, 2,2,14,3,12,1,28,255,18,2,12,1,2,1,12,1, 2,3,12,254,2,1,2,1,2,254,2,253,114,95,0,0, - 0,105,110,13,0,0,114,44,0,0,0,114,32,0,0,0, + 0,105,111,13,0,0,114,44,0,0,0,114,32,0,0,0, 115,2,0,0,0,13,10,90,11,95,95,112,121,99,97,99, 104,101,95,95,122,4,111,112,116,45,122,3,46,112,121,122, 4,46,112,121,119,122,4,46,112,121,99,41,1,218,12,111, @@ -471,7 +471,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,109,111,115,116,95,102,105,108,101,110,97,109,101,218,8, 102,105,108,101,110,97,109,101,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,17,99,97,99,104,101,95,102, - 114,111,109,95,115,111,117,114,99,101,123,1,0,0,115,72, + 114,111,109,95,115,111,117,114,99,101,124,1,0,0,115,72, 0,0,0,8,18,6,1,2,1,4,255,8,2,4,1,8, 1,12,1,10,1,12,1,16,1,8,1,8,1,8,1,24, 1,8,1,12,1,6,1,8,2,8,1,8,1,8,1,14, @@ -552,7 +552,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,95,108,101,118,101,108,90,13,98,97,115,101,95,102,105, 108,101,110,97,109,101,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,17,115,111,117,114,99,101,95,102,114, - 111,109,95,99,97,99,104,101,194,1,0,0,115,60,0,0, + 111,109,95,99,97,99,104,101,195,1,0,0,115,60,0,0, 0,12,9,8,1,10,1,12,1,4,1,10,1,12,1,14, 1,16,1,4,1,4,1,12,1,8,1,8,1,2,1,8, 255,10,2,8,1,14,1,8,1,16,1,10,1,4,1,2, @@ -587,7 +587,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 218,1,95,90,9,101,120,116,101,110,115,105,111,110,218,11, 115,111,117,114,99,101,95,112,97,116,104,114,7,0,0,0, 114,7,0,0,0,114,8,0,0,0,218,15,95,103,101,116, - 95,115,111,117,114,99,101,102,105,108,101,234,1,0,0,115, + 95,115,111,117,114,99,101,102,105,108,101,235,1,0,0,115, 22,0,0,0,12,7,4,1,16,1,24,1,4,1,2,1, 12,1,16,1,14,1,16,1,2,254,114,135,0,0,0,99, 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, @@ -600,7 +600,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 117,112,108,101,114,127,0,0,0,114,121,0,0,0,114,107, 0,0,0,114,113,0,0,0,41,1,114,120,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11, - 95,103,101,116,95,99,97,99,104,101,100,253,1,0,0,115, + 95,103,101,116,95,99,97,99,104,101,100,254,1,0,0,115, 18,0,0,0,14,1,2,1,10,1,12,1,6,1,14,1, 4,1,4,2,2,251,114,137,0,0,0,99,1,0,0,0, 0,0,0,0,0,0,0,0,2,0,0,0,8,0,0,0, @@ -615,7 +615,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,77,0,0,0,114,76,0,0,0,41,2,114,65, 0,0,0,114,78,0,0,0,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,10,95,99,97,108,99,95,109, - 111,100,101,9,2,0,0,115,14,0,0,0,2,2,14,1, + 111,100,101,10,2,0,0,115,14,0,0,0,2,2,14,1, 12,1,6,1,8,3,4,1,2,251,114,139,0,0,0,99, 1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, 4,0,0,0,3,0,0,0,115,52,0,0,0,100,6,135, @@ -652,7 +652,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 141,0,0,0,218,4,97,114,103,115,218,6,107,119,97,114, 103,115,169,1,218,6,109,101,116,104,111,100,114,7,0,0, 0,114,8,0,0,0,218,19,95,99,104,101,99,107,95,110, - 97,109,101,95,119,114,97,112,112,101,114,29,2,0,0,115, + 97,109,101,95,119,114,97,112,112,101,114,30,2,0,0,115, 18,0,0,0,8,1,8,1,10,1,4,1,8,1,2,255, 2,1,6,255,24,2,122,40,95,99,104,101,99,107,95,110, 97,109,101,46,60,108,111,99,97,108,115,62,46,95,99,104, @@ -670,7 +670,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,97,116,116,114,218,8,95,95,100,105,99,116,95,95,218, 6,117,112,100,97,116,101,41,3,90,3,110,101,119,90,3, 111,108,100,114,85,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,218,5,95,119,114,97,112,42,2, + 0,0,114,8,0,0,0,218,5,95,119,114,97,112,43,2, 0,0,115,10,0,0,0,8,1,10,1,18,1,2,128,18, 1,122,26,95,99,104,101,99,107,95,110,97,109,101,46,60, 108,111,99,97,108,115,62,46,95,119,114,97,112,114,69,0, @@ -678,7 +678,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,158,0,0,0,41,3,114,147,0,0,0,114,148,0,0, 0,114,158,0,0,0,114,7,0,0,0,114,146,0,0,0, 114,8,0,0,0,218,11,95,99,104,101,99,107,95,110,97, - 109,101,21,2,0,0,115,12,0,0,0,14,8,8,10,8, + 109,101,22,2,0,0,115,12,0,0,0,14,8,8,10,8, 1,8,2,10,6,4,1,114,160,0,0,0,99,2,0,0, 0,0,0,0,0,0,0,0,0,5,0,0,0,6,0,0, 0,67,0,0,0,115,72,0,0,0,116,0,160,1,100,1, @@ -713,7 +713,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,218,8,112,111,114,116,105,111,110,115,218,3,109,115,103, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, 17,95,102,105,110,100,95,109,111,100,117,108,101,95,115,104, - 105,109,52,2,0,0,115,16,0,0,0,6,7,2,2,4, + 105,109,53,2,0,0,115,16,0,0,0,6,7,2,2,4, 254,14,6,16,1,4,1,22,1,4,1,114,167,0,0,0, 99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0, 0,4,0,0,0,67,0,0,0,115,166,0,0,0,124,0, @@ -780,7 +780,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,120,99,95,100,101,116,97,105,108,115,90,5,109,97,103, 105,99,114,117,0,0,0,114,16,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,13,95,99,108, - 97,115,115,105,102,121,95,112,121,99,72,2,0,0,115,28, + 97,115,115,105,102,121,95,112,121,99,73,2,0,0,115,28, 0,0,0,12,16,8,1,16,1,12,1,16,1,12,1,10, 1,12,1,8,1,16,1,8,2,16,1,16,1,4,1,114, 176,0,0,0,99,5,0,0,0,0,0,0,0,0,0,0, @@ -835,7 +835,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,95,115,105,122,101,114,141,0,0,0,114,175,0,0,0, 114,117,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,23,95,118,97,108,105,100,97,116,101,95, - 116,105,109,101,115,116,97,109,112,95,112,121,99,105,2,0, + 116,105,109,101,115,116,97,109,112,95,112,121,99,106,2,0, 0,115,18,0,0,0,24,19,10,1,12,1,16,1,8,1, 22,1,2,255,22,2,8,254,114,180,0,0,0,99,4,0, 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, @@ -882,7 +882,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,104,97,115,104,114,141,0,0,0,114,175,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,18, 95,118,97,108,105,100,97,116,101,95,104,97,115,104,95,112, - 121,99,133,2,0,0,115,14,0,0,0,16,17,2,1,8, + 121,99,134,2,0,0,115,14,0,0,0,16,17,2,1,8, 1,4,255,2,2,6,254,4,255,114,182,0,0,0,99,4, 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5, 0,0,0,67,0,0,0,115,76,0,0,0,116,0,160,1, @@ -906,7 +906,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,134,0,0,0,218,4,99,111,100,101,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,17,95, 99,111,109,112,105,108,101,95,98,121,116,101,99,111,100,101, - 157,2,0,0,115,18,0,0,0,10,2,10,1,12,1,8, + 158,2,0,0,115,18,0,0,0,10,2,10,1,12,1,8, 1,12,1,4,1,10,2,4,1,6,255,114,189,0,0,0, 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, 0,5,0,0,0,67,0,0,0,115,70,0,0,0,116,0, @@ -924,7 +924,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 109,101,114,179,0,0,0,114,41,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,22,95,99,111, 100,101,95,116,111,95,116,105,109,101,115,116,97,109,112,95, - 112,121,99,170,2,0,0,115,12,0,0,0,8,2,14,1, + 112,121,99,171,2,0,0,115,12,0,0,0,8,2,14,1, 14,1,14,1,16,1,4,1,114,194,0,0,0,84,99,3, 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5, 0,0,0,67,0,0,0,115,80,0,0,0,116,0,116,1, @@ -942,7 +942,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,90,7,99,104,101,99,107,101,100,114,41,0,0,0, 114,16,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,17,95,99,111,100,101,95,116,111,95,104, - 97,115,104,95,112,121,99,180,2,0,0,115,14,0,0,0, + 97,115,104,95,112,121,99,181,2,0,0,115,14,0,0,0, 8,2,12,1,14,1,16,1,10,1,16,1,4,1,114,195, 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, 5,0,0,0,6,0,0,0,67,0,0,0,115,62,0,0, @@ -970,7 +970,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 103,90,15,110,101,119,108,105,110,101,95,100,101,99,111,100, 101,114,114,7,0,0,0,114,7,0,0,0,114,8,0,0, 0,218,13,100,101,99,111,100,101,95,115,111,117,114,99,101, - 191,2,0,0,115,10,0,0,0,8,5,12,1,10,1,12, + 192,2,0,0,115,10,0,0,0,8,5,12,1,10,1,12, 1,20,1,114,200,0,0,0,169,2,114,164,0,0,0,218, 26,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, 104,95,108,111,99,97,116,105,111,110,115,99,2,0,0,0, @@ -1035,7 +1035,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 7,100,105,114,110,97,109,101,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,23,115,112,101,99,95,102,114, 111,109,95,102,105,108,101,95,108,111,99,97,116,105,111,110, - 208,2,0,0,115,84,0,0,0,8,12,4,4,10,1,2, + 209,2,0,0,115,84,0,0,0,8,12,4,4,10,1,2, 2,14,1,12,1,4,1,2,251,10,7,8,1,2,1,18, 1,12,1,2,1,16,8,6,1,8,3,14,1,14,1,10, 1,6,1,4,1,2,253,4,5,8,3,10,2,2,1,14, @@ -1074,7 +1074,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 76,79,67,65,76,95,77,65,67,72,73,78,69,114,19,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, 0,218,14,95,111,112,101,110,95,114,101,103,105,115,116,114, - 121,37,3,0,0,115,10,0,0,0,2,2,16,1,12,1, + 121,38,3,0,0,115,10,0,0,0,2,2,16,1,12,1, 18,1,2,255,122,36,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, @@ -1101,7 +1101,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,20,0,0,0,90,4,104,107,101,121,218,8,102,105,108, 101,112,97,116,104,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,16,95,115,101,97,114,99,104,95,114,101, - 103,105,115,116,114,121,44,3,0,0,115,30,0,0,0,6, + 103,105,115,116,114,121,45,3,0,0,115,30,0,0,0,6, 2,8,1,6,2,6,1,16,1,6,255,2,2,12,1,14, 1,28,255,2,128,4,4,12,254,6,1,2,255,122,38,87, 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, @@ -1124,7 +1124,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,103,101,116,114,222,0,0,0,114,164,0,0,0,114,212, 0,0,0,114,210,0,0,0,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,9,102,105,110,100,95,115,112, - 101,99,59,3,0,0,115,34,0,0,0,10,2,8,1,4, + 101,99,60,3,0,0,115,34,0,0,0,10,2,8,1,4, 1,2,1,12,1,12,1,6,1,14,1,14,1,6,1,8, 1,2,1,6,254,8,3,2,252,4,255,2,254,122,31,87, 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, @@ -1152,7 +1152,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,169,4,114,221,0,0,0,114,163,0,0,0,114,65, 0,0,0,114,210,0,0,0,114,7,0,0,0,114,7,0, 0,0,114,8,0,0,0,218,11,102,105,110,100,95,109,111, - 100,117,108,101,75,3,0,0,115,14,0,0,0,6,7,2, + 100,117,108,101,76,3,0,0,115,14,0,0,0,6,7,2, 2,4,254,12,3,8,1,6,1,4,2,122,33,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,169,2, @@ -1165,7 +1165,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 218,11,99,108,97,115,115,109,101,116,104,111,100,114,223,0, 0,0,114,226,0,0,0,114,229,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,214,0,0,0,25,3,0,0,115,30,0,0,0,8,0, + 114,214,0,0,0,26,3,0,0,115,30,0,0,0,8,0, 4,2,2,3,2,255,2,4,2,255,12,3,2,2,10,1, 2,6,10,1,2,14,12,1,2,15,16,1,114,214,0,0, 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1201,7 +1201,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,163,0,0,0,114,120,0,0,0,90,13,102,105,108,101, 110,97,109,101,95,98,97,115,101,90,9,116,97,105,108,95, 110,97,109,101,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,206,0,0,0,97,3,0,0,115,8,0,0, + 0,0,0,114,206,0,0,0,98,3,0,0,115,8,0,0, 0,18,3,16,1,14,1,16,1,122,24,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,2,0,0,0,0,0,0,0,0,0,0,0, @@ -1211,7 +1211,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 111,100,117,108,101,32,99,114,101,97,116,105,111,110,46,78, 114,7,0,0,0,169,2,114,143,0,0,0,114,210,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,13,99,114,101,97,116,101,95,109,111,100,117,108,101,105, + 218,13,99,114,101,97,116,101,95,109,111,100,117,108,101,106, 3,0,0,243,2,0,0,0,4,0,122,27,95,76,111,97, 100,101,114,66,97,115,105,99,115,46,99,114,101,97,116,101, 95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0, @@ -1232,7 +1232,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,41,3,114,143,0,0,0,218,6,109,111,100,117,108,101, 114,188,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,11,101,120,101,99,95,109,111,100,117,108, - 101,108,3,0,0,115,12,0,0,0,12,2,8,1,4,1, + 101,109,3,0,0,115,12,0,0,0,12,2,8,1,4,1, 8,1,4,255,20,2,122,25,95,76,111,97,100,101,114,66, 97,115,105,99,115,46,101,120,101,99,95,109,111,100,117,108, 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, @@ -1243,14 +1243,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,218,17,95,108,111,97,100,95,109,111,100,117,108,101,95, 115,104,105,109,169,2,114,143,0,0,0,114,163,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218, - 11,108,111,97,100,95,109,111,100,117,108,101,116,3,0,0, + 11,108,111,97,100,95,109,111,100,117,108,101,117,3,0,0, 115,2,0,0,0,12,3,122,25,95,76,111,97,100,101,114, 66,97,115,105,99,115,46,108,111,97,100,95,109,111,100,117, 108,101,78,41,8,114,150,0,0,0,114,149,0,0,0,114, 151,0,0,0,114,152,0,0,0,114,206,0,0,0,114,239, 0,0,0,114,245,0,0,0,114,248,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,235,0,0,0,92,3,0,0,115,12,0,0,0,8, + 0,114,235,0,0,0,93,3,0,0,115,12,0,0,0,8, 0,4,2,8,3,8,8,8,3,12,8,114,235,0,0,0, 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,0,0,64,0,0,0,115,74,0,0,0,101,0, @@ -1275,7 +1275,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,78,41,1,114,76,0,0,0,169,2,114,143,0, 0,0,114,65,0,0,0,114,7,0,0,0,114,7,0,0, 0,114,8,0,0,0,218,10,112,97,116,104,95,109,116,105, - 109,101,124,3,0,0,115,2,0,0,0,4,6,122,23,83, + 109,101,125,3,0,0,115,2,0,0,0,4,6,122,23,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,0, 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, @@ -1309,7 +1309,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,32,32,114,193,0,0,0,78,41,1,114, 251,0,0,0,114,250,0,0,0,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,10,112,97,116,104,95,115, - 116,97,116,115,132,3,0,0,115,2,0,0,0,14,12,122, + 116,97,116,115,133,3,0,0,115,2,0,0,0,14,12,122, 23,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,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, @@ -1333,7 +1333,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,90,10,99,97,99,104,101,95,112,97,116,104,114, 41,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, 0,0,0,218,15,95,99,97,99,104,101,95,98,121,116,101, - 99,111,100,101,146,3,0,0,115,2,0,0,0,12,8,122, + 99,111,100,101,147,3,0,0,115,2,0,0,0,12,8,122, 28,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,0,0,0,0,3,0,0,0,1,0, @@ -1350,7 +1350,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,32,32,32,32,78,114,7,0,0,0,41,3,114,143,0, 0,0,114,65,0,0,0,114,41,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,253,0,0,0, - 156,3,0,0,114,240,0,0,0,122,21,83,111,117,114,99, + 157,3,0,0,114,240,0,0,0,122,21,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,0,0,0,0,5,0,0, 0,10,0,0,0,67,0,0,0,115,70,0,0,0,124,0, @@ -1370,7 +1370,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,163,0,0,0,114,65,0,0,0,114,198,0,0, 0,218,3,101,120,99,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,10,103,101,116,95,115,111,117,114,99, - 101,163,3,0,0,115,24,0,0,0,10,2,2,1,12,1, + 101,164,3,0,0,115,24,0,0,0,10,2,2,1,12,1, 8,4,14,253,4,1,2,1,4,255,2,1,2,255,8,128, 2,255,122,23,83,111,117,114,99,101,76,111,97,100,101,114, 46,103,101,116,95,115,111,117,114,99,101,114,130,0,0,0, @@ -1392,7 +1392,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 7,99,111,109,112,105,108,101,41,4,114,143,0,0,0,114, 41,0,0,0,114,65,0,0,0,114,2,1,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,218,14,115, - 111,117,114,99,101,95,116,111,95,99,111,100,101,173,3,0, + 111,117,114,99,101,95,116,111,95,99,111,100,101,174,3,0, 0,115,6,0,0,0,12,5,4,1,6,255,122,27,83,111, 117,114,99,101,76,111,97,100,101,114,46,115,111,117,114,99, 101,95,116,111,95,99,111,100,101,99,2,0,0,0,0,0, @@ -1468,7 +1468,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 2,115,116,114,41,0,0,0,114,175,0,0,0,114,16,0, 0,0,90,10,98,121,116,101,115,95,100,97,116,97,90,11, 99,111,100,101,95,111,98,106,101,99,116,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,241,0,0,0,181, + 114,7,0,0,0,114,8,0,0,0,114,241,0,0,0,182, 3,0,0,115,168,0,0,0,10,7,4,1,4,1,4,1, 4,1,4,1,2,1,12,1,14,1,8,1,2,2,14,1, 14,1,4,1,12,2,2,1,14,1,14,1,4,1,2,3, @@ -1486,7 +1486,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,254,0,0,0,114,253,0,0,0,114,1,1, 0,0,114,5,1,0,0,114,241,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,249,0,0,0,122,3,0,0,115,16,0,0,0,8,0, + 114,249,0,0,0,123,3,0,0,115,16,0,0,0,8,0, 8,2,8,8,8,14,8,10,8,7,14,10,12,8,114,249, 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,4,0,0,0,0,0,0,0,115,92,0,0, @@ -1513,7 +1513,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,10,32,32,32,32,32,32,32,32,102,105,110,100,101,114, 46,78,114,183,0,0,0,41,3,114,143,0,0,0,114,163, 0,0,0,114,65,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,236,0,0,0,15,4,0,0, + 0,0,114,8,0,0,0,114,236,0,0,0,16,4,0,0, 115,4,0,0,0,6,3,10,1,122,19,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,0,0,0,0,2,0,0,0,2, @@ -1523,7 +1523,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,97,115,115,95,95,114,156,0,0,0,169,2,114,143,0, 0,0,90,5,111,116,104,101,114,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,6,95,95,101,113,95,95, - 21,4,0,0,243,6,0,0,0,12,1,10,1,2,255,122, + 22,4,0,0,243,6,0,0,0,12,1,10,1,2,255,122, 17,70,105,108,101,76,111,97,100,101,114,46,95,95,101,113, 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,0,3,0,0,0,67,0,0,0,243,20,0,0,0, @@ -1531,7 +1531,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 65,0,83,0,114,69,0,0,0,169,3,218,4,104,97,115, 104,114,141,0,0,0,114,65,0,0,0,169,1,114,143,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,218,8,95,95,104,97,115,104,95,95,25,4,0,0,243, + 0,218,8,95,95,104,97,115,104,95,95,26,4,0,0,243, 2,0,0,0,20,1,122,19,70,105,108,101,76,111,97,100, 101,114,46,95,95,104,97,115,104,95,95,99,2,0,0,0, 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, @@ -1546,7 +1546,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,78,41,3,218,5,115,117,112,101,114,114,11,1,0,0, 114,248,0,0,0,114,247,0,0,0,169,1,114,14,1,0, 0,114,7,0,0,0,114,8,0,0,0,114,248,0,0,0, - 28,4,0,0,115,2,0,0,0,16,10,122,22,70,105,108, + 29,4,0,0,115,2,0,0,0,16,10,122,22,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,0,0,0,0, 2,0,0,0,1,0,0,0,67,0,0,0,243,6,0,0, @@ -1556,7 +1556,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 32,102,111,117,110,100,32,98,121,32,116,104,101,32,102,105, 110,100,101,114,46,78,114,71,0,0,0,114,247,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 203,0,0,0,40,4,0,0,243,2,0,0,0,6,3,122, + 203,0,0,0,41,4,0,0,243,2,0,0,0,6,3,122, 23,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,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0, @@ -1577,7 +1577,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,95,99,111,100,101,114,109,0,0,0,90,4,114,101,97, 100,114,92,0,0,0,41,3,114,143,0,0,0,114,65,0, 0,0,114,94,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,255,0,0,0,45,4,0,0,115, + 0,114,8,0,0,0,114,255,0,0,0,46,4,0,0,115, 22,0,0,0,14,2,16,1,6,1,14,255,2,1,20,255, 14,3,6,1,14,255,2,1,20,255,122,19,70,105,108,101, 76,111,97,100,101,114,46,103,101,116,95,100,97,116,97,99, @@ -1590,7 +1590,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,41,3,114,143,0,0,0,114,244,0,0,0,114,31,1, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, 0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95, - 114,101,97,100,101,114,54,4,0,0,115,4,0,0,0,12, + 114,101,97,100,101,114,55,4,0,0,115,4,0,0,0,12, 2,8,1,122,30,70,105,108,101,76,111,97,100,101,114,46, 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, 100,101,114,41,13,114,150,0,0,0,114,149,0,0,0,114, @@ -1599,7 +1599,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,203,0,0,0,114,255,0,0,0,114,33,1,0, 0,90,13,95,95,99,108,97,115,115,99,101,108,108,95,95, 114,7,0,0,0,114,7,0,0,0,114,25,1,0,0,114, - 8,0,0,0,114,11,1,0,0,10,4,0,0,115,24,0, + 8,0,0,0,114,11,1,0,0,11,4,0,0,115,24,0, 0,0,8,0,4,2,8,3,8,6,8,4,2,3,14,1, 2,11,10,1,8,4,2,9,18,1,114,11,1,0,0,99, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1622,7 +1622,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,109,116,105,109,101,90,7,115,116,95,115,105,122,101,41, 3,114,143,0,0,0,114,65,0,0,0,114,10,1,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 252,0,0,0,64,4,0,0,115,4,0,0,0,8,2,14, + 252,0,0,0,65,4,0,0,115,4,0,0,0,8,2,14, 1,122,27,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,0,0,0,0,5,0,0,0,5, @@ -1632,7 +1632,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 41,2,114,139,0,0,0,114,253,0,0,0,41,5,114,143, 0,0,0,114,134,0,0,0,114,132,0,0,0,114,41,0, 0,0,114,78,0,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,254,0,0,0,69,4,0,0,115, + 0,114,8,0,0,0,114,254,0,0,0,70,4,0,0,115, 4,0,0,0,8,2,16,1,122,32,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,114,87,0,0,0,114, @@ -1668,7 +1668,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,218,6,112,97,114,101,110,116,114,120,0,0,0,114, 63,0,0,0,114,68,0,0,0,114,0,1,0,0,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,253,0, - 0,0,74,4,0,0,115,56,0,0,0,12,2,4,1,12, + 0,0,75,4,0,0,115,56,0,0,0,12,2,4,1,12, 2,12,1,10,1,12,254,12,4,10,1,2,1,14,1,12, 1,4,2,14,1,6,3,4,1,4,255,16,2,8,128,2, 1,12,1,18,1,14,1,8,2,2,1,18,255,8,128,2, @@ -1677,7 +1677,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 7,114,150,0,0,0,114,149,0,0,0,114,151,0,0,0, 114,152,0,0,0,114,252,0,0,0,114,254,0,0,0,114, 253,0,0,0,114,7,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,34,1,0,0,60,4,0, + 0,0,0,114,8,0,0,0,114,34,1,0,0,61,4,0, 0,115,10,0,0,0,8,0,4,2,8,2,8,5,18,5, 114,34,1,0,0,99,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,32, @@ -1699,7 +1699,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,176,0,0,0,114,189,0,0,0,114,7,1,0,0, 41,5,114,143,0,0,0,114,163,0,0,0,114,65,0,0, 0,114,41,0,0,0,114,175,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,241,0,0,0,109, + 114,7,0,0,0,114,8,0,0,0,114,241,0,0,0,110, 4,0,0,115,22,0,0,0,10,1,10,1,2,4,2,1, 6,254,12,4,2,1,14,1,2,1,2,1,6,253,122,29, 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111, @@ -1710,13 +1710,13 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,114,101,32,105,115,32,110,111,32,115,111,117,114,99,101, 32,99,111,100,101,46,78,114,7,0,0,0,114,247,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,1,1,0,0,125,4,0,0,114,24,0,0,0,122,31, + 114,1,1,0,0,126,4,0,0,114,24,0,0,0,122,31, 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, 41,6,114,150,0,0,0,114,149,0,0,0,114,151,0,0, 0,114,152,0,0,0,114,241,0,0,0,114,1,1,0,0, 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,41,1,0,0,105,4,0,0,115,8,0, + 8,0,0,0,114,41,1,0,0,106,4,0,0,115,8,0, 0,0,8,0,4,2,8,2,12,16,114,41,1,0,0,99, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,0,0,64,0,0,0,115,92,0,0,0,101,0,90, @@ -1737,20 +1737,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,95,0,124,2,124,0,95,1,100,0,83,0,114,69,0, 0,0,114,183,0,0,0,41,3,114,143,0,0,0,114,141, 0,0,0,114,65,0,0,0,114,7,0,0,0,114,7,0, - 0,0,114,8,0,0,0,114,236,0,0,0,138,4,0,0, + 0,0,114,8,0,0,0,114,236,0,0,0,139,4,0,0, 115,4,0,0,0,6,1,10,1,122,28,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, 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, 114,12,1,0,0,114,69,0,0,0,114,13,1,0,0,114, 15,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,16,1,0,0,142,4,0,0,114,17,1,0, + 0,0,0,114,16,1,0,0,143,4,0,0,114,17,1,0, 0,122,26,69,120,116,101,110,115,105,111,110,70,105,108,101, 76,111,97,100,101,114,46,95,95,101,113,95,95,99,1,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, 0,0,67,0,0,0,114,18,1,0,0,114,69,0,0,0, 114,19,1,0,0,114,21,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,22,1,0,0,146,4, + 7,0,0,0,114,8,0,0,0,114,22,1,0,0,147,4, 0,0,114,23,1,0,0,122,28,69,120,116,101,110,115,105, 111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,104, 97,115,104,95,95,99,2,0,0,0,0,0,0,0,0,0, @@ -1767,7 +1767,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 97,116,101,95,100,121,110,97,109,105,99,114,173,0,0,0, 114,141,0,0,0,114,65,0,0,0,41,3,114,143,0,0, 0,114,210,0,0,0,114,244,0,0,0,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,239,0,0,0,149, + 114,7,0,0,0,114,8,0,0,0,114,239,0,0,0,150, 4,0,0,115,14,0,0,0,4,2,6,1,4,255,6,2, 8,1,4,255,4,2,122,33,69,120,116,101,110,115,105,111, 110,70,105,108,101,76,111,97,100,101,114,46,99,114,101,97, @@ -1785,7 +1785,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,121,110,97,109,105,99,114,173,0,0,0,114,141,0,0, 0,114,65,0,0,0,169,2,114,143,0,0,0,114,244,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,245,0,0,0,157,4,0,0,115,8,0,0,0,14, + 0,114,245,0,0,0,158,4,0,0,115,8,0,0,0,14, 2,6,1,8,1,8,255,122,31,69,120,116,101,110,115,105, 111,110,70,105,108,101,76,111,97,100,101,114,46,101,120,101, 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, @@ -1803,14 +1803,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,236,0,0,0,78,114,7,0,0,0,169,2,114,5,0, 0,0,218,6,115,117,102,102,105,120,169,1,90,9,102,105, 108,101,95,110,97,109,101,114,7,0,0,0,114,8,0,0, - 0,114,9,0,0,0,166,4,0,0,115,6,0,0,0,6, + 0,114,9,0,0,0,167,4,0,0,115,6,0,0,0,6, 128,2,1,20,255,122,49,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,78,41,4,114,74,0,0,0, 114,65,0,0,0,218,3,97,110,121,114,232,0,0,0,114, 247,0,0,0,114,7,0,0,0,114,45,1,0,0,114,8, - 0,0,0,114,206,0,0,0,163,4,0,0,115,8,0,0, + 0,0,0,114,206,0,0,0,164,4,0,0,115,8,0,0, 0,14,2,12,1,2,1,8,255,122,30,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, @@ -1821,7 +1821,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,114,7,0,0,0, 114,247,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,241,0,0,0,169,4,0,0,114,24,0, + 8,0,0,0,114,241,0,0,0,170,4,0,0,114,24,0, 0,0,122,28,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,0,0,0,0,2,0,0, @@ -1831,14 +1831,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,115,32,104,97,118,101,32,110,111,32,115,111,117,114,99, 101,32,99,111,100,101,46,78,114,7,0,0,0,114,247,0, 0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,1,1,0,0,173,4,0,0,114,24,0,0,0,122, + 0,114,1,1,0,0,174,4,0,0,114,24,0,0,0,122, 30,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,99, 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, 1,0,0,0,67,0,0,0,114,26,1,0,0,114,27,1, 0,0,114,71,0,0,0,114,247,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,203,0,0,0, - 177,4,0,0,114,28,1,0,0,122,32,69,120,116,101,110, + 178,4,0,0,114,28,1,0,0,122,32,69,120,116,101,110, 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,103, 101,116,95,102,105,108,101,110,97,109,101,78,41,14,114,150, 0,0,0,114,149,0,0,0,114,151,0,0,0,114,152,0, @@ -1846,7 +1846,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,239,0,0,0,114,245,0,0,0,114,206,0,0,0, 114,241,0,0,0,114,1,1,0,0,114,160,0,0,0,114, 203,0,0,0,114,7,0,0,0,114,7,0,0,0,114,7, - 0,0,0,114,8,0,0,0,114,30,1,0,0,130,4,0, + 0,0,0,114,8,0,0,0,114,30,1,0,0,131,4,0, 0,115,24,0,0,0,8,0,4,2,8,6,8,4,8,4, 8,3,8,8,8,6,8,6,8,4,2,4,14,1,114,30, 1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1889,7 +1889,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 105,110,100,101,114,169,4,114,143,0,0,0,114,141,0,0, 0,114,65,0,0,0,90,11,112,97,116,104,95,102,105,110, 100,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,236,0,0,0,190,4,0,0,115,8,0,0,0, + 0,0,114,236,0,0,0,191,4,0,0,115,8,0,0,0, 6,1,6,1,14,1,10,1,122,23,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,0,0,0,0,4,0, @@ -1907,7 +1907,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 218,3,100,111,116,90,2,109,101,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,23,95,102,105,110,100,95, 112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,101, - 115,196,4,0,0,115,8,0,0,0,18,2,8,1,4,2, + 115,197,4,0,0,115,8,0,0,0,18,2,8,1,4,2, 8,3,122,38,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, @@ -1920,7 +1920,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,14, 112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,7, 0,0,0,114,7,0,0,0,114,8,0,0,0,114,50,1, - 0,0,206,4,0,0,115,4,0,0,0,12,1,16,1,122, + 0,0,207,4,0,0,115,4,0,0,0,12,1,16,1,122, 31,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,0,0,0,0,3,0,0, @@ -1936,7 +1936,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 143,0,0,0,90,11,112,97,114,101,110,116,95,112,97,116, 104,114,210,0,0,0,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,12,95,114,101,99,97,108,99,117,108, - 97,116,101,210,4,0,0,115,16,0,0,0,12,2,10,1, + 97,116,101,211,4,0,0,115,16,0,0,0,12,2,10,1, 14,1,18,3,6,1,8,1,6,1,6,1,122,27,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, @@ -1945,7 +1945,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,83,0,114,69,0,0,0,41,2,218,4,105,116,101,114, 114,57,1,0,0,114,21,1,0,0,114,7,0,0,0,114, 7,0,0,0,114,8,0,0,0,218,8,95,95,105,116,101, - 114,95,95,223,4,0,0,243,2,0,0,0,12,1,122,23, + 114,95,95,224,4,0,0,243,2,0,0,0,12,1,122,23, 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95, 95,105,116,101,114,95,95,99,2,0,0,0,0,0,0,0, 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, @@ -1953,7 +1953,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,69,0,0,0,169,1,114,57,1,0,0,41,2,114, 143,0,0,0,218,5,105,110,100,101,120,114,7,0,0,0, 114,7,0,0,0,114,8,0,0,0,218,11,95,95,103,101, - 116,105,116,101,109,95,95,226,4,0,0,114,61,1,0,0, + 116,105,116,101,109,95,95,227,4,0,0,114,61,1,0,0, 122,26,95,78,97,109,101,115,112,97,99,101,80,97,116,104, 46,95,95,103,101,116,105,116,101,109,95,95,99,3,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0, @@ -1962,14 +1962,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 49,1,0,0,41,3,114,143,0,0,0,114,63,1,0,0, 114,65,0,0,0,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,11,95,95,115,101,116,105,116,101,109,95, - 95,229,4,0,0,115,2,0,0,0,14,1,122,26,95,78, + 95,230,4,0,0,115,2,0,0,0,14,1,122,26,95,78, 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,115, 101,116,105,116,101,109,95,95,99,1,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, 0,114,58,1,0,0,114,69,0,0,0,41,2,114,4,0, 0,0,114,57,1,0,0,114,21,1,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,7,95,95,108, - 101,110,95,95,232,4,0,0,114,61,1,0,0,122,22,95, + 101,110,95,95,233,4,0,0,114,61,1,0,0,122,22,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,0,0, 0,0,1,0,0,0,3,0,0,0,67,0,0,0,243,12, @@ -1978,7 +1978,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,104,40,123,33,114,125,41,41,2,114,89,0,0,0,114, 49,1,0,0,114,21,1,0,0,114,7,0,0,0,114,7, 0,0,0,114,8,0,0,0,218,8,95,95,114,101,112,114, - 95,95,235,4,0,0,114,61,1,0,0,122,23,95,78,97, + 95,95,236,4,0,0,114,61,1,0,0,122,23,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,0,0,0, 0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0, @@ -1986,7 +1986,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,62,1,0,0,169,2,114,143,0,0,0,218, 4,105,116,101,109,114,7,0,0,0,114,7,0,0,0,114, 8,0,0,0,218,12,95,95,99,111,110,116,97,105,110,115, - 95,95,238,4,0,0,114,61,1,0,0,122,27,95,78,97, + 95,95,239,4,0,0,114,61,1,0,0,122,27,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,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, @@ -1994,7 +1994,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,0,100,0,83,0,114,69,0,0,0,41,2,114,49,1, 0,0,114,61,0,0,0,114,69,1,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,61,0,0,0, - 241,4,0,0,243,2,0,0,0,16,1,122,21,95,78,97, + 242,4,0,0,243,2,0,0,0,16,1,122,21,95,78,97, 109,101,115,112,97,99,101,80,97,116,104,46,97,112,112,101, 110,100,78,41,15,114,150,0,0,0,114,149,0,0,0,114, 151,0,0,0,114,152,0,0,0,114,236,0,0,0,114,55, @@ -2002,7 +2002,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,64,1,0,0,114,65,1,0,0,114,66,1,0, 0,114,68,1,0,0,114,71,1,0,0,114,61,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,47,1,0,0,183,4,0,0,115,26,0, + 8,0,0,0,114,47,1,0,0,184,4,0,0,115,26,0, 0,0,8,0,4,1,8,6,8,6,8,10,8,4,8,13, 8,3,8,3,8,3,8,3,8,3,12,3,114,47,1,0, 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2019,7 +2019,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 3,131,3,124,0,95,1,100,0,83,0,114,69,0,0,0, 41,2,114,47,1,0,0,114,49,1,0,0,114,53,1,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,236,0,0,0,247,4,0,0,115,2,0,0,0,18,1, + 114,236,0,0,0,248,4,0,0,115,2,0,0,0,18,1, 122,25,95,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,1,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, @@ -2043,21 +2043,21 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 100,0,0,0,114,101,0,0,0,114,89,0,0,0,114,150, 0,0,0,41,1,114,244,0,0,0,114,7,0,0,0,114, 7,0,0,0,114,8,0,0,0,218,11,109,111,100,117,108, - 101,95,114,101,112,114,250,4,0,0,115,8,0,0,0,6, + 101,95,114,101,112,114,251,4,0,0,115,8,0,0,0,6, 7,2,1,4,255,12,2,122,28,95,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,0,0, 0,0,2,0,0,0,1,0,0,0,67,0,0,0,114,23, 0,0,0,41,2,78,84,114,7,0,0,0,114,247,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 114,206,0,0,0,5,5,0,0,243,2,0,0,0,4,1, + 114,206,0,0,0,6,5,0,0,243,2,0,0,0,4,1, 122,27,95,78,97,109,101,115,112,97,99,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,0,0,0,0,2,0,0,0,1,0, 0,0,67,0,0,0,114,23,0,0,0,41,2,78,114,10, 0,0,0,114,7,0,0,0,114,247,0,0,0,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,114,1,1,0, - 0,8,5,0,0,114,75,1,0,0,122,27,95,78,97,109, + 0,9,5,0,0,114,75,1,0,0,122,27,95,78,97,109, 101,115,112,97,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, 0,0,0,0,2,0,0,0,6,0,0,0,67,0,0,0, @@ -2066,20 +2066,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,116,114,105,110,103,62,114,243,0,0,0,84,41,1,114, 3,1,0,0,41,1,114,4,1,0,0,114,247,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 241,0,0,0,11,5,0,0,114,72,1,0,0,122,25,95, + 241,0,0,0,12,5,0,0,114,72,1,0,0,122,25,95, 78,97,109,101,115,112,97,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,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, 0,114,23,0,0,0,114,237,0,0,0,114,7,0,0,0, 114,238,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,239,0,0,0,14,5,0,0,114,240,0, + 8,0,0,0,114,239,0,0,0,15,5,0,0,114,240,0, 0,0,122,30,95,78,97,109,101,115,112,97,99,101,76,111, 97,100,101,114,46,99,114,101,97,116,101,95,109,111,100,117, 108,101,99,2,0,0,0,0,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,0,83,0,114,69,0,0,0,114,7,0,0,0,114,42, 1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,245,0,0,0,17,5,0,0,114,75,1,0,0, + 0,0,114,245,0,0,0,18,5,0,0,114,75,1,0,0, 122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100, 101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, @@ -2097,7 +2097,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 123,33,114,125,78,41,4,114,159,0,0,0,114,173,0,0, 0,114,49,1,0,0,114,246,0,0,0,114,247,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 248,0,0,0,20,5,0,0,115,8,0,0,0,6,7,4, + 248,0,0,0,21,5,0,0,115,8,0,0,0,6,7,4, 1,4,255,12,3,122,28,95,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,99,2,0,0,0,0,0,0,0,0,0,0,0, @@ -2108,7 +2108,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,114,41,3,114,32,1,0,0,114,76,1,0,0,114,49, 1,0,0,41,3,114,143,0,0,0,114,244,0,0,0,114, 76,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,33,1,0,0,32,5,0,0,115,4,0,0, + 0,0,0,114,33,1,0,0,33,5,0,0,115,4,0,0, 0,12,1,10,1,122,36,95,78,97,109,101,115,112,97,99, 101,76,111,97,100,101,114,46,103,101,116,95,114,101,115,111, 117,114,99,101,95,114,101,97,100,101,114,78,41,13,114,150, @@ -2117,7 +2117,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,1,1,0,0,114,241,0,0,0,114,239,0,0,0, 114,245,0,0,0,114,248,0,0,0,114,33,1,0,0,114, 7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,73,1,0,0,246,4,0,0,115,22,0,0, + 0,0,0,114,73,1,0,0,247,4,0,0,115,22,0,0, 0,8,0,8,1,2,3,10,1,8,10,8,3,8,3,8, 3,8,3,8,3,12,12,114,73,1,0,0,99,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, @@ -2154,7 +2154,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 99,104,101,218,5,105,116,101,109,115,114,153,0,0,0,114, 78,1,0,0,41,2,114,141,0,0,0,218,6,102,105,110, 100,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,78,1,0,0,43,5,0,0,115,14,0,0,0, + 0,0,114,78,1,0,0,44,5,0,0,115,14,0,0,0, 22,4,8,1,10,1,10,1,8,1,2,128,4,252,122,28, 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,1,0,0, @@ -2174,7 +2174,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 162,0,0,0,114,142,0,0,0,41,2,114,65,0,0,0, 90,4,104,111,111,107,114,7,0,0,0,114,7,0,0,0, 114,8,0,0,0,218,11,95,112,97,116,104,95,104,111,111, - 107,115,53,5,0,0,115,18,0,0,0,16,3,12,1,10, + 107,115,54,5,0,0,115,18,0,0,0,16,3,12,1,10, 1,2,1,14,1,12,1,4,1,4,2,2,253,122,22,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,0,0, @@ -2206,7 +2206,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,65,0,0,0,114,82,1,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,20,95,112,97, 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,66,5,0,0,115,28,0,0,0,8,8,2,1,12,1, + 101,67,5,0,0,115,28,0,0,0,8,8,2,1,12,1, 12,1,6,3,2,1,12,1,4,4,12,253,10,1,12,1, 4,1,2,253,2,250,122,31,80,97,116,104,70,105,110,100, 101,114,46,95,112,97,116,104,95,105,109,112,111,114,116,101, @@ -2236,7 +2236,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,0,114,82,1,0,0,114,166,0,0,0,114,164,0, 0,0,114,165,0,0,0,114,210,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,218,16,95,108,101, - 103,97,99,121,95,103,101,116,95,115,112,101,99,88,5,0, + 103,97,99,121,95,103,101,116,95,115,112,101,99,89,5,0, 0,115,26,0,0,0,10,4,16,1,12,2,16,1,16,2, 12,2,10,1,4,1,8,1,12,1,12,1,6,1,4,1, 122,27,80,97,116,104,70,105,110,100,101,114,46,95,108,101, @@ -2268,7 +2268,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,115,112,97,99,101,95,112,97,116,104,90,5,101,110,116, 114,121,114,82,1,0,0,114,210,0,0,0,114,165,0,0, 0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,9,95,103,101,116,95,115,112,101,99,109,5,0,0,115, + 218,9,95,103,101,116,95,115,112,101,99,110,5,0,0,115, 42,0,0,0,4,5,8,1,14,1,2,1,10,1,8,1, 10,1,14,1,12,2,8,1,2,1,10,1,8,1,6,1, 8,1,8,1,10,5,2,128,12,2,6,1,4,1,122,20, @@ -2295,7 +2295,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,0,114,47,1,0,0,41,6,114,221,0,0,0,114,163, 0,0,0,114,65,0,0,0,114,225,0,0,0,114,210,0, 0,0,114,90,1,0,0,114,7,0,0,0,114,7,0,0, - 0,114,8,0,0,0,114,226,0,0,0,141,5,0,0,115, + 0,114,8,0,0,0,114,226,0,0,0,142,5,0,0,115, 26,0,0,0,8,6,6,1,14,1,8,1,4,1,10,1, 6,1,4,1,6,3,16,1,4,1,4,2,4,2,122,20, 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, @@ -2323,7 +2323,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,97, 100,78,114,227,0,0,0,114,228,0,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,229,0,0,0, - 165,5,0,0,115,14,0,0,0,6,8,2,2,4,254,12, + 166,5,0,0,115,14,0,0,0,6,8,2,2,4,254,12, 3,8,1,4,1,6,1,122,22,80,97,116,104,70,105,110, 100,101,114,46,102,105,110,100,95,109,111,100,117,108,101,99, 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, @@ -2355,7 +2355,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 115,116,114,105,98,117,116,105,111,110,115,41,3,114,144,0, 0,0,114,145,0,0,0,114,92,1,0,0,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,93,1,0,0, - 181,5,0,0,115,4,0,0,0,12,10,16,1,122,29,80, + 182,5,0,0,115,4,0,0,0,12,10,16,1,122,29,80, 97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,100, 105,115,116,114,105,98,117,116,105,111,110,115,114,69,0,0, 0,114,230,0,0,0,41,14,114,150,0,0,0,114,149,0, @@ -2364,7 +2364,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,87,1,0,0,114,88,1,0,0,114,91,1,0,0,114, 226,0,0,0,114,229,0,0,0,114,93,1,0,0,114,7, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,77,1,0,0,39,5,0,0,115,36,0,0,0, + 0,0,114,77,1,0,0,40,5,0,0,115,36,0,0,0, 8,0,4,2,2,2,10,1,2,9,10,1,2,12,10,1, 2,21,10,1,2,20,12,1,2,31,12,1,2,23,12,1, 2,15,14,1,114,77,1,0,0,99,0,0,0,0,0,0, @@ -2411,7 +2411,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,136,0,102,2,86,0,1,0,113,2,100,0,83,0,114, 69,0,0,0,114,7,0,0,0,114,43,1,0,0,169,1, 114,164,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 9,0,0,0,210,5,0,0,115,4,0,0,0,6,128,18, + 9,0,0,0,211,5,0,0,115,4,0,0,0,6,128,18, 0,122,38,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,114,97,0,0,0,114,130, @@ -2425,7 +2425,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 108,111,97,100,101,114,95,100,101,116,97,105,108,115,90,7, 108,111,97,100,101,114,115,114,212,0,0,0,114,7,0,0, 0,114,95,1,0,0,114,8,0,0,0,114,236,0,0,0, - 204,5,0,0,115,20,0,0,0,4,4,12,1,26,1,6, + 205,5,0,0,115,20,0,0,0,4,4,12,1,26,1,6, 1,10,2,10,1,18,1,6,1,8,1,12,1,122,19,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,0,0,0,0,1, @@ -2435,7 +2435,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,99,116,111,114,121,32,109,116,105,109,101,46,114,130,0, 0,0,78,41,1,114,97,1,0,0,114,21,1,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,78, - 1,0,0,220,5,0,0,114,81,0,0,0,122,28,70,105, + 1,0,0,221,5,0,0,114,81,0,0,0,122,28,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,0,0,0,0,3,0,0,0,4,0,0,0,67, @@ -2466,7 +2466,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,226,0,0,0,114,164,0,0,0,114,202,0,0,0,41, 3,114,143,0,0,0,114,163,0,0,0,114,210,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 161,0,0,0,226,5,0,0,115,14,0,0,0,6,7,2, + 161,0,0,0,227,5,0,0,115,14,0,0,0,6,7,2, 2,4,254,10,3,8,1,8,1,16,1,122,22,70,105,108, 101,70,105,110,100,101,114,46,102,105,110,100,95,108,111,97, 100,101,114,99,6,0,0,0,0,0,0,0,0,0,0,0, @@ -2477,7 +2477,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,211,0,0,0,114,163,0,0,0,114,65,0,0,0, 90,4,115,109,115,108,114,225,0,0,0,114,164,0,0,0, 114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114, - 91,1,0,0,241,5,0,0,115,8,0,0,0,10,1,8, + 91,1,0,0,242,5,0,0,115,8,0,0,0,10,1,8, 1,2,1,6,255,122,20,70,105,108,101,70,105,110,100,101, 114,46,95,103,101,116,95,115,112,101,99,78,99,3,0,0, 0,0,0,0,0,0,0,0,0,14,0,0,0,9,0,0, @@ -2533,7 +2533,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,211,0,0,0,90,13,105,110,105,116,95,102,105,108, 101,110,97,109,101,90,9,102,117,108,108,95,112,97,116,104, 114,210,0,0,0,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,114,226,0,0,0,246,5,0,0,115,86,0, + 8,0,0,0,114,226,0,0,0,247,5,0,0,115,86,0, 0,0,4,5,14,1,2,1,24,1,12,1,6,1,10,1, 8,1,6,1,6,2,6,1,10,1,6,2,4,1,8,2, 12,1,14,1,8,1,10,1,8,1,24,1,2,255,8,5, @@ -2565,7 +2565,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,124,0,93,6,125,1,124,1,160,0,161,0,146,2,113, 2,83,0,114,7,0,0,0,41,1,114,131,0,0,0,41, 2,114,5,0,0,0,90,2,102,110,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,13,0,0,0,70,6, + 7,0,0,0,114,8,0,0,0,114,13,0,0,0,71,6, 0,0,115,2,0,0,0,20,0,122,41,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,115,101,116,99, @@ -2582,7 +2582,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 102,102,105,120,95,99,111,110,116,101,110,116,115,114,70,1, 0,0,114,141,0,0,0,114,54,1,0,0,114,44,1,0, 0,90,8,110,101,119,95,110,97,109,101,114,7,0,0,0, - 114,7,0,0,0,114,8,0,0,0,114,102,1,0,0,41, + 114,7,0,0,0,114,8,0,0,0,114,102,1,0,0,42, 6,0,0,115,38,0,0,0,6,2,2,1,22,1,18,1, 6,3,12,3,12,1,6,7,8,1,16,1,4,1,18,1, 4,2,12,1,6,1,12,1,20,1,4,255,2,233,122,22, @@ -2621,7 +2621,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,142,0,0,0,114,71,0,0,0,169,2,114,221,0, 0,0,114,101,1,0,0,114,7,0,0,0,114,8,0,0, 0,218,24,112,97,116,104,95,104,111,111,107,95,102,111,114, - 95,70,105,108,101,70,105,110,100,101,114,82,6,0,0,115, + 95,70,105,108,101,70,105,110,100,101,114,83,6,0,0,115, 6,0,0,0,8,2,12,1,16,1,122,54,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, @@ -2629,14 +2629,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,114,78,114,7,0,0,0,41,3,114,221,0,0,0,114, 101,1,0,0,114,107,1,0,0,114,7,0,0,0,114,106, 1,0,0,114,8,0,0,0,218,9,112,97,116,104,95,104, - 111,111,107,72,6,0,0,115,4,0,0,0,14,10,4,6, + 111,111,107,73,6,0,0,115,4,0,0,0,14,10,4,6, 122,20,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,0, 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,114, 67,1,0,0,41,2,78,122,16,70,105,108,101,70,105,110, 100,101,114,40,123,33,114,125,41,41,2,114,89,0,0,0, 114,65,0,0,0,114,21,1,0,0,114,7,0,0,0,114, - 7,0,0,0,114,8,0,0,0,114,68,1,0,0,90,6, + 7,0,0,0,114,8,0,0,0,114,68,1,0,0,91,6, 0,0,114,61,1,0,0,122,19,70,105,108,101,70,105,110, 100,101,114,46,95,95,114,101,112,114,95,95,114,69,0,0, 0,41,15,114,150,0,0,0,114,149,0,0,0,114,151,0, @@ -2645,7 +2645,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 114,91,1,0,0,114,226,0,0,0,114,102,1,0,0,114, 234,0,0,0,114,108,1,0,0,114,68,1,0,0,114,7, 0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0, - 0,0,114,94,1,0,0,195,5,0,0,115,24,0,0,0, + 0,0,114,94,1,0,0,196,5,0,0,115,24,0,0,0, 8,0,4,2,8,7,8,16,4,4,8,2,8,15,10,5, 8,51,2,31,10,1,12,17,114,94,1,0,0,99,4,0, 0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0, @@ -2668,7 +2668,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 90,8,112,97,116,104,110,97,109,101,90,9,99,112,97,116, 104,110,97,109,101,114,164,0,0,0,114,210,0,0,0,114, 7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,14, - 95,102,105,120,95,117,112,95,109,111,100,117,108,101,96,6, + 95,102,105,120,95,117,112,95,109,111,100,117,108,101,97,6, 0,0,115,36,0,0,0,10,2,10,1,4,1,4,1,8, 1,8,1,12,1,10,2,4,1,14,1,2,1,8,1,8, 1,8,1,14,1,12,1,6,2,2,254,114,113,1,0,0, @@ -2689,7 +2689,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,120,116,101,110,115,105,111,110,115,90,6,115,111,117,114, 99,101,90,8,98,121,116,101,99,111,100,101,114,7,0,0, 0,114,7,0,0,0,114,8,0,0,0,114,208,0,0,0, - 119,6,0,0,115,8,0,0,0,12,5,8,1,8,1,10, + 120,6,0,0,115,8,0,0,0,12,5,8,1,8,1,10, 1,114,208,0,0,0,99,1,0,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,1,0,0,0,67,0,0,0,115, 8,0,0,0,124,0,97,0,100,0,83,0,114,69,0,0, @@ -2697,7 +2697,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,115,116,114,97,112,95,109,111,100,117,108,101,114,7,0, 0,0,114,7,0,0,0,114,8,0,0,0,218,21,95,115, 101,116,95,98,111,111,116,115,116,114,97,112,95,109,111,100, - 117,108,101,130,6,0,0,115,2,0,0,0,8,2,114,116, + 117,108,101,131,6,0,0,115,2,0,0,0,8,2,114,116, 1,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,4,0,0,0,67,0,0,0,115,50,0,0, 0,116,0,124,0,131,1,1,0,116,1,131,0,125,1,116, @@ -2712,7 +2712,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 104,114,61,0,0,0,114,77,1,0,0,41,2,114,115,1, 0,0,90,17,115,117,112,112,111,114,116,101,100,95,108,111, 97,100,101,114,115,114,7,0,0,0,114,7,0,0,0,114, - 8,0,0,0,218,8,95,105,110,115,116,97,108,108,135,6, + 8,0,0,0,218,8,95,105,110,115,116,97,108,108,136,6, 0,0,115,8,0,0,0,8,2,6,1,20,1,16,1,114, 118,1,0,0,41,1,114,87,0,0,0,114,69,0,0,0, 41,3,78,78,78,41,2,114,0,0,0,0,114,0,0,0, @@ -2757,7 +2757,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,8,1,10,1,14,1,4,4,4,1,2,1,2,1,4, 255,8,4,6,16,8,3,8,5,8,5,4,6,10,1,8, 30,8,6,8,8,8,10,8,9,8,5,4,7,10,1,8, - 8,10,5,10,22,0,127,16,29,12,1,4,2,4,1,6, + 8,10,5,10,22,0,127,16,30,12,1,4,2,4,1,6, 2,4,1,10,1,8,2,6,2,8,2,16,2,8,71,8, 40,8,19,8,12,8,12,8,31,8,20,8,33,8,28,10, 24,10,13,10,10,8,11,6,14,4,3,2,1,12,255,14, diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index e20a89862e..951f8f8a55 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -98,7 +98,7 @@ static void *opcode_targets[256] = { &&TARGET_DELETE_ATTR, &&TARGET_STORE_GLOBAL, &&TARGET_DELETE_GLOBAL, - &&_unknown_opcode, + &&TARGET_ROT_N, &&TARGET_LOAD_CONST, &&TARGET_LOAD_NAME, &&TARGET_BUILD_TUPLE, |