@@ -127,28 +127,23 @@ impl<'py> PyCodeMethods<'py> for Bound<'py, PyCode> {
127127 // - https://github.com/python/cpython/pull/24564 (the same fix in CPython 3.10)
128128 // - https://github.com/PyO3/pyo3/issues/3370
129129 let builtins_s = crate :: intern!( self . py( ) , "__builtins__" ) ;
130- let has_builtins = globals. contains ( builtins_s) ?;
131- if !has_builtins {
132- crate :: sync:: critical_section:: with_critical_section ( globals, || {
133- // check if another thread set __builtins__ while this thread was blocked on the critical section
134- let has_builtins = globals. contains ( builtins_s) ?;
135- if !has_builtins {
136- // Inherit current builtins.
137- let builtins = unsafe { ffi:: PyEval_GetBuiltins ( ) } ;
138-
139- // `PyDict_SetItem` doesn't take ownership of `builtins`, but `PyEval_GetBuiltins`
140- // seems to return a borrowed reference, so no leak here.
141- if unsafe {
142- ffi:: PyDict_SetItem ( globals. as_ptr ( ) , builtins_s. as_ptr ( ) , builtins)
143- } == -1
144- {
145- return Err ( PyErr :: fetch ( self . py ( ) ) ) ;
146- }
147- }
148- Ok ( ( ) )
149- } ) ?;
130+ let mut result: * mut ffi:: PyObject = std:: ptr:: null_mut ( ) ;
131+ if unsafe {
132+ ffi:: compat:: PyDict_SetDefaultRef (
133+ globals. as_ptr ( ) ,
134+ builtins_s. as_ptr ( ) ,
135+ // borrowed reference
136+ ffi:: PyEval_GetBuiltins ( ) ,
137+ & mut result,
138+ )
139+ } == -1
140+ {
141+ return Err ( PyErr :: fetch ( self . py ( ) ) ) ;
150142 }
151143
144+ // release ownership of result
145+ unsafe { ffi:: Py_DECREF ( result) } ;
146+
152147 unsafe {
153148 ffi:: PyEval_EvalCode ( self . as_ptr ( ) , globals. as_ptr ( ) , locals. as_ptr ( ) )
154149 . assume_owned_or_err ( self . py ( ) )
0 commit comments