17
17
"""Functionality for doing annotations in the 'optimal' way"""
19
from __future__ import absolute_import
22
19
cdef extern from "python-compat.h":
25
from cpython.dict cimport (
29
from cpython.list cimport (
37
from cpython.object cimport (
41
PyObject_RichCompareBool,
43
from cpython.ref cimport (
46
from cpython.tuple cimport (
54
22
cdef extern from "Python.h":
23
ctypedef int Py_ssize_t
24
ctypedef struct PyObject:
55
26
ctypedef struct PyListObject:
28
int PyList_CheckExact(object)
29
PyObject *PyList_GET_ITEM(object, Py_ssize_t o)
30
Py_ssize_t PyList_GET_SIZE(object)
31
int PyList_Append(object, object) except -1
32
int PyList_SetItem(object, Py_ssize_t o, object) except -1
33
int PyList_Sort(object) except -1
35
int PyTuple_CheckExact(object)
36
object PyTuple_New(Py_ssize_t len)
37
void PyTuple_SET_ITEM(object, Py_ssize_t pos, object)
58
38
void PyTuple_SET_ITEM_ptr "PyTuple_SET_ITEM" (object, Py_ssize_t,
40
int PyTuple_Resize(PyObject **, Py_ssize_t newlen)
41
PyObject *PyTuple_GET_ITEM(object, Py_ssize_t o)
42
Py_ssize_t PyTuple_GET_SIZE(object)
44
PyObject *PyDict_GetItem(object d, object k)
45
int PyDict_SetItem(object d, object k, object v) except -1
47
void Py_INCREF(object)
61
48
void Py_INCREF_ptr "Py_INCREF" (PyObject *)
62
49
void Py_DECREF_ptr "Py_DECREF" (PyObject *)
53
int PyObject_RichCompareBool(object, object, int opid) except -1
64
54
int PyObject_RichCompareBool_ptr "PyObject_RichCompareBool" (
65
55
PyObject *, PyObject *, int opid)
68
from . import _annotator_py
58
from bzrlib import _annotator_py
71
61
cdef int _check_annotations_are_lists(annotations,
111
101
"""Combine the annotations from both sides."""
112
102
cdef Py_ssize_t pos_one, pos_two, len_one, len_two
113
103
cdef Py_ssize_t out_pos
104
cdef PyObject *temp, *left, *right
118
106
if (PyObject_RichCompareBool(ann_one, ann_two, Py_LT)):
119
107
cache_key = (ann_one, ann_two)
180
168
matching_blocks defines the ranges that match.
182
170
cdef Py_ssize_t parent_idx, lines_idx, match_len, idx
183
cdef PyListObject *par_list
184
cdef PyListObject *ann_list
185
cdef PyObject **par_temp
186
cdef PyObject **ann_temp
171
cdef PyListObject *par_list, *ann_list
172
cdef PyObject **par_temp, **ann_temp
188
174
_check_annotations_are_lists(annotations, parent_annotations)
189
175
par_list = <PyListObject *>parent_annotations
190
176
ann_list = <PyListObject *>annotations
191
# For NEWS and breezy/builtins.py, over 99% of the lines are simply copied
177
# For NEWS and bzrlib/builtins.py, over 99% of the lines are simply copied
192
178
# across from the parent entry. So this routine is heavily optimized for
193
179
# that. Would be interesting if we could use memcpy() but we have to incref
208
194
matching_blocks, ann_cache) except -1:
209
195
cdef Py_ssize_t parent_idx, ann_idx, lines_idx, match_len, idx
210
196
cdef Py_ssize_t pos
211
cdef PyObject *ann_temp
212
cdef PyObject *par_temp
197
cdef PyObject *ann_temp, *par_temp
214
199
_check_annotations_are_lists(annotations, parent_annotations)