Rev 2: for some reason, using PyTuple_GETITEM causes bad failures (I thought it was a reference counting bug), in http://bzr.arbash-meinel.com/plugins/alt_readdir

John Arbash Meinel john at arbash-meinel.com
Wed Sep 5 22:04:59 BST 2007


At http://bzr.arbash-meinel.com/plugins/alt_readdir

------------------------------------------------------------
revno: 2
revision-id: john at arbash-meinel.com-20070905210415-6usr4qkz5jnt11h1
parent: john at arbash-meinel.com-20070905204017-uz7oxwz1ks2ps3gg
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: alt_readdir
timestamp: Wed 2007-09-05 16:04:15 -0500
message:
  for some reason, using PyTuple_GETITEM causes bad failures (I thought it was a reference counting bug),
  but it also didn't seem to improve performance at all.
  So I'm ignoring it for now.
modified:
  _alt_walkdirs.pyx              _alt_walkdirs.pyx-20070905203935-juyid0ic3vgs0l9j-3
-------------- next part --------------
=== modified file '_alt_walkdirs.pyx'
--- a/_alt_walkdirs.pyx	2007-09-05 20:40:17 +0000
+++ b/_alt_walkdirs.pyx	2007-09-05 21:04:15 +0000
@@ -22,17 +22,22 @@
 cdef extern from "Python.h":
     int PyList_Append(object lst, object item) except -1
     int PyList_Append_object_void "PyList_Append" (object lst, void *item) except -1
-    # This is the #defined version
+    int PyList_CheckExact(object)
     int PyList_GET_SIZE(object)
     void *PyList_GET_ITEM_object_void "PyList_GET_ITEM" (object, int)
     void *PyList_GET_ITEM_void_void "PyList_GET_ITEM" (void *, int)
 
+    int PyTuple_CheckExact(object)
     object PyTuple_GET_ITEM "PyTuple_GET_ITEM" (object, int)
     void *PyTuple_GET_ITEM_void_void "PyTuple_GET_ITEM" (void *, int)
 
+    int PyString_CheckExact(object)
     char *PyString_AS_STRING_void "PyString_AS_STRING" (void *p)
     int PyString_GET_SIZE_void "PyString_GET_SIZE" (void *p)
 
+    int Py_INCREF(object)
+    int Py_DECREF(object)
+
 cdef extern from "string.h":
     int strncmp(char *s1, char *s2, int len)
     void *memchr(void *s, int c, size_t len)
@@ -100,7 +105,11 @@
 
         # relroot = PyTuple_GET_ITEM(obj, 0)
         # top = PyTuple_GET_ITEM(obj, 4)
-        relroot, _, _, _, top = self._pending.pop()
+        obj = self._pending.pop()
+        if not PyTuple_CheckExact(obj):
+            raise TypeError('we expected a tuple, not %s: %r'
+                            % (type(obj), obj))
+        relroot, _, _, _, top = obj
 
         if relroot:
             relprefix = relroot + '/'
@@ -128,9 +137,8 @@
                 kind = 'socket'
             else:
                 kind = 'unknown'
-            #PyList_Append(dirblock,
-            #              (relprefix + name, name, kind, statvalue, abspath))
-            append((relprefix + name, name, kind, statvalue, abspath))
+            PyList_Append(dirblock,
+                          (relprefix + name, name, kind, statvalue, abspath))
 
         # push the user specified dirs from dirblock
         self._last_dirblock = dirblock



More information about the bazaar-commits mailing list