You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-04 01:09:52 +08:00
More 3.x "if" checking. Abbreviate stmts->sstmt
This commit is contained in:
@@ -89,7 +89,7 @@ class PythonParser(GenericASTBuilder):
|
|||||||
# singleton reduction that we can simplify. It also happens to be optional
|
# singleton reduction that we can simplify. It also happens to be optional
|
||||||
# in its other derivation
|
# in its other derivation
|
||||||
self.optional_nt |= frozenset(
|
self.optional_nt |= frozenset(
|
||||||
("come_froms", "suite_stmts", "l_stmts_opt", "c_stmts_opt", "stmts_opt")
|
("come_froms", "suite_stmts", "l_stmts_opt", "c_stmts_opt", "stmts_opt", "stmt")
|
||||||
)
|
)
|
||||||
|
|
||||||
# Reduce singleton reductions in these nonterminals:
|
# Reduce singleton reductions in these nonterminals:
|
||||||
|
@@ -380,7 +380,6 @@ class Python3Parser(PythonParser):
|
|||||||
iflaststmt ::= testexpr _iflaststmts_jump
|
iflaststmt ::= testexpr _iflaststmts_jump
|
||||||
ifelsestmt ::= testexpr stmts_opt jump_absolute_else else_suite
|
ifelsestmt ::= testexpr stmts_opt jump_absolute_else else_suite
|
||||||
ifelsestmt ::= testexpr stmts_opt jump_forward_else else_suite _come_froms
|
ifelsestmt ::= testexpr stmts_opt jump_forward_else else_suite _come_froms
|
||||||
iflaststmt ::= testexpr _ifstmts_jump
|
|
||||||
else_suite ::= stmts
|
else_suite ::= stmts
|
||||||
|
|
||||||
|
|
||||||
|
@@ -20,11 +20,12 @@ def ifstmt(self, lhs, n, rule, ast, tokens, first, last):
|
|||||||
last_offset = tokens[l].offset
|
last_offset = tokens[l].offset
|
||||||
for i in range(first, l):
|
for i in range(first, l):
|
||||||
t = tokens[i]
|
t = tokens[i]
|
||||||
if t.kind == "POP_JUMP_IF_FALSE":
|
# instead of POP_JUMP_IF, should we use op attributes?
|
||||||
|
if t.kind in ("POP_JUMP_IF_FALSE", "POP_JUMP_IF_TRUE"):
|
||||||
pjif_target = t.attr
|
pjif_target = t.attr
|
||||||
if pjif_target > last_offset:
|
if pjif_target > last_offset:
|
||||||
# In come cases, where we have long bytecode, a
|
# In come cases, where we have long bytecode, a
|
||||||
# "POP_JUMP_IF_FALSE" offset might be too
|
# "POP_JUMP_IF_TRUE/FALSE" offset might be too
|
||||||
# large for the instruction; so instead it
|
# large for the instruction; so instead it
|
||||||
# jumps to a JUMP_FORWARD. Allow that here.
|
# jumps to a JUMP_FORWARD. Allow that here.
|
||||||
if tokens[l] == "JUMP_FORWARD":
|
if tokens[l] == "JUMP_FORWARD":
|
||||||
|
@@ -1103,7 +1103,10 @@ class SourceWalker(GenericASTTraversal, object):
|
|||||||
code = Code(cn.attr, self.scanner, self.currentclass)
|
code = Code(cn.attr, self.scanner, self.currentclass)
|
||||||
ast = self.build_ast(code._tokens, code._customize)
|
ast = self.build_ast(code._tokens, code._customize)
|
||||||
self.customize(code._customize)
|
self.customize(code._customize)
|
||||||
ast = ast[0][0][0]
|
|
||||||
|
# Remove single reductions as in ("stmts", "sstmt"):
|
||||||
|
while len(ast) == 1:
|
||||||
|
ast = ast[0]
|
||||||
|
|
||||||
n = ast[iter_index]
|
n = ast[iter_index]
|
||||||
assert n == "comp_iter", n
|
assert n == "comp_iter", n
|
||||||
@@ -1368,7 +1371,11 @@ class SourceWalker(GenericASTTraversal, object):
|
|||||||
code = Code(node[1].attr, self.scanner, self.currentclass)
|
code = Code(node[1].attr, self.scanner, self.currentclass)
|
||||||
ast = self.build_ast(code._tokens, code._customize)
|
ast = self.build_ast(code._tokens, code._customize)
|
||||||
self.customize(code._customize)
|
self.customize(code._customize)
|
||||||
ast = ast[0][0][0]
|
|
||||||
|
# Remove single reductions as in ("stmts", "sstmt"):
|
||||||
|
while len(ast) == 1:
|
||||||
|
ast = ast[0]
|
||||||
|
|
||||||
store = ast[3]
|
store = ast[3]
|
||||||
collection = node[collection_index]
|
collection = node[collection_index]
|
||||||
|
|
||||||
@@ -2208,6 +2215,7 @@ class SourceWalker(GenericASTTraversal, object):
|
|||||||
pass
|
pass
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# This code is only for Python 1.x - 2.1 ish!
|
||||||
def get_tuple_parameter(self, ast, name):
|
def get_tuple_parameter(self, ast, name):
|
||||||
"""
|
"""
|
||||||
If the name of the formal parameter starts with dot,
|
If the name of the formal parameter starts with dot,
|
||||||
@@ -2224,8 +2232,8 @@ class SourceWalker(GenericASTTraversal, object):
|
|||||||
assert ast == "stmts"
|
assert ast == "stmts"
|
||||||
for i in range(len(ast)):
|
for i in range(len(ast)):
|
||||||
# search for an assign-statement
|
# search for an assign-statement
|
||||||
assert ast[i][0] == "stmt"
|
assert ast[i] == "sstmt"
|
||||||
node = ast[i][0][0]
|
node = ast[i][0]
|
||||||
if node == "assign" and node[0] == ASSIGN_TUPLE_PARAM(name):
|
if node == "assign" and node[0] == ASSIGN_TUPLE_PARAM(name):
|
||||||
# okay, this assigns '.n' to something
|
# okay, this assigns '.n' to something
|
||||||
del ast[i]
|
del ast[i]
|
||||||
|
@@ -346,7 +346,7 @@ class TreeTransform(GenericASTTraversal, object):
|
|||||||
|
|
||||||
def n_stmts(self, node):
|
def n_stmts(self, node):
|
||||||
if node.first_child() == "SETUP_ANNOTATIONS":
|
if node.first_child() == "SETUP_ANNOTATIONS":
|
||||||
prev = node[0][0][0]
|
prev = node[0][0]
|
||||||
new_stmts = [node[0]]
|
new_stmts = [node[0]]
|
||||||
for i, sstmt in enumerate(node[1:]):
|
for i, sstmt in enumerate(node[1:]):
|
||||||
ann_assign = sstmt[0][0]
|
ann_assign = sstmt[0][0]
|
||||||
|
Reference in New Issue
Block a user