From 79f4893cd93e12123a3bac7d62c04972881b23f1 Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 23 May 2016 22:41:46 -0400 Subject: [PATCH] final RETURN removal bug We want to remove a final return from a module, but otherwise not. Note we'll no lonager be able to verify functools.pyc as there is now a return after a raise statement. That will have to be delt with separately. May address Issue #17. --- test/bytecode_2.7/06_return_bug.pyc | Bin 0 -> 301 bytes test/ok_lib2.7/functools.pyc | Bin 6817 -> 0 bytes .../def/06_ifTrue_optimize_bug.py | 11 ++++++++++ test/simple_source/def/06_return_bug.py | 7 +++++++ uncompyle6/semantics/pysource.py | 19 +++++++++++++----- 5 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 test/bytecode_2.7/06_return_bug.pyc delete mode 100644 test/ok_lib2.7/functools.pyc create mode 100644 test/simple_source/def/06_ifTrue_optimize_bug.py create mode 100644 test/simple_source/def/06_return_bug.py diff --git a/test/bytecode_2.7/06_return_bug.pyc b/test/bytecode_2.7/06_return_bug.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b78466ca664ffdafa024701633c9671449217c29 GIT binary patch literal 301 zcmZSn%*(~S+c`X$0SXv_v;z}hA1F|ks(-v2`G{bk_TZB#~Fx=#eqZ( z149;AQ8p7pkuXCF6GLzcGf)Q$P|mM}8AxU%mSlo>nIMh^$bb@%37IJnHb|;CH7892 zNHc(mVkMAJW^O@FYJ72iX;E^jeoAVZzJXbMQEEwPQC@sfX}VrPCD@d-Jg|N?kY+}H hMixdtu&F^{yFh}Z8_NOIWs{qqQks)$2R0mJ3;^txG$sH5 literal 0 HcmV?d00001 diff --git a/test/ok_lib2.7/functools.pyc b/test/ok_lib2.7/functools.pyc deleted file mode 100644 index cb22b91fd8af2325717ae5e53aea95fbbe6fb265..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6817 zcmc&(TW{RP6+YanBui0lb`aD>iKd9xXe%WF;-smp+O>ot2r3v{*=_}=EJe<)=;e}Y z&aCYPq?gKQ3-o99C-luP?RU z9X$Fmiil_jr9)AT5{HI0+Nsg7PCIpSqD9(iP_#rlO;Qa~O^Vv|5)`enIVa6FMf3C$ zjOHj>kjgwoSE$>0i)YzH(Hp0s$+ASRj3(}{-EFSAy)1X1XZavb`|k7D?72b}XQ_6B zG;+frNrK%(x!LX$6&k$|{}-Q54eU%C#VE*493-ZNdaj~zsLTSYzCX;OaiVB|sjkVB~f@BW6${ouL(Q)F)Er_!`?#F469C0m} z23p7cR0(0=n(+vG0b%lXF_^%ZJl-7}h3zUSqd3P_C6jWhUY-qKi=2@it*El*PNaIl zI5AjAHsvzao=4u@`}a3J|8BSY^&htWxVg36y;)KftK?;UH`=UsY-+O?n36}3Po-s5 zk}-x^o+~}d(ukKnUAB92aV3+f^s8&J(iIaZ7xCc!#@+4BVgVhtN>Ng+49_9;eo)cg=aqUS8eeXP3=~2!tmMqKgKv^T-$re9FB_`WJPQYtRhXtqpRGPqxn>(& z{cPonl}|reP2%0v(ZuX!DLPiGhHTip?F4=S<{k8CwnAE7a(?P8IUmnLDSFebPi*aAEctSYLr#T`2JZim6@f5AXD6l5P5_=#Qs|B+8vZD1tHq|oVd-p)-K zIb}jq1M!p@=j>SAXv&i}-i^~|*#Ihhd>!B?9*MWVctK6=XS%=0 z5(_ChSeFHw24DM9sVlh}25~BSRT8hb8`cEek|AJ2FYzLK%#%P@N>EdHn<)@2Yo&i$xUThCNisV=WNvJxRi&vr;wI zdX}@kfr@4Yp)1Qy$WD}PgNH@8zCllnm?iP-B?3>46)S3RRN^{9SgWY_(ch+9+=Vb^ zhs#LDq+lVz40R^0gA~J8N>aSGSk^JTRN?A?6kTtX!{D@B*1_WK3TcyW9XN$Gz!VT6 z@Xzr^Dt8WG8a2}YCIdk4@YvrRN?|*NvCu)CUObSXRHqL&zWtgW*EkLxG&xG))j^x` zS5j}1j{w#r#7i5%p0sHnoo#~Gz|>6Nv{CI9J$+R~sdph*eT$`=z^|0H05ufj>BR}+ zc$~V!7!d&al;x4ixiVDn7?GCX?E8I=vmCg~r^{?VK*19`G(a@JTGnf{XrtqnbygDa zdB?R%dRPEa2IHEoCu85VmITAyC|LiJr^3UM;*^0?iPPY(VeGZwPht1iDS9kOyB<{N z$2(u|J+S!=vtoXwoL>u-jdlw4v~1rXzOPQ;OTJGJ99kS*E5X)^EUBUgZxHKmORT5& zx}vBKWfgoED$KRB0akVx61+$ahzdsvbWm_S^i_|sAkO0g^^x;?=1oU2(+HH6Jc4r>%BmDpqW#k)YJ~?Co3<)|WAYi=aM=UHa799p<0(JdSCLB6PR3O>tdDn}WUnIQ4Y z)qf6rdIbg5>dqqm-aA!Zt6g_m&NBKxz%%b$#kZuSoU-srMNBR#NG6fg^&I+#lsNJH z9myWipOO3_|LIEptbYZ{dz`!HI77JMaCG}9eTVRH^l=Aja@2_v6wx;!3i*`Dl|DdI z;W`F+CsE(w8yx_6iJtl~0Jz*K@YER(Zh4AkLz=C!*_39xY__C1S2o+y#Ep++(K`#| zb&r$;cQ+Cl>VU-f9^uhTD6neeBtAq_UWRPRm5BEX4BF#_3O8h27VdH zz4w9l@%b<}FAMWk;Qh<_FxM{$bD<$APG5hmAZM%Rhqu1V{jB^51MtQ6ATO>@6hre) z?FD+zO*7m{;hIMAO_GYlrx=d8+mn%vuGY=4a}=YTk!2Q_<&44icfq{yDjiN&Y#?W( z0>$@rg81zF-p4%1e#qmsd5lGr&f{J5ZgTNU6c(ts$5}d)kC;Cm&4=q20`Poox$JOS#*J7md%;NN|d`H0i^F^9dWs$G9~%SL#= 2 and not noneInNames: if tokens[-1].type == 'RETURN_VALUE': + # Should we also check for returning None? if tokens[-2].type == 'LOAD_CONST': - del tokens[-2:] + if True or isTopLevel: + del tokens[-2:] + else: + tokens.append(Token('RETURN_LAST')) else: tokens.append(Token('RETURN_LAST')) if len(tokens) == 0: @@ -1877,7 +1885,8 @@ def deparse_code(version, co, out=sys.stdout, showasm=False, showast=False, deparsed = SourceWalker(version, out, scanner, showast=showast, debug_parser=debug_parser, compile_mode=compile_mode) - deparsed.ast = deparsed.build_ast(tokens, customize) + isTopLevel = co.co_name == '' + deparsed.ast = deparsed.build_ast(tokens, customize, isTopLevel=isTopLevel) assert deparsed.ast == 'stmts', 'Should have parsed grammar start'