blob: 2f23cc6ff4fa4c40d240900ce29ebaffb4656b6b [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000014
15******************************************************************/
16
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017/* Module object implementation */
18
Guido van Rossumc0b618a1997-05-02 03:12:38 +000019#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020
21typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000022 PyObject_HEAD
23 PyObject *md_dict;
24} PyModuleObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025
Guido van Rossumc0b618a1997-05-02 03:12:38 +000026PyObject *
27PyModule_New(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028 char *name;
29{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000030 PyModuleObject *m;
31 PyObject *nameobj;
32 m = PyObject_NEW(PyModuleObject, &PyModule_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033 if (m == NULL)
34 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000035 nameobj = PyString_FromString(name);
36 m->md_dict = PyDict_New();
Guido van Rossumc45611d1993-11-17 22:58:56 +000037 if (m->md_dict == NULL || nameobj == NULL)
38 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000039 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
Guido van Rossumc45611d1993-11-17 22:58:56 +000040 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
Guido van Rossum8b14b4c1995-01-07 11:59:29 +000042 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000043 Py_DECREF(nameobj);
44 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000045
46 fail:
Guido van Rossumc0b618a1997-05-02 03:12:38 +000047 Py_XDECREF(nameobj);
48 Py_DECREF(m);
Guido van Rossumc45611d1993-11-17 22:58:56 +000049 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050}
51
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052PyObject *
53PyModule_GetDict(m)
54 PyObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056 if (!PyModule_Check(m)) {
57 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058 return NULL;
59 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060 return ((PyModuleObject *)m) -> md_dict;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061}
62
Guido van Rossum0558a201990-10-26 15:00:11 +000063char *
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064PyModule_GetName(m)
65 PyObject *m;
Guido van Rossum0558a201990-10-26 15:00:11 +000066{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000067 PyObject *nameobj;
68 if (!PyModule_Check(m)) {
69 PyErr_BadArgument();
Guido van Rossum0558a201990-10-26 15:00:11 +000070 return NULL;
71 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000072 nameobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
73 "__name__");
74 if (nameobj == NULL || !PyString_Check(nameobj)) {
75 PyErr_SetString(PyExc_SystemError, "nameless module");
Guido van Rossumc45611d1993-11-17 22:58:56 +000076 return NULL;
77 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 return PyString_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +000079}
80
Guido van Rossum98cc19f1999-02-15 14:47:16 +000081char *
82PyModule_GetFilename(m)
83 PyObject *m;
84{
85 PyObject *fileobj;
86 if (!PyModule_Check(m)) {
87 PyErr_BadArgument();
88 return NULL;
89 }
90 fileobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
91 "__file__");
92 if (fileobj == NULL || !PyString_Check(fileobj)) {
93 PyErr_SetString(PyExc_SystemError, "module filename missing");
94 return NULL;
95 }
96 return PyString_AsString(fileobj);
97}
98
Guido van Rossumf1dc0611998-02-19 20:51:52 +000099void
100_PyModule_Clear(m)
101 PyObject *m;
102{
103 /* To make the execution order of destructors for global
104 objects a bit more predictable, we first zap all objects
105 whose name starts with a single underscore, before we clear
106 the entire dictionary. We zap them by replacing them with
107 None, rather than deleting them from the dictionary, to
108 avoid rehashing the dictionary (to some extent). */
109
110 int pos;
111 PyObject *key, *value;
112 PyObject *d;
113
114 d = ((PyModuleObject *)m)->md_dict;
115
116 /* First, clear only names starting with a single underscore */
117 pos = 0;
118 while (PyDict_Next(d, &pos, &key, &value)) {
119 if (value != Py_None && PyString_Check(key)) {
120 char *s = PyString_AsString(key);
121 if (s[0] == '_' && s[1] != '_') {
122 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000123 PySys_WriteStderr("# clear[1] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000124 PyDict_SetItem(d, key, Py_None);
125 }
126 }
127 }
128
129 /* Next, clear all names except for __builtins__ */
130 pos = 0;
131 while (PyDict_Next(d, &pos, &key, &value)) {
132 if (value != Py_None && PyString_Check(key)) {
133 char *s = PyString_AsString(key);
134 if (s[0] != '_' || strcmp(s, "__builtins__") != 0) {
135 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000136 PySys_WriteStderr("# clear[2] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000137 PyDict_SetItem(d, key, Py_None);
138 }
139 }
140 }
141
142 /* Note: we leave __builtins__ in place, so that destructors
143 of non-global objects defined in this module can still use
144 builtins, in particularly 'None'. */
145
146}
147
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148/* Methods */
149
150static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000151module_dealloc(m)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153{
Guido van Rossum27e916f1995-01-26 00:39:00 +0000154 if (m->md_dict != NULL) {
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000155 _PyModule_Clear((PyObject *)m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 Py_DECREF(m->md_dict);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000157 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000158 PyObject_DEL(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159}
160
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000162module_repr(m)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000164{
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000165 char buf[400];
166 char *name;
167 char *filename;
168 name = PyModule_GetName((PyObject *)m);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000169 if (name == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 PyErr_Clear();
Guido van Rossumc45611d1993-11-17 22:58:56 +0000171 name = "?";
172 }
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000173 filename = PyModule_GetFilename((PyObject *)m);
174 if (filename == NULL) {
175 PyErr_Clear();
176 sprintf(buf, "<module '%.80s' (built-in)>", name);
177 } else {
178 sprintf(buf, "<module '%.80s' from '%.255s'>", name, filename);
179 }
180
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000181 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182}
183
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000185module_getattr(m, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187 char *name;
188{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 PyObject *res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000190 if (strcmp(name, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 Py_INCREF(m->md_dict);
Guido van Rossume87203a1990-10-21 22:12:30 +0000192 return m->md_dict;
193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 res = PyDict_GetItemString(m->md_dict, name);
Guido van Rossum2b654f71990-10-14 20:03:32 +0000195 if (res == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 PyErr_SetString(PyExc_AttributeError, name);
Guido van Rossum0add15f1997-05-09 01:07:15 +0000197 else
198 Py_INCREF(res);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000199 return res;
200}
201
202static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000203module_setattr(m, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000208 if (name[0] == '_' && strcmp(name, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 PyErr_SetString(PyExc_TypeError,
210 "read-only special attribute");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000211 return -1;
Guido van Rossume87203a1990-10-21 22:12:30 +0000212 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000213 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 int rv = PyDict_DelItemString(m->md_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000215 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000217 "delete non-existing module attribute");
218 return rv;
219 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 return PyDict_SetItemString(m->md_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222}
223
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224PyTypeObject PyModule_Type = {
225 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226 0, /*ob_size*/
227 "module", /*tp_name*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 sizeof(PyModuleObject), /*tp_size*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229 0, /*tp_itemsize*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000230 (destructor)module_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000231 0, /*tp_print*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000232 (getattrfunc)module_getattr, /*tp_getattr*/
233 (setattrfunc)module_setattr, /*tp_setattr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000234 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000235 (reprfunc)module_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236};