Mercurial > cpython-lru_cache-weakref
annotate Objects/moduleobject.c @ 87081:dc5ae99bc605
Issue #19437: Fix GetKeepedObjects() of ctypes, handle PyCData_GetContainer()
failure
| author | Victor Stinner <victor.stinner@gmail.com> |
|---|---|
| date | Wed, 13 Nov 2013 13:24:50 +0100 |
| parents | 79e2f5bbc30c |
| children | 07229c6104b1 |
| rev | line source |
|---|---|
| 145 | 1 |
| 6 | 2 /* Module object implementation */ |
| 3 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
4 #include "Python.h" |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17811
diff
changeset
|
5 #include "structmember.h" |
| 6 | 6 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
7 static Py_ssize_t max_module_number; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
8 |
| 6 | 9 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
10 PyObject_HEAD |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
11 PyObject *md_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
12 struct PyModuleDef *md_def; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
13 void *md_state; |
|
84936
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
14 PyObject *md_weaklist; |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
15 PyObject *md_name; /* for logging purposes after md_dict is cleared */ |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
16 } PyModuleObject; |
| 6 | 17 |
|
20595
c4d9d8674506
Add missing "static" declarations (found by "make smelly").
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
20277
diff
changeset
|
18 static PyMemberDef module_members[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
19 {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
20 {0} |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17811
diff
changeset
|
21 }; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17811
diff
changeset
|
22 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
23 static PyTypeObject moduledef_type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
24 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
25 "moduledef", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
26 sizeof(struct PyModuleDef), /* tp_size */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
27 0, /* tp_itemsize */ |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
28 }; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
29 |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
30 |
|
83607
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
31 static int |
|
84936
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
32 module_init_dict(PyModuleObject *mod, PyObject *md_dict, |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
33 PyObject *name, PyObject *doc) |
|
83607
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
34 { |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
35 if (md_dict == NULL) |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
36 return -1; |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
37 if (doc == NULL) |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
38 doc = Py_None; |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
39 |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
40 if (PyDict_SetItemString(md_dict, "__name__", name) != 0) |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
41 return -1; |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
42 if (PyDict_SetItemString(md_dict, "__doc__", doc) != 0) |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
43 return -1; |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
44 if (PyDict_SetItemString(md_dict, "__package__", Py_None) != 0) |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
45 return -1; |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
46 if (PyDict_SetItemString(md_dict, "__loader__", Py_None) != 0) |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
47 return -1; |
|
84936
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
48 if (PyUnicode_CheckExact(name)) { |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
49 Py_INCREF(name); |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
50 Py_XDECREF(mod->md_name); |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
51 mod->md_name = name; |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
52 } |
|
83607
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
53 |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
54 return 0; |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
55 } |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
56 |
|
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
57 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
58 PyObject * |
|
68228
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
59 PyModule_NewObject(PyObject *name) |
| 6 | 60 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
61 PyModuleObject *m; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
62 m = PyObject_GC_New(PyModuleObject, &PyModule_Type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
63 if (m == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
64 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
65 m->md_def = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
66 m->md_state = NULL; |
|
84936
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
67 m->md_weaklist = NULL; |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
68 m->md_name = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
69 m->md_dict = PyDict_New(); |
|
84936
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
70 if (module_init_dict(m, m->md_dict, name, NULL) != 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
71 goto fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
72 PyObject_GC_Track(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
73 return (PyObject *)m; |
|
1410
315272ec4d5b
* import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents:
1293
diff
changeset
|
74 |
|
315272ec4d5b
* import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents:
1293
diff
changeset
|
75 fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
76 Py_DECREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
77 return NULL; |
| 6 | 78 } |
| 79 | |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
80 PyObject * |
|
68228
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
81 PyModule_New(const char *name) |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
82 { |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
83 PyObject *nameobj, *module; |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
84 nameobj = PyUnicode_FromString(name); |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
85 if (nameobj == NULL) |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
86 return NULL; |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
87 module = PyModule_NewObject(nameobj); |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
88 Py_DECREF(nameobj); |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
89 return module; |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
90 } |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
91 |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
92 |
|
50b38e4b0231
Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68111
diff
changeset
|
93 PyObject * |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
94 PyModule_Create2(struct PyModuleDef* module, int module_api_version) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
95 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
96 PyObject *d, *v, *n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
97 PyMethodDef *ml; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
98 const char* name; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
99 PyModuleObject *m; |
|
66911
7c3715b10cdd
Merged revisions 87251 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
65233
diff
changeset
|
100 PyInterpreterState *interp = PyThreadState_Get()->interp; |
|
7c3715b10cdd
Merged revisions 87251 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
65233
diff
changeset
|
101 if (interp->modules == NULL) |
|
7c3715b10cdd
Merged revisions 87251 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
65233
diff
changeset
|
102 Py_FatalError("Python import machinery not initialized"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
103 if (PyType_Ready(&moduledef_type) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
104 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
105 if (module->m_base.m_index == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
106 max_module_number++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
107 Py_REFCNT(module) = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
108 Py_TYPE(module) = &moduledef_type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
109 module->m_base.m_index = max_module_number; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
110 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
111 name = module->m_name; |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
65231
diff
changeset
|
112 if (module_api_version != PYTHON_API_VERSION && module_api_version != PYTHON_ABI_VERSION) { |
|
63949
fa2d9720a66c
Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61711
diff
changeset
|
113 int err; |
|
fa2d9720a66c
Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61711
diff
changeset
|
114 err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1, |
|
fa2d9720a66c
Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61711
diff
changeset
|
115 "Python C API version mismatch for module %.100s: " |
|
fa2d9720a66c
Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61711
diff
changeset
|
116 "This Python has API version %d, module %.100s has version %d.", |
|
fa2d9720a66c
Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61711
diff
changeset
|
117 name, |
|
fa2d9720a66c
Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61711
diff
changeset
|
118 PYTHON_API_VERSION, name, module_api_version); |
|
fa2d9720a66c
Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61711
diff
changeset
|
119 if (err) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
120 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
121 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
122 /* Make sure name is fully qualified. |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
123 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
124 This is a bit of a hack: when the shared library is loaded, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
125 the module name is "package.module", but the module calls |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
126 PyModule_Create*() with just "module" for the name. The shared |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
127 library loader squirrels away the true name of the module in |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
128 _Py_PackageContext, and PyModule_Create*() will substitute this |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
129 (if the name actually matches). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
130 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
131 if (_Py_PackageContext != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
132 char *p = strrchr(_Py_PackageContext, '.'); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
133 if (p != NULL && strcmp(module->m_name, p+1) == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
134 name = _Py_PackageContext; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
135 _Py_PackageContext = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
136 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
137 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
138 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
139 return NULL; |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
140 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
141 if (module->m_size > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
142 m->md_state = PyMem_MALLOC(module->m_size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
143 if (!m->md_state) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
144 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
145 Py_DECREF(m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
146 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
147 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
148 memset(m->md_state, 0, module->m_size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
149 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
150 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
151 d = PyModule_GetDict((PyObject*)m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
152 if (module->m_methods != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
153 n = PyUnicode_FromString(name); |
|
78178
7140d97d36fd
Issue #15394: Fix ref leaks in PyModule_Create.
Meador Inge <meadori@gmail.com>
parents:
68257
diff
changeset
|
154 if (n == NULL) { |
|
7140d97d36fd
Issue #15394: Fix ref leaks in PyModule_Create.
Meador Inge <meadori@gmail.com>
parents:
68257
diff
changeset
|
155 Py_DECREF(m); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
156 return NULL; |
|
78178
7140d97d36fd
Issue #15394: Fix ref leaks in PyModule_Create.
Meador Inge <meadori@gmail.com>
parents:
68257
diff
changeset
|
157 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
158 for (ml = module->m_methods; ml->ml_name != NULL; ml++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
159 if ((ml->ml_flags & METH_CLASS) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
160 (ml->ml_flags & METH_STATIC)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
161 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
162 "module functions cannot set" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
163 " METH_CLASS or METH_STATIC"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
164 Py_DECREF(n); |
|
78178
7140d97d36fd
Issue #15394: Fix ref leaks in PyModule_Create.
Meador Inge <meadori@gmail.com>
parents:
68257
diff
changeset
|
165 Py_DECREF(m); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
166 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
167 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
168 v = PyCFunction_NewEx(ml, (PyObject*)m, n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
169 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
170 Py_DECREF(n); |
|
78178
7140d97d36fd
Issue #15394: Fix ref leaks in PyModule_Create.
Meador Inge <meadori@gmail.com>
parents:
68257
diff
changeset
|
171 Py_DECREF(m); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
172 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
173 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
174 if (PyDict_SetItemString(d, ml->ml_name, v) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
175 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
176 Py_DECREF(n); |
|
78178
7140d97d36fd
Issue #15394: Fix ref leaks in PyModule_Create.
Meador Inge <meadori@gmail.com>
parents:
68257
diff
changeset
|
177 Py_DECREF(m); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
178 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
179 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
180 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
181 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
182 Py_DECREF(n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
183 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
184 if (module->m_doc != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
185 v = PyUnicode_FromString(module->m_doc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
186 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
187 Py_XDECREF(v); |
|
78178
7140d97d36fd
Issue #15394: Fix ref leaks in PyModule_Create.
Meador Inge <meadori@gmail.com>
parents:
68257
diff
changeset
|
188 Py_DECREF(m); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
189 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
190 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
191 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
192 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
193 m->md_def = module; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
194 return (PyObject*)m; |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
195 } |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
196 |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
197 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
198 PyObject * |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
199 PyModule_GetDict(PyObject *m) |
| 6 | 200 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
201 PyObject *d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
202 if (!PyModule_Check(m)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
203 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
204 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
205 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
206 d = ((PyModuleObject *)m) -> md_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
207 if (d == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
208 ((PyModuleObject *)m) -> md_dict = d = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
209 return d; |
| 6 | 210 } |
| 211 | |
|
68111
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
212 PyObject* |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
213 PyModule_GetNameObject(PyObject *m) |
|
43
ea21982a1532
Added getmodulename() public interface.
Guido van Rossum <guido@python.org>
parents:
25
diff
changeset
|
214 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
215 PyObject *d; |
|
68111
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
216 PyObject *name; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
217 if (!PyModule_Check(m)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
218 PyErr_BadArgument(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
219 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
220 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
221 d = ((PyModuleObject *)m)->md_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
222 if (d == NULL || |
|
68111
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
223 (name = PyDict_GetItemString(d, "__name__")) == NULL || |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
224 !PyUnicode_Check(name)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
225 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
226 PyErr_SetString(PyExc_SystemError, "nameless module"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
227 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
228 } |
|
68111
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
229 Py_INCREF(name); |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
230 return name; |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
231 } |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
232 |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
233 const char * |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
234 PyModule_GetName(PyObject *m) |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
235 { |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
236 PyObject *name = PyModule_GetNameObject(m); |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
237 if (name == NULL) |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
238 return NULL; |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
239 Py_DECREF(name); /* module dict has still a reference */ |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
240 return _PyUnicode_AsString(name); |
|
43
ea21982a1532
Added getmodulename() public interface.
Guido van Rossum <guido@python.org>
parents:
25
diff
changeset
|
241 } |
|
ea21982a1532
Added getmodulename() public interface.
Guido van Rossum <guido@python.org>
parents:
25
diff
changeset
|
242 |
|
64138
ee765a67c0b1
Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63949
diff
changeset
|
243 PyObject* |
|
ee765a67c0b1
Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63949
diff
changeset
|
244 PyModule_GetFilenameObject(PyObject *m) |
|
10161
5c1ebf23f1d7
Patch by Chris Petrilli to display the origin of a module in its
Guido van Rossum <guido@python.org>
parents:
9329
diff
changeset
|
245 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
246 PyObject *d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
247 PyObject *fileobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
248 if (!PyModule_Check(m)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
249 PyErr_BadArgument(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
250 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
251 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
252 d = ((PyModuleObject *)m)->md_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
253 if (d == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
254 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
255 !PyUnicode_Check(fileobj)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
256 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
257 PyErr_SetString(PyExc_SystemError, "module filename missing"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
258 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
259 } |
|
64138
ee765a67c0b1
Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63949
diff
changeset
|
260 Py_INCREF(fileobj); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61348
diff
changeset
|
261 return fileobj; |
|
61348
5260104db99d
module_repr(): use %U to format the file name
Victor Stinner <victor.stinner@haypocalc.com>
parents:
57210
diff
changeset
|
262 } |
|
5260104db99d
module_repr(): use %U to format the file name
Victor Stinner <victor.stinner@haypocalc.com>
parents:
57210
diff
changeset
|
263 |
|
5260104db99d
module_repr(): use %U to format the file name
Victor Stinner <victor.stinner@haypocalc.com>
parents:
57210
diff
changeset
|
264 const char * |
|
5260104db99d
module_repr(): use %U to format the file name
Victor Stinner <victor.stinner@haypocalc.com>
parents:
57210
diff
changeset
|
265 PyModule_GetFilename(PyObject *m) |
|
5260104db99d
module_repr(): use %U to format the file name
Victor Stinner <victor.stinner@haypocalc.com>
parents:
57210
diff
changeset
|
266 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61348
diff
changeset
|
267 PyObject *fileobj; |
|
64138
ee765a67c0b1
Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63949
diff
changeset
|
268 char *utf8; |
|
ee765a67c0b1
Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63949
diff
changeset
|
269 fileobj = PyModule_GetFilenameObject(m); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61348
diff
changeset
|
270 if (fileobj == NULL) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61348
diff
changeset
|
271 return NULL; |
|
64138
ee765a67c0b1
Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63949
diff
changeset
|
272 utf8 = _PyUnicode_AsString(fileobj); |
|
68111
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
273 Py_DECREF(fileobj); /* module dict has still a reference */ |
|
64138
ee765a67c0b1
Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63949
diff
changeset
|
274 return utf8; |
|
10161
5c1ebf23f1d7
Patch by Chris Petrilli to display the origin of a module in its
Guido van Rossum <guido@python.org>
parents:
9329
diff
changeset
|
275 } |
|
5c1ebf23f1d7
Patch by Chris Petrilli to display the origin of a module in its
Guido van Rossum <guido@python.org>
parents:
9329
diff
changeset
|
276 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
277 PyModuleDef* |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
278 PyModule_GetDef(PyObject* m) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
279 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
280 if (!PyModule_Check(m)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
281 PyErr_BadArgument(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
282 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
283 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
284 return ((PyModuleObject *)m)->md_def; |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
285 } |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
286 |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
287 void* |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
288 PyModule_GetState(PyObject* m) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
289 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
290 if (!PyModule_Check(m)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
291 PyErr_BadArgument(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
292 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
293 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
294 return ((PyModuleObject *)m)->md_state; |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
295 } |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
296 |
|
7401
8c01cfee14ba
Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents:
5456
diff
changeset
|
297 void |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
298 _PyModule_Clear(PyObject *m) |
|
7401
8c01cfee14ba
Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents:
5456
diff
changeset
|
299 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
300 /* To make the execution order of destructors for global |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
301 objects a bit more predictable, we first zap all objects |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
302 whose name starts with a single underscore, before we clear |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
303 the entire dictionary. We zap them by replacing them with |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
304 None, rather than deleting them from the dictionary, to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
305 avoid rehashing the dictionary (to some extent). */ |
|
7401
8c01cfee14ba
Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents:
5456
diff
changeset
|
306 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
307 Py_ssize_t pos; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
308 PyObject *key, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
309 PyObject *d; |
|
7401
8c01cfee14ba
Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents:
5456
diff
changeset
|
310 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
311 d = ((PyModuleObject *)m)->md_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
312 if (d == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
313 return; |
|
7401
8c01cfee14ba
Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents:
5456
diff
changeset
|
314 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
315 /* First, clear only names starting with a single underscore */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
316 pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
317 while (PyDict_Next(d, &pos, &key, &value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
318 if (value != Py_None && PyUnicode_Check(key)) { |
|
76640
eb68502731dd
Issues #13959, 14647: Re-implement imp.reload() in Lib/imp.py.
Brett Cannon <brett@python.org>
parents:
72925
diff
changeset
|
319 if (PyUnicode_READ_CHAR(key, 0) == '_' && |
| 72475 | 320 PyUnicode_READ_CHAR(key, 1) != '_') { |
|
61711
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
321 if (Py_VerboseFlag > 1) { |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
322 const char *s = _PyUnicode_AsString(key); |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
323 if (s != NULL) |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
324 PySys_WriteStderr("# clear[1] %s\n", s); |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
325 else |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
326 PyErr_Clear(); |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
327 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
328 PyDict_SetItem(d, key, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
329 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
330 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
331 } |
|
7401
8c01cfee14ba
Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents:
5456
diff
changeset
|
332 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
333 /* Next, clear all names except for __builtins__ */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
334 pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
335 while (PyDict_Next(d, &pos, &key, &value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
336 if (value != Py_None && PyUnicode_Check(key)) { |
| 72475 | 337 if (PyUnicode_READ_CHAR(key, 0) != '_' || |
| 338 PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0) | |
|
61711
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
339 { |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
340 if (Py_VerboseFlag > 1) { |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
341 const char *s = _PyUnicode_AsString(key); |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
342 if (s != NULL) |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
343 PySys_WriteStderr("# clear[2] %s\n", s); |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
344 else |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
345 PyErr_Clear(); |
|
7fc48ad16087
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
346 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
347 PyDict_SetItem(d, key, Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
348 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
349 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
350 } |
|
7401
8c01cfee14ba
Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents:
5456
diff
changeset
|
351 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
352 /* Note: we leave __builtins__ in place, so that destructors |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
353 of non-global objects defined in this module can still use |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
354 builtins, in particularly 'None'. */ |
|
7401
8c01cfee14ba
Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents:
5456
diff
changeset
|
355 |
|
8c01cfee14ba
Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents:
5456
diff
changeset
|
356 } |
|
8c01cfee14ba
Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents:
5456
diff
changeset
|
357 |
| 6 | 358 /* Methods */ |
| 359 | |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17811
diff
changeset
|
360 static int |
|
23652
b40165a4efe9
Surprising fix for SF bug 563060: module can be used as base class.
Guido van Rossum <guido@python.org>
parents:
22975
diff
changeset
|
361 module_init(PyModuleObject *m, PyObject *args, PyObject *kwds) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17811
diff
changeset
|
362 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
363 static char *kwlist[] = {"name", "doc", NULL}; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
364 PyObject *dict, *name = Py_None, *doc = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
365 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
366 kwlist, &name, &doc)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
367 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
368 dict = m->md_dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
369 if (dict == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
370 dict = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
371 if (dict == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
372 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
373 m->md_dict = dict; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
374 } |
|
84936
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
375 if (module_init_dict(m, dict, name, doc) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
376 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
377 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17811
diff
changeset
|
378 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17811
diff
changeset
|
379 |
| 6 | 380 static void |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
381 module_dealloc(PyModuleObject *m) |
| 6 | 382 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
383 PyObject_GC_UnTrack(m); |
|
84936
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
384 if (Py_VerboseFlag && m->md_name) { |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
385 PySys_FormatStderr("# destroy %S\n", m->md_name); |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
386 } |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
387 if (m->md_weaklist != NULL) |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
388 PyObject_ClearWeakRefs((PyObject *) m); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
389 if (m->md_def && m->md_def->m_free) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
390 m->md_def->m_free(m); |
|
84936
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
391 Py_XDECREF(m->md_dict); |
|
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
392 Py_XDECREF(m->md_name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
393 if (m->md_state != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
394 PyMem_FREE(m->md_state); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
395 Py_TYPE(m)->tp_free((PyObject *)m); |
| 6 | 396 } |
| 397 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
398 static PyObject * |
|
13457
ef2ebb3b0c64
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
399 module_repr(PyModuleObject *m) |
| 6 | 400 { |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
401 PyObject *name, *filename, *repr, *loader = NULL; |
|
19322
1fec03012346
module_repr(): Instead of fixing the maximum buf size to 400,
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
402 |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
403 /* See if the module has an __loader__. If it does, give the loader the |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
404 * first shot at producing a repr for the module. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
405 */ |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
406 if (m->md_dict != NULL) { |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
407 loader = PyDict_GetItemString(m->md_dict, "__loader__"); |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
408 } |
|
83607
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
409 if (loader != NULL && loader != Py_None) { |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
410 repr = PyObject_CallMethod(loader, "module_repr", "(O)", |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
411 (PyObject *)m, NULL); |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
412 if (repr == NULL) { |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
413 PyErr_Clear(); |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
414 } |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
415 else { |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
416 return repr; |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
417 } |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
418 } |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
419 /* __loader__.module_repr(m) did not provide us with a repr. Next, see if |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
420 * the module has an __file__. If it doesn't then use repr(__loader__) if |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
421 * it exists, otherwise, just use module.__name__. |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
422 */ |
|
68111
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
423 name = PyModule_GetNameObject((PyObject *)m); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
424 if (name == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
425 PyErr_Clear(); |
|
68111
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
426 name = PyUnicode_FromStringAndSize("?", 1); |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
427 if (name == NULL) |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
428 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
429 } |
|
64138
ee765a67c0b1
Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63949
diff
changeset
|
430 filename = PyModule_GetFilenameObject((PyObject *)m); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
431 if (filename == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
432 PyErr_Clear(); |
|
83607
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
433 /* There's no m.__file__, so if there was a __loader__, use that in |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
434 * the repr, otherwise, the only thing you can use is m.__name__ |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
435 */ |
|
83607
e39a8f8ceb9f
#17115,17116: Have modules initialize the __package__ and __loader__
Brett Cannon <brett@python.org>
parents:
78179
diff
changeset
|
436 if (loader == NULL || loader == Py_None) { |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
437 repr = PyUnicode_FromFormat("<module %R>", name); |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
438 } |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
439 else { |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
440 repr = PyUnicode_FromFormat("<module %R (%R)>", name, loader); |
|
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
441 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
442 } |
|
77126
702009f3c0b1
issue 14660: Implement PEP 420, namespace packages.
Eric V. Smith <eric@trueblade.com>
parents:
76640
diff
changeset
|
443 /* Finally, use m.__file__ */ |
|
68111
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
444 else { |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
445 repr = PyUnicode_FromFormat("<module %R from %R>", name, filename); |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
446 Py_DECREF(filename); |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
447 } |
|
f2edaf62d823
Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66910
diff
changeset
|
448 Py_DECREF(name); |
|
64138
ee765a67c0b1
Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
63949
diff
changeset
|
449 return repr; |
| 6 | 450 } |
| 451 | |
|
15686
986d1c3ccdde
Add garbage collection for module objects. Closes patch #102939 and
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
452 static int |
|
986d1c3ccdde
Add garbage collection for module objects. Closes patch #102939 and
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
453 module_traverse(PyModuleObject *m, visitproc visit, void *arg) |
|
986d1c3ccdde
Add garbage collection for module objects. Closes patch #102939 and
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
454 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
455 if (m->md_def && m->md_def->m_traverse) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
456 int res = m->md_def->m_traverse((PyObject*)m, visit, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
457 if (res) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
458 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
459 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
460 Py_VISIT(m->md_dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
461 return 0; |
|
15686
986d1c3ccdde
Add garbage collection for module objects. Closes patch #102939 and
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
462 } |
|
986d1c3ccdde
Add garbage collection for module objects. Closes patch #102939 and
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
15318
diff
changeset
|
463 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
464 static int |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
465 module_clear(PyModuleObject *m) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
466 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
467 if (m->md_def && m->md_def->m_clear) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
468 int res = m->md_def->m_clear((PyObject*)m); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
469 if (res) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
470 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
471 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
472 Py_CLEAR(m->md_dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
473 return 0; |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
474 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
475 |
|
70331
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
476 static PyObject * |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
477 module_dir(PyObject *self, PyObject *args) |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
478 { |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72848
diff
changeset
|
479 _Py_IDENTIFIER(__dict__); |
|
70331
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
480 PyObject *result = NULL; |
|
72848
81380082d216
Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
481 PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__); |
|
70331
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
482 |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
483 if (dict != NULL) { |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
484 if (PyDict_Check(dict)) |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
485 result = PyDict_Keys(dict); |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
486 else { |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
487 const char *name = PyModule_GetName(self); |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
488 if (name) |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
489 PyErr_Format(PyExc_TypeError, |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
490 "%.200s.__dict__ is not a dictionary", |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
491 name); |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
492 } |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
493 } |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
494 |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
495 Py_XDECREF(dict); |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
496 return result; |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
497 } |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
498 |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
499 static PyMethodDef module_methods[] = { |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
500 {"__dir__", module_dir, METH_NOARGS, |
|
70342
6f078d80898f
indicate return value on __dir__ methods
Benjamin Peterson <benjamin@python.org>
parents:
70331
diff
changeset
|
501 PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")}, |
|
70331
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
502 {0} |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
503 }; |
|
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
504 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44351
diff
changeset
|
505 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23654
diff
changeset
|
506 PyDoc_STRVAR(module_doc, |
|
23654
b86eaeb0d7dd
Add a docstring to the module type.
Guido van Rossum <guido@python.org>
parents:
23652
diff
changeset
|
507 "module(name[, doc])\n\ |
|
b86eaeb0d7dd
Add a docstring to the module type.
Guido van Rossum <guido@python.org>
parents:
23652
diff
changeset
|
508 \n\ |
|
b86eaeb0d7dd
Add a docstring to the module type.
Guido van Rossum <guido@python.org>
parents:
23652
diff
changeset
|
509 Create a module object.\n\ |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23654
diff
changeset
|
510 The name must be a string; the optional doc argument can have any type."); |
|
23654
b86eaeb0d7dd
Add a docstring to the module type.
Guido van Rossum <guido@python.org>
parents:
23652
diff
changeset
|
511 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
512 PyTypeObject PyModule_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
513 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
514 "module", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
515 sizeof(PyModuleObject), /* tp_size */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
516 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
517 (destructor)module_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
518 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
519 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
520 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
521 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
522 (reprfunc)module_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
523 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
524 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
525 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
526 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
527 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
528 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
529 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
530 PyObject_GenericSetAttr, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
531 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
532 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
533 Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
534 module_doc, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
535 (traverseproc)module_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
536 (inquiry)module_clear, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
537 0, /* tp_richcompare */ |
|
84936
79e2f5bbc30c
Issue #18214: Improve finalization of Python modules to avoid setting their globals to None, in most cases.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83607
diff
changeset
|
538 offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
539 0, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
540 0, /* tp_iternext */ |
|
70331
8f403199f999
move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents:
68258
diff
changeset
|
541 module_methods, /* tp_methods */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
542 module_members, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
543 0, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
544 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
545 0, /* tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
546 0, /* tp_descr_get */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
547 0, /* tp_descr_set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
548 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
549 (initproc)module_init, /* tp_init */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
550 PyType_GenericAlloc, /* tp_alloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
551 PyType_GenericNew, /* tp_new */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57210
diff
changeset
|
552 PyObject_GC_Del, /* tp_free */ |
| 6 | 553 }; |
