@@ -514,6 +514,21 @@ _Py_LazyJitShim(
514514 main interpreter. We fix those fields here, in addition
515515 to the other dynamically initialized fields.
516516 */
517+
518+ static inline void
519+ init_policy (uint16_t * target , const char * env_name , uint16_t default_value ,
520+ long min_value , long max_value )
521+ {
522+ * target = default_value ;
523+ char * env = Py_GETENV (env_name );
524+ if (env && * env != '\0' ) {
525+ long value = atol (env );
526+ if (value >= min_value && value <= max_value ) {
527+ * target = (uint16_t )value ;
528+ }
529+ }
530+ }
531+
517532static PyStatus
518533init_interpreter (PyInterpreterState * interp ,
519534 _PyRuntimeState * runtime , int64_t id ,
@@ -572,6 +587,31 @@ init_interpreter(PyInterpreterState *interp,
572587 interp -> executor_list_head = NULL ;
573588 interp -> executor_deletion_list_head = NULL ;
574589 interp -> executor_creation_counter = JIT_CLEANUP_THRESHOLD ;
590+
591+ // Initialize optimization configuration from environment variables
592+ init_policy (& interp -> opt_config .jump_backward_initial_value ,
593+ "PYTHON_JIT_JUMP_BACKWARD_INITIAL_VALUE" ,
594+ JUMP_BACKWARD_INITIAL_VALUE , 1 , MAX_VALUE );
595+ init_policy (& interp -> opt_config .jump_backward_initial_backoff ,
596+ "PYTHON_JIT_JUMP_BACKWARD_INITIAL_BACKOFF" ,
597+ JUMP_BACKWARD_INITIAL_BACKOFF , 0 , MAX_BACKOFF );
598+ #ifdef _Py_TIER2
599+ init_policy (& interp -> opt_config .side_exit_initial_value ,
600+ "PYTHON_JIT_SIDE_EXIT_INITIAL_VALUE" ,
601+ SIDE_EXIT_INITIAL_VALUE , 1 , MAX_VALUE );
602+ init_policy (& interp -> opt_config .side_exit_initial_backoff ,
603+ "PYTHON_JIT_SIDE_EXIT_INITIAL_BACKOFF" ,
604+ SIDE_EXIT_INITIAL_BACKOFF , 0 , MAX_BACKOFF );
605+ #endif
606+
607+ // Check if specialization should be disabled
608+ // If PYTHON_SPECIALIZATION_OFF is set to any non-empty value, disable specialization
609+ char * spec_off_env = Py_GETENV ("PYTHON_SPECIALIZATION_OFF" );
610+ if (spec_off_env && * spec_off_env != '\0' && * spec_off_env != '0' ) {
611+ interp -> opt_config .specialization_enabled = false;
612+ } else {
613+ interp -> opt_config .specialization_enabled = true;
614+ }
575615 if (interp != & runtime -> _main_interpreter ) {
576616 /* Fix the self-referential, statically initialized fields. */
577617 interp -> dtoa = (struct _dtoa_state )_dtoa_state_INIT (interp );
@@ -1439,20 +1479,6 @@ decref_threadstate(_PyThreadStateImpl *tstate)
14391479 }
14401480}
14411481
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-
14561482/* Get the thread state to a minimal consistent state.
14571483 Further init happens in pylifecycle.c before it can be used.
14581484 All fields not initialized here are expected to be zeroed out,
@@ -1538,21 +1564,8 @@ init_threadstate(_PyThreadStateImpl *_tstate,
15381564
15391565 _tstate -> asyncio_running_loop = NULL ;
15401566 _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 );
1567+
15481568#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 );
15561569 _tstate -> jit_tracer_state = NULL ;
15571570#endif
15581571 tstate -> delete_later = NULL ;
0 commit comments