Skip to content

Commit 949352e

Browse files
committed
remove unnecessary comments
1 parent ce188a4 commit 949352e

File tree

3 files changed

+89
-3
lines changed

3 files changed

+89
-3
lines changed

Include/internal/pycore_optimizer.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,9 @@ void _Py_ExecutorDetach(_PyExecutorObject *);
109109
void _Py_BloomFilter_Init(_PyBloomFilter *);
110110
void _Py_BloomFilter_Add(_PyBloomFilter *bloom, void *obj);
111111

112-
// Export for '_testinternalcapi' shared extension.
113112
PyAPI_FUNC(void) _Py_Executor_DependsOn(_PyExecutorObject *executor, void *obj);
114113

115114
// For testing
116-
// Export for '_testinternalcapi' shared extension.
117115
PyAPI_FUNC(_PyOptimizerObject *) _Py_GetOptimizer(void);
118116
PyAPI_FUNC(int) _Py_SetTier2Optimizer(_PyOptimizerObject* optimizer);
119117
PyAPI_FUNC(PyObject *) _PyOptimizer_NewUOpOptimizer(void);
@@ -270,7 +268,6 @@ extern int _Py_uop_frame_pop(_Py_UOpsContext *ctx);
270268

271269
PyAPI_FUNC(PyObject *) _Py_uop_symbols_test(PyObject *self, PyObject *ignored);
272270

273-
// Export for '_testinternalcapi' shared extension.
274271
PyAPI_FUNC(int) _PyOptimizer_Optimize(struct _PyInterpreterFrame *frame, _Py_CODEUNIT *start, _PyStackRef *stack_pointer, _PyExecutorObject **exec_ptr, int chain_depth);
275272

276273
static inline int is_terminator(const _PyUOpInstruction *uop)

Lib/test/test_capi/test_opt.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,80 @@ def get_opnames(ex):
5555
return list(iter_opnames(ex))
5656

5757

58+
@requires_specialization
59+
@unittest.skipIf(Py_GIL_DISABLED, "optimizer not yet supported in free-threaded builds")
60+
class TestExecutorInvalidation(unittest.TestCase):
61+
62+
def test_invalidate_object(self):
63+
# Generate a new set of functions at each call
64+
ns = {}
65+
func_src = "\n".join(
66+
f"""
67+
def f{n}():
68+
for _ in range(1000):
69+
pass
70+
""" for n in range(5)
71+
)
72+
exec(textwrap.dedent(func_src), ns, ns)
73+
funcs = [ ns[f'f{n}'] for n in range(5)]
74+
objects = [object() for _ in range(5)]
75+
76+
opt = _testinternalcapi.new_uop_optimizer()
77+
with temporary_optimizer(opt):
78+
for f in funcs:
79+
f()
80+
executors = [get_first_executor(f) for f in funcs]
81+
# Set things up so each executor depends on the objects
82+
# with an equal or lower index.
83+
for i, exe in enumerate(executors):
84+
self.assertTrue(exe.is_valid())
85+
for obj in objects[:i+1]:
86+
_testinternalcapi.add_executor_dependency(exe, obj)
87+
self.assertTrue(exe.is_valid())
88+
# Assert that the correct executors are invalidated
89+
# and check that nothing crashes when we invalidate
90+
# an executor multiple times.
91+
for i in (4,3,2,1,0):
92+
_testinternalcapi.invalidate_executors(objects[i])
93+
for exe in executors[i:]:
94+
self.assertFalse(exe.is_valid())
95+
for exe in executors[:i]:
96+
self.assertTrue(exe.is_valid())
97+
98+
def test_uop_optimizer_invalidation(self):
99+
# Generate a new function at each call
100+
ns = {}
101+
exec(textwrap.dedent("""
102+
def f():
103+
for i in range(1000):
104+
pass
105+
"""), ns, ns)
106+
f = ns['f']
107+
opt = _testinternalcapi.new_uop_optimizer()
108+
with temporary_optimizer(opt):
109+
f()
110+
exe = get_first_executor(f)
111+
self.assertIsNotNone(exe)
112+
self.assertTrue(exe.is_valid())
113+
_testinternalcapi.invalidate_executors(f.__code__)
114+
self.assertFalse(exe.is_valid())
115+
116+
def test_sys__clear_internal_caches(self):
117+
def f():
118+
for _ in range(1000):
119+
pass
120+
opt = _testinternalcapi.new_uop_optimizer()
121+
with temporary_optimizer(opt):
122+
f()
123+
exe = get_first_executor(f)
124+
self.assertIsNotNone(exe)
125+
self.assertTrue(exe.is_valid())
126+
sys._clear_internal_caches()
127+
self.assertFalse(exe.is_valid())
128+
exe = get_first_executor(f)
129+
self.assertIsNone(exe)
130+
131+
58132
@requires_specialization
59133
@unittest.skipIf(Py_GIL_DISABLED, "optimizer not yet supported in free-threaded builds")
60134
@unittest.skipUnless(hasattr(_testinternalcapi, "get_optimizer"),

Lib/test/test_monitoring.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2086,6 +2086,21 @@ def callback(code, instruction_offset):
20862086
sys.monitoring.set_events(0, 0)
20872087

20882088

2089+
class TestOptimizer(MonitoringTestBase, unittest.TestCase):
2090+
2091+
def test_for_loop(self):
2092+
def test_func(x):
2093+
i = 0
2094+
while i < x:
2095+
i += 1
2096+
2097+
code = test_func.__code__
2098+
sys.monitoring.set_local_events(TEST_TOOL, code, E.PY_START)
2099+
self.assertEqual(sys.monitoring.get_local_events(TEST_TOOL, code), E.PY_START)
2100+
test_func(1000)
2101+
sys.monitoring.set_local_events(TEST_TOOL, code, 0)
2102+
self.assertEqual(sys.monitoring.get_local_events(TEST_TOOL, code), 0)
2103+
20892104
class TestTier2Optimizer(CheckEvents):
20902105

20912106
def test_monitoring_already_opimized_loop(self):

0 commit comments

Comments
 (0)