Commit 7a0e8bc2 authored by Jim Fulton's avatar Jim Fulton

Updated documentation to:

- point out the importance of reassigning data members before
  assigning thier values

- correct my missconception about return values from visitprocs. Sigh.

- mention the labor saving Py_VISIT and Py_CLEAR macros.
parent a643b658
This diff is collapsed.
...@@ -46,7 +46,7 @@ Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ...@@ -46,7 +46,7 @@ Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static int static int
Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
{ {
PyObject *first=NULL, *last=NULL; PyObject *first=NULL, *last=NULL, *tmp;
static char *kwlist[] = {"first", "last", "number", NULL}; static char *kwlist[] = {"first", "last", "number", NULL};
...@@ -56,15 +56,17 @@ Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) ...@@ -56,15 +56,17 @@ Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
return -1; return -1;
if (first) { if (first) {
Py_XDECREF(self->first); tmp = self->first;
Py_INCREF(first); Py_INCREF(first);
self->first = first; self->first = first;
Py_XDECREF(tmp);
} }
if (last) { if (last) {
Py_XDECREF(self->last); tmp = self->last;
Py_INCREF(last); Py_INCREF(last);
self->last = last; self->last = last;
Py_XDECREF(tmp);
} }
return 0; return 0;
......
...@@ -46,25 +46,27 @@ Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ...@@ -46,25 +46,27 @@ Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static int static int
Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
{ {
PyObject *first=NULL, *last=NULL; PyObject *first=NULL, *last=NULL, *tmp;
static char *kwlist[] = {"first", "last", "number", NULL}; static char *kwlist[] = {"first", "last", "number", NULL};
if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist, if (! PyArg_ParseTupleAndKeywords(args, kwds, "|SSi", kwlist,
&first, &last, &first, &last,
&self->number)) &self->number))
return -1; return -1;
if (first) { if (first) {
Py_DECREF(self->first); tmp = self->first;
Py_INCREF(first); Py_INCREF(first);
self->first = first; self->first = first;
Py_DECREF(tmp);
} }
if (last) { if (last) {
Py_DECREF(self->last); tmp = self->last;
Py_INCREF(last); Py_INCREF(last);
self->last = last; self->last = last;
Py_DECREF(tmp);
} }
return 0; return 0;
......
...@@ -11,10 +11,18 @@ typedef struct { ...@@ -11,10 +11,18 @@ typedef struct {
static int static int
Noddy_traverse(Noddy *self, visitproc visit, void *arg) Noddy_traverse(Noddy *self, visitproc visit, void *arg)
{ {
if (self->first && visit(self->first, arg) < 0) int vret;
return -1;
if (self->last && visit(self->last, arg) < 0) if (self->first) {
return -1; vret = visit(self->first, arg);
if (vret != 0)
return vret;
}
if (self->last) {
vret = visit(self->last, arg);
if (vret != 0)
return vret;
}
return 0; return 0;
} }
...@@ -22,10 +30,15 @@ Noddy_traverse(Noddy *self, visitproc visit, void *arg) ...@@ -22,10 +30,15 @@ Noddy_traverse(Noddy *self, visitproc visit, void *arg)
static int static int
Noddy_clear(Noddy *self) Noddy_clear(Noddy *self)
{ {
Py_XDECREF(self->first); PyObject *tmp;
tmp = self->first;
self->first = NULL; self->first = NULL;
Py_XDECREF(self->last); Py_XDECREF(tmp);
tmp = self->last;
self->last = NULL; self->last = NULL;
Py_XDECREF(tmp);
return 0; return 0;
} }
...@@ -67,7 +80,7 @@ Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ...@@ -67,7 +80,7 @@ Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static int static int
Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
{ {
PyObject *first=NULL, *last=NULL; PyObject *first=NULL, *last=NULL, *tmp;
static char *kwlist[] = {"first", "last", "number", NULL}; static char *kwlist[] = {"first", "last", "number", NULL};
...@@ -77,15 +90,17 @@ Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) ...@@ -77,15 +90,17 @@ Noddy_init(Noddy *self, PyObject *args, PyObject *kwds)
return -1; return -1;
if (first) { if (first) {
Py_XDECREF(self->first); tmp = self->first;
Py_INCREF(first); Py_INCREF(first);
self->first = first; self->first = first;
Py_XDECREF(tmp);
} }
if (last) { if (last) {
Py_XDECREF(self->last); tmp = self->last;
Py_INCREF(last); Py_INCREF(last);
self->last = last; self->last = last;
Py_XDECREF(tmp);
} }
return 0; return 0;
......
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