blob: cf96a70915027a28c8b8a5f5a0e9d088fe701cd8 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Module object implementation */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004
5typedef struct {
6 OB_HEAD
7 object *md_name;
8 object *md_dict;
9} moduleobject;
10
11object *
12newmoduleobject(name)
13 char *name;
14{
15 moduleobject *m = NEWOBJ(moduleobject, &Moduletype);
16 if (m == NULL)
17 return NULL;
18 m->md_name = newstringobject(name);
19 m->md_dict = newdictobject();
20 if (m->md_name == NULL || m->md_dict == NULL) {
21 DECREF(m);
22 return NULL;
23 }
24 return (object *)m;
25}
26
27object *
28getmoduledict(m)
29 object *m;
30{
31 if (!is_moduleobject(m)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +000032 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033 return NULL;
34 }
35 return ((moduleobject *)m) -> md_dict;
36}
37
Guido van Rossum0558a201990-10-26 15:00:11 +000038char *
39getmodulename(m)
40 object *m;
41{
42 if (!is_moduleobject(m)) {
43 err_badarg();
44 return NULL;
45 }
46 return getstringvalue(((moduleobject *)m) -> md_name);
47}
48
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049/* Methods */
50
51static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000052module_dealloc(m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053 moduleobject *m;
54{
55 if (m->md_name != NULL)
56 DECREF(m->md_name);
57 if (m->md_dict != NULL)
58 DECREF(m->md_dict);
59 free((char *)m);
60}
61
62static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000063module_print(m, fp, flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 moduleobject *m;
65 FILE *fp;
66 int flags;
67{
Guido van Rossum3f5da241990-12-20 15:06:42 +000068 fprintf(fp, "<module '%s'>", getstringvalue(m->md_name));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069}
70
71static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000072module_repr(m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 moduleobject *m;
74{
75 char buf[100];
Guido van Rossum3f5da241990-12-20 15:06:42 +000076 sprintf(buf, "<module '%.80s'>", getstringvalue(m->md_name));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077 return newstringobject(buf);
78}
79
80static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +000081module_getattr(m, name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082 moduleobject *m;
83 char *name;
84{
Guido van Rossume87203a1990-10-21 22:12:30 +000085 object *res;
Guido van Rossum3f5da241990-12-20 15:06:42 +000086 if (strcmp(name, "__dict__") == 0) {
Guido van Rossume87203a1990-10-21 22:12:30 +000087 INCREF(m->md_dict);
88 return m->md_dict;
89 }
Guido van Rossum3f5da241990-12-20 15:06:42 +000090 if (strcmp(name, "__name__") == 0) {
91 INCREF(m->md_name);
92 return m->md_name;
93 }
Guido van Rossume87203a1990-10-21 22:12:30 +000094 res = dictlookup(m->md_dict, name);
Guido van Rossum2b654f71990-10-14 20:03:32 +000095 if (res == NULL)
96 err_setstr(NameError, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097 else
98 INCREF(res);
99 return res;
100}
101
102static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000103module_setattr(m, name, v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104 moduleobject *m;
105 char *name;
106 object *v;
107{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000108 if (strcmp(name, "__dict__") == 0 || strcmp(name, "__name__") == 0) {
109 err_setstr(NameError, "can't assign to reserved member name");
Guido van Rossume87203a1990-10-21 22:12:30 +0000110 return NULL;
111 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112 if (v == NULL)
113 return dictremove(m->md_dict, name);
114 else
115 return dictinsert(m->md_dict, name, v);
116}
117
118typeobject Moduletype = {
119 OB_HEAD_INIT(&Typetype)
120 0, /*ob_size*/
121 "module", /*tp_name*/
122 sizeof(moduleobject), /*tp_size*/
123 0, /*tp_itemsize*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000124 module_dealloc, /*tp_dealloc*/
125 module_print, /*tp_print*/
126 module_getattr, /*tp_getattr*/
127 module_setattr, /*tp_setattr*/
128 0, /*tp_compare*/
129 module_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130};