@@ -19,9 +19,23 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
19
19
return NULL ;
20
20
}
21
21
22
+ /* __module__: If module name is in globals, use it.
23
+ Otherwise, use None. */
24
+ module = PyDict_GetItemWithError (globals , __name__ );
25
+ if (module ) {
26
+ Py_INCREF (module );
27
+ }
28
+ else if (PyErr_Occurred ()) {
29
+ return NULL ;
30
+ }
31
+
22
32
op = PyObject_GC_New (PyFunctionObject , & PyFunction_Type );
23
- if (op == NULL )
33
+ if (op == NULL ) {
34
+ Py_XDECREF (module );
24
35
return NULL ;
36
+ }
37
+ /* Note: No failures from this point on, since func_dealloc() does not
38
+ expect a partially-created object. */
25
39
26
40
op -> func_weakreflist = NULL ;
27
41
Py_INCREF (code );
@@ -34,6 +48,7 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
34
48
op -> func_kwdefaults = NULL ; /* No keyword only defaults */
35
49
op -> func_closure = NULL ;
36
50
op -> vectorcall = _PyFunction_Vectorcall ;
51
+ op -> func_module = module ;
37
52
38
53
consts = ((PyCodeObject * )code )-> co_consts ;
39
54
if (PyTuple_Size (consts ) >= 1 ) {
@@ -47,20 +62,8 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
47
62
op -> func_doc = doc ;
48
63
49
64
op -> func_dict = NULL ;
50
- op -> func_module = NULL ;
51
65
op -> func_annotations = NULL ;
52
66
53
- /* __module__: If module name is in globals, use it.
54
- Otherwise, use None. */
55
- module = PyDict_GetItemWithError (globals , __name__ );
56
- if (module ) {
57
- Py_INCREF (module );
58
- op -> func_module = module ;
59
- }
60
- else if (PyErr_Occurred ()) {
61
- Py_DECREF (op );
62
- return NULL ;
63
- }
64
67
if (qualname )
65
68
op -> func_qualname = qualname ;
66
69
else
0 commit comments