python/nondist/sandbox/set setobject.c, 1.7, 1.8 setobject.h, 1.2, 1.3

Update of /cvsroot/python/python/nondist/sandbox/set In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26909 Modified Files: setobject.c setobject.h Log Message: More cleanups. * Remove unnecessary typedefs and forward declarations. * Make the empty frozenset a singleton * Eliminate C++ style comments Index: setobject.c =================================================================== RCS file: /cvsroot/python/python/nondist/sandbox/set/setobject.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- setobject.c 30 Jul 2005 21:07:28 -0000 1.7 +++ setobject.c 30 Jul 2005 22:21:09 -0000 1.8 @@ -5,18 +5,11 @@ #include "Python.h" -typedef PySetEntry setentry; -typedef PySetObject setobject; - /* This must be >= 1. */ #define PERTURB_SHIFT 5 /* Object used as dummy key to fill deleted entries */ -static PyObject *dummy; /* Initialized by first call to newsetobject() */ - -/* forward declarations */ -static setentry * -set_lookkey_string(setobject *so, PyObject *key, long hash); +static PyObject *dummy; /* Initialized by first call to make_new_set() */ #define EMPTY_TO_MINSIZE(so) do { \ memset((so)->smalltable, 0, sizeof((so)->smalltable)); \ @@ -43,7 +36,7 @@ */ static setentry * -set_lookkey(setobject *so, PyObject *key, register long hash) +set_lookkey(PySetObject *so, PyObject *key, register long hash) { register int i; register unsigned int perturb; @@ -83,9 +76,7 @@ } else { /* The compare did major nasty stuff to the - * xx: start over. - * XXX A clever adversary could prevent this - * XXX from terminating. + * set: start over. */ ep = set_lookkey(so, key, hash); goto Done; @@ -125,9 +116,7 @@ } else { /* The compare did major nasty stuff to the - * xx: start over. - * XXX A clever adversary could prevent this - * XXX from terminating. + * set: start over. */ ep = set_lookkey(so, key, hash); break; @@ -154,7 +143,7 @@ * expensive, and sets with pure-string keys may be very common. */ static setentry * -set_lookkey_string(setobject *so, PyObject *key, register long hash) +set_lookkey_string(PySetObject *so, PyObject *key, register long hash) { register int i; register unsigned int perturb; @@ -206,10 +195,10 @@ Eats a reference to key. */ static void -set_insert_key(register setobject *so, PyObject *key, long hash) +set_insert_key(register PySetObject *so, PyObject *key, long hash) { register setentry *ep; - typedef PySetEntry *(*lookupfunc)(PySetObject *, PyObject *, long); + typedef setentry *(*lookupfunc)(PySetObject *, PyObject *, long); assert(so->lookup != NULL); @@ -222,10 +211,10 @@ so->used++; } else if (ep->key == dummy) { /* DUMMY */ - Py_DECREF(dummy); ep->key = key; ep->hash = hash; so->used++; + Py_DECREF(dummy); } else { /* ACTIVE */ Py_DECREF(key); @@ -238,7 +227,7 @@ actually be smaller than the old one. */ static int -set_table_resize(setobject *so, int minused) +set_table_resize(PySetObject *so, int minused) { int newsize; setentry *oldtable, *newtable, *ep; @@ -303,15 +292,15 @@ dummy entries aren't copied over, of course */ for (ep = oldtable; i > 0; ep++) { if (ep->key == NULL) { - // UNUSED + /* UNUSED */ ; } else if (ep->key == dummy) { - // DUMMY + /* DUMMY */ --i; assert(ep->key == dummy); Py_DECREF(ep->key); } else { - // ACTIVE + /* ACTIVE */ --i; set_insert_key(so, ep->key, ep->hash); } @@ -350,8 +339,8 @@ return set_table_resize(so, so->used*(so->used>50000 ? 2 : 4)); } -#define DISCARD_FOUND 0 -#define DISCARD_NOTFOUND 1 +#define DISCARD_NOTFOUND 0 +#define DISCARD_FOUND 1 static int set_discard_internal(PySetObject *so, PyObject *key) @@ -490,7 +479,7 @@ assert (PyAnySet_Check(so)); assert (PyAnySet_Check(b)); - other = (setobject*)b; + other = (PySetObject*)b; if (other == so || other->used == 0) /* a.update(a) or a.update({}); nothing to do */ return 0; @@ -529,20 +518,19 @@ } static PyTypeObject PySetIter_Type; /* Forward */ -static PyObject *set_iter(setobject *); /* Set iterator types */ typedef struct { PyObject_HEAD - setobject *si_set; /* Set to NULL when iterator is exhausted */ + PySetObject *si_set; /* Set to NULL when iterator is exhausted */ int si_used; int si_pos; long len; } setiterobject; static PyObject * -set_iter(setobject *so) +set_iter(PySetObject *so) { setiterobject *si = PyObject_New(setiterobject, &PySetIter_Type); if (si == NULL) @@ -580,7 +568,7 @@ PyObject *key; register int i, mask; register setentry *ep; - setobject *d = si->si_set; + PySetObject *d = si->si_set; if (d == NULL) return NULL; @@ -646,7 +634,7 @@ (iternextfunc)setiter_iternextkey, /* tp_iternext */ }; -/***** Derived functions (table accesses only done thru above primitives *****/ +/***** Derived functions (table accesses only done with above primitives *****/ #include "structmember.h" @@ -739,10 +727,19 @@ frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *iterable = NULL; + static PyObject *emptyfrozenset = NULL; if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable)) return NULL; - if (iterable != NULL && PyFrozenSet_CheckExact(iterable)) { + if (iterable == NULL) { + if (type == &PyFrozenSet_Type) { + if (emptyfrozenset == NULL) + emptyfrozenset = make_new_set(type, NULL); + else + Py_INCREF(emptyfrozenset); + return emptyfrozenset; + } + } else if (PyFrozenSet_CheckExact(iterable)) { Py_INCREF(iterable); return iterable; } @@ -800,9 +797,9 @@ set_swap_bodies(PySetObject *a, PySetObject *b) { int t; - PySetEntry *u; - PySetEntry *(*f)(PySetObject *so, PyObject *key, long hash); - PySetEntry tab[PySet_MINSIZE]; + setentry *u; + setentry *(*f)(PySetObject *so, PyObject *key, long hash); + setentry tab[PySet_MINSIZE]; long h; t = a->fill; a->fill = b->fill; b->fill = t; Index: setobject.h =================================================================== RCS file: /cvsroot/python/python/nondist/sandbox/set/setobject.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- setobject.h 30 Jul 2005 21:07:28 -0000 1.2 +++ setobject.h 30 Jul 2005 22:21:10 -0000 1.3 @@ -20,7 +20,7 @@ typedef struct { long hash; /* cached hash code for the entry key */ PyObject *key; -} PySetEntry; +} setentry; /* @@ -45,9 +45,9 @@ * saves repeated runtime null-tests in the workhorse getitem and * setitem calls. */ - PySetEntry *table; - PySetEntry *(*lookup)(PySetObject *so, PyObject *key, long hash); - PySetEntry smalltable[PySet_MINSIZE]; + setentry *table; + setentry *(*lookup)(PySetObject *so, PyObject *key, long hash); + setentry smalltable[PySet_MINSIZE]; long hash; /* only used by frozenset objects */ PyObject *weakreflist; /* List of weak references */
participants (1)
-
rhettingerīŧ users.sourceforge.net