Commit 9c388e30 authored by Guido van Rossum's avatar Guido van Rossum

Add several secret __*__ attributes

parent d9c49fd3
...@@ -32,22 +32,25 @@ typedef struct { ...@@ -32,22 +32,25 @@ typedef struct {
OB_HEAD OB_HEAD
object *cl_bases; /* A tuple */ object *cl_bases; /* A tuple */
object *cl_methods; /* A dictionary */ object *cl_methods; /* A dictionary */
object *cl_name; /* A string */
} classobject; } classobject;
object * object *
newclassobject(bases, methods) newclassobject(bases, methods, name)
object *bases; /* NULL or tuple of classobjects! */ object *bases; /* NULL or tuple of classobjects! */
object *methods; object *methods;
object *name; /* String; NULL if unknown */
{ {
classobject *op; classobject *op;
op = NEWOBJ(classobject, &Classtype); op = NEWOBJ(classobject, &Classtype);
if (op == NULL) if (op == NULL)
return NULL; return NULL;
if (bases != NULL) XINCREF(bases);
INCREF(bases);
op->cl_bases = bases; op->cl_bases = bases;
INCREF(methods); INCREF(methods);
op->cl_methods = methods; op->cl_methods = methods;
XINCREF(name);
op->cl_name = name;
return (object *) op; return (object *) op;
} }
...@@ -58,9 +61,9 @@ class_dealloc(op) ...@@ -58,9 +61,9 @@ class_dealloc(op)
classobject *op; classobject *op;
{ {
int i; int i;
if (op->cl_bases != NULL) XDECREF(op->cl_bases);
DECREF(op->cl_bases);
DECREF(op->cl_methods); DECREF(op->cl_methods);
XDECREF(op->cl_name);
free((ANY *)op); free((ANY *)op);
} }
...@@ -70,6 +73,24 @@ class_getattr(op, name) ...@@ -70,6 +73,24 @@ class_getattr(op, name)
register char *name; register char *name;
{ {
register object *v; register object *v;
if (strcmp(name, "__dict__") == 0) {
INCREF(op->cl_methods);
return op->cl_methods;
}
if (strcmp(name, "__bases__") == 0) {
if (op->cl_bases == NULL)
return newtupleobject(0);
INCREF(op->cl_bases);
return op->cl_bases;
}
if (strcmp(name, "__name__") == 0) {
if (op->cl_name == NULL)
v = None;
else
v = op->cl_name;
INCREF(v);
return v;
}
v = dictlookup(op->cl_methods, name); v = dictlookup(op->cl_methods, name);
if (v != NULL) { if (v != NULL) {
INCREF(v); INCREF(v);
...@@ -89,6 +110,18 @@ class_getattr(op, name) ...@@ -89,6 +110,18 @@ class_getattr(op, name)
return NULL; return NULL;
} }
static int
class_setattr(op, name, v)
classobject *op;
char *name;
object *v;
{
if (v == NULL)
return dictremove(op->cl_methods, name);
else
return dictinsert(op->cl_methods, name, v);
}
typeobject Classtype = { typeobject Classtype = {
OB_HEAD_INIT(&Typetype) OB_HEAD_INIT(&Typetype)
0, 0,
...@@ -98,7 +131,7 @@ typeobject Classtype = { ...@@ -98,7 +131,7 @@ typeobject Classtype = {
class_dealloc, /*tp_dealloc*/ class_dealloc, /*tp_dealloc*/
0, /*tp_print*/ 0, /*tp_print*/
class_getattr, /*tp_getattr*/ class_getattr, /*tp_getattr*/
0, /*tp_setattr*/ class_setattr, /*tp_setattr*/
0, /*tp_compare*/ 0, /*tp_compare*/
0, /*tp_repr*/ 0, /*tp_repr*/
0, /*tp_as_number*/ 0, /*tp_as_number*/
...@@ -154,7 +187,16 @@ instance_getattr(inst, name) ...@@ -154,7 +187,16 @@ instance_getattr(inst, name)
register instanceobject *inst; register instanceobject *inst;
register char *name; register char *name;
{ {
register object *v = dictlookup(inst->in_attr, name); register object *v;
if (strcmp(name, "__dict__") == 0) {
INCREF(inst->in_attr);
return inst->in_attr;
}
if (strcmp(name, "__class__") == 0) {
INCREF(inst->in_class);
return (object *)inst->in_class;
}
v = dictlookup(inst->in_attr, name);
if (v != NULL) { if (v != NULL) {
INCREF(v); INCREF(v);
return v; return v;
...@@ -202,8 +244,7 @@ typeobject Instancetype = { ...@@ -202,8 +244,7 @@ typeobject Instancetype = {
}; };
/* And finally, here are instance method objects /* And finally, here are instance method objects */
(accidentally called class methods) */
typedef struct { typedef struct {
OB_HEAD OB_HEAD
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment