17
17
"""Functionality for doing annotations in the 'optimal' way"""
19
from __future__ import absolute_import
22
20
cdef extern from "python-compat.h":
23
from cpython.dict cimport (
27
from cpython.list cimport (
35
from cpython.object cimport (
39
PyObject_RichCompareBool,
41
from cpython.ref cimport (
44
from cpython.tuple cimport (
25
52
cdef extern from "Python.h":
26
ctypedef int Py_ssize_t
27
ctypedef struct PyObject:
29
53
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)
41
56
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)
51
59
void Py_INCREF_ptr "Py_INCREF" (PyObject *)
52
60
void Py_DECREF_ptr "Py_DECREF" (PyObject *)
56
int PyObject_RichCompareBool(object, object, int opid) except -1
57
62
int PyObject_RichCompareBool_ptr "PyObject_RichCompareBool" (
58
63
PyObject *, PyObject *, int opid)
104
109
"""Combine the annotations from both sides."""
105
110
cdef Py_ssize_t pos_one, pos_two, len_one, len_two
106
111
cdef Py_ssize_t out_pos
107
cdef PyObject *temp, *left, *right
109
116
if (PyObject_RichCompareBool(ann_one, ann_two, Py_LT)):
110
117
cache_key = (ann_one, ann_two)
171
178
matching_blocks defines the ranges that match.
173
180
cdef Py_ssize_t parent_idx, lines_idx, match_len, idx
174
cdef PyListObject *par_list, *ann_list
175
cdef PyObject **par_temp, **ann_temp
181
cdef PyListObject *par_list
182
cdef PyListObject *ann_list
183
cdef PyObject **par_temp
184
cdef PyObject **ann_temp
177
186
_check_annotations_are_lists(annotations, parent_annotations)
178
187
par_list = <PyListObject *>parent_annotations
197
206
matching_blocks, ann_cache) except -1:
198
207
cdef Py_ssize_t parent_idx, ann_idx, lines_idx, match_len, idx
199
208
cdef Py_ssize_t pos
200
cdef PyObject *ann_temp, *par_temp
209
cdef PyObject *ann_temp
210
cdef PyObject *par_temp
202
212
_check_annotations_are_lists(annotations, parent_annotations)