OLD | NEW |
1 | 1 |
2 /* Module object implementation */ | 2 /* Module object implementation */ |
3 | 3 |
4 #include "Python.h" | 4 #include "Python.h" |
5 #include "structmember.h" | 5 #include "structmember.h" |
6 | 6 |
7 static Py_ssize_t max_module_number; | 7 static Py_ssize_t max_module_number; |
8 | 8 |
9 typedef struct { | 9 typedef struct { |
10 PyObject_HEAD | 10 PyObject_HEAD |
(...skipping 11 matching lines...) Expand all Loading... |
22 PyVarObject_HEAD_INIT(&PyType_Type, 0) | 22 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
23 "moduledef", /* tp_name */ | 23 "moduledef", /* tp_name */ |
24 sizeof(struct PyModuleDef), /* tp_size */ | 24 sizeof(struct PyModuleDef), /* tp_size */ |
25 0, /* tp_itemsize */ | 25 0, /* tp_itemsize */ |
26 }; | 26 }; |
27 | 27 |
28 | 28 |
29 PyObject * | 29 PyObject * |
30 PyModule_New(const char *name) | 30 PyModule_New(const char *name) |
31 { | 31 { |
| 32 PyObject *nameobj, *module; |
| 33 nameobj = PyUnicode_FromString(name); |
| 34 if (nameobj == NULL) |
| 35 return NULL; |
| 36 module = PyModule_NewUnicode(nameobj); |
| 37 Py_DECREF(nameobj); |
| 38 return module; |
| 39 } |
| 40 |
| 41 PyObject * |
| 42 PyModule_NewUnicode(PyObject *name) |
| 43 { |
32 PyModuleObject *m; | 44 PyModuleObject *m; |
33 PyObject *nameobj; | |
34 m = PyObject_GC_New(PyModuleObject, &PyModule_Type); | 45 m = PyObject_GC_New(PyModuleObject, &PyModule_Type); |
35 if (m == NULL) | 46 if (m == NULL) |
36 return NULL; | 47 return NULL; |
37 m->md_def = NULL; | 48 m->md_def = NULL; |
38 m->md_state = NULL; | 49 m->md_state = NULL; |
39 nameobj = PyUnicode_FromString(name); | |
40 m->md_dict = PyDict_New(); | 50 m->md_dict = PyDict_New(); |
41 if (m->md_dict == NULL || nameobj == NULL) | 51 if (m->md_dict == NULL) |
42 goto fail; | 52 goto fail; |
43 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0) | 53 if (PyDict_SetItemString(m->md_dict, "__name__", name) != 0) |
44 goto fail; | 54 goto fail; |
45 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0) | 55 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0) |
46 goto fail; | 56 goto fail; |
47 if (PyDict_SetItemString(m->md_dict, "__package__", Py_None) != 0) | 57 if (PyDict_SetItemString(m->md_dict, "__package__", Py_None) != 0) |
48 goto fail; | 58 goto fail; |
49 Py_DECREF(nameobj); | |
50 PyObject_GC_Track(m); | 59 PyObject_GC_Track(m); |
51 return (PyObject *)m; | 60 return (PyObject *)m; |
52 | 61 |
53 fail: | 62 fail: |
54 Py_XDECREF(nameobj); | |
55 Py_DECREF(m); | 63 Py_DECREF(m); |
56 return NULL; | 64 return NULL; |
57 } | 65 } |
58 | 66 |
59 PyObject * | 67 PyObject * |
60 PyModule_Create2(struct PyModuleDef* module, int module_api_version) | 68 PyModule_Create2(struct PyModuleDef* module, int module_api_version) |
61 { | 69 { |
62 PyObject *d, *v, *n; | 70 PyObject *d, *v, *n; |
63 PyMethodDef *ml; | 71 PyMethodDef *ml; |
64 const char* name; | 72 const char* name; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 if (!PyModule_Check(m)) { | 170 if (!PyModule_Check(m)) { |
163 PyErr_BadInternalCall(); | 171 PyErr_BadInternalCall(); |
164 return NULL; | 172 return NULL; |
165 } | 173 } |
166 d = ((PyModuleObject *)m) -> md_dict; | 174 d = ((PyModuleObject *)m) -> md_dict; |
167 if (d == NULL) | 175 if (d == NULL) |
168 ((PyModuleObject *)m) -> md_dict = d = PyDict_New(); | 176 ((PyModuleObject *)m) -> md_dict = d = PyDict_New(); |
169 return d; | 177 return d; |
170 } | 178 } |
171 | 179 |
172 const char * | 180 PyObject* |
173 PyModule_GetName(PyObject *m) | 181 PyModule_GetNameObject(PyObject *m) |
174 { | 182 { |
175 PyObject *d; | 183 PyObject *d; |
176 PyObject *nameobj; | 184 PyObject *name; |
177 if (!PyModule_Check(m)) { | 185 if (!PyModule_Check(m)) { |
178 PyErr_BadArgument(); | 186 PyErr_BadArgument(); |
179 return NULL; | 187 return NULL; |
180 } | 188 } |
181 d = ((PyModuleObject *)m)->md_dict; | 189 d = ((PyModuleObject *)m)->md_dict; |
182 if (d == NULL || | 190 if (d == NULL || |
183 (nameobj = PyDict_GetItemString(d, "__name__")) == NULL || | 191 (name = PyDict_GetItemString(d, "__name__")) == NULL || |
184 !PyUnicode_Check(nameobj)) | 192 !PyUnicode_Check(name)) |
185 { | 193 { |
186 PyErr_SetString(PyExc_SystemError, "nameless module"); | 194 PyErr_SetString(PyExc_SystemError, "nameless module"); |
187 return NULL; | 195 return NULL; |
188 } | 196 } |
189 return _PyUnicode_AsString(nameobj); | 197 Py_INCREF(name); |
| 198 return name; |
| 199 } |
| 200 |
| 201 const char * |
| 202 PyModule_GetName(PyObject *m) |
| 203 { |
| 204 PyObject *name = PyModule_GetNameObject(m); |
| 205 if (name == NULL) |
| 206 return NULL; |
| 207 Py_DECREF(name); |
| 208 return _PyUnicode_AsString(name); |
190 } | 209 } |
191 | 210 |
192 PyObject* | 211 PyObject* |
193 PyModule_GetFilenameObject(PyObject *m) | 212 PyModule_GetFilenameObject(PyObject *m) |
194 { | 213 { |
195 PyObject *d; | 214 PyObject *d; |
196 PyObject *fileobj; | 215 PyObject *fileobj; |
197 if (!PyModule_Check(m)) { | 216 if (!PyModule_Check(m)) { |
198 PyErr_BadArgument(); | 217 PyErr_BadArgument(); |
199 return NULL; | 218 return NULL; |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 Py_DECREF(m->md_dict); | 359 Py_DECREF(m->md_dict); |
341 } | 360 } |
342 if (m->md_state != NULL) | 361 if (m->md_state != NULL) |
343 PyMem_FREE(m->md_state); | 362 PyMem_FREE(m->md_state); |
344 Py_TYPE(m)->tp_free((PyObject *)m); | 363 Py_TYPE(m)->tp_free((PyObject *)m); |
345 } | 364 } |
346 | 365 |
347 static PyObject * | 366 static PyObject * |
348 module_repr(PyModuleObject *m) | 367 module_repr(PyModuleObject *m) |
349 { | 368 { |
350 const char *name; | 369 PyObject *name; |
351 PyObject *filename, *repr; | 370 PyObject *filename, *repr; |
352 | 371 |
353 name = PyModule_GetName((PyObject *)m); | 372 name = PyModule_GetNameObject((PyObject *)m); |
354 if (name == NULL) { | 373 if (name == NULL) { |
355 PyErr_Clear(); | 374 PyErr_Clear(); |
356 name = "?"; | 375 name = PyUnicode_FromStringAndSize("?", 1); |
| 376 if (name == NULL) |
| 377 return NULL; |
357 } | 378 } |
358 filename = PyModule_GetFilenameObject((PyObject *)m); | 379 filename = PyModule_GetFilenameObject((PyObject *)m); |
359 if (filename == NULL) { | 380 if (filename == NULL) { |
360 PyErr_Clear(); | 381 PyErr_Clear(); |
361 return PyUnicode_FromFormat("<module '%s' (built-in)>", name); | 382 repr = PyUnicode_FromFormat("<module %R (built-in)>", name); |
362 } | 383 } |
363 repr = PyUnicode_FromFormat("<module '%s' from '%U'>", name, filename); | 384 else { |
364 Py_DECREF(filename); | 385 repr = PyUnicode_FromFormat("<module %R from %R>", name, filename); |
| 386 Py_DECREF(filename); |
| 387 } |
| 388 Py_DECREF(name); |
365 return repr; | 389 return repr; |
366 } | 390 } |
367 | 391 |
368 static int | 392 static int |
369 module_traverse(PyModuleObject *m, visitproc visit, void *arg) | 393 module_traverse(PyModuleObject *m, visitproc visit, void *arg) |
370 { | 394 { |
371 if (m->md_def && m->md_def->m_traverse) { | 395 if (m->md_def && m->md_def->m_traverse) { |
372 int res = m->md_def->m_traverse((PyObject*)m, visit, arg); | 396 int res = m->md_def->m_traverse((PyObject*)m, visit, arg); |
373 if (res) | 397 if (res) |
374 return res; | 398 return res; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 0, /* tp_base */ | 455 0, /* tp_base */ |
432 0, /* tp_dict */ | 456 0, /* tp_dict */ |
433 0, /* tp_descr_get */ | 457 0, /* tp_descr_get */ |
434 0, /* tp_descr_set */ | 458 0, /* tp_descr_set */ |
435 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */ | 459 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */ |
436 (initproc)module_init, /* tp_init */ | 460 (initproc)module_init, /* tp_init */ |
437 PyType_GenericAlloc, /* tp_alloc */ | 461 PyType_GenericAlloc, /* tp_alloc */ |
438 PyType_GenericNew, /* tp_new */ | 462 PyType_GenericNew, /* tp_new */ |
439 PyObject_GC_Del, /* tp_free */ | 463 PyObject_GC_Del, /* tp_free */ |
440 }; | 464 }; |
OLD | NEW |