[PATCH 1 of 7 V4] sparse-revlog: add a `index_get_start` function in C
Yuya Nishihara
yuya at tcha.org
Wed Nov 21 12:30:44 UTC 2018
On Tue, 20 Nov 2018 21:44:32 +0100, Boris Feld wrote:
> # HG changeset patch
> # User Boris Feld <boris.feld at octobus.net>
> # Date 1542725358 0
> # Tue Nov 20 14:49:18 2018 +0000
> # Node ID 60a55da39befa4996c1a88ca6f663765ea143ef2
> # Parent 337a389953366f059f2cb88129031ba3e67e0bbc
> # EXP-Topic sparse-perf
> # Available At https://bitbucket.org/octobus/mercurial-devel/
> # hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 60a55da39bef
> sparse-revlog: add a `index_get_start` function in C
> diff --git a/mercurial/cext/revlog.c b/mercurial/cext/revlog.c
> --- a/mercurial/cext/revlog.c
> +++ b/mercurial/cext/revlog.c
> @@ -185,6 +185,46 @@ static inline int index_get_parents(inde
> return 0;
> }
>
> +static inline int64_t index_get_start(indexObject *self, Py_ssize_t rev)
I meant "int index_get_start(*self, rev, *offset)" just like index_get_parents(),
but this is also good.
> +{
> + uint64_t offset;
> + if (rev >= self->length) {
> + PyObject *tuple;
> + PyObject *pylong;
> + unsigned PY_LONG_LONG tmp;
> + tuple = PyList_GET_ITEM(self->added, rev - self->length);
> + pylong = PyTuple_GET_ITEM(tuple, 0);
> +#ifndef IS_PY3K
> + if (PyInt_Check(pylong)) {
> + long tmp2 = PyInt_AsLong(pylong);
> + if (tmp2 < 0) {
> + return -1;
> + }
> + tmp = (unsigned PY_LONG_LONG)tmp2;
> + } else {
> +#endif
> + tmp = PyLong_AsUnsignedLongLong(pylong);
> + if (tmp == (unsigned PY_LONG_LONG) - 1) {
> + return -1;
> + }
> +
> +#ifndef IS_PY3K
> + }
> +#endif
> + offset = (uint64_t)tmp;
Sigh, PyLong API is so inconsistent on Python 2. Let's switch to
PyLong_AsLongLong(), which can handle PyInt as well. I think it's
okay to raise OverflowError if offset >= 1 << (63 - 16).
FWIW, PyLong_AsUnsignedLongLong() of Python 2 would raise BadInternalCall
if non-long type were passed.
More information about the Mercurial-devel
mailing list