0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

updated for version 7.4.151

Problem:    Python: slices with steps are not supported.
Solution:   Support slices in Python vim.List. (ZyX)
This commit is contained in:
Bram Moolenaar
2014-01-14 16:36:51 +01:00
parent 14177b77bf
commit 063a46ba77
10 changed files with 617 additions and 268 deletions

View File

@@ -97,6 +97,9 @@
#define Py_ssize_t_fmt "n"
#define Py_bytes_fmt "y"
#define PyIntArgFunc ssizeargfunc
#define PyIntObjArgProc ssizeobjargproc
#if defined(DYNAMIC_PYTHON3) || defined(PROTO)
# ifndef WIN3264
@@ -292,7 +295,8 @@ static PyObject* (*py3_PyTuple_GetItem)(PyObject *, Py_ssize_t);
static int (*py3_PyMapping_Check)(PyObject *);
static PyObject* (*py3_PyMapping_Keys)(PyObject *);
static int (*py3_PySlice_GetIndicesEx)(PyObject *r, Py_ssize_t length,
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength);
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step,
Py_ssize_t *slicelen);
static PyObject* (*py3_PyErr_NoMemory)(void);
static void (*py3_Py_Finalize)(void);
static void (*py3_PyErr_SetString)(PyObject *, const char *);
@@ -1478,76 +1482,6 @@ DictionarySetattro(PyObject *self, PyObject *nameobj, PyObject *val)
/* List object - Definitions
*/
static PySequenceMethods ListAsSeq = {
(lenfunc) ListLength, /* sq_length, len(x) */
(binaryfunc) 0, /* RangeConcat, sq_concat, x+y */
(ssizeargfunc) 0, /* RangeRepeat, sq_repeat, x*n */
(ssizeargfunc) ListItem, /* sq_item, x[i] */
(void *) 0, /* was_sq_slice, x[i:j] */
(ssizeobjargproc) ListAssItem, /* sq_as_item, x[i]=v */
(void *) 0, /* was_sq_ass_slice, x[i:j]=v */
0, /* sq_contains */
(binaryfunc) ListConcatInPlace,/* sq_inplace_concat */
0, /* sq_inplace_repeat */
};
static PyObject *ListSubscript(PyObject *, PyObject *);
static Py_ssize_t ListAsSubscript(PyObject *, PyObject *, PyObject *);
static PyMappingMethods ListAsMapping = {
/* mp_length */ (lenfunc) ListLength,
/* mp_subscript */ (binaryfunc) ListSubscript,
/* mp_ass_subscript */ (objobjargproc) ListAsSubscript,
};
static PyObject *
ListSubscript(PyObject *self, PyObject* idx)
{
if (PyLong_Check(idx))
{
long _idx = PyLong_AsLong(idx);
return ListItem((ListObject *)(self), _idx);
}
else if (PySlice_Check(idx))
{
Py_ssize_t start, stop, step, slicelen;
if (PySlice_GetIndicesEx(idx, ListLength((ListObject *)(self)),
&start, &stop, &step, &slicelen) < 0)
return NULL;
return ListSlice((ListObject *)(self), start, stop);
}
else
{
RAISE_INVALID_INDEX_TYPE(idx);
return NULL;
}
}
static Py_ssize_t
ListAsSubscript(PyObject *self, PyObject *idx, PyObject *obj)
{
if (PyLong_Check(idx))
{
long _idx = PyLong_AsLong(idx);
return ListAssItem((ListObject *)(self), _idx, obj);
}
else if (PySlice_Check(idx))
{
Py_ssize_t start, stop, step, slicelen;
if (PySlice_GetIndicesEx(idx, ListLength((ListObject *)(self)),
&start, &stop, &step, &slicelen) < 0)
return -1;
return ListAssSlice((ListObject *)(self), start, stop, obj);
}
else
{
RAISE_INVALID_INDEX_TYPE(idx);
return -1;
}
}
static PyObject *
ListGetattro(PyObject *self, PyObject *nameobj)
{