[Python-checkins] r51494 - python/branches/p3yk-noslice/Objects/stringobject.c python/branches/p3yk-noslice/Objects/tupleobject.c python/branches/p3yk-noslice/Objects/unicodeobject.c

Jim Jewett jimjjewett at gmail.com
Wed Aug 23 15:01:21 CEST 2006


(1)  I would personally prefer

if (step == 1) {
    if (start == 0 && ...) {}
    else {}
}

I realize that the compiler can do this, but I like flagging "this is
an odd special case"

(2)  Why the CheckExact?  Is there a promise (even in py3K) that
constructors won't return a subclass?  I had thought that the question
was only when/if to *guarantee* that the subclass would be used.  If
the intent is to guard against subclasses with a different internal
layout, then it should come before the GET_SIZE macros.

-jJ

On 8/22/06, thomas.wouters <python-checkins at python.org> wrote:
> Author: thomas.wouters
> Date: Wed Aug 23 00:37:35 2006
> New Revision: 51494
>
> Modified:
>    python/branches/p3yk-noslice/Objects/stringobject.c
>    python/branches/p3yk-noslice/Objects/tupleobject.c
>    python/branches/p3yk-noslice/Objects/unicodeobject.c
> Log:
>
> Copy some of the special cases from normal slicing to extended slicing, for
> general speedup.
>
>
>
> Modified: python/branches/p3yk-noslice/Objects/stringobject.c
> ==============================================================================
> --- python/branches/p3yk-noslice/Objects/stringobject.c (original)
> +++ python/branches/p3yk-noslice/Objects/stringobject.c Wed Aug 23 00:37:35 2006
> @@ -1210,6 +1210,17 @@
>                 if (slicelength <= 0) {
>                         return PyString_FromStringAndSize("", 0);
>                 }
> +               else if (start == 0 && step == 1 &&
> +                        slicelength == PyString_GET_SIZE(self) &&
> +                        PyString_CheckExact(self)) {
> +                       Py_INCREF(self);
> +                       return (PyObject *)self;
> +               }
> +               else if (step == 1) {
> +                       return PyString_FromStringAndSize(
> +                               PyString_AS_STRING(self) + start,
> +                               slicelength);
> +               }
>                 else {
>                         source_buf = PyString_AsString((PyObject*)self);
>                         result_buf = (char *)PyMem_Malloc(slicelength);
>
> Modified: python/branches/p3yk-noslice/Objects/tupleobject.c
> ==============================================================================
> --- python/branches/p3yk-noslice/Objects/tupleobject.c  (original)
> +++ python/branches/p3yk-noslice/Objects/tupleobject.c  Wed Aug 23 00:37:35 2006
> @@ -603,6 +603,12 @@
>                 if (slicelength <= 0) {
>                         return PyTuple_New(0);
>                 }
> +               else if (start == 0 && step == 1 &&
> +                        slicelength == PyTuple_GET_SIZE(self) &&
> +                        PyTuple_CheckExact(self)) {
> +                       Py_INCREF(self);
> +                       return (PyObject *)self;
> +               }
>                 else {
>                         result = PyTuple_New(slicelength);
>                         if (!result) return NULL;
>
> Modified: python/branches/p3yk-noslice/Objects/unicodeobject.c
> ==============================================================================
> --- python/branches/p3yk-noslice/Objects/unicodeobject.c        (original)
> +++ python/branches/p3yk-noslice/Objects/unicodeobject.c        Wed Aug 23 00:37:35 2006
> @@ -7083,6 +7083,12 @@
>
>          if (slicelength <= 0) {
>              return PyUnicode_FromUnicode(NULL, 0);
> +        } else if (start == 0 && step == 1 && slicelength == self->length &&
> +                   PyUnicode_CheckExact(self)) {
> +            Py_INCREF(self);
> +            return (PyObject *)self;
> +        } else if (step == 1) {
> +            return PyUnicode_FromUnicode(self->str + start, slicelength);
>          } else {
>              source_buf = PyUnicode_AS_UNICODE((PyObject*)self);
>              result_buf = (Py_UNICODE *)PyMem_MALLOC(slicelength*
> _______________________________________________
> Python-checkins mailing list
> Python-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-checkins
>


More information about the Python-checkins mailing list