@@ -131,7 +131,7 @@ _PyFunction_FromConstructor(PyFrameConstructor *constr)
131
131
op -> func_annotations = NULL ;
132
132
op -> func_typeparams = NULL ;
133
133
op -> vectorcall = _PyFunction_Vectorcall ;
134
- op -> func_version = 0 ;
134
+ _PyFunction_SetVersion ( op , 0 ) ;
135
135
_PyObject_GC_TRACK (op );
136
136
handle_func_event (PyFunction_EVENT_CREATE , op , NULL );
137
137
return op ;
@@ -207,7 +207,7 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
207
207
op -> func_annotations = NULL ;
208
208
op -> func_typeparams = NULL ;
209
209
op -> vectorcall = _PyFunction_Vectorcall ;
210
- op -> func_version = 0 ;
210
+ _PyFunction_SetVersion ( op , 0 ) ;
211
211
_PyObject_GC_TRACK (op );
212
212
handle_func_event (PyFunction_EVENT_CREATE , op , NULL );
213
213
return (PyObject * )op ;
@@ -268,9 +268,17 @@ code objects have been created during the process's lifetime.
268
268
void
269
269
_PyFunction_SetVersion (PyFunctionObject * func , uint32_t version )
270
270
{
271
+ PyInterpreterState * interp = _PyInterpreterState_GET ();
272
+ if (func -> func_version != 0 ) {
273
+ PyFunctionObject * * slot =
274
+ interp -> func_state .func_version_cache
275
+ + (func -> func_version % FUNC_VERSION_CACHE_SIZE );
276
+ if (* slot == func ) {
277
+ * slot = NULL ;
278
+ }
279
+ }
271
280
func -> func_version = version ;
272
281
if (version != 0 ) {
273
- PyInterpreterState * interp = _PyInterpreterState_GET ();
274
282
interp -> func_state .func_version_cache [
275
283
version % FUNC_VERSION_CACHE_SIZE ] = func ;
276
284
}
@@ -370,7 +378,7 @@ PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
370
378
}
371
379
handle_func_event (PyFunction_EVENT_MODIFY_DEFAULTS ,
372
380
(PyFunctionObject * ) op , defaults );
373
- ((PyFunctionObject * )op ) -> func_version = 0 ;
381
+ _PyFunction_SetVersion ((PyFunctionObject * )op , 0 ) ;
374
382
Py_XSETREF (((PyFunctionObject * )op )-> func_defaults , defaults );
375
383
return 0 ;
376
384
}
379
387
PyFunction_SetVectorcall (PyFunctionObject * func , vectorcallfunc vectorcall )
380
388
{
381
389
assert (func != NULL );
382
- func -> func_version = 0 ;
390
+ _PyFunction_SetVersion ( func , 0 ) ;
383
391
func -> vectorcall = vectorcall ;
384
392
}
385
393
@@ -412,7 +420,7 @@ PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults)
412
420
}
413
421
handle_func_event (PyFunction_EVENT_MODIFY_KWDEFAULTS ,
414
422
(PyFunctionObject * ) op , defaults );
415
- ((PyFunctionObject * )op ) -> func_version = 0 ;
423
+ _PyFunction_SetVersion ((PyFunctionObject * )op , 0 ) ;
416
424
Py_XSETREF (((PyFunctionObject * )op )-> func_kwdefaults , defaults );
417
425
return 0 ;
418
426
}
@@ -445,7 +453,7 @@ PyFunction_SetClosure(PyObject *op, PyObject *closure)
445
453
Py_TYPE (closure )-> tp_name );
446
454
return -1 ;
447
455
}
448
- ((PyFunctionObject * )op ) -> func_version = 0 ;
456
+ _PyFunction_SetVersion ((PyFunctionObject * )op , 0 ) ;
449
457
Py_XSETREF (((PyFunctionObject * )op )-> func_closure , closure );
450
458
return 0 ;
451
459
}
@@ -507,7 +515,7 @@ PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)
507
515
"non-dict annotations" );
508
516
return -1 ;
509
517
}
510
- ((PyFunctionObject * )op ) -> func_version = 0 ;
518
+ _PyFunction_SetVersion ((PyFunctionObject * )op , 0 ) ;
511
519
Py_XSETREF (((PyFunctionObject * )op )-> func_annotations , annotations );
512
520
return 0 ;
513
521
}
@@ -566,7 +574,7 @@ func_set_code(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
566
574
return -1 ;
567
575
}
568
576
handle_func_event (PyFunction_EVENT_MODIFY_CODE , op , value );
569
- op -> func_version = 0 ;
577
+ _PyFunction_SetVersion ( op , 0 ) ;
570
578
Py_XSETREF (op -> func_code , Py_NewRef (value ));
571
579
return 0 ;
572
580
}
@@ -646,7 +654,7 @@ func_set_defaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored
646
654
}
647
655
648
656
handle_func_event (PyFunction_EVENT_MODIFY_DEFAULTS , op , value );
649
- op -> func_version = 0 ;
657
+ _PyFunction_SetVersion ( op , 0 ) ;
650
658
Py_XSETREF (op -> func_defaults , Py_XNewRef (value ));
651
659
return 0 ;
652
660
}
@@ -687,7 +695,7 @@ func_set_kwdefaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignor
687
695
}
688
696
689
697
handle_func_event (PyFunction_EVENT_MODIFY_KWDEFAULTS , op , value );
690
- op -> func_version = 0 ;
698
+ _PyFunction_SetVersion ( op , 0 ) ;
691
699
Py_XSETREF (op -> func_kwdefaults , Py_XNewRef (value ));
692
700
return 0 ;
693
701
}
@@ -717,7 +725,7 @@ func_set_annotations(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(igno
717
725
"__annotations__ must be set to a dict object" );
718
726
return -1 ;
719
727
}
720
- op -> func_version = 0 ;
728
+ _PyFunction_SetVersion ( op , 0 ) ;
721
729
Py_XSETREF (op -> func_annotations , Py_XNewRef (value ));
722
730
return 0 ;
723
731
}
@@ -881,7 +889,7 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals,
881
889
static int
882
890
func_clear (PyFunctionObject * op )
883
891
{
884
- op -> func_version = 0 ;
892
+ _PyFunction_SetVersion ( op , 0 ) ;
885
893
Py_CLEAR (op -> func_globals );
886
894
Py_CLEAR (op -> func_builtins );
887
895
Py_CLEAR (op -> func_module );
@@ -917,15 +925,7 @@ func_dealloc(PyFunctionObject *op)
917
925
if (op -> func_weakreflist != NULL ) {
918
926
PyObject_ClearWeakRefs ((PyObject * ) op );
919
927
}
920
- if (op -> func_version != 0 ) {
921
- PyInterpreterState * interp = _PyInterpreterState_GET ();
922
- PyFunctionObject * * slot =
923
- interp -> func_state .func_version_cache
924
- + (op -> func_version % FUNC_VERSION_CACHE_SIZE );
925
- if (* slot == op ) {
926
- * slot = NULL ;
927
- }
928
- }
928
+ _PyFunction_SetVersion (op , 0 );
929
929
(void )func_clear (op );
930
930
// These aren't cleared by func_clear().
931
931
Py_DECREF (op -> func_code );
0 commit comments