@@ -514,6 +514,28 @@ _Py_LazyJitShim(
514514 main interpreter. We fix those fields here, in addition
515515 to the other dynamically initialized fields.
516516 */
517+
518+ static inline bool
519+ is_env_enabled (const char * env_name )
520+ {
521+ char * env = Py_GETENV (env_name );
522+ return env && * env != '\0' && * env != '0' ;
523+ }
524+
525+ static inline void
526+ init_policy (uint16_t * target , const char * env_name , uint16_t default_value ,
527+ long min_value , long max_value )
528+ {
529+ * target = default_value ;
530+ char * env = Py_GETENV (env_name );
531+ if (env && * env != '\0' ) {
532+ long value = atol (env );
533+ if (value >= min_value && value <= max_value ) {
534+ * target = (uint16_t )value ;
535+ }
536+ }
537+ }
538+
517539static PyStatus
518540init_interpreter (PyInterpreterState * interp ,
519541 _PyRuntimeState * runtime , int64_t id ,
@@ -572,6 +594,31 @@ init_interpreter(PyInterpreterState *interp,
572594 interp -> executor_list_head = NULL ;
573595 interp -> executor_deletion_list_head = NULL ;
574596 interp -> executor_creation_counter = JIT_CLEANUP_THRESHOLD ;
597+
598+ // Initialize optimization configuration from environment variables
599+ // PYTHON_JIT_STRESS sets aggressive defaults for testing, but can be overridden
600+ uint16_t jump_default = JUMP_BACKWARD_INITIAL_VALUE ;
601+ uint16_t side_exit_default = SIDE_EXIT_INITIAL_VALUE ;
602+
603+ if (is_env_enabled ("PYTHON_JIT_STRESS" )) {
604+ jump_default = 63 ;
605+ side_exit_default = 63 ;
606+ }
607+
608+ init_policy (& interp -> opt_config .jump_backward_initial_value ,
609+ "PYTHON_JIT_JUMP_BACKWARD_INITIAL_VALUE" ,
610+ jump_default , 1 , MAX_VALUE );
611+ init_policy (& interp -> opt_config .jump_backward_initial_backoff ,
612+ "PYTHON_JIT_JUMP_BACKWARD_INITIAL_BACKOFF" ,
613+ JUMP_BACKWARD_INITIAL_BACKOFF , 0 , MAX_BACKOFF );
614+ init_policy (& interp -> opt_config .side_exit_initial_value ,
615+ "PYTHON_JIT_SIDE_EXIT_INITIAL_VALUE" ,
616+ side_exit_default , 1 , MAX_VALUE );
617+ init_policy (& interp -> opt_config .side_exit_initial_backoff ,
618+ "PYTHON_JIT_SIDE_EXIT_INITIAL_BACKOFF" ,
619+ SIDE_EXIT_INITIAL_BACKOFF , 0 , MAX_BACKOFF );
620+
621+ interp -> opt_config .specialization_enabled = !is_env_enabled ("PYTHON_SPECIALIZATION_OFF" );
575622 if (interp != & runtime -> _main_interpreter ) {
576623 /* Fix the self-referential, statically initialized fields. */
577624 interp -> dtoa = (struct _dtoa_state )_dtoa_state_INIT (interp );
@@ -1439,20 +1486,6 @@ decref_threadstate(_PyThreadStateImpl *tstate)
14391486 }
14401487}
14411488
1442- static inline void
1443- init_policy (uint16_t * target , const char * env_name , uint16_t default_value ,
1444- long min_value , long max_value )
1445- {
1446- * target = default_value ;
1447- char * env = Py_GETENV (env_name );
1448- if (env && * env != '\0' ) {
1449- long value = atol (env );
1450- if (value >= min_value && value <= max_value ) {
1451- * target = (uint16_t )value ;
1452- }
1453- }
1454- }
1455-
14561489/* Get the thread state to a minimal consistent state.
14571490 Further init happens in pylifecycle.c before it can be used.
14581491 All fields not initialized here are expected to be zeroed out,
@@ -1538,21 +1571,8 @@ init_threadstate(_PyThreadStateImpl *_tstate,
15381571
15391572 _tstate -> asyncio_running_loop = NULL ;
15401573 _tstate -> asyncio_running_task = NULL ;
1541- // Initialize interpreter policy from environment variables
1542- init_policy (& _tstate -> policy .interp .jump_backward_initial_value ,
1543- "PYTHON_JIT_JUMP_BACKWARD_INITIAL_VALUE" ,
1544- JUMP_BACKWARD_INITIAL_VALUE , 1 , MAX_VALUE );
1545- init_policy (& _tstate -> policy .interp .jump_backward_initial_backoff ,
1546- "PYTHON_JIT_JUMP_BACKWARD_INITIAL_BACKOFF" ,
1547- JUMP_BACKWARD_INITIAL_BACKOFF , 0 , MAX_BACKOFF );
1574+
15481575#ifdef _Py_TIER2
1549- // Initialize JIT policy from environment variables
1550- init_policy (& _tstate -> policy .jit .side_exit_initial_value ,
1551- "PYTHON_JIT_SIDE_EXIT_INITIAL_VALUE" ,
1552- SIDE_EXIT_INITIAL_VALUE , 1 , MAX_VALUE );
1553- init_policy (& _tstate -> policy .jit .side_exit_initial_backoff ,
1554- "PYTHON_JIT_SIDE_EXIT_INITIAL_BACKOFF" ,
1555- SIDE_EXIT_INITIAL_BACKOFF , 0 , MAX_BACKOFF );
15561576 _tstate -> jit_tracer_state = NULL ;
15571577#endif
15581578 tstate -> delete_later = NULL ;
0 commit comments