summaryrefslogtreecommitdiffstats
path: root/Objects/xxobject.c
blob: ffafcd71bdb86dc4982d5b9324c396a12c3a72b5 (plain)
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*/
};