@@ -2196,6 +2196,64 @@ def test_remote_exec_in_process_without_debug_fails_xoption(self):
2196
2196
self .assertIn (b"Remote debugging is not enabled" , err )
2197
2197
self .assertEqual (out , b"" )
2198
2198
2199
+ class TestSysJIT (unittest .TestCase ):
2200
+
2201
+ def test_jit_is_available (self ):
2202
+ available = sys ._jit .is_available ()
2203
+ script = f"import sys; assert sys._jit.is_available() is { available } "
2204
+ assert_python_ok ("-c" , script , PYTHON_JIT = "0" )
2205
+ assert_python_ok ("-c" , script , PYTHON_JIT = "1" )
2206
+
2207
+ def test_jit_is_enabled (self ):
2208
+ available = sys ._jit .is_available ()
2209
+ script = "import sys; assert sys._jit.is_enabled() is {enabled}"
2210
+ assert_python_ok ("-c" , script .format (enabled = False ), PYTHON_JIT = "0" )
2211
+ assert_python_ok ("-c" , script .format (enabled = available ), PYTHON_JIT = "1" )
2212
+
2213
+ def test_jit_is_active (self ):
2214
+ available = sys ._jit .is_available ()
2215
+ script = textwrap .dedent (
2216
+ """
2217
+ import _testcapi
2218
+ import _testinternalcapi
2219
+ import sys
2220
+
2221
+ def frame_0_interpreter() -> None:
2222
+ assert sys._jit.is_active() is False
2223
+
2224
+ def frame_1_interpreter() -> None:
2225
+ assert sys._jit.is_active() is False
2226
+ frame_0_interpreter()
2227
+ assert sys._jit.is_active() is False
2228
+
2229
+ def frame_2_jit(expected: bool) -> None:
2230
+ # Inlined into the last loop of frame_3_jit:
2231
+ assert sys._jit.is_active() is expected
2232
+ # Insert C frame:
2233
+ _testcapi.pyobject_vectorcall(frame_1_interpreter, None, None)
2234
+ assert sys._jit.is_active() is expected
2235
+
2236
+ def frame_3_jit() -> None:
2237
+ # JITs just before the last loop:
2238
+ for i in range(_testinternalcapi.TIER2_THRESHOLD + 1):
2239
+ # Careful, doing this in the reverse order breaks tracing:
2240
+ expected = {enabled} and i == _testinternalcapi.TIER2_THRESHOLD
2241
+ assert sys._jit.is_active() is expected
2242
+ frame_2_jit(expected)
2243
+ assert sys._jit.is_active() is expected
2244
+
2245
+ def frame_4_interpreter() -> None:
2246
+ assert sys._jit.is_active() is False
2247
+ frame_3_jit()
2248
+ assert sys._jit.is_active() is False
2249
+
2250
+ assert sys._jit.is_active() is False
2251
+ frame_4_interpreter()
2252
+ assert sys._jit.is_active() is False
2253
+ """
2254
+ )
2255
+ assert_python_ok ("-c" , script .format (enabled = False ), PYTHON_JIT = "0" )
2256
+ assert_python_ok ("-c" , script .format (enabled = available ), PYTHON_JIT = "1" )
2199
2257
2200
2258
2201
2259
if __name__ == "__main__" :
0 commit comments