annotate Objects/moduleobject.c @ 73323:dad02a080bbc

Improve byte-compilation in packaging to be independent of -O or -B. The code I fixed to comply with PEP 3147 still had one bug: When run under python -O, some paths for pyc files would be pyo, because I called imp.cache_from_source without explicit debug_override argument in some places, and under -O that would return .pyo (this is well explained in the imp docs). Now all code (util.byte_compile, build_py, install_lib) can create .pyo files according to options given by users, without interference from the calling Python’s own optimize mode. On a related topic, I also removed the code that prevented byte compilation under python -B. The rationale is that packaging gives control over the creation of pyc files to the user with its own explicit option, and the behavior should not be changed if the calling Python happens to run with -B for whatever reason. I will argue that this is a bug fix and ask to be allowed to backport this change to distutils. Finally, I moved one nugget of information about the --compile and --optimize options from the source into the doc. It clears up a misunderstanding that I (and maybe other people) had.
author Éric Araujo <merwok@netwok.org>
date Thu, 03 Nov 2011 05:08:28 +0100
parents 7109f31300fb
children eb68502731dd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 95
diff changeset
1
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Module object implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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;
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
14 } PyModuleObject;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
20595
c4d9d8674506 Add missing "static" declarations (found by "make smelly").
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20277
diff changeset
16 static PyMemberDef module_members[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
17 {"__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
18 {0}
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17811
diff changeset
19 };
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17811
diff changeset
20
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
21 static PyTypeObject moduledef_type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
22 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
23 "moduledef", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
24 sizeof(struct PyModuleDef), /* tp_size */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
25 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
26 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
27
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
28
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
29 PyObject *
68228
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
30 PyModule_NewObject(PyObject *name)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
32 PyModuleObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
33 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
34 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
35 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
36 m->md_def = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
37 m->md_state = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
38 m->md_dict = PyDict_New();
68228
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
39 if (m->md_dict == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
40 goto fail;
68228
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
41 if (PyDict_SetItemString(m->md_dict, "__name__", name) != 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
42 goto fail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
43 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
44 goto fail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
45 if (PyDict_SetItemString(m->md_dict, "__package__", Py_None) != 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
46 goto fail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
47 PyObject_GC_Track(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
48 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
49
315272ec4d5b * import.c (get_module): total rewrite, to ensure proper search order: for
Guido van Rossum <guido@python.org>
parents: 1293
diff changeset
50 fail:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
51 Py_DECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
52 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
55 PyObject *
68228
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
56 PyModule_New(const char *name)
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
57 {
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
58 PyObject *nameobj, *module;
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
59 nameobj = PyUnicode_FromString(name);
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
60 if (nameobj == NULL)
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
61 return NULL;
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
62 module = PyModule_NewObject(nameobj);
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
63 Py_DECREF(nameobj);
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
64 return module;
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
65 }
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
66
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
67
50b38e4b0231 Issue #3080: Add PyModule_NewObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68111
diff changeset
68 PyObject *
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
69 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
70 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
71 PyObject *d, *v, *n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
72 PyMethodDef *ml;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
73 const char* name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
74 PyModuleObject *m;
66911
7c3715b10cdd Merged revisions 87251 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 65233
diff changeset
75 PyInterpreterState *interp = PyThreadState_Get()->interp;
7c3715b10cdd Merged revisions 87251 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 65233
diff changeset
76 if (interp->modules == NULL)
7c3715b10cdd Merged revisions 87251 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 65233
diff changeset
77 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
78 if (PyType_Ready(&moduledef_type) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
79 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
80 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
81 max_module_number++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
82 Py_REFCNT(module) = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
83 Py_TYPE(module) = &moduledef_type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
84 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
85 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
86 name = module->m_name;
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65231
diff changeset
87 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
88 int err;
fa2d9720a66c Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61711
diff changeset
89 err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
fa2d9720a66c Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61711
diff changeset
90 "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
91 "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
92 name,
fa2d9720a66c Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61711
diff changeset
93 PYTHON_API_VERSION, name, module_api_version);
fa2d9720a66c Issue #9425: Create PyErr_WarnFormat() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61711
diff changeset
94 if (err)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
95 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
96 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
97 /* 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
98
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
99 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
100 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
101 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
102 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
103 _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
104 (if the name actually matches).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
105 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
106 if (_Py_PackageContext != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
107 char *p = strrchr(_Py_PackageContext, '.');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
108 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
109 name = _Py_PackageContext;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
110 _Py_PackageContext = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
111 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
112 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
113 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
114 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
115
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
116 if (module->m_size > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
117 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
118 if (!m->md_state) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
119 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
120 Py_DECREF(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
121 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
122 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
123 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
124 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
125
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
126 d = PyModule_GetDict((PyObject*)m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
127 if (module->m_methods != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
128 n = PyUnicode_FromString(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
129 if (n == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
130 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
131 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
132 if ((ml->ml_flags & METH_CLASS) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
133 (ml->ml_flags & METH_STATIC)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
134 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
135 "module functions cannot set"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
136 " METH_CLASS or METH_STATIC");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
137 Py_DECREF(n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
138 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
139 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
140 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
141 if (v == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
142 Py_DECREF(n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
143 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
144 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
145 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
146 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
147 Py_DECREF(n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
148 return NULL;
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 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
151 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
152 Py_DECREF(n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
153 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
154 if (module->m_doc != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
155 v = PyUnicode_FromString(module->m_doc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
156 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
157 Py_XDECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
158 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
159 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
160 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
161 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
162 m->md_def = module;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
163 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
164 }
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
165
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
166
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
167 PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
168 PyModule_GetDict(PyObject *m)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
170 PyObject *d;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
171 if (!PyModule_Check(m)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
172 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
173 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
174 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
175 d = ((PyModuleObject *)m) -> md_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
176 if (d == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
177 ((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
178 return d;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180
68111
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
181 PyObject*
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
182 PyModule_GetNameObject(PyObject *m)
43
ea21982a1532 Added getmodulename() public interface.
Guido van Rossum <guido@python.org>
parents: 25
diff changeset
183 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
184 PyObject *d;
68111
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
185 PyObject *name;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
186 if (!PyModule_Check(m)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
187 PyErr_BadArgument();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
188 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
189 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
190 d = ((PyModuleObject *)m)->md_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
191 if (d == NULL ||
68111
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
192 (name = PyDict_GetItemString(d, "__name__")) == NULL ||
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
193 !PyUnicode_Check(name))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
194 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
195 PyErr_SetString(PyExc_SystemError, "nameless module");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
196 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
197 }
68111
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
198 Py_INCREF(name);
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
199 return name;
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
200 }
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
201
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
202 const char *
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
203 PyModule_GetName(PyObject *m)
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
204 {
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
205 PyObject *name = PyModule_GetNameObject(m);
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
206 if (name == NULL)
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
207 return NULL;
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
208 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
209 return _PyUnicode_AsString(name);
43
ea21982a1532 Added getmodulename() public interface.
Guido van Rossum <guido@python.org>
parents: 25
diff changeset
210 }
ea21982a1532 Added getmodulename() public interface.
Guido van Rossum <guido@python.org>
parents: 25
diff changeset
211
64138
ee765a67c0b1 Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63949
diff changeset
212 PyObject*
ee765a67c0b1 Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63949
diff changeset
213 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
214 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
215 PyObject *d;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
216 PyObject *fileobj;
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 ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
223 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
224 !PyUnicode_Check(fileobj))
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, "module filename missing");
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 }
64138
ee765a67c0b1 Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63949
diff changeset
229 Py_INCREF(fileobj);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61348
diff changeset
230 return fileobj;
61348
5260104db99d module_repr(): use %U to format the file name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 57210
diff changeset
231 }
5260104db99d module_repr(): use %U to format the file name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 57210
diff changeset
232
5260104db99d module_repr(): use %U to format the file name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 57210
diff changeset
233 const char *
5260104db99d module_repr(): use %U to format the file name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 57210
diff changeset
234 PyModule_GetFilename(PyObject *m)
5260104db99d module_repr(): use %U to format the file name
Victor Stinner <victor.stinner@haypocalc.com>
parents: 57210
diff changeset
235 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61348
diff changeset
236 PyObject *fileobj;
64138
ee765a67c0b1 Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63949
diff changeset
237 char *utf8;
ee765a67c0b1 Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63949
diff changeset
238 fileobj = PyModule_GetFilenameObject(m);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61348
diff changeset
239 if (fileobj == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61348
diff changeset
240 return NULL;
64138
ee765a67c0b1 Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63949
diff changeset
241 utf8 = _PyUnicode_AsString(fileobj);
68111
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
242 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
243 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
244 }
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
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
246 PyModuleDef*
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
247 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
248 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
249 if (!PyModule_Check(m)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
250 PyErr_BadArgument();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
251 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
252 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
253 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
254 }
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
255
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
256 void*
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
257 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
258 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
259 if (!PyModule_Check(m)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
260 PyErr_BadArgument();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
261 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
262 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
263 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
264 }
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
265
7401
8c01cfee14ba Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents: 5456
diff changeset
266 void
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
267 _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
268 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
269 /* 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
270 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
271 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
272 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
273 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
274 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
275
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
276 Py_ssize_t pos;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
277 PyObject *key, *value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
278 PyObject *d;
7401
8c01cfee14ba Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents: 5456
diff changeset
279
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
280 d = ((PyModuleObject *)m)->md_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
281 if (d == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
282 return;
7401
8c01cfee14ba Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents: 5456
diff changeset
283
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
284 /* 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
285 pos = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
286 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
287 if (value != Py_None && PyUnicode_Check(key)) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70342
diff changeset
288 if (PyUnicode_READ_CHAR(key, 0) == '_' &&
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70342
diff changeset
289 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
290 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
291 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
292 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
293 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
294 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
295 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
296 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
297 PyDict_SetItem(d, key, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
298 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
299 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
300 }
7401
8c01cfee14ba Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents: 5456
diff changeset
301
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
302 /* 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
303 pos = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
304 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
305 if (value != Py_None && PyUnicode_Check(key)) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70342
diff changeset
306 if (PyUnicode_READ_CHAR(key, 0) != '_' ||
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70342
diff changeset
307 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
308 {
7fc48ad16087 Issue #6697: Fix a crash if a module attribute name contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61466
diff changeset
309 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
310 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
311 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
312 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
313 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
314 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
315 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
316 PyDict_SetItem(d, key, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
317 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
318 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
319 }
7401
8c01cfee14ba Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents: 5456
diff changeset
320
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
321 /* 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
322 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
323 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
324
8c01cfee14ba Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents: 5456
diff changeset
325 }
8c01cfee14ba Add internal routine _PyModule_Clear(), which does approximately what
Guido van Rossum <guido@python.org>
parents: 5456
diff changeset
326
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 /* Methods */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
328
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17811
diff changeset
329 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
330 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
331 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
332 static char *kwlist[] = {"name", "doc", NULL};
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
333 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
334 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
335 kwlist, &name, &doc))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
336 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
337 dict = m->md_dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
338 if (dict == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
339 dict = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
340 if (dict == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
341 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
342 m->md_dict = dict;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
343 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
344 if (PyDict_SetItemString(dict, "__name__", name) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
345 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
346 if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
347 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
348 return 0;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17811
diff changeset
349 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17811
diff changeset
350
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 static void
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
352 module_dealloc(PyModuleObject *m)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
354 PyObject_GC_UnTrack(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
355 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
356 m->md_def->m_free(m);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
357 if (m->md_dict != NULL) {
65233
3e8d28886ad6 Merged revisions 85392 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 61467
diff changeset
358 _PyModule_Clear((PyObject *)m);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
359 Py_DECREF(m->md_dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
360 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
361 if (m->md_state != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
362 PyMem_FREE(m->md_state);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
363 Py_TYPE(m)->tp_free((PyObject *)m);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
366 static PyObject *
13457
ef2ebb3b0c64 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
367 module_repr(PyModuleObject *m)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 {
68111
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
369 PyObject *name, *filename, *repr;
19322
1fec03012346 module_repr(): Instead of fixing the maximum buf size to 400,
Barry Warsaw <barry@python.org>
parents: 18933
diff changeset
370
68111
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
371 name = PyModule_GetNameObject((PyObject *)m);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
372 if (name == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
373 PyErr_Clear();
68111
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
374 name = PyUnicode_FromStringAndSize("?", 1);
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
375 if (name == NULL)
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
376 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
377 }
64138
ee765a67c0b1 Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63949
diff changeset
378 filename = PyModule_GetFilenameObject((PyObject *)m);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
379 if (filename == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
380 PyErr_Clear();
68111
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
381 repr = PyUnicode_FromFormat("<module %R (built-in)>", name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
382 }
68111
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
383 else {
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
384 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
385 Py_DECREF(filename);
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
386 }
f2edaf62d823 Issue #3080: Add PyModule_GetNameObject()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66910
diff changeset
387 Py_DECREF(name);
64138
ee765a67c0b1 Issue #9425: Create PyModule_GetFilenameObject() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63949
diff changeset
388 return repr;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
390
15686
986d1c3ccdde Add garbage collection for module objects. Closes patch #102939 and
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
391 static int
986d1c3ccdde Add garbage collection for module objects. Closes patch #102939 and
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
392 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
393 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
394 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
395 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
396 if (res)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
397 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
398 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
399 Py_VISIT(m->md_dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
400 return 0;
15686
986d1c3ccdde Add garbage collection for module objects. Closes patch #102939 and
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
401 }
986d1c3ccdde Add garbage collection for module objects. Closes patch #102939 and
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15318
diff changeset
402
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
403 static int
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
404 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
405 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
406 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
407 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
408 if (res)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
409 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
410 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
411 Py_CLEAR(m->md_dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
412 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
413 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
414
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
415 static PyObject *
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
416 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
417 {
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72848
diff changeset
418 _Py_IDENTIFIER(__dict__);
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
419 PyObject *result = NULL;
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 72475
diff changeset
420 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
421
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
422 if (dict != NULL) {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
423 if (PyDict_Check(dict))
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
424 result = PyDict_Keys(dict);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
425 else {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
426 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
427 if (name)
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
428 PyErr_Format(PyExc_TypeError,
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
429 "%.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
430 name);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
431 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
432 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
433
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
434 Py_XDECREF(dict);
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
435 return result;
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
436 }
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
437
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
438 static PyMethodDef module_methods[] = {
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
439 {"__dir__", module_dir, METH_NOARGS,
70342
6f078d80898f indicate return value on __dir__ methods
Benjamin Peterson <benjamin@python.org>
parents: 70331
diff changeset
440 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
441 {0}
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
442 };
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
443
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44351
diff changeset
444
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23654
diff changeset
445 PyDoc_STRVAR(module_doc,
23654
b86eaeb0d7dd Add a docstring to the module type.
Guido van Rossum <guido@python.org>
parents: 23652
diff changeset
446 "module(name[, doc])\n\
b86eaeb0d7dd Add a docstring to the module type.
Guido van Rossum <guido@python.org>
parents: 23652
diff changeset
447 \n\
b86eaeb0d7dd Add a docstring to the module type.
Guido van Rossum <guido@python.org>
parents: 23652
diff changeset
448 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
449 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
450
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
451 PyTypeObject PyModule_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
452 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
453 "module", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
454 sizeof(PyModuleObject), /* tp_size */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
455 0, /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
456 (destructor)module_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
457 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
458 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
459 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
460 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
461 (reprfunc)module_repr, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
462 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
463 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
464 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
465 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
466 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
467 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
468 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
469 PyObject_GenericSetAttr, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
470 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
471 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
472 Py_TPFLAGS_BASETYPE, /* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
473 module_doc, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
474 (traverseproc)module_traverse, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
475 (inquiry)module_clear, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
476 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
477 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
478 0, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
479 0, /* tp_iternext */
70331
8f403199f999 move specialized dir implementations into __dir__ methods (closes #12166)
Benjamin Peterson <benjamin@python.org>
parents: 68258
diff changeset
480 module_methods, /* tp_methods */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
481 module_members, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
482 0, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
483 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
484 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
485 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
486 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
487 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
488 (initproc)module_init, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
489 PyType_GenericAlloc, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
490 PyType_GenericNew, /* tp_new */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57210
diff changeset
491 PyObject_GC_Del, /* tp_free */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
492 };