Three months ago we discussed about an issue with PySlice_GetIndicesEx().
(https://mail.python.org/pipermail/python-dev/2016-August/145901.html)

The problem was that PySlice_GetIndicesEx() takes the size of the sequence, but the size of the sequence can be changed when call custom __index__() methods inside PySlice_GetIndicesEx().

The solution is to split PySlice_GetIndicesEx() into two functions: one function convert Python objects to C integers by calling __index__() methods, other function takes the size of the sequence and adjusts indices, it is atomic from Python view.

The code

    if (PySlice_GetIndicesEx(item, length,
            &start, &stop, &step, &slicelength) < 0)
        return -1;

should be replaced with

    if (foo(item, &start, &stop, &step) < 0)
        return -1;
    slicelength = bar(&start, &stop, step, length);

PySlice_GetIndicesEx() can be converted to a macro calling these two functions. It would be enough just recompile an extension to make it invulnerable to the original bug.

But there is a problem. New functions should be added to stable ABI. This means that we should design names and signatures of these functions even if don't make them a part of public API.

Let's start bikeshedding. What are your ideas about names and the order of arguments of two following functions?

1. Takes a slice object, returns it's start, stop and step as Py_ssize_t values. Can fail.

2. Takes slice's start, stop, step, and the length of the sequence (all are Py_ssize_t), returns adjusted start, stop, and the length of sliced subsequence (as Py_ssize_t). Always success.

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to