@@ -397,7 +397,7 @@ _PyFunction_LookupByVersion(uint32_t version, PyObject **p_code)
397
397
uint32_t
398
398
_PyFunction_GetVersionForCurrentState (PyFunctionObject * func )
399
399
{
400
- return func -> func_version ;
400
+ return FT_ATOMIC_LOAD_UINT32_RELAXED ( func -> func_version ) ;
401
401
}
402
402
403
403
PyObject *
@@ -413,7 +413,7 @@ PyFunction_GetCode(PyObject *op)
413
413
PyErr_BadInternalCall ();
414
414
return NULL ;
415
415
}
416
- return (( PyFunctionObject * ) op ) -> func_code ;
416
+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_code ) ;
417
417
}
418
418
419
419
PyObject *
@@ -423,7 +423,7 @@ PyFunction_GetGlobals(PyObject *op)
423
423
PyErr_BadInternalCall ();
424
424
return NULL ;
425
425
}
426
- return (( PyFunctionObject * ) op ) -> func_globals ;
426
+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_globals ) ;
427
427
}
428
428
429
429
PyObject *
@@ -433,7 +433,7 @@ PyFunction_GetModule(PyObject *op)
433
433
PyErr_BadInternalCall ();
434
434
return NULL ;
435
435
}
436
- return (( PyFunctionObject * ) op ) -> func_module ;
436
+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_module ) ;
437
437
}
438
438
439
439
PyObject *
@@ -443,7 +443,7 @@ PyFunction_GetDefaults(PyObject *op)
443
443
PyErr_BadInternalCall ();
444
444
return NULL ;
445
445
}
446
- return (( PyFunctionObject * ) op ) -> func_defaults ;
446
+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_defaults ) ;
447
447
}
448
448
449
449
int
@@ -462,19 +462,23 @@ PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
462
462
PyErr_SetString (PyExc_SystemError , "non-tuple default args" );
463
463
return -1 ;
464
464
}
465
+ Py_BEGIN_CRITICAL_SECTION (op );
465
466
handle_func_event (PyFunction_EVENT_MODIFY_DEFAULTS ,
466
467
(PyFunctionObject * ) op , defaults );
467
468
_PyFunction_ClearVersion ((PyFunctionObject * )op );
468
469
Py_XSETREF (((PyFunctionObject * )op )-> func_defaults , defaults );
470
+ Py_END_CRITICAL_SECTION ();
469
471
return 0 ;
470
472
}
471
473
472
474
void
473
475
PyFunction_SetVectorcall (PyFunctionObject * func , vectorcallfunc vectorcall )
474
476
{
475
477
assert (func != NULL );
478
+ Py_BEGIN_CRITICAL_SECTION (func );
476
479
_PyFunction_ClearVersion (func );
477
480
func -> vectorcall = vectorcall ;
481
+ Py_END_CRITICAL_SECTION ();
478
482
}
479
483
480
484
PyObject *
@@ -484,7 +488,7 @@ PyFunction_GetKwDefaults(PyObject *op)
484
488
PyErr_BadInternalCall ();
485
489
return NULL ;
486
490
}
487
- return (( PyFunctionObject * ) op ) -> func_kwdefaults ;
491
+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_kwdefaults ) ;
488
492
}
489
493
490
494
int
@@ -504,10 +508,12 @@ PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults)
504
508
"non-dict keyword only default args" );
505
509
return -1 ;
506
510
}
511
+ Py_BEGIN_CRITICAL_SECTION (op );
507
512
handle_func_event (PyFunction_EVENT_MODIFY_KWDEFAULTS ,
508
513
(PyFunctionObject * ) op , defaults );
509
514
_PyFunction_ClearVersion ((PyFunctionObject * )op );
510
515
Py_XSETREF (((PyFunctionObject * )op )-> func_kwdefaults , defaults );
516
+ Py_END_CRITICAL_SECTION ();
511
517
return 0 ;
512
518
}
513
519
@@ -518,7 +524,7 @@ PyFunction_GetClosure(PyObject *op)
518
524
PyErr_BadInternalCall ();
519
525
return NULL ;
520
526
}
521
- return (( PyFunctionObject * ) op ) -> func_closure ;
527
+ return FT_ATOMIC_LOAD_PTR ((( PyFunctionObject * ) op ) -> func_closure ) ;
522
528
}
523
529
524
530
int
@@ -539,8 +545,10 @@ PyFunction_SetClosure(PyObject *op, PyObject *closure)
539
545
Py_TYPE (closure )-> tp_name );
540
546
return -1 ;
541
547
}
548
+ Py_BEGIN_CRITICAL_SECTION (op );
542
549
_PyFunction_ClearVersion ((PyFunctionObject * )op );
543
550
Py_XSETREF (((PyFunctionObject * )op )-> func_closure , closure );
551
+ Py_END_CRITICAL_SECTION ();
544
552
return 0 ;
545
553
}
546
554
@@ -597,7 +605,11 @@ PyFunction_GetAnnotations(PyObject *op)
597
605
PyErr_BadInternalCall ();
598
606
return NULL ;
599
607
}
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 ;
601
613
}
602
614
603
615
int
@@ -618,8 +630,10 @@ PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)
618
630
return -1 ;
619
631
}
620
632
PyFunctionObject * func = (PyFunctionObject * )op ;
633
+ Py_BEGIN_CRITICAL_SECTION (op );
621
634
Py_XSETREF (func -> func_annotations , annotations );
622
635
Py_CLEAR (func -> func_annotate );
636
+ Py_END_CRITICAL_SECTION ();
623
637
return 0 ;
624
638
}
625
639
@@ -1231,8 +1245,9 @@ static PyObject*
1231
1245
func_repr (PyObject * self )
1232
1246
{
1233
1247
PyFunctionObject * op = _PyFunction_CAST (self );
1248
+ PyObject * func_name = FT_ATOMIC_LOAD_PTR (op -> func_qualname );
1234
1249
return PyUnicode_FromFormat ("<function %U at %p>" ,
1235
- op -> func_qualname , op );
1250
+ func_name , op );
1236
1251
}
1237
1252
1238
1253
static int
0 commit comments