13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
# cython: language_level=3
19
17
"""Functionality for doing annotations in the 'optimal' way"""
19
from __future__ import absolute_import
22
22
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
25
cdef extern from "Python.h":
26
ctypedef int Py_ssize_t
27
ctypedef struct PyObject:
55
29
ctypedef struct PyListObject:
31
int PyList_CheckExact(object)
32
PyObject *PyList_GET_ITEM(object, Py_ssize_t o)
33
Py_ssize_t PyList_GET_SIZE(object)
34
int PyList_Append(object, object) except -1
35
int PyList_SetItem(object, Py_ssize_t o, object) except -1
36
int PyList_Sort(object) except -1
38
int PyTuple_CheckExact(object)
39
object PyTuple_New(Py_ssize_t len)
40
void PyTuple_SET_ITEM(object, Py_ssize_t pos, object)
58
41
void PyTuple_SET_ITEM_ptr "PyTuple_SET_ITEM" (object, Py_ssize_t,
43
int PyTuple_Resize(PyObject **, Py_ssize_t newlen)
44
PyObject *PyTuple_GET_ITEM(object, Py_ssize_t o)
45
Py_ssize_t PyTuple_GET_SIZE(object)
47
PyObject *PyDict_GetItem(object d, object k)
48
int PyDict_SetItem(object d, object k, object v) except -1
50
void Py_INCREF(object)
61
51
void Py_INCREF_ptr "Py_INCREF" (PyObject *)
62
52
void Py_DECREF_ptr "Py_DECREF" (PyObject *)
56
int PyObject_RichCompareBool(object, object, int opid) except -1
64
57
int PyObject_RichCompareBool_ptr "PyObject_RichCompareBool" (
65
58
PyObject *, PyObject *, int opid)
111
104
"""Combine the annotations from both sides."""
112
105
cdef Py_ssize_t pos_one, pos_two, len_one, len_two
113
106
cdef Py_ssize_t out_pos
107
cdef PyObject *temp, *left, *right
118
109
if (PyObject_RichCompareBool(ann_one, ann_two, Py_LT)):
119
110
cache_key = (ann_one, ann_two)
180
171
matching_blocks defines the ranges that match.
182
173
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
174
cdef PyListObject *par_list, *ann_list
175
cdef PyObject **par_temp, **ann_temp
188
177
_check_annotations_are_lists(annotations, parent_annotations)
189
178
par_list = <PyListObject *>parent_annotations
208
197
matching_blocks, ann_cache) except -1:
209
198
cdef Py_ssize_t parent_idx, ann_idx, lines_idx, match_len, idx
210
199
cdef Py_ssize_t pos
211
cdef PyObject *ann_temp
212
cdef PyObject *par_temp
200
cdef PyObject *ann_temp, *par_temp
214
202
_check_annotations_are_lists(annotations, parent_annotations)