From c148e496702213811345ce474ae2a98ff08631f7 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 23 Jun 2018 07:37:47 -0400 Subject: [PATCH] Python 3.0 chained comparisions --- test/Makefile | 6 +----- test/bytecode_3.0_run/00_assign.pyc | Bin 0 -> 256 bytes test/bytecode_3.0_run/00_chained-compare.pyc | Bin 0 -> 278 bytes .../simple_source/bug30/00_chained-compare.py | 6 ++++++ uncompyle6/parsers/parse26.py | 7 +++---- uncompyle6/parsers/parse30.py | 18 +++++++++++++++--- 6 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 test/bytecode_3.0_run/00_assign.pyc create mode 100644 test/bytecode_3.0_run/00_chained-compare.pyc create mode 100644 test/simple_source/bug30/00_chained-compare.py diff --git a/test/Makefile b/test/Makefile index 9185f4a5..00662c6c 100644 --- a/test/Makefile +++ b/test/Makefile @@ -225,11 +225,7 @@ check-bytecode-2.7: #: Check deparsing Python 3.0 check-bytecode-3.0: $(PYTHON) test_pythonlib.py --bytecode-3.0 --weak-verify - -#: Check deparsing Python 3.0 -check-bytecode-3.0: - $(PYTHON) test_pythonlib.py --bytecode-3.0 --weak-verify - # $(PYTHON) test_pythonlib.py --bytecode-3.0-run --verify-run + $(PYTHON) test_pythonlib.py --bytecode-3.0-run --verify-run #: Check deparsing Python 3.1 check-bytecode-3.1: diff --git a/test/bytecode_3.0_run/00_assign.pyc b/test/bytecode_3.0_run/00_assign.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89eb57a634e46000978d434879bc5b7979dbe024 GIT binary patch literal 256 zcmYj~Jr2S!42543{)B)tz}5lLN{k=`0}BHSTN$d-22??tDsBc=4#9bGIsmr($$oya zSEKRp@SdGB{6&ZREf*~rIS?}?Vu@TJR?vW!&(b=zp*Q{|^%yVg#Wwu(Gg)A!?IHh-l)-u7z0pseB1H1yn5i z=)U9kWcl_Yo_#ISmlFS0#Ju70uSET~Ba;KUAUA_kU=+O@*ei(2Z=Nw5&~^q!Yz(P5 z%@Lpz-T^-~JNgOa5aCE&37!+fry3!ik`Wn(=uZ4NQNtz8gZJtVjqM(tvo4{*8DYuN zH*LSy!rS0VUGGADldZF?DBreCr`2_7+kWdb?LWhm-FL06!d~x(ANw&emzBiw4Xwg1 Ad;kCd literal 0 HcmV?d00001 diff --git a/test/simple_source/bug30/00_chained-compare.py b/test/simple_source/bug30/00_chained-compare.py new file mode 100644 index 00000000..199f6526 --- /dev/null +++ b/test/simple_source/bug30/00_chained-compare.py @@ -0,0 +1,6 @@ +# From 3.0 asyncore.py +# This is RUNNABLE! +r, w, e = ([], [], []) +if [] == r == w == e: + r = [1] +assert r == [1] diff --git a/uncompyle6/parsers/parse26.py b/uncompyle6/parsers/parse26.py index c38e08a0..49cc1436 100644 --- a/uncompyle6/parsers/parse26.py +++ b/uncompyle6/parsers/parse26.py @@ -273,14 +273,13 @@ class Python26Parser(Python2Parser): # compare_chained is like x <= y <= z compare_chained ::= expr compare_chained1 ROT_TWO COME_FROM POP_TOP _come_froms - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP - jmp_false_then compare_chained1 _come_froms - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP - jmp_false_then compare_chained2 _come_froms compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP jmp_false compare_chained1 _come_froms compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP jmp_false compare_chained2 _come_froms + + compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP + jmp_false_then compare_chained1 _come_froms compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP jmp_false_then compare_chained2 _come_froms diff --git a/uncompyle6/parsers/parse30.py b/uncompyle6/parsers/parse30.py index 3eed27f7..3bcafa37 100644 --- a/uncompyle6/parsers/parse30.py +++ b/uncompyle6/parsers/parse30.py @@ -14,8 +14,6 @@ class Python30Parser(Python31Parser): assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1 POP_TOP return_if_lambda ::= RETURN_END_IF_LAMBDA POP_TOP - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP - JUMP_IF_FALSE POP_TOP compare_chained2 compare_chained2 ::= expr COMPARE_OP RETURN_END_IF_LAMBDA # FIXME: combine with parse3.2 @@ -72,6 +70,7 @@ class Python30Parser(Python31Parser): _jump POP_TOP jump_except ::= JUMP_FORWARD POP_TOP + ################################################################################ # In many ways 3.0 is like 2.6. The below rules in fact are the same or similar. jmp_true ::= JUMP_IF_TRUE POP_TOP @@ -87,6 +86,13 @@ class Python30Parser(Python31Parser): JUMP_BACK POP_TOP POP_BLOCK COME_FROM_LOOP whilestmt ::= SETUP_LOOP testexpr returns POP_TOP POP_BLOCK COME_FROM_LOOP + + + # compare_chained is like x <= y <= z + compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP + jmp_false compare_chained1 _come_froms + compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP + jmp_false compare_chained2 _come_froms """ def customize_grammar_rules(self, tokens, customize): @@ -104,9 +110,15 @@ class Python30Parser(Python31Parser): POP_BLOCK COME_FROM_LOOP assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1 return_if_lambda ::= RETURN_END_IF_LAMBDA - compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP compare_chained2 COME_FROM except_handler ::= jmp_abs COME_FROM_EXCEPT except_stmts END_FINALLY except_suite ::= c_stmts POP_EXCEPT jump_except + + # No JUMP_IF_FALSE_OR_POP + compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP + compare_chained1 COME_FROM + compare_chained1 ::= expr DUP_TOP ROT_THREE COMPARE_OP JUMP_IF_FALSE_OR_POP + compare_chained2 COME_FROM + """) return