blob: 4e4395e1164aa3e45476db6d6083465d2b45a7ee [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Module object implementation */
12
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014
15typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000016 PyObject_HEAD
17 PyObject *md_dict;
18} PyModuleObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000019
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000021PyModule_New(char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000023 PyModuleObject *m;
24 PyObject *nameobj;
25 m = PyObject_NEW(PyModuleObject, &PyModule_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000026 if (m == NULL)
27 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000028 nameobj = PyString_FromString(name);
29 m->md_dict = PyDict_New();
Guido van Rossumc45611d1993-11-17 22:58:56 +000030 if (m->md_dict == NULL || nameobj == NULL)
31 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
Guido van Rossumc45611d1993-11-17 22:58:56 +000033 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
Guido van Rossum8b14b4c1995-01-07 11:59:29 +000035 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000036 Py_DECREF(nameobj);
37 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000038
39 fail:
Guido van Rossumc0b618a1997-05-02 03:12:38 +000040 Py_XDECREF(nameobj);
41 Py_DECREF(m);
Guido van Rossumc45611d1993-11-17 22:58:56 +000042 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043}
44
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000046PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048 if (!PyModule_Check(m)) {
49 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050 return NULL;
51 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 return ((PyModuleObject *)m) -> md_dict;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053}
54
Guido van Rossum0558a201990-10-26 15:00:11 +000055char *
Fred Drakeee238b92000-07-09 06:03:25 +000056PyModule_GetName(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +000057{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058 PyObject *nameobj;
59 if (!PyModule_Check(m)) {
60 PyErr_BadArgument();
Guido van Rossum0558a201990-10-26 15:00:11 +000061 return NULL;
62 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000063 nameobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
64 "__name__");
65 if (nameobj == NULL || !PyString_Check(nameobj)) {
66 PyErr_SetString(PyExc_SystemError, "nameless module");
Guido van Rossumc45611d1993-11-17 22:58:56 +000067 return NULL;
68 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000069 return PyString_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +000070}
71
Guido van Rossum98cc19f1999-02-15 14:47:16 +000072char *
Fred Drakeee238b92000-07-09 06:03:25 +000073PyModule_GetFilename(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +000074{
75 PyObject *fileobj;
76 if (!PyModule_Check(m)) {
77 PyErr_BadArgument();
78 return NULL;
79 }
80 fileobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
81 "__file__");
82 if (fileobj == NULL || !PyString_Check(fileobj)) {
83 PyErr_SetString(PyExc_SystemError, "module filename missing");
84 return NULL;
85 }
86 return PyString_AsString(fileobj);
87}
88
Guido van Rossumf1dc0611998-02-19 20:51:52 +000089void
Fred Drakeee238b92000-07-09 06:03:25 +000090_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +000091{
92 /* To make the execution order of destructors for global
93 objects a bit more predictable, we first zap all objects
94 whose name starts with a single underscore, before we clear
95 the entire dictionary. We zap them by replacing them with
96 None, rather than deleting them from the dictionary, to
97 avoid rehashing the dictionary (to some extent). */
98
99 int pos;
100 PyObject *key, *value;
101 PyObject *d;
102
103 d = ((PyModuleObject *)m)->md_dict;
104
105 /* First, clear only names starting with a single underscore */
106 pos = 0;
107 while (PyDict_Next(d, &pos, &key, &value)) {
108 if (value != Py_None && PyString_Check(key)) {
109 char *s = PyString_AsString(key);
110 if (s[0] == '_' && s[1] != '_') {
111 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000112 PySys_WriteStderr("# clear[1] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000113 PyDict_SetItem(d, key, Py_None);
114 }
115 }
116 }
117
118 /* Next, clear all names except for __builtins__ */
119 pos = 0;
120 while (PyDict_Next(d, &pos, &key, &value)) {
121 if (value != Py_None && PyString_Check(key)) {
122 char *s = PyString_AsString(key);
123 if (s[0] != '_' || strcmp(s, "__builtins__") != 0) {
124 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000125 PySys_WriteStderr("# clear[2] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000126 PyDict_SetItem(d, key, Py_None);
127 }
128 }
129 }
130
131 /* Note: we leave __builtins__ in place, so that destructors
132 of non-global objects defined in this module can still use
133 builtins, in particularly 'None'. */
134
135}
136
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137/* Methods */
138
139static void
Fred Drakeee238b92000-07-09 06:03:25 +0000140module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141{
Guido van Rossum27e916f1995-01-26 00:39:00 +0000142 if (m->md_dict != NULL) {
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000143 _PyModule_Clear((PyObject *)m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 Py_DECREF(m->md_dict);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000145 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000146 PyObject_DEL(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147}
148
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000150module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151{
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000152 char buf[400];
153 char *name;
154 char *filename;
155 name = PyModule_GetName((PyObject *)m);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000156 if (name == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 PyErr_Clear();
Guido van Rossumc45611d1993-11-17 22:58:56 +0000158 name = "?";
159 }
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000160 filename = PyModule_GetFilename((PyObject *)m);
161 if (filename == NULL) {
162 PyErr_Clear();
163 sprintf(buf, "<module '%.80s' (built-in)>", name);
164 } else {
165 sprintf(buf, "<module '%.80s' from '%.255s'>", name, filename);
166 }
167
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169}
170
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000172module_getattr(PyModuleObject *m, char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000174 PyObject *res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000175 if (strcmp(name, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000176 Py_INCREF(m->md_dict);
Guido van Rossume87203a1990-10-21 22:12:30 +0000177 return m->md_dict;
178 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 res = PyDict_GetItemString(m->md_dict, name);
Guido van Rossum2b654f71990-10-14 20:03:32 +0000180 if (res == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 PyErr_SetString(PyExc_AttributeError, name);
Guido van Rossum0add15f1997-05-09 01:07:15 +0000182 else
183 Py_INCREF(res);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184 return res;
185}
186
187static int
Fred Drakeee238b92000-07-09 06:03:25 +0000188module_setattr(PyModuleObject *m, char *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000190 if (name[0] == '_' && strcmp(name, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 PyErr_SetString(PyExc_TypeError,
192 "read-only special attribute");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000193 return -1;
Guido van Rossume87203a1990-10-21 22:12:30 +0000194 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000195 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 int rv = PyDict_DelItemString(m->md_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000197 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000199 "delete non-existing module attribute");
200 return rv;
201 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203 return PyDict_SetItemString(m->md_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204}
205
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206PyTypeObject PyModule_Type = {
207 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208 0, /*ob_size*/
209 "module", /*tp_name*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 sizeof(PyModuleObject), /*tp_size*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211 0, /*tp_itemsize*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000212 (destructor)module_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000213 0, /*tp_print*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000214 (getattrfunc)module_getattr, /*tp_getattr*/
215 (setattrfunc)module_setattr, /*tp_setattr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000216 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000217 (reprfunc)module_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218};