~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_static_tuple_interned_pyx.pyx

Move some of the information into the pxd header file.

This will make it easier to directly use attributes of the class in other modules.
(More of a case for StaticTuple than StaticTupleInterner, but I figured I'd get
practice using it.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 
19
19
cdef extern from "Python.h":
20
20
    ctypedef unsigned long size_t
21
 
    ctypedef struct PyTypeObject
22
 
    ctypedef struct PyObject:
23
 
        PyTypeObject *ob_type
24
21
    ctypedef long (*hashfunc)(PyObject*)
25
22
    ctypedef PyObject *(*richcmpfunc)(PyObject *, PyObject *, int)
26
23
    int Py_EQ
31
28
    ctypedef struct PyTypeObject:
32
29
        hashfunc tp_hash
33
30
        richcmpfunc tp_richcompare
 
31
 
 
32
    PyTypeObject *Py_TYPE(PyObject *)
34
33
        
35
34
    void *PyMem_Malloc(size_t nbytes)
36
35
    void PyMem_Free(void *)
37
36
    void memset(void *, int, size_t)
38
37
 
39
 
 
40
38
cdef object _dummy_obj
41
39
cdef PyObject *_dummy
42
40
_dummy_obj = object()
49
47
 
50
48
    if this == other:
51
49
        return 1
52
 
    other_hash = other.ob_type.tp_hash(other)
 
50
    other_hash = Py_TYPE(other).tp_hash(other)
53
51
    if other_hash != this_hash:
54
52
        return 0
55
 
    res = this.ob_type.tp_richcompare(this, other, Py_EQ)
 
53
    res = Py_TYPE(this).tp_richcompare(this, other, Py_EQ)
56
54
    if res == Py_True:
57
55
        Py_DECREF(res)
58
56
        return 1
62
60
    # required, and Py_NotImplemented => not equal
63
61
    if res == Py_NotImplemented:
64
62
        Py_DECREF(res)
65
 
        res = other.ob_type.tp_richcompare(other, this, Py_EQ)
 
63
        res = Py_TYPE(other).tp_richcompare(other, this, Py_EQ)
66
64
    if res == Py_True:
67
65
        Py_DECREF(res)
68
66
        return 1
85
83
    As such, it uses 1/3rd the amount of memory to store a pointer to the
86
84
    interned object.
87
85
    """
88
 
 
89
 
    cdef readonly Py_ssize_t used    # active
90
 
    cdef readonly Py_ssize_t fill    # active + dummy
91
 
    cdef readonly Py_ssize_t mask    # Table contains (mask+1) slots, a power
92
 
                                     # of 2
93
 
    cdef PyObject **table   # Pyrex/Cython doesn't support arrays to 'object'
94
 
                            # so we manage it manually
95
 
 
 
86
    # Attributes are defined in the .pxd file
96
87
    DEF DEFAULT_SIZE=1024
97
88
    DEF PERTURB_SHIFT=5
98
89
 
141
132
            return False
142
133
        return True
143
134
 
144
 
    cdef PyObject *_get(self, object key):
 
135
    cdef PyObject *_get(self, object key) except? NULL:
145
136
        """Return the object (or nothing) define at the given location."""
146
137
        cdef PyObject **slot
147
138