Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9430839

Browse files
committed
Add several secret __*__ attributes
1 parent dc8a108 commit 9430839

1 file changed

Lines changed: 50 additions & 9 deletions

File tree

Objects/classobject.c

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3738
object *
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+
92125
typeobject 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

208249
typedef struct {
209250
OB_HEAD

0 commit comments

Comments
 (0)