[Zodb-checkins] CVS: Zope/lib/python/BTrees - BTreeTemplate.c:1.69 BucketTemplate.c:1.46 Maintainer.txt:1.13 _fsBTree.c:1.4 intkeymacros.h:1.10 intvaluemacros.h:1.8 objectkeymacros.h:1.4 objectvaluemacros.h:1.4

Tim Peters tim.one@comcast.net
Wed, 26 Jun 2002 20:32:55 -0400


Update of /cvs-repository/Zope/lib/python/BTrees
In directory cvs.zope.org:/tmp/cvs-serv27009

Modified Files:
	BTreeTemplate.c BucketTemplate.c Maintainer.txt _fsBTree.c 
	intkeymacros.h intvaluemacros.h objectkeymacros.h 
	objectvaluemacros.h 
Log Message:
Backported the BTree KEY_TYPE_IS_PYOBJECT and VALUE_TYPE_IS_PYOBJECT
macros from Zope3.  These allow converting some runtime tests into
compile-time specialization, and that's going to be more important for
work on speeding "lopsided merges".


=== Zope/lib/python/BTrees/BTreeTemplate.c 1.68 => 1.69 ===
 
         for (i = 1; i < len; i++) {
+#ifdef KEY_TYPE_IS_PYOBJECT
 	    DECREF_KEY(self->data[i].key);
+#endif
             Py_DECREF(self->data[i].child);
         }
 	free(self->data);


=== Zope/lib/python/BTrees/BucketTemplate.c 1.45 => 1.46 ===
 _bucket_clear(Bucket *self)
 {
-  int i;
+    const int len = self->len;
+    /* Don't declare i at this level.  If neither keys nor values are
+     * PyObject*, i won't be referenced, and you'll get a nuisance compiler
+     * wng for declaring it here.
+     */
+    self->len = self->size = 0;
 
-  if (self->next)
-    {
-      Py_DECREF(self->next);
-      self->next=0;
+    if (self->next) {
+        Py_DECREF(self->next);
+        self->next = NULL;
     }
 
-  for (i=self->len; --i >= 0; )
-    {
-      DECREF_KEY(self->keys[i]);
-      if (self->values)
-        {
-          DECREF_VALUE(self->values[i]);
-        }
-    }
-  self->len=0;
-  if (self->values)
-    {
-      free(self->values);
-      self->values=0;
-    }
-  if (self->keys)
-    {
-      free(self->keys);
-      self->keys=0;
+    /* Silence compiler warning about unused variable len for the case
+       when neither key nor value is an object, i.e. II. */
+    (void)len;
+
+    if (self->keys) {
+#ifdef KEY_TYPE_IS_PYOBJECT
+        int i;
+        for (i = 0; i < len; ++i)
+            DECREF_KEY(self->keys[i]);
+#endif
+        free(self->keys);
+        self->keys = NULL;
     }
-  self->size=0;
 
-  return 0;
+    if (self->values) {
+#ifdef VALUE_TYPE_IS_PYOBJECT
+        int i;
+        for (i = 0; i < len; ++i)
+            DECREF_VALUE(self->values[i]);
+#endif
+        free(self->values);
+        self->values = NULL;
+    }
+    return 0;
 }
 
 #ifdef PERSISTENT


=== Zope/lib/python/BTrees/Maintainer.txt 1.12 => 1.13 ===
 The C type declaration for keys (e.g., int or PyObject*).
 
+KEY_TYPE_IS_PYOBJECT
+Define if KEY_TYPE is a PyObject*, else undef.
+
 KEY_CHECK(K)
 Tests whether the PyObject* K can be converted to the (C) key type
 (KEY_TYPE).  The macro should return a boolean (zero for false,
@@ -83,6 +86,9 @@
 
 VALUE_TYPE
 The C type declaration for values (e.g., int or PyObject*).
+
+VALUE_TYPE_IS_PYOBJECT
+Define if VALUE_TYPE is a PyObject*, else undef.
 
 TEST_VALUE(X, Y)
 Like Python's cmp().  Compares X to Y, where X & Y are C values of


=== Zope/lib/python/BTrees/_fsBTree.c 1.3 => 1.4 ===
 #define KEYMACROS_H "$Id$\n"
 #define KEY_TYPE char2
+#undef KEY_TYPE_IS_PYOBJECT
 #define KEY_CHECK(K) (PyString_Check(K) && PyString_GET_SIZE(K)==2)
 #define TEST_KEY_SET_OR(V, K, T) if ( ( (V) = ((*(K) < *(T) || (*(K) == *(T) && (K)[1] < (T)[1])) ? -1 : ((*(K) == *(T) && (K)[1] == (T)[1]) ? 0 : 1)) ), 0 )
 #define DECREF_KEY(KEY)
@@ -42,6 +43,7 @@
 /*#include "intvaluemacros.h"*/
 #define VALUEMACROS_H "$Id$\n"
 #define VALUE_TYPE char6
+#undef VALUE_TYPE_IS_PYOBJECT
 #define TEST_VALUE(K, T) strncmp(K,T,6)
 #define DECLARE_VALUE(NAME) VALUE_TYPE NAME
 #define DECREF_VALUE(k)


=== Zope/lib/python/BTrees/intkeymacros.h 1.9 => 1.10 ===
 
 #define KEY_TYPE int
+#undef KEY_TYPE_IS_PYOBJECT
 #define KEY_CHECK PyInt_Check
 #define TEST_KEY_SET_OR(V, K, T) if ( ( (V) = (((K) < (T)) ? -1 : (((K) > (T)) ? 1: 0)) ) , 0 )
 #define DECREF_KEY(KEY)


=== Zope/lib/python/BTrees/intvaluemacros.h 1.7 => 1.8 ===
 
 #define VALUE_TYPE int
+#undef VALUE_TYPE_IS_PYOBJECT
 #define TEST_VALUE(K, T) (((K) < (T)) ? -1 : (((K) > (T)) ? 1: 0)) 
 #define VALUE_SAME(VALUE, TARGET) ( (VALUE) == (TARGET) )
 #define DECLARE_VALUE(NAME) VALUE_TYPE NAME


=== Zope/lib/python/BTrees/objectkeymacros.h 1.3 => 1.4 ===
 #define KEY_TYPE PyObject *
+#define KEY_TYPE_IS_PYOBJECT
 #define TEST_KEY_SET_OR(V, KEY, TARGET) if ( ( (V) = PyObject_Compare((KEY),(TARGET)) ), PyErr_Occurred() )
 #define INCREF_KEY(k) Py_INCREF(k)
 #define DECREF_KEY(KEY) Py_DECREF(KEY)


=== Zope/lib/python/BTrees/objectvaluemacros.h 1.3 => 1.4 ===
 
 #define VALUE_TYPE PyObject *
+#define VALUE_TYPE_IS_PYOBJECT
 #define TEST_VALUE(VALUE, TARGET) PyObject_Compare((VALUE),(TARGET))
 #define DECLARE_VALUE(NAME) VALUE_TYPE NAME
 #define INCREF_VALUE(k) Py_INCREF(k)