# Constant narrowing allows constant folding for second comparison
self.assertLessEqual(count_ops(ex, "_COMPARE_OP_STR"), 1)
- @unittest.skip("gh-139109 WIP")
def test_combine_stack_space_checks_sequential(self):
def dummy12(x):
return x - 1
self.assertEqual(uop_names.count("_PUSH_FRAME"), 2)
self.assertEqual(uop_names.count("_RETURN_VALUE"), 2)
self.assertEqual(uop_names.count("_CHECK_STACK_SPACE"), 0)
- self.assertEqual(uop_names.count("_CHECK_STACK_SPACE_OPERAND"), 1)
- # sequential calls: max(12, 13) == 13
- largest_stack = _testinternalcapi.get_co_framesize(dummy13.__code__)
- self.assertIn(("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands)
+ # Each call gets its own _CHECK_STACK_SPACE_OPERAND
+ self.assertEqual(uop_names.count("_CHECK_STACK_SPACE_OPERAND"), 2)
+ # Each _CHECK_STACK_SPACE_OPERAND has the framesize of its function
+ self.assertIn(("_CHECK_STACK_SPACE_OPERAND",
+ _testinternalcapi.get_co_framesize(dummy12.__code__)), uops_and_operands)
+ self.assertIn(("_CHECK_STACK_SPACE_OPERAND",
+ _testinternalcapi.get_co_framesize(dummy13.__code__)), uops_and_operands)
- @unittest.skip("gh-139109 WIP")
def test_combine_stack_space_checks_nested(self):
def dummy12(x):
return x + 3
self.assertEqual(uop_names.count("_PUSH_FRAME"), 2)
self.assertEqual(uop_names.count("_RETURN_VALUE"), 2)
self.assertEqual(uop_names.count("_CHECK_STACK_SPACE"), 0)
- self.assertEqual(uop_names.count("_CHECK_STACK_SPACE_OPERAND"), 1)
- # nested calls: 15 + 12 == 27
- largest_stack = (
- _testinternalcapi.get_co_framesize(dummy15.__code__) +
- _testinternalcapi.get_co_framesize(dummy12.__code__)
- )
- self.assertIn(("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands)
+ self.assertEqual(uop_names.count("_CHECK_STACK_SPACE_OPERAND"), 2)
+ self.assertIn(("_CHECK_STACK_SPACE_OPERAND",
+ _testinternalcapi.get_co_framesize(dummy15.__code__)), uops_and_operands)
+ self.assertIn(("_CHECK_STACK_SPACE_OPERAND",
+ _testinternalcapi.get_co_framesize(dummy12.__code__)), uops_and_operands)
- @unittest.skip("gh-139109 WIP")
def test_combine_stack_space_checks_several_calls(self):
def dummy12(x):
return x + 3
self.assertEqual(uop_names.count("_PUSH_FRAME"), 4)
self.assertEqual(uop_names.count("_RETURN_VALUE"), 4)
self.assertEqual(uop_names.count("_CHECK_STACK_SPACE"), 0)
- self.assertEqual(uop_names.count("_CHECK_STACK_SPACE_OPERAND"), 1)
- # max(12, 18 + max(12, 13)) == 31
- largest_stack = (
- _testinternalcapi.get_co_framesize(dummy18.__code__) +
- _testinternalcapi.get_co_framesize(dummy13.__code__)
- )
- self.assertIn(("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands)
+ self.assertEqual(uop_names.count("_CHECK_STACK_SPACE_OPERAND"), 4)
+ self.assertIn(("_CHECK_STACK_SPACE_OPERAND",
+ _testinternalcapi.get_co_framesize(dummy12.__code__)), uops_and_operands)
+ self.assertIn(("_CHECK_STACK_SPACE_OPERAND",
+ _testinternalcapi.get_co_framesize(dummy13.__code__)), uops_and_operands)
+ self.assertIn(("_CHECK_STACK_SPACE_OPERAND",
+ _testinternalcapi.get_co_framesize(dummy18.__code__)), uops_and_operands)
- @unittest.skip("gh-139109 WIP")
def test_combine_stack_space_checks_several_calls_different_order(self):
# same as `several_calls` but with top-level calls reversed
def dummy12(x):
self.assertEqual(uop_names.count("_PUSH_FRAME"), 4)
self.assertEqual(uop_names.count("_RETURN_VALUE"), 4)
self.assertEqual(uop_names.count("_CHECK_STACK_SPACE"), 0)
- self.assertEqual(uop_names.count("_CHECK_STACK_SPACE_OPERAND"), 1)
- # max(18 + max(12, 13), 12) == 31
- largest_stack = (
- _testinternalcapi.get_co_framesize(dummy18.__code__) +
- _testinternalcapi.get_co_framesize(dummy13.__code__)
- )
- self.assertIn(("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands)
-
- @unittest.skip("gh-139109 WIP")
+ self.assertEqual(uop_names.count("_CHECK_STACK_SPACE_OPERAND"), 4)
+ self.assertIn(("_CHECK_STACK_SPACE_OPERAND",
+ _testinternalcapi.get_co_framesize(dummy12.__code__)), uops_and_operands)
+ self.assertIn(("_CHECK_STACK_SPACE_OPERAND",
+ _testinternalcapi.get_co_framesize(dummy13.__code__)), uops_and_operands)
+ self.assertIn(("_CHECK_STACK_SPACE_OPERAND",
+ _testinternalcapi.get_co_framesize(dummy18.__code__)), uops_and_operands)
+
+ @unittest.skip("reopen when we combine multiple stack space checks into one")
def test_combine_stack_space_complex(self):
def dummy0(x):
return x
("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands
)
- @unittest.skip("gh-139109 WIP")
+ @unittest.skip("reopen when we combine multiple stack space checks into one")
def test_combine_stack_space_checks_large_framesize(self):
# Create a function with a large framesize. This ensures _CHECK_STACK_SPACE is
# actually doing its job. Note that the resulting trace hits
("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands
)
- @unittest.skip("gh-139109 WIP")
+ @unittest.skip("reopen when we combine multiple stack space checks into one")
def test_combine_stack_space_checks_recursion(self):
def dummy15(x):
while x > 0:
SET_CURRENT_CACHED_VALUES(0);
JUMP_TO_JUMP_TARGET();
}
- if (tstate->py_recursion_remaining <= 1) {
- UOP_STAT_INC(uopcode, miss);
- SET_CURRENT_CACHED_VALUES(0);
- JUMP_TO_JUMP_TARGET();
- }
SET_CURRENT_CACHED_VALUES(0);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
break;
SET_CURRENT_CACHED_VALUES(1);
JUMP_TO_JUMP_TARGET();
}
- if (tstate->py_recursion_remaining <= 1) {
- UOP_STAT_INC(uopcode, miss);
- _tos_cache0 = _stack_item_0;
- SET_CURRENT_CACHED_VALUES(1);
- JUMP_TO_JUMP_TARGET();
- }
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(1);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
SET_CURRENT_CACHED_VALUES(2);
JUMP_TO_JUMP_TARGET();
}
- if (tstate->py_recursion_remaining <= 1) {
- UOP_STAT_INC(uopcode, miss);
- _tos_cache1 = _stack_item_1;
- _tos_cache0 = _stack_item_0;
- SET_CURRENT_CACHED_VALUES(2);
- JUMP_TO_JUMP_TARGET();
- }
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;
SET_CURRENT_CACHED_VALUES(2);
SET_CURRENT_CACHED_VALUES(3);
JUMP_TO_JUMP_TARGET();
}
- if (tstate->py_recursion_remaining <= 1) {
- UOP_STAT_INC(uopcode, miss);
- _tos_cache2 = _stack_item_2;
- _tos_cache1 = _stack_item_1;
- _tos_cache0 = _stack_item_0;
- SET_CURRENT_CACHED_VALUES(3);
- JUMP_TO_JUMP_TARGET();
- }
_tos_cache2 = _stack_item_2;
_tos_cache1 = _stack_item_1;
_tos_cache0 = _stack_item_0;