[Python-Dev] Re: [snake-farm] test test_slice failed -- [9, 7, 5, 3, 1] == [0]

Michael Hudson mwh@python.net
06 Nov 2002 13:56:54 +0000


Neal Norwitz <neal@metaslash.com> writes:

> On Wed, Nov 06, 2002 at 11:04:57AM +0000, Michael Hudson wrote:
> > 
> > So you suggest changing PySlice_GetIndicesEx(), right?
> 
> Yes.  But based on Guido's comments and some thinking,
> I don't think the API should change to longs.  Your
> solution below make sense, but didn't work.

Nuts.

> > I think the better idea is to call _PyEval_SliceIndex for the step
> > element of the slice too.  And maybe change the latter from
> > 
> >                 else if (x < -INT_MAX)
> >                         x = 0;
> > 
> > to
> > 
> >                 else if (x < -INT_MAX)
> >                         x = -INT_MAX;
> > 
> > Can you test this on a 64 bit platform or shall I just check it in?
> 
> Tested on SF compile farm (ssh to compile.sf.net), they have a very
> fast Alpha.
> 
> Here's the trimmed down diff:
> 
>         Index: Python/ceval.c (in _PyEval_SliceIndex)
>         @@ -3507,7 +3507,7 @@
>                         else if (x < -INT_MAX)
>         -                       x = 0;
>         +                       x = -INT_MAX;
>                         *pi = x;
> 
>         Index: Objects/sliceobject.c
>         @@ -119,7 +119,7 @@
>                 if (r->step == Py_None) {
>                         *step = 1;
>                 } else {
>         -               *step = PyInt_AsLong(r->step);
>         +               if (!_PyEval_SliceIndex(r->step, step)) return -1;
>                         if (*step == -1 && PyErr_Occurred()) {
>                                 return -1;
> 
> But this didn't produce the correct results:
> 
>         >>> range(10)[::sys.maxint-1]
>         []

Wierd.  Shall dig.

Nice how you get warnings from the system header files on that alpha
isn't it?

...

Works for me!

mwh@usf-cf-alpha-linux-1:~/python$ ./python 
Python 2.3a0 (#2, Nov  6 2002, 05:44:13) 
[GCC 2.95.4 20011002 (Debian prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> range(10)[::sys.maxint - 2]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'sys' is not defined
>>> import sys
>>> range(10)[::sys.maxint - 2]
[0]
>>> 

Try again?  Can you try playing with gdb to see what's going on?

Cheers,
M.

-- 
    -Dr. Olin Shivers,
     Ph.D., Cranberry-Melon School of Cucumber Science
                                           -- seen in comp.lang.scheme