~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/compiled/dirstate_helpers.pyx

  • Committer: John Arbash Meinel
  • Date: 2007-05-04 18:59:36 UTC
  • mto: This revision was merged to the branch mainline in revision 2643.
  • Revision ID: john@arbash-meinel.com-20070504185936-1mjdoqmtz74xe5mg
A C implementation of _fields_to_entry_0_parents drops the time from 400ms to 330ms for a 21k-entry tree

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
    # GetItem returns a borrowed reference
30
30
    void *PyDict_GetItem(object p, object key)
31
31
    int PyDict_SetItem(object p, object key, object val) except -1
 
32
 
 
33
    int PyList_Append(object lst, object item) except -1
32
34
    void *PyList_GetItem_object_void "PyList_GET_ITEM" (object lst, int index)
33
 
    void *PyTuple_GetItem_void_void "PyTuple_GET_ITEM" (void* tpl, int index)
34
 
    object PyUnicode_Split_void_object "PyUnicode_Split" (void* str, )
 
35
    object PyList_GET_ITEM (object lst, int index)
35
36
    int PyList_CheckExact(object)
 
37
 
36
38
    int PyTuple_CheckExact(object)
 
39
    void *PyTuple_GetItem_void_void "PyTuple_GET_ITEM" (void* tpl, int index)
 
40
    object PyTuple_New(int)
 
41
    int PyTuple_SetItem(object tpl, int offset, object val)
 
42
    void PyTuple_SET_ITEM(object tpl, int offset, object val)
 
43
    object PyTuple_Pack(int n, ...)
37
44
 
38
45
    char *PyString_AsString(object p)
39
46
    char *PyString_AS_STRING_void "PyString_AS_STRING" (void *p)
44
51
    void Py_INCREF(object)
45
52
    void Py_DECREF(object)
46
53
 
 
54
 
 
55
cdef extern from "stdlib.h":
 
56
    unsigned long int strtoul(char *nptr, char **endptr, int base)
 
57
 
47
58
cdef extern from "string.h":
48
 
    int strncmp(char *s1, char *s2, size_t len)
49
 
    int strcmp(char *s1, char *s2)
50
59
    char *strchr(char *s1, char c)
51
60
 
52
61
 
182
191
    return _lo
183
192
 
184
193
 
 
194
cdef object _List_GetItem_Incref(object lst, int offset):
 
195
    """Get an item, and increment a reference to it.
 
196
 
 
197
    The caller must have checked that the object really is a list.
 
198
    """
 
199
    cdef object cur
 
200
    cur = PyList_GET_ITEM(lst, offset)
 
201
    Py_INCREF(cur)
 
202
    return cur
 
203
 
 
204
 
 
205
cdef object _fields_to_entry_0_parents(object fields):
 
206
    cdef object path_name_file_id_key
 
207
    cdef char *size_str
 
208
    cdef unsigned long int size
 
209
    cdef char* executable_str
 
210
    cdef object is_executable
 
211
    if not PyList_CheckExact(fields):
 
212
        raise TypeError('fields must be a list')
 
213
    path_name_file_id_key = (_List_GetItem_Incref(fields, 0),
 
214
                             _List_GetItem_Incref(fields, 1),
 
215
                             _List_GetItem_Incref(fields, 2),
 
216
                            )
 
217
 
 
218
    size_str = PyString_AS_STRING_void(
 
219
                PyList_GetItem_object_void(fields, 5))
 
220
    size = strtoul(size_str, NULL, 10)
 
221
    executable_str = PyString_AS_STRING_void(
 
222
                        PyList_GetItem_object_void(fields, 6))
 
223
    if executable_str[0] == c'y':
 
224
        is_executable = True
 
225
    else:
 
226
        is_executable = False
 
227
    return (path_name_file_id_key, [
 
228
        ( # Current tree
 
229
            _List_GetItem_Incref(fields, 3),# minikind
 
230
            _List_GetItem_Incref(fields, 4),# fingerprint
 
231
            size,                           # size
 
232
            is_executable,                  # executable
 
233
            _List_GetItem_Incref(fields, 7),# packed_stat or revision_id
 
234
        )])
 
235
 
 
236
 
185
237
def _c_read_dirblocks(state):
186
238
    """Read in the dirblocks for the given DirState object.
187
239
 
192
244
    :param state: A DirState object.
193
245
    :return: None
194
246
    """
 
247
    cdef int cur
195
248
    cdef int pos
196
249
    cdef int entry_size
197
250
    cdef int field_count
 
251
    cdef int num_present_parents
198
252
 
199
253
    state._state_file.seek(state._end_of_header)
200
254
    text = state._state_file.read()
276
330
            # append the entry to the current block
277
331
            append_entry(entry)
278
332
        state._split_root_dirblock_into_contents()
 
333
    elif num_present_parents == 0:
 
334
        entries = []
 
335
        pos = cur
 
336
        while pos < field_count:
 
337
            PyList_Append(entries,
 
338
                _fields_to_entry_0_parents(fields[pos:pos+entry_size]))
 
339
            pos = pos + entry_size
 
340
        state._entries_to_current_state(entries)
279
341
    else:
280
 
 
281
342
        fields_to_entry = state._get_fields_to_entry()
282
343
        entries = []
283
344
        entries_append = entries.append
284
345
        pos = cur
285
 
        entry_size = entry_size
286
346
        while pos < field_count:
287
347
            entries_append(fields_to_entry(fields[pos:pos+entry_size]))
288
348
            pos = pos + entry_size