7
7
#include "pycore_pyerrors.h" // _PyErr_Occurred()
8
8
#include "structmember.h" // PyMemberDef
9
9
10
+ static uint32_t next_func_version = 1 ;
11
+
10
12
PyObject *
11
13
PyFunction_NewWithQualName (PyObject * code , PyObject * globals , PyObject * qualname )
12
14
{
@@ -79,7 +81,7 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
79
81
op -> func_module = module ;
80
82
op -> func_annotations = NULL ;
81
83
op -> vectorcall = _PyFunction_Vectorcall ;
82
-
84
+ op -> func_version = 0 ;
83
85
_PyObject_GC_TRACK (op );
84
86
return (PyObject * )op ;
85
87
@@ -94,6 +96,19 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
94
96
return NULL ;
95
97
}
96
98
99
+ uint32_t _PyFunction_GetVersionForCurrentState (PyFunctionObject * func )
100
+ {
101
+ if (func -> func_version != 0 ) {
102
+ return func -> func_version ;
103
+ }
104
+ if (next_func_version == 0 ) {
105
+ return 0 ;
106
+ }
107
+ uint32_t v = next_func_version ++ ;
108
+ func -> func_version = v ;
109
+ return v ;
110
+ }
111
+
97
112
PyObject *
98
113
PyFunction_New (PyObject * code , PyObject * globals )
99
114
{
@@ -156,6 +171,7 @@ PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
156
171
PyErr_SetString (PyExc_SystemError , "non-tuple default args" );
157
172
return -1 ;
158
173
}
174
+ ((PyFunctionObject * )op )-> func_version = 0 ;
159
175
Py_XSETREF (((PyFunctionObject * )op )-> func_defaults , defaults );
160
176
return 0 ;
161
177
}
@@ -187,6 +203,7 @@ PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults)
187
203
"non-dict keyword only default args" );
188
204
return -1 ;
189
205
}
206
+ ((PyFunctionObject * )op )-> func_version = 0 ;
190
207
Py_XSETREF (((PyFunctionObject * )op )-> func_kwdefaults , defaults );
191
208
return 0 ;
192
209
}
@@ -219,6 +236,7 @@ PyFunction_SetClosure(PyObject *op, PyObject *closure)
219
236
Py_TYPE (closure )-> tp_name );
220
237
return -1 ;
221
238
}
239
+ ((PyFunctionObject * )op )-> func_version = 0 ;
222
240
Py_XSETREF (((PyFunctionObject * )op )-> func_closure , closure );
223
241
return 0 ;
224
242
}
@@ -250,6 +268,7 @@ PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)
250
268
"non-dict annotations" );
251
269
return -1 ;
252
270
}
271
+ ((PyFunctionObject * )op )-> func_version = 0 ;
253
272
Py_XSETREF (((PyFunctionObject * )op )-> func_annotations , annotations );
254
273
return 0 ;
255
274
}
@@ -308,6 +327,7 @@ func_set_code(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
308
327
nclosure , nfree );
309
328
return -1 ;
310
329
}
330
+ op -> func_version = 0 ;
311
331
Py_INCREF (value );
312
332
Py_XSETREF (op -> func_code , value );
313
333
return 0 ;
@@ -392,6 +412,7 @@ func_set_defaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored
392
412
return -1 ;
393
413
}
394
414
415
+ op -> func_version = 0 ;
395
416
Py_XINCREF (value );
396
417
Py_XSETREF (op -> func_defaults , value );
397
418
return 0 ;
@@ -433,6 +454,7 @@ func_set_kwdefaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignor
433
454
return -1 ;
434
455
}
435
456
457
+ op -> func_version = 0 ;
436
458
Py_XINCREF (value );
437
459
Py_XSETREF (op -> func_kwdefaults , value );
438
460
return 0 ;
@@ -482,6 +504,7 @@ func_set_annotations(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(igno
482
504
"__annotations__ must be set to a dict object" );
483
505
return -1 ;
484
506
}
507
+ op -> func_version = 0 ;
485
508
Py_XINCREF (value );
486
509
Py_XSETREF (op -> func_annotations , value );
487
510
return 0 ;
@@ -611,6 +634,7 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals,
611
634
static int
612
635
func_clear (PyFunctionObject * op )
613
636
{
637
+ op -> func_version = 0 ;
614
638
Py_CLEAR (op -> func_code );
615
639
Py_CLEAR (op -> func_globals );
616
640
Py_CLEAR (op -> func_builtins );
0 commit comments