You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 00:45:53 +08:00
Python 3.5 if handling...
Allow RETURN_END_IF in a return statement May want to do this in other versions as well, but right now we only need it here.
This commit is contained in:
BIN
test/bytecode_3.5/07_if_return_bug.pyc
Normal file
BIN
test/bytecode_3.5/07_if_return_bug.pyc
Normal file
Binary file not shown.
31
test/simple_source/branching/07_if_return_bug.py
Normal file
31
test/simple_source/branching/07_if_return_bug.py
Normal file
@@ -0,0 +1,31 @@
|
||||
# From 3.5.1 bdb
|
||||
#
|
||||
# RETURN_VALUES can get turned in RETURN_END_IF
|
||||
# scanner3's detect_structure sometimes can't
|
||||
# fully handle Python 3.5's jump optimization
|
||||
# So in 3.5, for now, we allow:
|
||||
#
|
||||
# return_stmt ::= ret_expr RETURN_END_IF
|
||||
# and you see that in the grammar rules for below.
|
||||
|
||||
# For other pythons the RETURN_END_IF may be a
|
||||
# RETURN_VALUE.
|
||||
# Or it may be that we may want to add that
|
||||
# additional return_stmt grammar rule for Pythons
|
||||
# before 3.5 which currently isn't needed.
|
||||
|
||||
def effective(line):
|
||||
for b in line:
|
||||
if not b.cond:
|
||||
return
|
||||
else:
|
||||
try:
|
||||
val = 5
|
||||
if val:
|
||||
if b.ignore:
|
||||
b.ignore -= 1
|
||||
else:
|
||||
return (b, True)
|
||||
except:
|
||||
return (b, False)
|
||||
return
|
@@ -594,6 +594,11 @@ class Python35onParser(Python3Parser):
|
||||
WITH_CLEANUP_START WITH_CLEANUP_FINISH END_FINALLY
|
||||
|
||||
|
||||
# Python 3.5+_ does jump optimization that scanner3.py's detect
|
||||
# structure can't fully work out. So for now let's allow
|
||||
# RETURN_END_IF the same as RETURN_VAL
|
||||
return_stmt ::= ret_expr RETURN_END_IF
|
||||
|
||||
# Python 3.3+ also has yield from. 3.5 does it
|
||||
# differently than 3.3, 3.4
|
||||
|
||||
|
Reference in New Issue
Block a user