1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
/* Xx objects */
typedef struct {
OB_HEAD
object *x_attr; /* Attributes dictionary */
} xxobject;
extern typeobject Xxtype; /* Really static, forward */
static xxobject *
newxxobject(arg)
object *arg;
{
textobject *xp;
xp = NEWOBJ(xxobject, &Xxtype);
if (xp == NULL)
return NULL;
xp->x_attr = NULL;
return xp;
}
/* Xx methods */
static void
xx_dealloc(xp)
xxobject *xp;
{
if (xp->x_attr != NULL)
DECREF(xp->x_attr);
DEL(xp);
}
static object *
xx_demo(self, args)
xxobject *self;
object *args;
{
if (!getnoarg(args))
return NULL;
INCREF(None);
return None;
}
static struct methodlist xx_methods[] = {
"demo", xx_demo,
{NULL, NULL} /* sentinel */
};
static object *
xx_getattr(xp, name)
xxobject *xp;
char *name;
{
if (xp->x_attr != NULL) {
object *v = dictlookup(xp->x_attr, name);
if (v != NULL) {
INCREF(v);
return v;
}
}
return findmethod(xx_methods, (object *)xp, name);
}
static int
xx_setattr(xp, name, v)
xxobject *xp;
char *name;
object *v;
{
if (xp->x_attr == NULL) {
xp->x_attr = newdictobject();
if (xp->x_attr == NULL)
return errno;
}
if (v == NULL)
return dictremove(xp->x_attr, name);
else
return dictinsert(xp->x_attr, name, v);
}
static typeobject Xxtype = {
OB_HEAD_INIT(&Typetype)
0, /*ob_size*/
"xx", /*tp_name*/
sizeof(xxobject), /*tp_size*/
0, /*tp_itemsize*/
/* methods */
xx_dealloc, /*tp_dealloc*/
0, /*tp_print*/
xx_getattr, /*tp_getattr*/
xx_setattr, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
};
|