mirror of
https://github.com/python/cpython.git
synced 2025-09-05 00:11:10 +00:00
gh-87092: refactor assemble() to a number of separate functions, which do not need the compiler struct (#102562)
This commit is contained in:
parent
ca01cae1e9
commit
634cb61909
3 changed files with 352 additions and 295 deletions
|
@ -125,7 +125,7 @@ class CfgOptimizationTestCase(CompilationStepTestCase):
|
||||||
assert isinstance(item, tuple)
|
assert isinstance(item, tuple)
|
||||||
inst = list(reversed(item))
|
inst = list(reversed(item))
|
||||||
opcode = dis.opmap[inst.pop()]
|
opcode = dis.opmap[inst.pop()]
|
||||||
oparg = inst.pop() if opcode in self.HAS_ARG_OR_TARGET else 0
|
oparg = inst.pop()
|
||||||
loc = inst + [-1] * (4 - len(inst))
|
loc = inst + [-1] * (4 - len(inst))
|
||||||
res.append((opcode, oparg, *loc))
|
res.append((opcode, oparg, *loc))
|
||||||
return res
|
return res
|
||||||
|
|
|
@ -995,15 +995,19 @@ class DirectiCfgOptimizerTests(CfgOptimizationTestCase):
|
||||||
('LOAD_CONST', 2, 13),
|
('LOAD_CONST', 2, 13),
|
||||||
lbl,
|
lbl,
|
||||||
('LOAD_CONST', 3, 14),
|
('LOAD_CONST', 3, 14),
|
||||||
|
('RETURN_VALUE', 14),
|
||||||
]
|
]
|
||||||
expected = [
|
expected_insts = [
|
||||||
('LOAD_NAME', 1, 11),
|
('LOAD_NAME', 1, 11),
|
||||||
('POP_JUMP_IF_TRUE', lbl := self.Label(), 12),
|
('POP_JUMP_IF_TRUE', lbl := self.Label(), 12),
|
||||||
('LOAD_CONST', 2, 13),
|
('LOAD_CONST', 1, 13),
|
||||||
lbl,
|
lbl,
|
||||||
('LOAD_CONST', 3, 14)
|
('RETURN_CONST', 2, 14),
|
||||||
]
|
]
|
||||||
self.cfg_optimization_test(insts, expected, consts=list(range(5)))
|
self.cfg_optimization_test(insts,
|
||||||
|
expected_insts,
|
||||||
|
consts=[0, 1, 2, 3, 4],
|
||||||
|
expected_consts=[0, 2, 3])
|
||||||
|
|
||||||
def test_conditional_jump_forward_const_condition(self):
|
def test_conditional_jump_forward_const_condition(self):
|
||||||
# The unreachable branch of the jump is removed, the jump
|
# The unreachable branch of the jump is removed, the jump
|
||||||
|
@ -1015,26 +1019,32 @@ class DirectiCfgOptimizerTests(CfgOptimizationTestCase):
|
||||||
('LOAD_CONST', 2, 13),
|
('LOAD_CONST', 2, 13),
|
||||||
lbl,
|
lbl,
|
||||||
('LOAD_CONST', 3, 14),
|
('LOAD_CONST', 3, 14),
|
||||||
|
('RETURN_VALUE', 14),
|
||||||
]
|
]
|
||||||
expected = [
|
expected_insts = [
|
||||||
('NOP', None, 11),
|
('NOP', 11),
|
||||||
('NOP', None, 12),
|
('NOP', 12),
|
||||||
('LOAD_CONST', 3, 14)
|
('RETURN_CONST', 1, 14),
|
||||||
]
|
]
|
||||||
self.cfg_optimization_test(insts, expected, consts=list(range(5)))
|
self.cfg_optimization_test(insts,
|
||||||
|
expected_insts,
|
||||||
|
consts=[0, 1, 2, 3, 4],
|
||||||
|
expected_consts=[0, 3])
|
||||||
|
|
||||||
def test_conditional_jump_backward_non_const_condition(self):
|
def test_conditional_jump_backward_non_const_condition(self):
|
||||||
insts = [
|
insts = [
|
||||||
lbl1 := self.Label(),
|
lbl1 := self.Label(),
|
||||||
('LOAD_NAME', 1, 11),
|
('LOAD_NAME', 1, 11),
|
||||||
('POP_JUMP_IF_TRUE', lbl1, 12),
|
('POP_JUMP_IF_TRUE', lbl1, 12),
|
||||||
('LOAD_CONST', 2, 13),
|
('LOAD_NAME', 2, 13),
|
||||||
|
('RETURN_VALUE', 13),
|
||||||
]
|
]
|
||||||
expected = [
|
expected = [
|
||||||
lbl := self.Label(),
|
lbl := self.Label(),
|
||||||
('LOAD_NAME', 1, 11),
|
('LOAD_NAME', 1, 11),
|
||||||
('POP_JUMP_IF_TRUE', lbl, 12),
|
('POP_JUMP_IF_TRUE', lbl, 12),
|
||||||
('LOAD_CONST', 2, 13)
|
('LOAD_NAME', 2, 13),
|
||||||
|
('RETURN_VALUE', 13),
|
||||||
]
|
]
|
||||||
self.cfg_optimization_test(insts, expected, consts=list(range(5)))
|
self.cfg_optimization_test(insts, expected, consts=list(range(5)))
|
||||||
|
|
||||||
|
@ -1042,16 +1052,17 @@ class DirectiCfgOptimizerTests(CfgOptimizationTestCase):
|
||||||
# The unreachable branch of the jump is removed
|
# The unreachable branch of the jump is removed
|
||||||
insts = [
|
insts = [
|
||||||
lbl1 := self.Label(),
|
lbl1 := self.Label(),
|
||||||
('LOAD_CONST', 1, 11),
|
('LOAD_CONST', 3, 11),
|
||||||
('POP_JUMP_IF_TRUE', lbl1, 12),
|
('POP_JUMP_IF_TRUE', lbl1, 12),
|
||||||
('LOAD_CONST', 2, 13),
|
('LOAD_CONST', 2, 13),
|
||||||
|
('RETURN_VALUE', 13),
|
||||||
]
|
]
|
||||||
expected = [
|
expected_insts = [
|
||||||
lbl := self.Label(),
|
lbl := self.Label(),
|
||||||
('NOP', None, 11),
|
('NOP', 11),
|
||||||
('JUMP', lbl, 12)
|
('JUMP', lbl, 12),
|
||||||
]
|
]
|
||||||
self.cfg_optimization_test(insts, expected, consts=list(range(5)))
|
self.cfg_optimization_test(insts, expected_insts, consts=list(range(5)))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
602
Python/compile.c
602
Python/compile.c
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue