@@ -2196,6 +2196,64 @@ def test_remote_exec_in_process_without_debug_fails_xoption(self):
21962196 self .assertIn (b"Remote debugging is not enabled" , err )
21972197 self .assertEqual (out , b"" )
21982198
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 _testinternalcapi
2218+ import operator
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+ operator.call(frame_1_interpreter)
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" )
21992257
22002258
22012259if __name__ == "__main__" :
0 commit comments