[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