@@ -397,7 +397,7 @@ _PyFunction_LookupByVersion(uint32_t version, PyObject **p_code)
397397uint32_t
398398_PyFunction_GetVersionForCurrentState (PyFunctionObject * func )
399399{
400- return func -> func_version ;
400+ return FT_ATOMIC_LOAD_UINT32_RELAXED ( func -> func_version ) ;
401401}
402402
403403PyObject *
@@ -413,7 +413,7 @@ PyFunction_GetCode(PyObject *op)
413413 PyErr_BadInternalCall ();
414414 return NULL ;
415415 }
416- return (( PyFunctionObject * ) op ) -> func_code ;
416+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_code ) ;
417417}
418418
419419PyObject *
@@ -423,7 +423,7 @@ PyFunction_GetGlobals(PyObject *op)
423423 PyErr_BadInternalCall ();
424424 return NULL ;
425425 }
426- return (( PyFunctionObject * ) op ) -> func_globals ;
426+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_globals ) ;
427427}
428428
429429PyObject *
@@ -433,7 +433,7 @@ PyFunction_GetModule(PyObject *op)
433433 PyErr_BadInternalCall ();
434434 return NULL ;
435435 }
436- return (( PyFunctionObject * ) op ) -> func_module ;
436+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_module ) ;
437437}
438438
439439PyObject *
@@ -443,7 +443,7 @@ PyFunction_GetDefaults(PyObject *op)
443443 PyErr_BadInternalCall ();
444444 return NULL ;
445445 }
446- return (( PyFunctionObject * ) op ) -> func_defaults ;
446+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_defaults ) ;
447447}
448448
449449int
@@ -462,19 +462,23 @@ PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
462462 PyErr_SetString (PyExc_SystemError , "non-tuple default args" );
463463 return -1 ;
464464 }
465+ Py_BEGIN_CRITICAL_SECTION (op );
465466 handle_func_event (PyFunction_EVENT_MODIFY_DEFAULTS ,
466467 (PyFunctionObject * ) op , defaults );
467468 _PyFunction_ClearVersion ((PyFunctionObject * )op );
468469 Py_XSETREF (((PyFunctionObject * )op )-> func_defaults , defaults );
470+ Py_END_CRITICAL_SECTION ();
469471 return 0 ;
470472}
471473
472474void
473475PyFunction_SetVectorcall (PyFunctionObject * func , vectorcallfunc vectorcall )
474476{
475477 assert (func != NULL );
478+ Py_BEGIN_CRITICAL_SECTION (func );
476479 _PyFunction_ClearVersion (func );
477480 func -> vectorcall = vectorcall ;
481+ Py_END_CRITICAL_SECTION ();
478482}
479483
480484PyObject *
@@ -484,7 +488,7 @@ PyFunction_GetKwDefaults(PyObject *op)
484488 PyErr_BadInternalCall ();
485489 return NULL ;
486490 }
487- return (( PyFunctionObject * ) op ) -> func_kwdefaults ;
491+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_kwdefaults ) ;
488492}
489493
490494int
@@ -504,10 +508,12 @@ PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults)
504508 "non-dict keyword only default args" );
505509 return -1 ;
506510 }
511+ Py_BEGIN_CRITICAL_SECTION (op );
507512 handle_func_event (PyFunction_EVENT_MODIFY_KWDEFAULTS ,
508513 (PyFunctionObject * ) op , defaults );
509514 _PyFunction_ClearVersion ((PyFunctionObject * )op );
510515 Py_XSETREF (((PyFunctionObject * )op )-> func_kwdefaults , defaults );
516+ Py_END_CRITICAL_SECTION ();
511517 return 0 ;
512518}
513519
@@ -518,7 +524,7 @@ PyFunction_GetClosure(PyObject *op)
518524 PyErr_BadInternalCall ();
519525 return NULL ;
520526 }
521- return (( PyFunctionObject * ) op ) -> func_closure ;
527+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_closure ) ;
522528}
523529
524530int
@@ -539,8 +545,10 @@ PyFunction_SetClosure(PyObject *op, PyObject *closure)
539545 Py_TYPE (closure )-> tp_name );
540546 return -1 ;
541547 }
548+ Py_BEGIN_CRITICAL_SECTION (op );
542549 _PyFunction_ClearVersion ((PyFunctionObject * )op );
543550 Py_XSETREF (((PyFunctionObject * )op )-> func_closure , closure );
551+ Py_END_CRITICAL_SECTION ();
544552 return 0 ;
545553}
546554
@@ -597,7 +605,11 @@ PyFunction_GetAnnotations(PyObject *op)
597605 PyErr_BadInternalCall ();
598606 return NULL ;
599607 }
600- return func_get_annotation_dict ((PyFunctionObject * )op );
608+ PyObject * d = NULL ;
609+ Py_BEGIN_CRITICAL_SECTION (op );
610+ d = func_get_annotation_dict ((PyFunctionObject * )op );
611+ Py_END_CRITICAL_SECTION ();
612+ return d ;
601613}
602614
603615int
@@ -618,8 +630,10 @@ PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)
618630 return -1 ;
619631 }
620632 PyFunctionObject * func = (PyFunctionObject * )op ;
633+ Py_BEGIN_CRITICAL_SECTION (op );
621634 Py_XSETREF (func -> func_annotations , annotations );
622635 Py_CLEAR (func -> func_annotate );
636+ Py_END_CRITICAL_SECTION ();
623637 return 0 ;
624638}
625639
@@ -1231,8 +1245,9 @@ static PyObject*
12311245func_repr (PyObject * self )
12321246{
12331247 PyFunctionObject * op = _PyFunction_CAST (self );
1248+ PyObject * func_name = FT_ATOMIC_LOAD_PTR (op -> func_qualname );
12341249 return PyUnicode_FromFormat ("<function %U at %p>" ,
1235- op -> func_qualname , op );
1250+ func_name , op );
12361251}
12371252
12381253static int
0 commit comments