Commit ef61c524 authored by Serhiy Storchaka's avatar Serhiy Storchaka Committed by GitHub

bpo-37830: Fix compilation of break and continue in finally. (GH-15320)

Fix compilation of "break" and "continue" in the
"finally" block when the corresponding "try" block
contains "return" with a non-constant value.
parent e9c90aa4
...@@ -270,6 +270,7 @@ _code_type = type(_write_atomic.__code__) ...@@ -270,6 +270,7 @@ _code_type = type(_write_atomic.__code__)
# comprehensions #35224) # comprehensions #35224)
# Python 3.8b2 3412 (Swap the position of positional args and positional # Python 3.8b2 3412 (Swap the position of positional args and positional
# only args in ast.arguments #37593) # only args in ast.arguments #37593)
# Python 3.8b4 3413 (Fix "break" and "continue" in "finally" #37830)
# #
# MAGIC must change whenever the bytecode emitted by the compiler may no # MAGIC must change whenever the bytecode emitted by the compiler may no
# longer be understood by older implementations of the eval loop (usually # longer be understood by older implementations of the eval loop (usually
...@@ -278,7 +279,7 @@ _code_type = type(_write_atomic.__code__) ...@@ -278,7 +279,7 @@ _code_type = type(_write_atomic.__code__)
# Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array
# in PC/launcher.c must also be updated. # in PC/launcher.c must also be updated.
MAGIC_NUMBER = (3412).to_bytes(2, 'little') + b'\r\n' MAGIC_NUMBER = (3413).to_bytes(2, 'little') + b'\r\n'
_RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c
_PYCACHE = '__pycache__' _PYCACHE = '__pycache__'
......
...@@ -980,7 +980,7 @@ expected_opinfo_jumpy = [ ...@@ -980,7 +980,7 @@ expected_opinfo_jumpy = [
Instruction(opname='SETUP_FINALLY', opcode=122, arg=70, argval=174, argrepr='to 174', offset=102, starts_line=20, is_jump_target=True), Instruction(opname='SETUP_FINALLY', opcode=122, arg=70, argval=174, argrepr='to 174', offset=102, starts_line=20, is_jump_target=True),
Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=118, argrepr='to 118', offset=104, starts_line=None, is_jump_target=False), Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=118, argrepr='to 118', offset=104, starts_line=None, is_jump_target=False),
Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=106, starts_line=21, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=106, starts_line=21, is_jump_target=False),
Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False),
Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False), Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False),
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False),
Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False), Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False),
...@@ -993,7 +993,7 @@ expected_opinfo_jumpy = [ ...@@ -993,7 +993,7 @@ expected_opinfo_jumpy = [
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=128, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=128, starts_line=None, is_jump_target=False),
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=130, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=130, starts_line=None, is_jump_target=False),
Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=132, starts_line=23, is_jump_target=False), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=132, starts_line=23, is_jump_target=False),
Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=134, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=134, starts_line=None, is_jump_target=False),
Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=136, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=136, starts_line=None, is_jump_target=False),
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False),
Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=140, starts_line=None, is_jump_target=False), Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=140, starts_line=None, is_jump_target=False),
...@@ -1003,7 +1003,7 @@ expected_opinfo_jumpy = [ ...@@ -1003,7 +1003,7 @@ expected_opinfo_jumpy = [
Instruction(opname='SETUP_WITH', opcode=143, arg=14, argval=164, argrepr='to 164', offset=148, starts_line=None, is_jump_target=False), Instruction(opname='SETUP_WITH', opcode=143, arg=14, argval=164, argrepr='to 164', offset=148, starts_line=None, is_jump_target=False),
Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=150, starts_line=None, is_jump_target=False), Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=150, starts_line=None, is_jump_target=False),
Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=152, starts_line=26, is_jump_target=False), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=152, starts_line=26, is_jump_target=False),
Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=154, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval='Never reach this', argrepr="'Never reach this'", offset=154, starts_line=None, is_jump_target=False),
Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=156, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=156, starts_line=None, is_jump_target=False),
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False),
Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False), Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False),
...@@ -1014,7 +1014,7 @@ expected_opinfo_jumpy = [ ...@@ -1014,7 +1014,7 @@ expected_opinfo_jumpy = [
Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=170, starts_line=None, is_jump_target=True), Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=170, starts_line=None, is_jump_target=True),
Instruction(opname='BEGIN_FINALLY', opcode=53, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=False), Instruction(opname='BEGIN_FINALLY', opcode=53, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=False),
Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=174, starts_line=28, is_jump_target=True), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=174, starts_line=28, is_jump_target=True),
Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=176, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=176, starts_line=None, is_jump_target=False),
Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=178, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=178, starts_line=None, is_jump_target=False),
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False),
Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False),
......
...@@ -991,6 +991,60 @@ class GrammarTests(unittest.TestCase): ...@@ -991,6 +991,60 @@ class GrammarTests(unittest.TestCase):
return 4 return 4
self.assertEqual(g3(), 4) self.assertEqual(g3(), 4)
def test_break_in_finally_after_return(self):
# See issue #37830
def g1(x):
for count in [0, 1]:
count2 = 0
while count2 < 20:
count2 += 10
try:
return count + count2
finally:
if x:
break
return 'end', count, count2
self.assertEqual(g1(False), 10)
self.assertEqual(g1(True), ('end', 1, 10))
def g2(x):
for count in [0, 1]:
for count2 in [10, 20]:
try:
return count + count2
finally:
if x:
break
return 'end', count, count2
self.assertEqual(g2(False), 10)
self.assertEqual(g2(True), ('end', 1, 10))
def test_continue_in_finally_after_return(self):
# See issue #37830
def g1(x):
count = 0
while count < 100:
count += 1
try:
return count
finally:
if x:
continue
return 'end', count
self.assertEqual(g1(False), 1)
self.assertEqual(g1(True), ('end', 100))
def g2(x):
for count in [0, 1]:
try:
return count
finally:
if x:
continue
return 'end', count
self.assertEqual(g2(False), 0)
self.assertEqual(g2(True), ('end', 1))
def test_yield(self): def test_yield(self):
# Allowed as standalone statement # Allowed as standalone statement
def g(): yield 1 def g(): yield 1
......
...@@ -861,7 +861,7 @@ class MagicNumberTests(unittest.TestCase): ...@@ -861,7 +861,7 @@ class MagicNumberTests(unittest.TestCase):
in advance. Such exceptional releases will then require an in advance. Such exceptional releases will then require an
adjustment to this test case. adjustment to this test case.
""" """
EXPECTED_MAGIC_NUMBER = 3410 EXPECTED_MAGIC_NUMBER = 3413
actual = int.from_bytes(importlib.util.MAGIC_NUMBER[:2], 'little') actual = int.from_bytes(importlib.util.MAGIC_NUMBER[:2], 'little')
msg = ( msg = (
......
Fixed compilation of :keyword:`break` and :keyword:`continue` in the
:keyword:`finally` block when the corresponding :keyword:`try` block
contains :keyword:`return` with a non-constant value.
...@@ -233,6 +233,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore ...@@ -233,6 +233,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore
* the 'finally' blocks. */ * the 'finally' blocks. */
memset(blockstack, '\0', sizeof(blockstack)); memset(blockstack, '\0', sizeof(blockstack));
blockstack_top = 0; blockstack_top = 0;
unsigned char prevop = NOP;
for (addr = 0; addr < code_len; addr += sizeof(_Py_CODEUNIT)) { for (addr = 0; addr < code_len; addr += sizeof(_Py_CODEUNIT)) {
unsigned char op = code[addr]; unsigned char op = code[addr];
switch (op) { switch (op) {
...@@ -259,17 +260,24 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore ...@@ -259,17 +260,24 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore
"can't jump into the middle of a block"); "can't jump into the middle of a block");
return -1; return -1;
} }
int in_for_loop = op == FOR_ITER || code[target_addr] == END_ASYNC_FOR;
if (first_in && !second_in) { if (first_in && !second_in) {
if (op != FOR_ITER && code[target_addr] != END_ASYNC_FOR) { if (!delta_iblock) {
delta_iblock++; if (in_for_loop) {
/* Pop the iterators of any 'for' and 'async for' loop
* we're jumping out of. */
delta++;
}
else if (prevop == LOAD_CONST) {
/* Pops None pushed before SETUP_FINALLY. */
delta++;
}
} }
else if (!delta_iblock) { if (!in_for_loop) {
/* Pop the iterators of any 'for' and 'async for' loop delta_iblock++;
* we're jumping out of. */
delta++;
} }
} }
if (op != FOR_ITER && code[target_addr] != END_ASYNC_FOR) { if (!in_for_loop) {
blockstack[blockstack_top++] = target_addr; blockstack[blockstack_top++] = target_addr;
} }
break; break;
...@@ -293,6 +301,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore ...@@ -293,6 +301,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore
break; break;
} }
} }
prevop = op;
} }
/* Verify that the blockstack tracking code didn't get lost. */ /* Verify that the blockstack tracking code didn't get lost. */
......
...@@ -1139,7 +1139,7 @@ static PYC_MAGIC magic_values[] = { ...@@ -1139,7 +1139,7 @@ static PYC_MAGIC magic_values[] = {
{ 3320, 3351, L"3.5" }, { 3320, 3351, L"3.5" },
{ 3360, 3379, L"3.6" }, { 3360, 3379, L"3.6" },
{ 3390, 3399, L"3.7" }, { 3390, 3399, L"3.7" },
{ 3400, 3410, L"3.8" }, { 3400, 3419, L"3.8" },
{ 0 } { 0 }
}; };
......
...@@ -81,7 +81,7 @@ It's called a frame block to distinguish it from a basic block in the ...@@ -81,7 +81,7 @@ It's called a frame block to distinguish it from a basic block in the
compiler IR. compiler IR.
*/ */
enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_END, enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_TRY2, FINALLY_END,
WITH, ASYNC_WITH, HANDLER_CLEANUP }; WITH, ASYNC_WITH, HANDLER_CLEANUP };
struct fblockinfo { struct fblockinfo {
...@@ -1664,7 +1664,12 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, ...@@ -1664,7 +1664,12 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
return 1; return 1;
case FINALLY_END: case FINALLY_END:
info->fb_exit = NULL;
ADDOP_I(c, POP_FINALLY, preserve_tos); ADDOP_I(c, POP_FINALLY, preserve_tos);
if (preserve_tos) {
ADDOP(c, ROT_TWO);
}
ADDOP(c, POP_TOP);
return 1; return 1;
case FOR_LOOP: case FOR_LOOP:
...@@ -1684,6 +1689,19 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, ...@@ -1684,6 +1689,19 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info,
ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); ADDOP_JREL(c, CALL_FINALLY, info->fb_exit);
return 1; return 1;
case FINALLY_TRY2:
ADDOP(c, POP_BLOCK);
if (preserve_tos) {
ADDOP(c, ROT_TWO);
ADDOP(c, POP_TOP);
ADDOP_JREL(c, CALL_FINALLY, info->fb_exit);
}
else {
ADDOP_JREL(c, CALL_FINALLY, info->fb_exit);
ADDOP(c, POP_TOP);
}
return 1;
case WITH: case WITH:
case ASYNC_WITH: case ASYNC_WITH:
ADDOP(c, POP_BLOCK); ADDOP(c, POP_BLOCK);
...@@ -2869,17 +2887,47 @@ compiler_continue(struct compiler *c) ...@@ -2869,17 +2887,47 @@ compiler_continue(struct compiler *c)
static int static int
compiler_try_finally(struct compiler *c, stmt_ty s) compiler_try_finally(struct compiler *c, stmt_ty s)
{ {
basicblock *body, *end; basicblock *start, *newcurblock, *body, *end;
int break_finally = 1;
body = compiler_new_block(c); body = compiler_new_block(c);
end = compiler_new_block(c); end = compiler_new_block(c);
if (body == NULL || end == NULL) if (body == NULL || end == NULL)
return 0; return 0;
start = c->u->u_curblock;
/* `finally` block. Compile it first to determine if any of "break",
"continue" or "return" are used in it. */
compiler_use_next_block(c, end);
if (!compiler_push_fblock(c, FINALLY_END, end, end))
return 0;
VISIT_SEQ(c, stmt, s->v.Try.finalbody);
ADDOP(c, END_FINALLY);
break_finally = (c->u->u_fblock[c->u->u_nfblocks - 1].fb_exit == NULL);
if (break_finally) {
/* Pops a placeholder. See below */
ADDOP(c, POP_TOP);
}
compiler_pop_fblock(c, FINALLY_END, end);
newcurblock = c->u->u_curblock;
c->u->u_curblock = start;
start->b_next = NULL;
/* `try` block */ /* `try` block */
c->u->u_lineno_set = 0;
c->u->u_lineno = s->lineno;
c->u->u_col_offset = s->col_offset;
if (break_finally) {
/* Pushes a placeholder for the value of "return" in the "try" block
to balance the stack for "break", "continue" and "return" in
the "finally" block. */
ADDOP_LOAD_CONST(c, Py_None);
}
ADDOP_JREL(c, SETUP_FINALLY, end); ADDOP_JREL(c, SETUP_FINALLY, end);
compiler_use_next_block(c, body); compiler_use_next_block(c, body);
if (!compiler_push_fblock(c, FINALLY_TRY, body, end)) if (!compiler_push_fblock(c, break_finally ? FINALLY_TRY2 : FINALLY_TRY, body, end))
return 0; return 0;
if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) { if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
if (!compiler_try_except(c, s)) if (!compiler_try_except(c, s))
...@@ -2890,15 +2938,11 @@ compiler_try_finally(struct compiler *c, stmt_ty s) ...@@ -2890,15 +2938,11 @@ compiler_try_finally(struct compiler *c, stmt_ty s)
} }
ADDOP(c, POP_BLOCK); ADDOP(c, POP_BLOCK);
ADDOP(c, BEGIN_FINALLY); ADDOP(c, BEGIN_FINALLY);
compiler_pop_fblock(c, FINALLY_TRY, body); compiler_pop_fblock(c, break_finally ? FINALLY_TRY2 : FINALLY_TRY, body);
c->u->u_curblock->b_next = end;
c->u->u_curblock = newcurblock;
/* `finally` block */
compiler_use_next_block(c, end);
if (!compiler_push_fblock(c, FINALLY_END, end, NULL))
return 0;
VISIT_SEQ(c, stmt, s->v.Try.finalbody);
ADDOP(c, END_FINALLY);
compiler_pop_fblock(c, FINALLY_END, end);
return 1; return 1;
} }
......
...@@ -301,14 +301,14 @@ const unsigned char _Py_M__importlib_bootstrap[] = { ...@@ -301,14 +301,14 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
0,0,115,6,0,0,0,8,2,8,4,8,4,114,50,0, 0,0,115,6,0,0,0,8,2,8,4,8,4,114,50,0,
0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,
0,0,0,8,0,0,0,67,0,0,0,115,130,0,0,0, 0,0,0,8,0,0,0,67,0,0,0,115,130,0,0,0,
116,0,160,1,161,0,1,0,122,106,122,14,116,2,124,0, 116,0,160,1,161,0,1,0,122,106,122,14,116,3,124,0,
25,0,131,0,125,1,87,0,110,24,4,0,116,3,107,10, 25,0,131,0,125,1,87,0,110,24,4,0,116,4,107,10,
114,48,1,0,1,0,1,0,100,1,125,1,89,0,110,2, 114,48,1,0,1,0,1,0,100,1,125,1,89,0,110,2,
88,0,124,1,100,1,107,8,114,112,116,4,100,1,107,8, 88,0,124,1,100,1,107,8,114,112,116,5,100,1,107,8,
114,76,116,5,124,0,131,1,125,1,110,8,116,6,124,0, 114,76,116,6,124,0,131,1,125,1,110,8,116,7,124,0,
131,1,125,1,124,0,102,1,100,2,100,3,132,1,125,2, 131,1,125,1,124,0,102,1,100,2,100,3,132,1,125,2,
116,7,160,8,124,1,124,2,161,2,116,2,124,0,60,0, 116,8,160,9,124,1,124,2,161,2,116,3,124,0,60,0,
87,0,53,0,116,0,160,9,161,0,1,0,88,0,124,1, 87,0,53,0,116,0,160,2,161,0,1,0,88,0,124,1,
83,0,41,4,122,139,71,101,116,32,111,114,32,99,114,101, 83,0,41,4,122,139,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, 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, 111,99,107,32,102,111,114,32,97,32,103,105,118,101,110,32,
...@@ -320,22 +320,22 @@ const unsigned char _Py_M__importlib_bootstrap[] = { ...@@ -320,22 +320,22 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
32,32,32,95,109,111,100,117,108,101,95,108,111,99,107,115, 32,32,32,95,109,111,100,117,108,101,95,108,111,99,107,115,
46,78,99,2,0,0,0,0,0,0,0,0,0,0,0,2, 46,78,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
0,0,0,8,0,0,0,83,0,0,0,115,48,0,0,0, 0,0,0,8,0,0,0,83,0,0,0,115,48,0,0,0,
116,0,160,1,161,0,1,0,122,24,116,2,160,3,124,1, 116,0,160,1,161,0,1,0,122,24,116,3,160,4,124,1,
161,1,124,0,107,8,114,30,116,2,124,1,61,0,87,0, 161,1,124,0,107,8,114,30,116,3,124,1,61,0,87,0,
53,0,116,0,160,4,161,0,1,0,88,0,100,0,83,0, 53,0,116,0,160,2,161,0,1,0,88,0,100,0,83,0,
114,13,0,0,0,41,5,218,4,95,105,109,112,218,12,97, 114,13,0,0,0,41,5,218,4,95,105,109,112,218,12,97,
99,113,117,105,114,101,95,108,111,99,107,218,13,95,109,111, 99,113,117,105,114,101,95,108,111,99,107,218,12,114,101,108,
100,117,108,101,95,108,111,99,107,115,114,34,0,0,0,218, 101,97,115,101,95,108,111,99,107,218,13,95,109,111,100,117,
12,114,101,108,101,97,115,101,95,108,111,99,107,41,2,218, 108,101,95,108,111,99,107,115,114,34,0,0,0,41,2,218,
3,114,101,102,114,17,0,0,0,114,10,0,0,0,114,10, 3,114,101,102,114,17,0,0,0,114,10,0,0,0,114,10,
0,0,0,114,11,0,0,0,218,2,99,98,176,0,0,0, 0,0,0,114,11,0,0,0,218,2,99,98,176,0,0,0,
115,10,0,0,0,0,1,8,1,2,4,14,1,10,2,122, 115,10,0,0,0,0,1,8,1,2,4,14,1,10,2,122,
28,95,103,101,116,95,109,111,100,117,108,101,95,108,111,99, 28,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,41,10,114, 107,46,60,108,111,99,97,108,115,62,46,99,98,41,10,114,
57,0,0,0,114,58,0,0,0,114,59,0,0,0,218,8, 57,0,0,0,114,58,0,0,0,114,59,0,0,0,114,60,
75,101,121,69,114,114,111,114,114,23,0,0,0,114,49,0, 0,0,0,218,8,75,101,121,69,114,114,111,114,114,23,0,
0,0,114,20,0,0,0,218,8,95,119,101,97,107,114,101, 0,0,114,49,0,0,0,114,20,0,0,0,218,8,95,119,
102,114,61,0,0,0,114,60,0,0,0,41,3,114,17,0, 101,97,107,114,101,102,114,61,0,0,0,41,3,114,17,0,
0,0,114,24,0,0,0,114,62,0,0,0,114,10,0,0, 0,0,114,24,0,0,0,114,62,0,0,0,114,10,0,0,
0,114,10,0,0,0,114,11,0,0,0,114,53,0,0,0, 0,114,10,0,0,0,114,11,0,0,0,114,53,0,0,0,
157,0,0,0,115,28,0,0,0,0,6,8,1,2,1,2, 157,0,0,0,115,28,0,0,0,0,6,8,1,2,1,2,
...@@ -911,14 +911,14 @@ const unsigned char _Py_M__importlib_bootstrap[] = { ...@@ -911,14 +911,14 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
0,124,0,106,0,125,2,116,1,124,2,131,1,143,180,1, 0,124,0,106,0,125,2,116,1,124,2,131,1,143,180,1,
0,116,2,106,3,160,4,124,2,161,1,124,1,107,9,114, 0,116,2,106,3,160,4,124,2,161,1,124,1,107,9,114,
54,100,1,160,5,124,2,161,1,125,3,116,6,124,3,124, 54,100,1,160,5,124,2,161,1,125,3,116,6,124,3,124,
2,100,2,141,2,130,1,122,106,124,0,106,7,100,3,107, 2,100,2,141,2,130,1,122,106,124,0,106,8,100,3,107,
8,114,106,124,0,106,8,100,3,107,8,114,90,116,6,100, 8,114,106,124,0,106,9,100,3,107,8,114,90,116,6,100,
4,124,0,106,0,100,2,141,2,130,1,116,9,124,0,124, 4,124,0,106,0,100,2,141,2,130,1,116,10,124,0,124,
1,100,5,100,6,141,3,1,0,110,52,116,9,124,0,124, 1,100,5,100,6,141,3,1,0,110,52,116,10,124,0,124,
1,100,5,100,6,141,3,1,0,116,10,124,0,106,7,100, 1,100,5,100,6,141,3,1,0,116,11,124,0,106,8,100,
7,131,2,115,146,124,0,106,7,160,11,124,2,161,1,1, 7,131,2,115,146,124,0,106,8,160,12,124,2,161,1,1,
0,110,12,124,0,106,7,160,12,124,1,161,1,1,0,87, 0,110,12,124,0,106,8,160,13,124,1,161,1,1,0,87,
0,53,0,116,2,106,3,160,13,124,0,106,0,161,1,125, 0,53,0,116,2,106,3,160,7,124,0,106,0,161,1,125,
1,124,1,116,2,106,3,124,0,106,0,60,0,88,0,87, 1,124,1,116,2,106,3,124,0,106,0,60,0,88,0,87,
0,53,0,81,0,82,0,88,0,124,1,83,0,41,8,122, 0,53,0,81,0,82,0,88,0,124,1,83,0,41,8,122,
70,69,120,101,99,117,116,101,32,116,104,101,32,115,112,101, 70,69,120,101,99,117,116,101,32,116,104,101,32,115,112,101,
...@@ -931,10 +931,10 @@ const unsigned char _Py_M__importlib_bootstrap[] = { ...@@ -931,10 +931,10 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
105,115,115,105,110,103,32,108,111,97,100,101,114,84,114,143, 105,115,115,105,110,103,32,108,111,97,100,101,114,84,114,143,
0,0,0,114,150,0,0,0,41,14,114,17,0,0,0,114, 0,0,0,114,150,0,0,0,41,14,114,17,0,0,0,114,
50,0,0,0,114,15,0,0,0,114,92,0,0,0,114,34, 50,0,0,0,114,15,0,0,0,114,92,0,0,0,114,34,
0,0,0,114,45,0,0,0,114,79,0,0,0,114,109,0, 0,0,0,114,45,0,0,0,114,79,0,0,0,218,3,112,
0,0,114,116,0,0,0,114,148,0,0,0,114,4,0,0, 111,112,114,109,0,0,0,114,116,0,0,0,114,148,0,0,
0,218,11,108,111,97,100,95,109,111,100,117,108,101,114,150, 0,114,4,0,0,0,218,11,108,111,97,100,95,109,111,100,
0,0,0,218,3,112,111,112,41,4,114,95,0,0,0,114, 117,108,101,114,150,0,0,0,41,4,114,95,0,0,0,114,
96,0,0,0,114,17,0,0,0,218,3,109,115,103,114,10, 96,0,0,0,114,17,0,0,0,218,3,109,115,103,114,10,
0,0,0,114,10,0,0,0,114,11,0,0,0,114,93,0, 0,0,0,114,10,0,0,0,114,11,0,0,0,114,93,0,
0,0,71,2,0,0,115,34,0,0,0,0,2,6,1,10, 0,0,71,2,0,0,115,34,0,0,0,0,2,6,1,10,
...@@ -962,8 +962,8 @@ const unsigned char _Py_M__importlib_bootstrap[] = { ...@@ -962,8 +962,8 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
89,0,110,2,88,0,124,1,83,0,41,7,78,114,98,0, 89,0,110,2,88,0,124,1,83,0,41,7,78,114,98,0,
0,0,114,145,0,0,0,114,141,0,0,0,114,128,0,0, 0,0,114,145,0,0,0,114,141,0,0,0,114,128,0,0,
0,114,22,0,0,0,114,105,0,0,0,41,14,114,109,0, 0,114,22,0,0,0,114,105,0,0,0,41,14,114,109,0,
0,0,114,155,0,0,0,114,17,0,0,0,114,15,0,0, 0,0,114,156,0,0,0,114,17,0,0,0,114,15,0,0,
0,114,92,0,0,0,114,156,0,0,0,114,6,0,0,0, 0,114,92,0,0,0,114,155,0,0,0,114,6,0,0,0,
114,98,0,0,0,114,106,0,0,0,114,1,0,0,0,114, 114,98,0,0,0,114,106,0,0,0,114,1,0,0,0,114,
145,0,0,0,114,4,0,0,0,114,129,0,0,0,114,105, 145,0,0,0,114,4,0,0,0,114,129,0,0,0,114,105,
0,0,0,114,151,0,0,0,114,10,0,0,0,114,10,0, 0,0,0,114,151,0,0,0,114,10,0,0,0,114,10,0,
...@@ -980,23 +980,23 @@ const unsigned char _Py_M__importlib_bootstrap[] = { ...@@ -980,23 +980,23 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
83,0,116,3,124,0,131,1,125,1,100,2,124,0,95,4, 83,0,116,3,124,0,131,1,125,1,100,2,124,0,95,4,
122,162,124,1,116,5,106,6,124,0,106,7,60,0,122,52, 122,162,124,1,116,5,106,6,124,0,106,7,60,0,122,52,
124,0,106,0,100,0,107,8,114,96,124,0,106,8,100,0, 124,0,106,0,100,0,107,8,114,96,124,0,106,8,100,0,
107,8,114,108,116,9,100,3,124,0,106,7,100,4,141,2, 107,8,114,108,116,9,100,4,124,0,106,7,100,5,141,2,
130,1,110,12,124,0,106,0,160,10,124,1,161,1,1,0, 130,1,110,12,124,0,106,0,160,10,124,1,161,1,1,0,
87,0,110,50,1,0,1,0,1,0,122,14,116,5,106,6, 87,0,110,50,1,0,1,0,1,0,122,14,116,5,106,6,
124,0,106,7,61,0,87,0,110,20,4,0,116,11,107,10, 124,0,106,7,61,0,87,0,110,20,4,0,116,11,107,10,
114,152,1,0,1,0,1,0,89,0,110,2,88,0,130,0, 114,152,1,0,1,0,1,0,89,0,110,2,88,0,130,0,
89,0,110,2,88,0,116,5,106,6,160,12,124,0,106,7, 89,0,110,2,88,0,116,5,106,6,160,12,124,0,106,7,
161,1,125,1,124,1,116,5,106,6,124,0,106,7,60,0, 161,1,125,1,124,1,116,5,106,6,124,0,106,7,60,0,
116,13,100,5,124,0,106,7,124,0,106,0,131,3,1,0, 116,13,100,6,124,0,106,7,124,0,106,0,131,3,1,0,
87,0,53,0,100,6,124,0,95,4,88,0,124,1,83,0, 87,0,53,0,100,3,124,0,95,4,88,0,124,1,83,0,
41,7,78,114,150,0,0,0,84,114,154,0,0,0,114,16, 41,7,78,114,150,0,0,0,84,70,114,154,0,0,0,114,
0,0,0,122,18,105,109,112,111,114,116,32,123,33,114,125, 16,0,0,0,122,18,105,109,112,111,114,116,32,123,33,114,
32,35,32,123,33,114,125,70,41,14,114,109,0,0,0,114, 125,32,35,32,123,33,114,125,41,14,114,109,0,0,0,114,
4,0,0,0,114,158,0,0,0,114,152,0,0,0,90,13, 4,0,0,0,114,158,0,0,0,114,152,0,0,0,90,13,
95,105,110,105,116,105,97,108,105,122,105,110,103,114,15,0, 95,105,110,105,116,105,97,108,105,122,105,110,103,114,15,0,
0,0,114,92,0,0,0,114,17,0,0,0,114,116,0,0, 0,0,114,92,0,0,0,114,17,0,0,0,114,116,0,0,
0,114,79,0,0,0,114,150,0,0,0,114,63,0,0,0, 0,114,79,0,0,0,114,150,0,0,0,114,63,0,0,0,
114,156,0,0,0,114,76,0,0,0,114,151,0,0,0,114, 114,155,0,0,0,114,76,0,0,0,114,151,0,0,0,114,
10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,14, 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,14,
95,108,111,97,100,95,117,110,108,111,99,107,101,100,138,2, 95,108,111,97,100,95,117,110,108,111,99,107,101,100,138,2,
0,0,115,46,0,0,0,0,2,10,2,12,1,8,2,8, 0,0,115,46,0,0,0,0,2,10,2,12,1,8,2,8,
...@@ -1160,7 +1160,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { ...@@ -1160,7 +1160,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
104,111,100,114,166,0,0,0,114,167,0,0,0,114,149,0, 104,111,100,114,166,0,0,0,114,167,0,0,0,114,149,0,
0,0,114,150,0,0,0,114,86,0,0,0,114,169,0,0, 0,0,114,150,0,0,0,114,86,0,0,0,114,169,0,0,
0,114,170,0,0,0,114,115,0,0,0,114,97,0,0,0, 0,114,170,0,0,0,114,115,0,0,0,114,97,0,0,0,
114,155,0,0,0,114,10,0,0,0,114,10,0,0,0,114, 114,156,0,0,0,114,10,0,0,0,114,10,0,0,0,114,
10,0,0,0,114,11,0,0,0,114,160,0,0,0,195,2, 10,0,0,0,114,11,0,0,0,114,160,0,0,0,195,2,
0,0,115,42,0,0,0,8,2,4,7,2,1,10,8,2, 0,0,115,42,0,0,0,8,2,4,7,2,1,10,8,2,
1,12,8,2,1,12,11,2,1,10,7,2,1,10,4,2, 1,12,8,2,1,12,11,2,1,10,7,2,1,10,4,2,
...@@ -1256,7 +1256,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { ...@@ -1256,7 +1256,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32, 101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,
105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32, 105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,
32,32,41,1,114,97,0,0,0,114,168,0,0,0,114,10, 32,32,41,1,114,97,0,0,0,114,168,0,0,0,114,10,
0,0,0,114,10,0,0,0,114,11,0,0,0,114,155,0, 0,0,0,114,10,0,0,0,114,11,0,0,0,114,156,0,
0,0,61,3,0,0,115,2,0,0,0,0,7,122,26,70, 0,0,61,3,0,0,115,2,0,0,0,0,7,122,26,70,
114,111,122,101,110,73,109,112,111,114,116,101,114,46,108,111, 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, 97,100,95,109,111,100,117,108,101,99,2,0,0,0,0,0,
...@@ -1295,7 +1295,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { ...@@ -1295,7 +1295,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
0,0,114,2,0,0,0,114,3,0,0,0,114,138,0,0, 0,0,114,2,0,0,0,114,3,0,0,0,114,138,0,0,
0,114,171,0,0,0,114,99,0,0,0,114,172,0,0,0, 0,114,171,0,0,0,114,99,0,0,0,114,172,0,0,0,
114,166,0,0,0,114,167,0,0,0,114,149,0,0,0,114, 114,166,0,0,0,114,167,0,0,0,114,149,0,0,0,114,
150,0,0,0,114,155,0,0,0,114,90,0,0,0,114,169, 150,0,0,0,114,156,0,0,0,114,90,0,0,0,114,169,
0,0,0,114,170,0,0,0,114,115,0,0,0,114,10,0, 0,0,0,114,170,0,0,0,114,115,0,0,0,114,10,0,
0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,
0,114,173,0,0,0,12,3,0,0,115,46,0,0,0,8, 0,114,173,0,0,0,12,3,0,0,115,46,0,0,0,8,
...@@ -1326,7 +1326,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { ...@@ -1326,7 +1326,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
116,32,108,111,99,107,32,114,101,103,97,114,100,108,101,115, 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, 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,41,2,114,57, 101,120,99,101,112,116,105,111,110,115,46,78,41,2,114,57,
0,0,0,114,60,0,0,0,41,4,114,30,0,0,0,218, 0,0,0,114,59,0,0,0,41,4,114,30,0,0,0,218,
8,101,120,99,95,116,121,112,101,218,9,101,120,99,95,118, 8,101,120,99,95,116,121,112,101,218,9,101,120,99,95,118,
97,108,117,101,218,13,101,120,99,95,116,114,97,99,101,98, 97,108,117,101,218,13,101,120,99,95,116,114,97,99,101,98,
97,99,107,114,10,0,0,0,114,10,0,0,0,114,11,0, 97,99,107,114,10,0,0,0,114,10,0,0,0,114,11,0,
...@@ -1763,7 +1763,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { ...@@ -1763,7 +1763,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = {
114,230,0,0,0,41,2,78,78,41,1,78,41,2,78,114, 114,230,0,0,0,41,2,78,78,41,1,78,41,2,78,114,
22,0,0,0,41,4,78,78,114,10,0,0,0,114,22,0, 22,0,0,0,41,4,78,78,114,10,0,0,0,114,22,0,
0,0,41,50,114,3,0,0,0,114,126,0,0,0,114,12, 0,0,41,50,114,3,0,0,0,114,126,0,0,0,114,12,
0,0,0,114,18,0,0,0,114,59,0,0,0,114,33,0, 0,0,0,114,18,0,0,0,114,60,0,0,0,114,33,0,
0,0,114,42,0,0,0,114,19,0,0,0,114,20,0,0, 0,0,114,42,0,0,0,114,19,0,0,0,114,20,0,0,
0,114,49,0,0,0,114,50,0,0,0,114,53,0,0,0, 0,114,49,0,0,0,114,50,0,0,0,114,53,0,0,0,
114,65,0,0,0,114,67,0,0,0,114,76,0,0,0,114, 114,65,0,0,0,114,67,0,0,0,114,76,0,0,0,114,
......
This diff is collapsed.
...@@ -703,18 +703,18 @@ const unsigned char _Py_M__zipimport[] = { ...@@ -703,18 +703,18 @@ const unsigned char _Py_M__zipimport[] = {
160,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 160,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
0,0,8,0,0,0,67,0,0,0,115,108,0,0,0,116, 0,0,8,0,0,0,67,0,0,0,115,108,0,0,0,116,
0,114,22,116,1,160,2,100,1,161,1,1,0,116,3,100, 0,114,22,116,1,160,2,100,1,161,1,1,0,116,3,100,
2,131,1,130,1,100,3,97,0,122,60,122,16,100,4,100, 2,131,1,130,1,100,3,97,0,122,60,122,16,100,5,100,
5,108,4,109,5,125,0,1,0,87,0,110,38,4,0,116, 6,108,4,109,5,125,0,1,0,87,0,110,38,4,0,116,
6,107,10,114,82,1,0,1,0,1,0,116,1,160,2,100, 6,107,10,114,82,1,0,1,0,1,0,116,1,160,2,100,
1,161,1,1,0,116,3,100,2,131,1,130,1,89,0,110, 1,161,1,1,0,116,3,100,2,131,1,130,1,89,0,110,
2,88,0,87,0,53,0,100,6,97,0,88,0,116,1,160, 2,88,0,87,0,53,0,100,4,97,0,88,0,116,1,160,
2,100,7,161,1,1,0,124,0,83,0,41,8,78,122,27, 2,100,7,161,1,1,0,124,0,83,0,41,8,78,122,27,
122,105,112,105,109,112,111,114,116,58,32,122,108,105,98,32, 122,105,112,105,109,112,111,114,116,58,32,122,108,105,98,32,
85,78,65,86,65,73,76,65,66,76,69,250,41,99,97,110, 85,78,65,86,65,73,76,65,66,76,69,250,41,99,97,110,
39,116,32,100,101,99,111,109,112,114,101,115,115,32,100,97, 39,116,32,100,101,99,111,109,112,114,101,115,115,32,100,97,
116,97,59,32,122,108,105,98,32,110,111,116,32,97,118,97, 116,97,59,32,122,108,105,98,32,110,111,116,32,97,118,97,
105,108,97,98,108,101,84,114,0,0,0,0,169,1,218,10, 105,108,97,98,108,101,84,70,114,0,0,0,0,169,1,218,
100,101,99,111,109,112,114,101,115,115,70,122,25,122,105,112, 10,100,101,99,111,109,112,114,101,115,115,122,25,122,105,112,
105,109,112,111,114,116,58,32,122,108,105,98,32,97,118,97, 105,109,112,111,114,116,58,32,122,108,105,98,32,97,118,97,
105,108,97,98,108,101,41,7,218,15,95,105,109,112,111,114, 105,108,97,98,108,101,41,7,218,15,95,105,109,112,111,114,
116,105,110,103,95,122,108,105,98,114,76,0,0,0,114,77, 116,105,110,103,95,122,108,105,98,114,76,0,0,0,114,77,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment