Commit 77d86170 authored by Christian Heimes's avatar Christian Heimes

Merged revisions 59407-59422 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r59407 | armin.rigo | 2007-12-07 20:19:55 +0100 (Fri, 07 Dec 2007) | 2 lines

  This is probably what was meant here.
........
  r59410 | guido.van.rossum | 2007-12-08 05:38:23 +0100 (Sat, 08 Dec 2007) | 2 lines

  Be (just a bit :) more specific about release date.
........
  r59411 | alexandre.vassalotti | 2007-12-08 05:49:22 +0100 (Sat, 08 Dec 2007) | 3 lines

  Fix issue #1530.
  Return an error exit status if not all tests passes.
........
  r59413 | georg.brandl | 2007-12-08 11:56:39 +0100 (Sat, 08 Dec 2007) | 2 lines

  Fix tpyo.
........
  r59414 | georg.brandl | 2007-12-08 12:05:05 +0100 (Sat, 08 Dec 2007) | 2 lines

  Fix markup in whatsnew, use new directive in ACKS.
........
  r59415 | georg.brandl | 2007-12-08 12:05:36 +0100 (Sat, 08 Dec 2007) | 2 lines

  Fix Eren's name.
........
  r59416 | georg.brandl | 2007-12-08 12:23:13 +0100 (Sat, 08 Dec 2007) | 2 lines

  Add examples to the datetime documentation. Written for GHOP by "h4wk.cz".
........
  r59417 | skip.montanaro | 2007-12-08 15:37:43 +0100 (Sat, 08 Dec 2007) | 2 lines

  Note that open() is the preferred way to open files (issue 1510).
........
  r59418 | skip.montanaro | 2007-12-08 16:23:31 +0100 (Sat, 08 Dec 2007) | 1 line

  + "context manager"
........
  r59419 | skip.montanaro | 2007-12-08 16:26:16 +0100 (Sat, 08 Dec 2007) | 1 line

  correct email address
........
  r59420 | skip.montanaro | 2007-12-08 16:33:24 +0100 (Sat, 08 Dec 2007) | 3 lines

  When splitting, avoid making a copy of the string if the split doesn't find
  anything (issue 1538).
........
parent c8a1139f
Contributors to the Python Documentation Contributors to the Python Documentation
---------------------------------------- ----------------------------------------
This file lists people who have contributed in some way to the Python This section lists people who have contributed in some way to the Python
documentation. It is probably not complete -- if you feel that you or documentation. It is probably not complete -- if you feel that you or
anyone else should be on this list, please let us know (send email to anyone else should be on this list, please let us know (send email to
docs@python.org), and we'll be glad to correct the problem. docs@python.org), and we'll be glad to correct the problem.
* Aahz .. acks::
* Michael Abbott
* Steve Alexander * Aahz
* Jim Ahlstrom * Michael Abbott
* Fred Allen * Steve Alexander
* A. Amoroso * Jim Ahlstrom
* Pehr Anderson * Fred Allen
* Oliver Andrich * A. Amoroso
* Jesús Cea Avión * Pehr Anderson
* Daniel Barclay * Oliver Andrich
* Chris Barker * Jesús Cea Avión
* Don Bashford * Daniel Barclay
* Anthony Baxter * Chris Barker
* Bennett Benson * Don Bashford
* Jonathan Black * Anthony Baxter
* Robin Boerdijk * Bennett Benson
* Michal Bozon * Jonathan Black
* Aaron Brancotti * Robin Boerdijk
* Georg Brandl * Michal Bozon
* Keith Briggs * Aaron Brancotti
* Lee Busby * Georg Brandl
* Lorenzo M. Catucci * Keith Briggs
* Carl Cerecke * Lee Busby
* Mauro Cicognini * Lorenzo M. Catucci
* Gilles Civario * Carl Cerecke
* Mike Clarkson * Mauro Cicognini
* Steve Clift * Gilles Civario
* Dave Cole * Mike Clarkson
* Matthew Cowles * Steve Clift
* Jeremy Craven * Dave Cole
* Andrew Dalke * Matthew Cowles
* Ben Darnell * Jeremy Craven
* L. Peter Deutsch * Andrew Dalke
* Robert Donohue * Ben Darnell
* Fred L. Drake, Jr. * L. Peter Deutsch
* Josip Dzolonga * Robert Donohue
* Jeff Epler * Fred L. Drake, Jr.
* Michael Ernst * Josip Dzolonga
* Blame Andy Eskilsson * Jeff Epler
* Carey Evans * Michael Ernst
* Martijn Faassen * Blame Andy Eskilsson
* Carl Feynman * Carey Evans
* Dan Finnie * Martijn Faassen
* Hernán Martínez Foffani * Carl Feynman
* Stefan Franke * Dan Finnie
* Jim Fulton * Hernán Martínez Foffani
* Peter Funk * Stefan Franke
* Lele Gaifax * Jim Fulton
* Matthew Gallagher * Peter Funk
* Ben Gertzfield * Lele Gaifax
* Nadim Ghaznavi * Matthew Gallagher
* Jonathan Giddy * Ben Gertzfield
* Shelley Gooch * Nadim Ghaznavi
* Nathaniel Gray * Jonathan Giddy
* Grant Griffin * Shelley Gooch
* Thomas Guettler * Nathaniel Gray
* Anders Hammarquist * Grant Griffin
* Mark Hammond * Thomas Guettler
* Harald Hanche-Olsen * Anders Hammarquist
* Manus Hand * Mark Hammond
* Gerhard Häring * Harald Hanche-Olsen
* Peter Harris * Manus Hand
* Travis B. Hartwell * Gerhard Häring
* Tim Hatch * Travis B. Hartwell
* Janko Hauser * Tim Hatch
* Bernhard Herzog * Janko Hauser
* Magnus L. Hetland * Bernhard Herzog
* Konrad Hinsen * Magnus L. Hetland
* Stefan Hoffmeister * Konrad Hinsen
* Albert Hofkamp * Stefan Hoffmeister
* Gregor Hoffleit * Albert Hofkamp
* Steve Holden * Gregor Hoffleit
* Thomas Holenstein * Steve Holden
* Gerrit Holl * Thomas Holenstein
* Rob Hooft * Gerrit Holl
* Brian Hooper * Rob Hooft
* Randall Hopper * Brian Hooper
* Michael Hudson * Randall Hopper
* Eric Huss * Michael Hudson
* Jeremy Hylton * Eric Huss
* Roger Irwin * Jeremy Hylton
* Jack Jansen * Roger Irwin
* Philip H. Jensen * Jack Jansen
* Pedro Diaz Jimenez * Philip H. Jensen
* Kent Johnson * Pedro Diaz Jimenez
* Lucas de Jonge * Kent Johnson
* Andreas Jung * Lucas de Jonge
* Robert Kern * Andreas Jung
* Jim Kerr * Robert Kern
* Jan Kim * Jim Kerr
* Greg Kochanski * Jan Kim
* Guido Kollerie * Greg Kochanski
* Peter A. Koren * Guido Kollerie
* Daniel Kozan * Peter A. Koren
* Andrew M. Kuchling * Daniel Kozan
* Dave Kuhlman * Andrew M. Kuchling
* Erno Kuusela * Dave Kuhlman
* Thomas Lamb * Erno Kuusela
* Detlef Lannert * Thomas Lamb
* Piers Lauder * Detlef Lannert
* Glyph Lefkowitz * Piers Lauder
* Robert Lehmann * Glyph Lefkowitz
* Marc-André Lemburg * Robert Lehmann
* Ross Light * Marc-André Lemburg
* Ulf A. Lindgren * Ross Light
* Everett Lipman * Ulf A. Lindgren
* Mirko Liss * Everett Lipman
* Martin von Löwis * Mirko Liss
* Fredrik Lundh * Martin von Löwis
* Jeff MacDonald * Fredrik Lundh
* John Machin * Jeff MacDonald
* Andrew MacIntyre * John Machin
* Vladimir Marangozov * Andrew MacIntyre
* Vincent Marchetti * Vladimir Marangozov
* Laura Matson * Vincent Marchetti
* Daniel May * Laura Matson
* Rebecca McCreary * Daniel May
* Doug Mennella * Rebecca McCreary
* Paolo Milani * Doug Mennella
* Skip Montanaro * Paolo Milani
* Paul Moore * Skip Montanaro
* Ross Moore * Paul Moore
* Sjoerd Mullender * Ross Moore
* Dale Nagata * Sjoerd Mullender
* Ng Pheng Siong * Dale Nagata
* Koray Oner * Ng Pheng Siong
* Tomas Oppelstrup * Koray Oner
* Denis S. Otkidach * Tomas Oppelstrup
* Zooko O'Whielacronx * Denis S. Otkidach
* William Park * Zooko O'Whielacronx
* Joonas Paalasmaa * William Park
* Harri Pasanen * Joonas Paalasmaa
* Bo Peng * Harri Pasanen
* Tim Peters * Bo Peng
* Christopher Petrilli * Tim Peters
* Justin D. Pettit * Christopher Petrilli
* Chris Phoenix * Justin D. Pettit
* François Pinard * Chris Phoenix
* Paul Prescod * François Pinard
* Eric S. Raymond * Paul Prescod
* Edward K. Ream * Eric S. Raymond
* Sean Reifschneider * Edward K. Ream
* Bernhard Reiter * Sean Reifschneider
* Armin Rigo * Bernhard Reiter
* Wes Rishel * Armin Rigo
* Jim Roskind * Wes Rishel
* Guido van Rossum * Jim Roskind
* Donald Wallace Rouse II * Guido van Rossum
* Nick Russo * Donald Wallace Rouse II
* Chris Ryland * Nick Russo
* Constantina S. * Chris Ryland
* Hugh Sasse * Constantina S.
* Bob Savage * Hugh Sasse
* Scott Schram * Bob Savage
* Neil Schemenauer * Scott Schram
* Barry Scott * Neil Schemenauer
* Joakim Sernbrant * Barry Scott
* Justin Sheehy * Joakim Sernbrant
* Charlie Shepherd * Justin Sheehy
* Michael Simcich * Charlie Shepherd
* Ionel Simionescu * Michael Simcich
* Michael Sloan * Ionel Simionescu
* Gregory P. Smith * Michael Sloan
* Roy Smith * Gregory P. Smith
* Clay Spence * Roy Smith
* Nicholas Spies * Clay Spence
* Tage Stabell-Kulo * Nicholas Spies
* Frank Stajano * Tage Stabell-Kulo
* Anthony Starks * Frank Stajano
* Greg Stein * Anthony Starks
* Peter Stoehr * Greg Stein
* Mark Summerfield * Peter Stoehr
* Reuben Sumner * Mark Summerfield
* Kalle Svensson * Reuben Sumner
* Jim Tittsler * Kalle Svensson
* Ville Vainio * Jim Tittsler
* Martijn Vries * Ville Vainio
* Charles G. Waldman * Martijn Vries
* Greg Ward * Charles G. Waldman
* Barry Warsaw * Greg Ward
* Corran Webster * Barry Warsaw
* Glyn Webster * Corran Webster
* Bob Weiner * Glyn Webster
* Eddy Welbourne * Bob Weiner
* Jeff Wheeler * Eddy Welbourne
* Mats Wichmann * Jeff Wheeler
* Gerry Wiener * Mats Wichmann
* Timothy Wild * Gerry Wiener
* Collin Winter * Timothy Wild
* Blake Winton * Collin Winter
* Dan Wolfe * Blake Winton
* Steven Work * Dan Wolfe
* Thomas Wouters * Steven Work
* Ka-Ping Yee * Thomas Wouters
* Rory Yorke * Ka-Ping Yee
* Moshe Zadka * Rory Yorke
* Milan Zamazal * Moshe Zadka
* Cheng Zhang * Milan Zamazal
* Cheng Zhang
...@@ -55,6 +55,11 @@ Glossary ...@@ -55,6 +55,11 @@ Glossary
advanced mathematical feature. If you're not aware of a need for them, advanced mathematical feature. If you're not aware of a need for them,
it's almost certain you can safely ignore them. it's almost certain you can safely ignore them.
context manager
Objects which control the environment seen in a :keyword:`with`
statement by defining :meth:`__enter__` and :meth:`__exit__` methods.
See :pep:`343`.
decorator decorator
A function returning another function, usually applied as a function A function returning another function, usually applied as a function
transformation using the ``@wrapper`` syntax. Common examples for transformation using the ``@wrapper`` syntax. Common examples for
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
.. module:: atexit .. module:: atexit
:synopsis: Register and execute cleanup functions. :synopsis: Register and execute cleanup functions.
.. moduleauthor:: Skip Montanaro <skip@mojam.com> .. moduleauthor:: Skip Montanaro <skip@pobox.com>
.. sectionauthor:: Skip Montanaro <skip@mojam.com> .. sectionauthor:: Skip Montanaro <skip@pobox.com>
The :mod:`atexit` module defines functions to register and unregister cleanup The :mod:`atexit` module defines functions to register and unregister cleanup
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
.. module:: bsddb .. module:: bsddb
:synopsis: Interface to Berkeley DB database library :synopsis: Interface to Berkeley DB database library
.. sectionauthor:: Skip Montanaro <skip@mojam.com> .. sectionauthor:: Skip Montanaro <skip@pobox.com>
The :mod:`bsddb` module provides an interface to the Berkeley DB library. Users The :mod:`bsddb` module provides an interface to the Berkeley DB library. Users
......
This diff is collapsed.
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
.. % LaTeX'ized from the comments in the module by Skip Montanaro .. % LaTeX'ized from the comments in the module by Skip Montanaro
.. % <skip@mojam.com>. .. % <skip@pobox.com>.
The :mod:`mhlib` module provides a Python interface to MH folders and their The :mod:`mhlib` module provides a Python interface to MH folders and their
contents. contents.
......
...@@ -155,7 +155,7 @@ Finally, :class:`MultiFile` instances have two public instance variables: ...@@ -155,7 +155,7 @@ Finally, :class:`MultiFile` instances have two public instance variables:
:class:`MultiFile` Example :class:`MultiFile` Example
-------------------------- --------------------------
.. sectionauthor:: Skip Montanaro <skip@mojam.com> .. sectionauthor:: Skip Montanaro <skip@pobox.com>
:: ::
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
.. module:: readline .. module:: readline
:platform: Unix :platform: Unix
:synopsis: GNU readline support for Python. :synopsis: GNU readline support for Python.
.. sectionauthor:: Skip Montanaro <skip@mojam.com> .. sectionauthor:: Skip Montanaro <skip@pobox.com>
The :mod:`readline` module defines a number of functions to facilitate The :mod:`readline` module defines a number of functions to facilitate
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
.. module:: robotparser .. module:: robotparser
:synopsis: Loads a robots.txt file and answers questions about fetchability of other URLs. :synopsis: Loads a robots.txt file and answers questions about fetchability of other URLs.
.. sectionauthor:: Skip Montanaro <skip@mojam.com> .. sectionauthor:: Skip Montanaro <skip@pobox.com>
.. index:: .. index::
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
.. module:: telnetlib .. module:: telnetlib
:synopsis: Telnet client class. :synopsis: Telnet client class.
.. sectionauthor:: Skip Montanaro <skip@mojam.com> .. sectionauthor:: Skip Montanaro <skip@pobox.com>
.. index:: single: protocol; Telnet .. index:: single: protocol; Telnet
......
...@@ -363,7 +363,7 @@ Restrictions: ...@@ -363,7 +363,7 @@ Restrictions:
URLopener Objects URLopener Objects
----------------- -----------------
.. sectionauthor:: Skip Montanaro <skip@mojam.com> .. sectionauthor:: Skip Montanaro <skip@pobox.com>
:class:`URLopener` and :class:`FancyURLopener` objects have the following :class:`URLopener` and :class:`FancyURLopener` objects have the following
......
...@@ -545,9 +545,9 @@ complete list of changes, or look through the CVS logs for all the details. ...@@ -545,9 +545,9 @@ complete list of changes, or look through the CVS logs for all the details.
(Contributed by Raymond Hettinger.) (Contributed by Raymond Hettinger.)
* Another change to the :mod:`collections` module is that the * Another change to the :mod:`collections` module is that the
:class:`deque` type now supports an optional `maxlen` parameter; :class:`deque` type now supports an optional *maxlen* parameter;
if supplied, the deque's size will be restricted to no more if supplied, the deque's size will be restricted to no more
than ``maxlen`` items. Adding more items to a full deque causes than *maxlen* items. Adding more items to a full deque causes
old items to be discarded. old items to be discarded.
:: ::
......
...@@ -2651,12 +2651,15 @@ def _test(): ...@@ -2651,12 +2651,15 @@ def _test():
sys.path.insert(0, dirname) sys.path.insert(0, dirname)
m = __import__(filename[:-3]) m = __import__(filename[:-3])
del sys.path[0] del sys.path[0]
testmod(m) failures, _ = testmod(m)
else: else:
testfile(filename, module_relative=False) failures, _ = testfile(filename, module_relative=False)
if failures:
return 1
else: else:
r = unittest.TextTestRunner() r = unittest.TextTestRunner()
r.run(DocTestSuite()) r.run(DocTestSuite())
return 0
if __name__ == "__main__": if __name__ == "__main__":
_test() sys.exit(_test())
...@@ -478,7 +478,7 @@ class HTTPResponse: ...@@ -478,7 +478,7 @@ class HTTPResponse:
# Some HTTP/1.0 implementations have support for persistent # Some HTTP/1.0 implementations have support for persistent
# connections, using rules different than HTTP/1.1. # connections, using rules different than HTTP/1.1.
# For older HTTP, Keep-Alive indiciates persistent connection. # For older HTTP, Keep-Alive indicates persistent connection.
if self.msg.getheader("keep-alive"): if self.msg.getheader("keep-alive"):
return False return False
......
...@@ -3,7 +3,7 @@ Writing Python Regression Tests ...@@ -3,7 +3,7 @@ Writing Python Regression Tests
+++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++
:Author: Skip Montanaro :Author: Skip Montanaro
:Contact: skip@mojam.com :Contact: skip@pobox.com
Introduction Introduction
============ ============
...@@ -382,15 +382,6 @@ test_support provides the following useful objects: ...@@ -382,15 +382,6 @@ test_support provides the following useful objects:
statement is *not* correct Python syntax. statement is *not* correct Python syntax.
Python and C statement coverage results are currently available at
http://www.musi-cal.com/~skip/python/Python/dist/src/
As of this writing (July, 2000) these results are being generated nightly.
You can refer to the summaries and the test coverage output files to see
where coverage is adequate or lacking and write test cases to beef up the
coverage.
Some Non-Obvious regrtest Features Some Non-Obvious regrtest Features
================================== ==================================
* Automagic test detection: When you create a new test file * Automagic test detection: When you create a new test file
......
...@@ -299,7 +299,7 @@ class test__mkstemp_inner(TC): ...@@ -299,7 +299,7 @@ class test__mkstemp_inner(TC):
# On Windows a spawn* /path/ with embedded spaces shouldn't be quoted, # On Windows a spawn* /path/ with embedded spaces shouldn't be quoted,
# but an arg with embedded spaces should be decorated with double # but an arg with embedded spaces should be decorated with double
# quotes on each end # quotes on each end
if sys.platform in ('win32'): if sys.platform in ('win32',):
decorated = '"%s"' % sys.executable decorated = '"%s"' % sys.executable
tester = '"%s"' % tester tester = '"%s"' % tester
else: else:
......
...@@ -190,7 +190,6 @@ David Ely ...@@ -190,7 +190,6 @@ David Ely
Jeff Epler Jeff Epler
Tom Epperly Tom Epperly
Stoffel Erasmus Stoffel Erasmus
Turkay Eren
Jrgen A. Erhard Jrgen A. Erhard
Michael Ernst Michael Ernst
Ben Escoto Ben Escoto
...@@ -665,6 +664,7 @@ Anthony Tuininga ...@@ -665,6 +664,7 @@ Anthony Tuininga
Christopher Tur Lesniewski-Laas Christopher Tur Lesniewski-Laas
Stephen Turner Stephen Turner
Bill Tutt Bill Tutt
Eren Trkay
Doobee R. Tzeck Doobee R. Tzeck
Lionel Ulmer Lionel Ulmer
Roger Upole Roger Upole
......
...@@ -1061,8 +1061,9 @@ static const char *stripformat[] = {"|O:lstrip", "|O:rstrip", "|O:strip"}; ...@@ -1061,8 +1061,9 @@ static const char *stripformat[] = {"|O:lstrip", "|O:rstrip", "|O:strip"};
#define RSKIP_NONSPACE(s, i) { while (i>=0 && !ISSPACE(s[i])) i--; } #define RSKIP_NONSPACE(s, i) { while (i>=0 && !ISSPACE(s[i])) i--; }
Py_LOCAL_INLINE(PyObject *) Py_LOCAL_INLINE(PyObject *)
split_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit) split_whitespace(PyStringObject *self, Py_ssize_t len, Py_ssize_t maxsplit)
{ {
const char *s = PyString_AS_STRING(self);
Py_ssize_t i, j, count=0; Py_ssize_t i, j, count=0;
PyObject *str; PyObject *str;
PyObject *list = PyList_New(PREALLOC_SIZE(maxsplit)); PyObject *list = PyList_New(PREALLOC_SIZE(maxsplit));
...@@ -1077,6 +1078,13 @@ split_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit) ...@@ -1077,6 +1078,13 @@ split_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit)
if (i==len) break; if (i==len) break;
j = i; i++; j = i; i++;
SKIP_NONSPACE(s, i, len); SKIP_NONSPACE(s, i, len);
if (j == 0 && i == len && PyString_CheckExact(self)) {
/* No whitespace in self, so just use it as list[0] */
Py_INCREF(self);
PyList_SET_ITEM(list, 0, (PyObject *)self);
count++;
break;
}
SPLIT_ADD(s, j, i); SPLIT_ADD(s, j, i);
} }
...@@ -1095,8 +1103,9 @@ split_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit) ...@@ -1095,8 +1103,9 @@ split_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit)
} }
Py_LOCAL_INLINE(PyObject *) Py_LOCAL_INLINE(PyObject *)
split_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount) split_char(PyStringObject *self, Py_ssize_t len, char ch, Py_ssize_t maxcount)
{ {
const char *s = PyString_AS_STRING(self);
register Py_ssize_t i, j, count=0; register Py_ssize_t i, j, count=0;
PyObject *str; PyObject *str;
PyObject *list = PyList_New(PREALLOC_SIZE(maxcount)); PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
...@@ -1115,7 +1124,13 @@ split_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount) ...@@ -1115,7 +1124,13 @@ split_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount)
} }
} }
} }
if (i <= len) { if (i == 0 && count == 0 && PyString_CheckExact(self)) {
/* ch not in self, so just use self as list[0] */
Py_INCREF(self);
PyList_SET_ITEM(list, 0, (PyObject *)self);
count++;
}
else if (i <= len) {
SPLIT_ADD(s, i, len); SPLIT_ADD(s, i, len);
} }
FIX_PREALLOC_SIZE(list); FIX_PREALLOC_SIZE(list);
...@@ -1151,7 +1166,7 @@ string_split(PyStringObject *self, PyObject *args) ...@@ -1151,7 +1166,7 @@ string_split(PyStringObject *self, PyObject *args)
if (maxsplit < 0) if (maxsplit < 0)
maxsplit = PY_SSIZE_T_MAX; maxsplit = PY_SSIZE_T_MAX;
if (subobj == Py_None) if (subobj == Py_None)
return split_whitespace(s, len, maxsplit); return split_whitespace(self, len, maxsplit);
if (_getbuffer(subobj, &vsub) < 0) if (_getbuffer(subobj, &vsub) < 0)
return NULL; return NULL;
sub = vsub.buf; sub = vsub.buf;
...@@ -1162,11 +1177,8 @@ string_split(PyStringObject *self, PyObject *args) ...@@ -1162,11 +1177,8 @@ string_split(PyStringObject *self, PyObject *args)
PyObject_ReleaseBuffer(subobj, &vsub); PyObject_ReleaseBuffer(subobj, &vsub);
return NULL; return NULL;
} }
else if (n == 1) { else if (n == 1)
char ch = sub[0]; return split_char(self, len, sub[0], maxsplit);
PyObject_ReleaseBuffer(subobj, &vsub);
return split_char(s, len, ch, maxsplit);
}
list = PyList_New(PREALLOC_SIZE(maxsplit)); list = PyList_New(PREALLOC_SIZE(maxsplit));
if (list == NULL) { if (list == NULL) {
...@@ -1263,8 +1275,9 @@ string_rpartition(PyStringObject *self, PyObject *sep_obj) ...@@ -1263,8 +1275,9 @@ string_rpartition(PyStringObject *self, PyObject *sep_obj)
} }
Py_LOCAL_INLINE(PyObject *) Py_LOCAL_INLINE(PyObject *)
rsplit_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit) rsplit_whitespace(PyStringObject *self, Py_ssize_t len, Py_ssize_t maxsplit)
{ {
const char *s = PyString_AS_STRING(self);
Py_ssize_t i, j, count=0; Py_ssize_t i, j, count=0;
PyObject *str; PyObject *str;
PyObject *list = PyList_New(PREALLOC_SIZE(maxsplit)); PyObject *list = PyList_New(PREALLOC_SIZE(maxsplit));
...@@ -1279,6 +1292,13 @@ rsplit_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit) ...@@ -1279,6 +1292,13 @@ rsplit_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit)
if (i<0) break; if (i<0) break;
j = i; i--; j = i; i--;
RSKIP_NONSPACE(s, i); RSKIP_NONSPACE(s, i);
if (j == len-1 && i < 0 && PyString_CheckExact(self)) {
/* No whitespace in self, so just use it as list[0] */
Py_INCREF(self);
PyList_SET_ITEM(list, 0, (PyObject *)self);
count++;
break;
}
SPLIT_ADD(s, i + 1, j + 1); SPLIT_ADD(s, i + 1, j + 1);
} }
if (i >= 0) { if (i >= 0) {
...@@ -1299,8 +1319,9 @@ rsplit_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit) ...@@ -1299,8 +1319,9 @@ rsplit_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit)
} }
Py_LOCAL_INLINE(PyObject *) Py_LOCAL_INLINE(PyObject *)
rsplit_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount) rsplit_char(PyStringObject *self, Py_ssize_t len, char ch, Py_ssize_t maxcount)
{ {
const char *s = PyString_AS_STRING(self);
register Py_ssize_t i, j, count=0; register Py_ssize_t i, j, count=0;
PyObject *str; PyObject *str;
PyObject *list = PyList_New(PREALLOC_SIZE(maxcount)); PyObject *list = PyList_New(PREALLOC_SIZE(maxcount));
...@@ -1318,7 +1339,13 @@ rsplit_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount) ...@@ -1318,7 +1339,13 @@ rsplit_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount)
} }
} }
} }
if (j >= -1) { if (i < 0 && count == 0 && PyString_CheckExact(self)) {
/* ch not in self, so just use self as list[0] */
Py_INCREF(self);
PyList_SET_ITEM(list, 0, (PyObject *)self);
count++;
}
else if (j >= -1) {
SPLIT_ADD(s, 0, j + 1); SPLIT_ADD(s, 0, j + 1);
} }
FIX_PREALLOC_SIZE(list); FIX_PREALLOC_SIZE(list);
...@@ -1346,7 +1373,7 @@ string_rsplit(PyStringObject *self, PyObject *args) ...@@ -1346,7 +1373,7 @@ string_rsplit(PyStringObject *self, PyObject *args)
{ {
Py_ssize_t len = PyString_GET_SIZE(self), n, i, j; Py_ssize_t len = PyString_GET_SIZE(self), n, i, j;
Py_ssize_t maxsplit = -1, count=0; Py_ssize_t maxsplit = -1, count=0;
const char *s = PyString_AS_STRING(self), *sub; const char *s, *sub;
Py_buffer vsub; Py_buffer vsub;
PyObject *list, *str, *subobj = Py_None; PyObject *list, *str, *subobj = Py_None;
...@@ -1355,7 +1382,7 @@ string_rsplit(PyStringObject *self, PyObject *args) ...@@ -1355,7 +1382,7 @@ string_rsplit(PyStringObject *self, PyObject *args)
if (maxsplit < 0) if (maxsplit < 0)
maxsplit = PY_SSIZE_T_MAX; maxsplit = PY_SSIZE_T_MAX;
if (subobj == Py_None) if (subobj == Py_None)
return rsplit_whitespace(s, len, maxsplit); return rsplit_whitespace(self, len, maxsplit);
if (_getbuffer(subobj, &vsub) < 0) if (_getbuffer(subobj, &vsub) < 0)
return NULL; return NULL;
sub = vsub.buf; sub = vsub.buf;
...@@ -1366,11 +1393,8 @@ string_rsplit(PyStringObject *self, PyObject *args) ...@@ -1366,11 +1393,8 @@ string_rsplit(PyStringObject *self, PyObject *args)
PyObject_ReleaseBuffer(subobj, &vsub); PyObject_ReleaseBuffer(subobj, &vsub);
return NULL; return NULL;
} }
else if (n == 1) { else if (n == 1)
char ch = sub[0]; return rsplit_char(self, len, sub[0], maxsplit);
PyObject_ReleaseBuffer(subobj, &vsub);
return rsplit_char(s, len, ch, maxsplit);
}
list = PyList_New(PREALLOC_SIZE(maxsplit)); list = PyList_New(PREALLOC_SIZE(maxsplit));
if (list == NULL) { if (list == NULL) {
...@@ -1381,6 +1405,7 @@ string_rsplit(PyStringObject *self, PyObject *args) ...@@ -1381,6 +1405,7 @@ string_rsplit(PyStringObject *self, PyObject *args)
j = len; j = len;
i = j - n; i = j - n;
s = PyString_AS_STRING(self);
while ( (i >= 0) && (maxsplit-- > 0) ) { while ( (i >= 0) && (maxsplit-- > 0) ) {
for (; i>=0; i--) { for (; i>=0; i--) {
if (Py_STRING_MATCH(s, i, sub, n)) { if (Py_STRING_MATCH(s, i, sub, n)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment