~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_btree_serializer_c.pyx

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-04-08 22:50:22 UTC
  • mfrom: (4274.1.3 1.15-btree-intern)
  • Revision ID: pqm@pqm.ubuntu.com-20090408225022-exxekai8bxhxrayk
(jam) During BTreeIndex parsing, intern() the appropriate key bits.

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
 
33
33
    char *PyString_AsString(object p) except NULL
34
34
    object PyString_FromStringAndSize(char *, Py_ssize_t)
 
35
    PyObject *PyString_FromStringAndSize_ptr "PyString_FromStringAndSize" (char *, Py_ssize_t)
35
36
    int PyString_CheckExact(object s)
36
37
    int PyString_CheckExact_ptr "PyString_CheckExact" (PyObject *)
37
38
    Py_ssize_t PyString_Size(object p)
38
39
    Py_ssize_t PyString_GET_SIZE_ptr "PyString_GET_SIZE" (PyObject *)
39
40
    char * PyString_AS_STRING_ptr "PyString_AS_STRING" (PyObject *)
40
41
    int PyString_AsStringAndSize_ptr(PyObject *, char **buf, Py_ssize_t *len)
 
42
    void PyString_InternInPlace(PyObject **)
41
43
    int PyTuple_CheckExact(object t)
42
44
    Py_ssize_t PyTuple_GET_SIZE(object t)
43
45
    PyObject *PyTuple_GET_ITEM_ptr_object "PyTuple_GET_ITEM" (object tpl, int index)
 
46
    void Py_DECREF_ptr "Py_DECREF" (PyObject *)
44
47
 
45
48
cdef extern from "string.h":
46
49
    void *memcpy(void *dest, void *src, size_t n)
74
77
    return PyString_FromStringAndSize(s, size)
75
78
 
76
79
 
 
80
cdef object safe_interned_string_from_size(char *s, Py_ssize_t size):
 
81
    cdef PyObject *py_str
 
82
    if size < 0:
 
83
        raise AssertionError(
 
84
            'tried to create a string with an invalid size: %d @0x%x'
 
85
            % (size, <int>s))
 
86
    py_str = PyString_FromStringAndSize_ptr(s, size)
 
87
    PyString_InternInPlace(&py_str)
 
88
    result = <object>py_str
 
89
    # Casting a PyObject* to an <object> triggers an INCREF from Pyrex, so we
 
90
    # DECREF it to avoid geting immortal strings
 
91
    Py_DECREF_ptr(py_str)
 
92
    return result
 
93
 
 
94
 
77
95
cdef class BTreeLeafParser:
78
96
    """Parse the leaf nodes of a BTree index.
79
97
 
142
160
            # TODO: Consider using PyIntern_FromString, the only caveat is that
143
161
            # it assumes a NULL-terminated string, so we have to check if
144
162
            # temp_ptr[0] == c'\0' or some other char.
145
 
            key_element = safe_string_from_size(self._start,
146
 
                                                temp_ptr - self._start)
 
163
            key_element = safe_interned_string_from_size(self._start,
 
164
                                                         temp_ptr - self._start)
147
165
            # advance our pointer
148
166
            self._start = temp_ptr + 1
149
167
            PyList_Append(key_segments, key_element)