[Python-checkins] python/nondist/sandbox/set setobject.c, 1.7, 1.8 setobject.h, 1.2, 1.3

rhettinger@users.sourceforge.net rhettinger at users.sourceforge.net
Sun Jul 31 00:21:12 CEST 2005


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 */



More information about the Python-checkins mailing list