@@ -32,22 +32,25 @@ typedef struct {
3232 OB_HEAD
3333 object * cl_bases ; /* A tuple */
3434 object * cl_methods ; /* A dictionary */
35+ object * cl_name ; /* A string */
3536} classobject ;
3637
3738object *
38- newclassobject (bases , methods )
39+ newclassobject (bases , methods , name )
3940 object * bases ; /* NULL or tuple of classobjects! */
4041 object * methods ;
42+ object * name ; /* String; NULL if unknown */
4143{
4244 classobject * op ;
4345 op = NEWOBJ (classobject , & Classtype );
4446 if (op == NULL )
4547 return NULL ;
46- if (bases != NULL )
47- INCREF (bases );
48+ XINCREF (bases );
4849 op -> cl_bases = bases ;
4950 INCREF (methods );
5051 op -> cl_methods = methods ;
52+ XINCREF (name );
53+ op -> cl_name = name ;
5154 return (object * ) op ;
5255}
5356
@@ -58,9 +61,9 @@ class_dealloc(op)
5861 classobject * op ;
5962{
6063 int i ;
61- if (op -> cl_bases != NULL )
62- DECREF (op -> cl_bases );
64+ XDECREF (op -> cl_bases );
6365 DECREF (op -> cl_methods );
66+ XDECREF (op -> cl_name );
6467 free ((ANY * )op );
6568}
6669
@@ -70,6 +73,24 @@ class_getattr(op, name)
7073 register char * name ;
7174{
7275 register object * v ;
76+ if (strcmp (name , "__dict__" ) == 0 ) {
77+ INCREF (op -> cl_methods );
78+ return op -> cl_methods ;
79+ }
80+ if (strcmp (name , "__bases__" ) == 0 ) {
81+ if (op -> cl_bases == NULL )
82+ return newtupleobject (0 );
83+ INCREF (op -> cl_bases );
84+ return op -> cl_bases ;
85+ }
86+ if (strcmp (name , "__name__" ) == 0 ) {
87+ if (op -> cl_name == NULL )
88+ v = None ;
89+ else
90+ v = op -> cl_name ;
91+ INCREF (v );
92+ return v ;
93+ }
7394 v = dictlookup (op -> cl_methods , name );
7495 if (v != NULL ) {
7596 INCREF (v );
@@ -89,6 +110,18 @@ class_getattr(op, name)
89110 return NULL ;
90111}
91112
113+ static int
114+ class_setattr (op , name , v )
115+ classobject * op ;
116+ char * name ;
117+ object * v ;
118+ {
119+ if (v == NULL )
120+ return dictremove (op -> cl_methods , name );
121+ else
122+ return dictinsert (op -> cl_methods , name , v );
123+ }
124+
92125typeobject Classtype = {
93126 OB_HEAD_INIT (& Typetype )
94127 0 ,
@@ -98,7 +131,7 @@ typeobject Classtype = {
98131 class_dealloc , /*tp_dealloc*/
99132 0 , /*tp_print*/
100133 class_getattr , /*tp_getattr*/
101- 0 , /*tp_setattr*/
134+ class_setattr , /*tp_setattr*/
102135 0 , /*tp_compare*/
103136 0 , /*tp_repr*/
104137 0 , /*tp_as_number*/
@@ -154,7 +187,16 @@ instance_getattr(inst, name)
154187 register instanceobject * inst ;
155188 register char * name ;
156189{
157- register object * v = dictlookup (inst -> in_attr , name );
190+ register object * v ;
191+ if (strcmp (name , "__dict__" ) == 0 ) {
192+ INCREF (inst -> in_attr );
193+ return inst -> in_attr ;
194+ }
195+ if (strcmp (name , "__class__" ) == 0 ) {
196+ INCREF (inst -> in_class );
197+ return (object * )inst -> in_class ;
198+ }
199+ v = dictlookup (inst -> in_attr , name );
158200 if (v != NULL ) {
159201 INCREF (v );
160202 return v ;
@@ -202,8 +244,7 @@ typeobject Instancetype = {
202244};
203245
204246
205- /* And finally, here are instance method objects
206- (accidentally called class methods) */
247+ /* And finally, here are instance method objects */
207248
208249typedef struct {
209250 OB_HEAD
0 commit comments