~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_readdir_pyx.pyx

Just embed a struct st in the python result object, avoids converting things we don't need converted, and copying values around always.

Show diffs side-by-side

added added

removed removed

Lines of Context:
107
107
cdef class _Stat:
108
108
    """Represent a 'stat' result."""
109
109
 
110
 
    cdef readonly int st_mode
111
 
    # nanosecond time definitions use MACROS, due to an "interesting" glibc
112
 
    # design decision. The result is that we cannot have a C symbol of st_*time.
113
 
    cdef readonly time_t _ctime
114
 
    cdef readonly time_t _mtime
115
 
    cdef readonly int st_size
116
 
 
117
 
    cdef readonly int st_dev
118
 
    cdef readonly int st_ino
 
110
    cdef stat _st
 
111
 
 
112
    property st_dev:
 
113
        def __get__(self):
 
114
            return self._st.st_dev
 
115
 
 
116
    property st_ino:
 
117
        def __get__(self):
 
118
            return self._st.st_ino
 
119
 
 
120
    property st_mode:
 
121
        def __get__(self):
 
122
            return self._st.st_mode
 
123
 
 
124
    property st_ctime:
 
125
        def __get__(self):
 
126
            return self._st.st_ctime
119
127
 
120
128
    property st_mtime:
121
129
        def __get__(self):
122
 
            return self._mtime
 
130
            return self._st.st_mtime
123
131
 
124
 
    property st_ctime:
 
132
    property st_size:
125
133
        def __get__(self):
126
 
            return self._ctime
 
134
            return self._st.st_size
127
135
 
128
136
    def __repr__(self):
129
137
        """Repr is the same as a Stat object.
258
266
    cdef dirent sentinel
259
267
    cdef char *name
260
268
    cdef int stat_result
261
 
    cdef stat st
262
269
    cdef _Stat statvalue
263
270
    cdef char *cwd
264
271
 
292
299
                (name[1] == 0) or 
293
300
                (name[1] == c"." and name[2] == 0))
294
301
                ):
295
 
                stat_result = lstat(entry.d_name, &st)
 
302
                statvalue = _Stat()
 
303
                stat_result = lstat(entry.d_name, &statvalue._st)
296
304
                if stat_result != 0:
297
305
                    if errno != ENOENT:
298
306
                        raise OSError(errno, strerror(errno))
299
307
                    else:
300
308
                        kind = _missing
301
309
                        statvalue = None
302
 
                else:
303
 
                    statvalue = _Stat()
304
 
                    statvalue.st_mode = st.st_mode
305
 
                    statvalue._ctime = st.st_ctime
306
 
                    statvalue._mtime = st.st_mtime
307
 
                    statvalue.st_size = st.st_size
308
 
                    statvalue.st_ino = st.st_ino
309
 
                    statvalue.st_dev = st.st_dev
310
310
                # We append a 5-tuple that can be modified in-place by the C
311
311
                # api:
312
312
                # inode to sort on (to replace with top_path)