mirror of
https://github.com/python/cpython.git
synced 2025-08-08 10:58:51 +00:00
Merged revisions 67898,67904-67907,67912,67918,67920-67921,67923-67924,67927,67930,67932,67943 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r67898 | benjamin.peterson | 2008-12-21 15:00:53 -0600 (Sun, 21 Dec 2008) | 1 line compute DISTVERSION with patchlevel.py ........ r67904 | benjamin.peterson | 2008-12-22 14:44:58 -0600 (Mon, 22 Dec 2008) | 1 line less attitude ........ r67905 | benjamin.peterson | 2008-12-22 14:51:15 -0600 (Mon, 22 Dec 2008) | 1 line fix #4720: the format to PyArg_ParseTupleAndKeywords can now start with '|' ........ r67906 | benjamin.peterson | 2008-12-22 14:52:53 -0600 (Mon, 22 Dec 2008) | 1 line add NEWS note ........ r67907 | benjamin.peterson | 2008-12-22 16:12:19 -0600 (Mon, 22 Dec 2008) | 1 line silence compiler warning ........ r67912 | georg.brandl | 2008-12-23 06:37:21 -0600 (Tue, 23 Dec 2008) | 2 lines Fix missing "svn" command. ........ r67918 | georg.brandl | 2008-12-23 09:44:25 -0600 (Tue, 23 Dec 2008) | 2 lines Markup fix. ........ r67920 | benjamin.peterson | 2008-12-23 14:09:28 -0600 (Tue, 23 Dec 2008) | 1 line use a global variable, so the compiler doesn't optimize the assignment out ........ r67921 | benjamin.peterson | 2008-12-23 14:12:33 -0600 (Tue, 23 Dec 2008) | 1 line make global static ........ r67923 | benjamin.peterson | 2008-12-24 09:10:27 -0600 (Wed, 24 Dec 2008) | 1 line #4736 BufferRWPair.closed shouldn't try to call another property as a function ........ r67924 | benjamin.peterson | 2008-12-24 10:10:05 -0600 (Wed, 24 Dec 2008) | 1 line pretend exceptions don't exist a while longer ........ r67927 | benjamin.peterson | 2008-12-26 17:26:30 -0600 (Fri, 26 Dec 2008) | 1 line python version is included in file name now ........ r67930 | hirokazu.yamamoto | 2008-12-26 22:19:48 -0600 (Fri, 26 Dec 2008) | 2 lines Issue #4740: Use HIGHEST_PROTOCOL in pickle test. (There is no behavior difference in 2.x because HIGHEST_PROTOCOL == 2) ........ r67932 | alexandre.vassalotti | 2008-12-27 00:36:10 -0600 (Sat, 27 Dec 2008) | 5 lines Remove unnecessary casts related to unicode_decode_call_errorhandler. Make the _PyUnicode_Resize macro a static function. These changes are needed to avoid breaking strict aliasing rules. ........ r67943 | alexandre.vassalotti | 2008-12-27 04:02:59 -0600 (Sat, 27 Dec 2008) | 2 lines Fix bogus unicode tests in pickletester. ........
This commit is contained in:
parent
ba48608711
commit
828a7066f1
16 changed files with 113 additions and 96 deletions
34
Doc/Makefile
34
Doc/Makefile
|
@ -9,7 +9,7 @@ SVNROOT = http://svn.python.org/projects
|
||||||
SPHINXOPTS =
|
SPHINXOPTS =
|
||||||
PAPER =
|
PAPER =
|
||||||
SOURCES =
|
SOURCES =
|
||||||
DISTVERSION =
|
DISTVERSION = $(shell $(PYTHON) tools/sphinxext/patchlevel.py)
|
||||||
|
|
||||||
ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees -D latex_paper_size=$(PAPER) \
|
ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees -D latex_paper_size=$(PAPER) \
|
||||||
$(SPHINXOPTS) . build/$(BUILDER) $(SOURCES)
|
$(SPHINXOPTS) . build/$(BUILDER) $(SOURCES)
|
||||||
|
@ -111,33 +111,33 @@ dist:
|
||||||
|
|
||||||
# archive the HTML
|
# archive the HTML
|
||||||
make html
|
make html
|
||||||
cp -pPR build/html dist/python$(DISTVERSION)-docs-html
|
cp -pPR build/html dist/python-$(DISTVERSION)-docs-html
|
||||||
tar -C dist -cf dist/python$(DISTVERSION)-docs-html.tar python$(DISTVERSION)-docs-html
|
tar -C dist -cf dist/python-$(DISTVERSION)-docs-html.tar python-$(DISTVERSION)-docs-html
|
||||||
bzip2 -9 -k dist/python$(DISTVERSION)-docs-html.tar
|
bzip2 -9 -k dist/python-$(DISTVERSION)-docs-html.tar
|
||||||
(cd dist; zip -q -r -9 python$(DISTVERSION)-docs-html.zip python$(DISTVERSION)-docs-html)
|
(cd dist; zip -q -r -9 python-$(DISTVERSION)-docs-html.zip python-$(DISTVERSION)-docs-html)
|
||||||
rm -r dist/python$(DISTVERSION)-docs-html
|
rm -r dist/python-$(DISTVERSION)-docs-html
|
||||||
rm dist/python$(DISTVERSION)-docs-html.tar
|
rm dist/python-$(DISTVERSION)-docs-html.tar
|
||||||
|
|
||||||
# archive the text build
|
# archive the text build
|
||||||
make text
|
make text
|
||||||
cp -pPR build/text dist/python$(DISTVERSION)-docs-text
|
cp -pPR build/text dist/python-$(DISTVERSION)-docs-text
|
||||||
tar -C dist -cf dist/python$(DISTVERSION)-docs-text.tar python$(DISTVERSION)-docs-text
|
tar -C dist -cf dist/python-$(DISTVERSION)-docs-text.tar python-$(DISTVERSION)-docs-text
|
||||||
bzip2 -9 -k dist/python$(DISTVERSION)-docs-text.tar
|
bzip2 -9 -k dist/python-$(DISTVERSION)-docs-text.tar
|
||||||
(cd dist; zip -q -r -9 python$(DISTVERSION)-docs-text.zip python$(DISTVERSION)-docs-text)
|
(cd dist; zip -q -r -9 python-$(DISTVERSION)-docs-text.zip python-$(DISTVERSION)-docs-text)
|
||||||
rm -r dist/python$(DISTVERSION)-docs-text
|
rm -r dist/python-$(DISTVERSION)-docs-text
|
||||||
rm dist/python$(DISTVERSION)-docs-text.tar
|
rm dist/python-$(DISTVERSION)-docs-text.tar
|
||||||
|
|
||||||
# archive the A4 latex
|
# archive the A4 latex
|
||||||
-rm -r build/latex
|
-rm -r build/latex
|
||||||
make latex PAPER=a4
|
make latex PAPER=a4
|
||||||
(cd build/latex; make clean && make all-pdf && make FMT=pdf zip bz2)
|
(cd build/latex; make clean && make all-pdf && make FMT=pdf zip bz2)
|
||||||
cp build/latex/docs-pdf.zip dist/python$(DISTVERSION)-docs-pdf-a4.zip
|
cp build/latex/docs-pdf.zip dist/python-$(DISTVERSION)-docs-pdf-a4.zip
|
||||||
cp build/latex/docs-pdf.tar.bz2 dist/python$(DISTVERSION)-docs-pdf-a4.tar.bz2
|
cp build/latex/docs-pdf.tar.bz2 dist/python-$(DISTVERSION)-docs-pdf-a4.tar.bz2
|
||||||
|
|
||||||
# archive the letter latex
|
# archive the letter latex
|
||||||
rm -r build/latex
|
rm -r build/latex
|
||||||
make latex PAPER=letter
|
make latex PAPER=letter
|
||||||
(cd build/latex; make clean && make all-pdf && make FMT=pdf zip bz2)
|
(cd build/latex; make clean && make all-pdf && make FMT=pdf zip bz2)
|
||||||
cp build/latex/docs-pdf.zip dist/python$(DISTVERSION)-docs-pdf-letter.zip
|
cp build/latex/docs-pdf.zip dist/python-$(DISTVERSION)-docs-pdf-letter.zip
|
||||||
cp build/latex/docs-pdf.tar.bz2 dist/python$(DISTVERSION)-docs-pdf-letter.tar.bz2
|
cp build/latex/docs-pdf.tar.bz2 dist/python-$(DISTVERSION)-docs-pdf-letter.tar.bz2
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ Without make
|
||||||
|
|
||||||
You'll need to checkout the Sphinx package to the `tools/` directory::
|
You'll need to checkout the Sphinx package to the `tools/` directory::
|
||||||
|
|
||||||
http://svn.python.org/projects/doctools/trunk/sphinx tools/sphinx
|
svn co http://svn.python.org/projects/doctools/trunk/sphinx tools/sphinx
|
||||||
|
|
||||||
Then, you need to install Docutils, either by checking it out via ::
|
Then, you need to install Docutils, either by checking it out via ::
|
||||||
|
|
||||||
|
|
|
@ -297,8 +297,8 @@ inside nested parentheses. They are:
|
||||||
|
|
||||||
``;``
|
``;``
|
||||||
The list of format units ends here; the string after the semicolon is used as
|
The list of format units ends here; the string after the semicolon is used as
|
||||||
the error message *instead* of the default error message. Clearly, ``:`` and
|
the error message *instead* of the default error message. ``:`` and ``;``
|
||||||
``;`` mutually exclude each other.
|
mutually exclude each other.
|
||||||
|
|
||||||
Note that any Python object references which are provided to the caller are
|
Note that any Python object references which are provided to the caller are
|
||||||
*borrowed* references; do not decrement their reference count!
|
*borrowed* references; do not decrement their reference count!
|
||||||
|
|
|
@ -19,20 +19,20 @@ in the table are the size of the download files in megabytes.</p>
|
||||||
<table class="docutils">
|
<table class="docutils">
|
||||||
<tr><th>Format</th><th>Packed as .zip</th><th>Packed as .tar.bz2</th></tr>
|
<tr><th>Format</th><th>Packed as .zip</th><th>Packed as .tar.bz2</th></tr>
|
||||||
<tr><td>PDF (US-Letter paper size)</td>
|
<tr><td>PDF (US-Letter paper size)</td>
|
||||||
<td><a href="{{ dlbase }}/python-docs-pdf-letter.zip">Download</a> (ca. 8 MB)</td>
|
<td><a href="{{ dlbase }}/python-{{ release }}-docs-pdf-letter.zip">Download</a> (ca. 8 MB)</td>
|
||||||
<td><a href="{{ dlbase }}/python-docs-pdf-letter.tar.bz2">Download</a> (ca. 8 MB)</td>
|
<td><a href="{{ dlbase }}/python-{{ release }}-docs-pdf-letter.tar.bz2">Download</a> (ca. 8 MB)</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td>PDF (A4 paper size)</td>
|
<tr><td>PDF (A4 paper size)</td>
|
||||||
<td><a href="{{ dlbase }}/python-docs-pdf-a4.zip">Download</a> (ca. 8 MB)</td>
|
<td><a href="{{ dlbase }}/python-{{ release }}-docs-pdf-a4.zip">Download</a> (ca. 8 MB)</td>
|
||||||
<td><a href="{{ dlbase }}/python-docs-pdf-a4.tar.bz2">Download</a> (ca. 8 MB)</td>
|
<td><a href="{{ dlbase }}/python-{{ release }}-docs-pdf-a4.tar.bz2">Download</a> (ca. 8 MB)</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td>HTML</td>
|
<tr><td>HTML</td>
|
||||||
<td><a href="{{ dlbase }}/python-docs-html.zip">Download</a> (ca. 6 MB)</td>
|
<td><a href="{{ dlbase }}/python-{{ release }}-docs-html.zip">Download</a> (ca. 6 MB)</td>
|
||||||
<td><a href="{{ dlbase }}/python-docs-html.tar.bz2">Download</a> (ca. 4 MB)</td>
|
<td><a href="{{ dlbase }}/python-{{ release }}-docs-html.tar.bz2">Download</a> (ca. 4 MB)</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td>Plain Text</td>
|
<tr><td>Plain Text</td>
|
||||||
<td><a href="{{ dlbase }}/python-docs-text.zip">Download</a> (ca. 2 MB)</td>
|
<td><a href="{{ dlbase }}/python-docs-text.zip">Download</a> (ca. 2 MB)</td>
|
||||||
<td><a href="{{ dlbase }}/python-docs-text.tar.bz2">Download</a> (ca. 1.5 MB)</td>
|
<td><a href="{{ dlbase }}/python-{{ release }}-docs-text.tar.bz2">Download</a> (ca. 1.5 MB)</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
|
@ -169,42 +169,20 @@ required syntactically but the program requires no action. For example::
|
||||||
... pass # Busy-wait for keyboard interrupt (Ctrl+C)
|
... pass # Busy-wait for keyboard interrupt (Ctrl+C)
|
||||||
...
|
...
|
||||||
|
|
||||||
This is commonly used for creating minimal classes such as exceptions, or
|
This is commonly used for creating minimal classes::
|
||||||
for ignoring unwanted exceptions::
|
|
||||||
|
|
||||||
>>> class ParserError(Exception):
|
>>> class MyEmptyClass:
|
||||||
... pass
|
... pass
|
||||||
...
|
...
|
||||||
>>> try:
|
|
||||||
... import audioop
|
|
||||||
... except ImportError:
|
|
||||||
... pass
|
|
||||||
...
|
|
||||||
|
|
||||||
Another place :keyword:`pass` can be used is as a place-holder for a function or
|
Another place :keyword:`pass` can be used is as a place-holder for a function or
|
||||||
conditional body when you are working on new code, allowing you to keep
|
conditional body when you are working on new code, allowing you to keep thinking
|
||||||
thinking at a more abstract level. However, as :keyword:`pass` is silently
|
at a more abstract level. The :keyword:`pass` is silently ignored::
|
||||||
ignored, a better choice may be to raise a :exc:`NotImplementedError`
|
|
||||||
exception::
|
|
||||||
|
|
||||||
>>> def initlog(*args):
|
>>> def initlog(*args):
|
||||||
... raise NotImplementedError # Open logfile if not already open
|
... pass # Remember to implement this!
|
||||||
... if not logfp:
|
|
||||||
... raise NotImplementedError # Set up dummy log back-end
|
|
||||||
... raise NotImplementedError('Call log initialization handler')
|
|
||||||
...
|
...
|
||||||
|
|
||||||
If :keyword:`pass` were used here and you later ran tests, they may fail
|
|
||||||
without indicating why. Using :exc:`NotImplementedError` causes this code
|
|
||||||
to raise an exception, telling you exactly where the incomplete code
|
|
||||||
is. Note the two calling styles of the exceptions above.
|
|
||||||
The first style, with no message but with an accompanying comment,
|
|
||||||
lets you easily leave the comment when you remove the exception,
|
|
||||||
which ideally would be a good description for
|
|
||||||
the block of code the exception is a placeholder for. However, the
|
|
||||||
third example, providing a message for the exception, will produce
|
|
||||||
a more useful traceback.
|
|
||||||
|
|
||||||
.. _tut-functions:
|
.. _tut-functions:
|
||||||
|
|
||||||
Defining Functions
|
Defining Functions
|
||||||
|
|
|
@ -140,8 +140,8 @@ Editors
|
||||||
Vim and Emacs are excellent editors which support Python very well. For more
|
Vim and Emacs are excellent editors which support Python very well. For more
|
||||||
information on how to code in python in these editors, look at:
|
information on how to code in python in these editors, look at:
|
||||||
|
|
||||||
http://www.vim.org/scripts/script.php?script_id=790
|
* http://www.vim.org/scripts/script.php?script_id=790
|
||||||
http://sourceforge.net/projects/python-mode
|
* http://sourceforge.net/projects/python-mode
|
||||||
|
|
||||||
Geany is an excellent IDE with support for a lot of languages. For more
|
Geany is an excellent IDE with support for a lot of languages. For more
|
||||||
information, read: http://geany.uvena.de/
|
information, read: http://geany.uvena.de/
|
||||||
|
|
|
@ -1167,7 +1167,7 @@ class BufferedRWPair(BufferedIOBase):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def closed(self):
|
def closed(self):
|
||||||
return self.writer.closed()
|
return self.writer.closed
|
||||||
|
|
||||||
|
|
||||||
class BufferedRandom(BufferedWriter, BufferedReader):
|
class BufferedRandom(BufferedWriter, BufferedReader):
|
||||||
|
|
|
@ -480,8 +480,8 @@ class AbstractPickleTests(unittest.TestCase):
|
||||||
|
|
||||||
if have_unicode:
|
if have_unicode:
|
||||||
def test_unicode(self):
|
def test_unicode(self):
|
||||||
endcases = [u'', u'<\\u>', u'<\\\\u1234>', u'<\n>',
|
endcases = [u'', u'<\\u>', u'<\\\u1234>', u'<\n>',
|
||||||
u'<\\>', u'<\\\\U00012345>']
|
u'<\\>', u'<\\\U00012345>']
|
||||||
for proto in protocols:
|
for proto in protocols:
|
||||||
for u in endcases:
|
for u in endcases:
|
||||||
p = self.dumps(u, proto)
|
p = self.dumps(u, proto)
|
||||||
|
|
|
@ -7,7 +7,7 @@ import unittest
|
||||||
from test import test_support
|
from test import test_support
|
||||||
from weakref import proxy
|
from weakref import proxy
|
||||||
import array, cStringIO
|
import array, cStringIO
|
||||||
from cPickle import loads, dumps
|
from cPickle import loads, dumps, HIGHEST_PROTOCOL
|
||||||
|
|
||||||
class ArraySubclass(array.array):
|
class ArraySubclass(array.array):
|
||||||
pass
|
pass
|
||||||
|
@ -97,7 +97,7 @@ class BaseTest(unittest.TestCase):
|
||||||
self.assertEqual(a, b)
|
self.assertEqual(a, b)
|
||||||
|
|
||||||
def test_pickle(self):
|
def test_pickle(self):
|
||||||
for protocol in (0, 1, 2):
|
for protocol in range(HIGHEST_PROTOCOL + 1):
|
||||||
a = array.array(self.typecode, self.example)
|
a = array.array(self.typecode, self.example)
|
||||||
b = loads(dumps(a, protocol))
|
b = loads(dumps(a, protocol))
|
||||||
self.assertNotEqual(id(a), id(b))
|
self.assertNotEqual(id(a), id(b))
|
||||||
|
@ -112,7 +112,7 @@ class BaseTest(unittest.TestCase):
|
||||||
self.assertEqual(type(a), type(b))
|
self.assertEqual(type(a), type(b))
|
||||||
|
|
||||||
def test_pickle_for_empty_array(self):
|
def test_pickle_for_empty_array(self):
|
||||||
for protocol in (0, 1, 2):
|
for protocol in range(HIGHEST_PROTOCOL + 1):
|
||||||
a = array.array(self.typecode)
|
a = array.array(self.typecode)
|
||||||
b = loads(dumps(a, protocol))
|
b = loads(dumps(a, protocol))
|
||||||
self.assertNotEqual(id(a), id(b))
|
self.assertNotEqual(id(a), id(b))
|
||||||
|
|
|
@ -373,7 +373,7 @@ class TestBasic(unittest.TestCase):
|
||||||
|
|
||||||
def test_pickle(self):
|
def test_pickle(self):
|
||||||
d = deque(xrange(200))
|
d = deque(xrange(200))
|
||||||
for i in (0, 1, 2):
|
for i in range(pickle.HIGHEST_PROTOCOL + 1):
|
||||||
s = pickle.dumps(d, i)
|
s = pickle.dumps(d, i)
|
||||||
e = pickle.loads(s)
|
e = pickle.loads(s)
|
||||||
self.assertNotEqual(id(d), id(e))
|
self.assertNotEqual(id(d), id(e))
|
||||||
|
@ -382,7 +382,7 @@ class TestBasic(unittest.TestCase):
|
||||||
## def test_pickle_recursive(self):
|
## def test_pickle_recursive(self):
|
||||||
## d = deque('abc')
|
## d = deque('abc')
|
||||||
## d.append(d)
|
## d.append(d)
|
||||||
## for i in (0, 1, 2):
|
## for i in range(pickle.HIGHEST_PROTOCOL + 1):
|
||||||
## e = pickle.loads(pickle.dumps(d, i))
|
## e = pickle.loads(pickle.dumps(d, i))
|
||||||
## self.assertNotEqual(id(d), id(e))
|
## self.assertNotEqual(id(d), id(e))
|
||||||
## self.assertEqual(id(e), id(e[-1]))
|
## self.assertEqual(id(e), id(e[-1]))
|
||||||
|
|
|
@ -554,8 +554,9 @@ class BufferedRWPairTest(unittest.TestCase):
|
||||||
r = MockRawIO(())
|
r = MockRawIO(())
|
||||||
w = MockRawIO()
|
w = MockRawIO()
|
||||||
pair = io.BufferedRWPair(r, w)
|
pair = io.BufferedRWPair(r, w)
|
||||||
|
self.assertFalse(pair.closed)
|
||||||
|
|
||||||
# XXX need implementation
|
# XXX More Tests
|
||||||
|
|
||||||
|
|
||||||
class BufferedRandomTest(unittest.TestCase):
|
class BufferedRandomTest(unittest.TestCase):
|
||||||
|
|
|
@ -221,7 +221,7 @@ class TestJointOps(unittest.TestCase):
|
||||||
self.failIf(set('cbs').issuperset('a'))
|
self.failIf(set('cbs').issuperset('a'))
|
||||||
|
|
||||||
def test_pickling(self):
|
def test_pickling(self):
|
||||||
for i in (0, 1, 2):
|
for i in range(pickle.HIGHEST_PROTOCOL + 1):
|
||||||
p = pickle.dumps(self.s, i)
|
p = pickle.dumps(self.s, i)
|
||||||
dup = pickle.loads(p)
|
dup = pickle.loads(p)
|
||||||
self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
|
self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
|
||||||
|
|
|
@ -123,6 +123,11 @@ Library
|
||||||
|
|
||||||
- Issue #4400: .pypirc default generated file was broken in distutils.
|
- Issue #4400: .pypirc default generated file was broken in distutils.
|
||||||
|
|
||||||
|
- Issue #4736: io.BufferedRWPair's closed property now functions properly.
|
||||||
|
|
||||||
|
- Issue #3954: Fix a potential SystemError in _hotshot.logreader error
|
||||||
|
handling.
|
||||||
|
|
||||||
- Issue #4163: Use unicode-friendly word splitting in the textwrap functions
|
- Issue #4163: Use unicode-friendly word splitting in the textwrap functions
|
||||||
when given an unicode string.
|
when given an unicode string.
|
||||||
|
|
||||||
|
@ -200,6 +205,8 @@ Build
|
||||||
C-API
|
C-API
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
- Issue #4720: The format for PyArg_ParseTupleAndKeywords can begin with '|'.
|
||||||
|
|
||||||
- Issue #3632: from the gdb debugger, the 'pyo' macro can now be called when
|
- Issue #3632: from the gdb debugger, the 'pyo' macro can now be called when
|
||||||
the GIL is released, or owned by another thread.
|
the GIL is released, or owned by another thread.
|
||||||
|
|
||||||
|
|
|
@ -474,6 +474,8 @@ test_k_code(PyObject *self)
|
||||||
|
|
||||||
#ifdef Py_USING_UNICODE
|
#ifdef Py_USING_UNICODE
|
||||||
|
|
||||||
|
static volatile int x;
|
||||||
|
|
||||||
/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
|
/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
|
||||||
of an error.
|
of an error.
|
||||||
*/
|
*/
|
||||||
|
@ -486,7 +488,7 @@ test_u_code(PyObject *self)
|
||||||
|
|
||||||
/* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
|
/* issue4122: Undefined reference to _Py_ascii_whitespace on Windows */
|
||||||
/* Just use the macro and check that it compiles */
|
/* Just use the macro and check that it compiles */
|
||||||
int x = Py_UNICODE_ISSPACE(25);
|
x = Py_UNICODE_ISSPACE(25);
|
||||||
|
|
||||||
tuple = PyTuple_New(1);
|
tuple = PyTuple_New(1);
|
||||||
if (tuple == NULL)
|
if (tuple == NULL)
|
||||||
|
@ -518,6 +520,32 @@ test_u_code(PyObject *self)
|
||||||
return Py_None;
|
return Py_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
test_empty_argparse(PyObject *self)
|
||||||
|
{
|
||||||
|
/* Test that formats can begin with '|'. See issue #4720. */
|
||||||
|
PyObject *tuple, *dict = NULL;
|
||||||
|
static char *kwlist[] = {NULL};
|
||||||
|
int result;
|
||||||
|
tuple = PyTuple_New(0);
|
||||||
|
if (!tuple)
|
||||||
|
return NULL;
|
||||||
|
if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0)
|
||||||
|
goto done;
|
||||||
|
dict = PyDict_New();
|
||||||
|
if (!dict)
|
||||||
|
goto done;
|
||||||
|
result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist);
|
||||||
|
done:
|
||||||
|
Py_DECREF(tuple);
|
||||||
|
Py_XDECREF(dict);
|
||||||
|
if (result < 0)
|
||||||
|
return NULL;
|
||||||
|
else {
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
codec_incrementalencoder(PyObject *self, PyObject *args)
|
codec_incrementalencoder(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
|
@ -780,6 +808,7 @@ static PyMethodDef TestMethods[] = {
|
||||||
{"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
|
{"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
|
||||||
{"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
|
{"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
|
||||||
{"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
|
{"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
|
||||||
|
{"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
|
||||||
{"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
|
{"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
|
||||||
{"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
|
{"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
|
||||||
{"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
|
{"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
|
||||||
|
|
|
@ -386,7 +386,8 @@ void unicode_dealloc(register PyUnicodeObject *unicode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int PyUnicode_Resize(PyObject **unicode, Py_ssize_t length)
|
static
|
||||||
|
int _PyUnicode_Resize(PyUnicodeObject **unicode, Py_ssize_t length)
|
||||||
{
|
{
|
||||||
register PyUnicodeObject *v;
|
register PyUnicodeObject *v;
|
||||||
|
|
||||||
|
@ -395,7 +396,7 @@ int PyUnicode_Resize(PyObject **unicode, Py_ssize_t length)
|
||||||
PyErr_BadInternalCall();
|
PyErr_BadInternalCall();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
v = (PyUnicodeObject *)*unicode;
|
v = *unicode;
|
||||||
if (v == NULL || !PyUnicode_Check(v) || Py_REFCNT(v) != 1 || length < 0) {
|
if (v == NULL || !PyUnicode_Check(v) || Py_REFCNT(v) != 1 || length < 0) {
|
||||||
PyErr_BadInternalCall();
|
PyErr_BadInternalCall();
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -412,7 +413,7 @@ int PyUnicode_Resize(PyObject **unicode, Py_ssize_t length)
|
||||||
Py_UNICODE_COPY(w->str, v->str,
|
Py_UNICODE_COPY(w->str, v->str,
|
||||||
length < v->length ? length : v->length);
|
length < v->length ? length : v->length);
|
||||||
Py_DECREF(*unicode);
|
Py_DECREF(*unicode);
|
||||||
*unicode = (PyObject *)w;
|
*unicode = w;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -421,9 +422,10 @@ int PyUnicode_Resize(PyObject **unicode, Py_ssize_t length)
|
||||||
return unicode_resize(v, length);
|
return unicode_resize(v, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Internal API for use in unicodeobject.c only ! */
|
int PyUnicode_Resize(PyObject **unicode, Py_ssize_t length)
|
||||||
#define _PyUnicode_Resize(unicodevar, length) \
|
{
|
||||||
PyUnicode_Resize(((PyObject **)(unicodevar)), length)
|
return _PyUnicode_Resize((PyUnicodeObject **)unicode, length);
|
||||||
|
}
|
||||||
|
|
||||||
PyObject *PyUnicode_FromUnicode(const Py_UNICODE *u,
|
PyObject *PyUnicode_FromUnicode(const Py_UNICODE *u,
|
||||||
Py_ssize_t size)
|
Py_ssize_t size)
|
||||||
|
@ -937,7 +939,7 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
|
||||||
PyObject_Free(callresults);
|
PyObject_Free(callresults);
|
||||||
if (abuffer)
|
if (abuffer)
|
||||||
PyObject_Free(abuffer);
|
PyObject_Free(abuffer);
|
||||||
_PyUnicode_Resize(&string, s - PyUnicode_AS_UNICODE(string));
|
PyUnicode_Resize(&string, s - PyUnicode_AS_UNICODE(string));
|
||||||
return string;
|
return string;
|
||||||
fail:
|
fail:
|
||||||
if (callresults) {
|
if (callresults) {
|
||||||
|
@ -1345,7 +1347,7 @@ int unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler
|
||||||
const char *encoding, const char *reason,
|
const char *encoding, const char *reason,
|
||||||
const char *input, Py_ssize_t insize, Py_ssize_t *startinpos,
|
const char *input, Py_ssize_t insize, Py_ssize_t *startinpos,
|
||||||
Py_ssize_t *endinpos, PyObject **exceptionObject, const char **inptr,
|
Py_ssize_t *endinpos, PyObject **exceptionObject, const char **inptr,
|
||||||
PyObject **output, Py_ssize_t *outpos, Py_UNICODE **outptr)
|
PyUnicodeObject **output, Py_ssize_t *outpos, Py_UNICODE **outptr)
|
||||||
{
|
{
|
||||||
static char *argparse = "O!n;decoding error handler must return (unicode, int) tuple";
|
static char *argparse = "O!n;decoding error handler must return (unicode, int) tuple";
|
||||||
|
|
||||||
|
@ -1405,7 +1407,7 @@ int unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler
|
||||||
if (requiredsize > outsize) {
|
if (requiredsize > outsize) {
|
||||||
if (requiredsize<2*outsize)
|
if (requiredsize<2*outsize)
|
||||||
requiredsize = 2*outsize;
|
requiredsize = 2*outsize;
|
||||||
if (PyUnicode_Resize(output, requiredsize) < 0)
|
if (_PyUnicode_Resize(output, requiredsize) < 0)
|
||||||
goto onError;
|
goto onError;
|
||||||
*outptr = PyUnicode_AS_UNICODE(*output) + *outpos;
|
*outptr = PyUnicode_AS_UNICODE(*output) + *outpos;
|
||||||
}
|
}
|
||||||
|
@ -1604,7 +1606,7 @@ PyObject *PyUnicode_DecodeUTF7Stateful(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"utf7", errmsg,
|
"utf7", errmsg,
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&unicode, &outpos, &p))
|
&unicode, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1615,7 +1617,7 @@ PyObject *PyUnicode_DecodeUTF7Stateful(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"utf7", "unterminated shift sequence",
|
"utf7", "unterminated shift sequence",
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&unicode, &outpos, &p))
|
&unicode, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
if (s < e)
|
if (s < e)
|
||||||
goto restart;
|
goto restart;
|
||||||
|
@ -1942,7 +1944,7 @@ PyObject *PyUnicode_DecodeUTF8Stateful(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"utf8", errmsg,
|
"utf8", errmsg,
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&unicode, &outpos, &p))
|
&unicode, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
if (consumed)
|
if (consumed)
|
||||||
|
@ -2222,7 +2224,7 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"utf32", errmsg,
|
"utf32", errmsg,
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&unicode, &outpos, &p))
|
&unicode, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2496,7 +2498,7 @@ PyUnicode_DecodeUTF16Stateful(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"utf16", errmsg,
|
"utf16", errmsg,
|
||||||
starts, size, &startinpos, &endinpos, &exc, (const char **)&q,
|
starts, size, &startinpos, &endinpos, &exc, (const char **)&q,
|
||||||
(PyObject **)&unicode, &outpos, &p))
|
&unicode, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2717,7 +2719,7 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"unicodeescape", "end of string in escape sequence",
|
"unicodeescape", "end of string in escape sequence",
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&v, &outpos, &p))
|
&v, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
goto nextByte;
|
goto nextByte;
|
||||||
}
|
}
|
||||||
|
@ -2729,7 +2731,7 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"unicodeescape", message,
|
"unicodeescape", message,
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&v, &outpos, &p))
|
&v, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
goto nextByte;
|
goto nextByte;
|
||||||
}
|
}
|
||||||
|
@ -2768,7 +2770,7 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"unicodeescape", "illegal Unicode character",
|
"unicodeescape", "illegal Unicode character",
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&v, &outpos, &p))
|
&v, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2810,7 +2812,7 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"unicodeescape", message,
|
"unicodeescape", message,
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&v, &outpos, &p))
|
&v, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2824,7 +2826,7 @@ PyObject *PyUnicode_DecodeUnicodeEscape(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"unicodeescape", message,
|
"unicodeescape", message,
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&v, &outpos, &p))
|
&v, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -3113,7 +3115,7 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"rawunicodeescape", "truncated \\uXXXX",
|
"rawunicodeescape", "truncated \\uXXXX",
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&v, &outpos, &p))
|
&v, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
goto nextByte;
|
goto nextByte;
|
||||||
}
|
}
|
||||||
|
@ -3145,7 +3147,7 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"rawunicodeescape", "\\Uxxxxxxxx out of range",
|
"rawunicodeescape", "\\Uxxxxxxxx out of range",
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&v, &outpos, &p))
|
&v, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
nextByte:
|
nextByte:
|
||||||
|
@ -3315,7 +3317,7 @@ PyObject *_PyUnicode_DecodeUnicodeInternal(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"unicode_internal", reason,
|
"unicode_internal", reason,
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&v, &outpos, &p)) {
|
&v, &outpos, &p)) {
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3695,7 +3697,7 @@ PyObject *PyUnicode_DecodeASCII(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"ascii", "ordinal not in range(128)",
|
"ascii", "ordinal not in range(128)",
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&v, &outpos, &p))
|
&v, &outpos, &p))
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3996,7 +3998,7 @@ PyObject *PyUnicode_DecodeCharmap(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"charmap", "character maps to <undefined>",
|
"charmap", "character maps to <undefined>",
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&v, &outpos, &p)) {
|
&v, &outpos, &p)) {
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
@ -4046,7 +4048,7 @@ PyObject *PyUnicode_DecodeCharmap(const char *s,
|
||||||
errors, &errorHandler,
|
errors, &errorHandler,
|
||||||
"charmap", "character maps to <undefined>",
|
"charmap", "character maps to <undefined>",
|
||||||
starts, size, &startinpos, &endinpos, &exc, &s,
|
starts, size, &startinpos, &endinpos, &exc, &s,
|
||||||
(PyObject **)&v, &outpos, &p)) {
|
&v, &outpos, &p)) {
|
||||||
Py_DECREF(x);
|
Py_DECREF(x);
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
|
@ -4797,7 +4799,7 @@ int charmaptranslate_makespace(PyObject **outobj, Py_UNICODE **outp,
|
||||||
/* exponentially overallocate to minimize reallocations */
|
/* exponentially overallocate to minimize reallocations */
|
||||||
if (requiredsize < 2 * oldsize)
|
if (requiredsize < 2 * oldsize)
|
||||||
requiredsize = 2 * oldsize;
|
requiredsize = 2 * oldsize;
|
||||||
if (_PyUnicode_Resize(outobj, requiredsize) < 0)
|
if (PyUnicode_Resize(outobj, requiredsize) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
*outp = PyUnicode_AS_UNICODE(*outobj) + outpos;
|
*outp = PyUnicode_AS_UNICODE(*outobj) + outpos;
|
||||||
}
|
}
|
||||||
|
@ -4976,7 +4978,7 @@ PyObject *PyUnicode_TranslateCharmap(const Py_UNICODE *p,
|
||||||
/* Resize if we allocated to much */
|
/* Resize if we allocated to much */
|
||||||
respos = str-PyUnicode_AS_UNICODE(res);
|
respos = str-PyUnicode_AS_UNICODE(res);
|
||||||
if (respos<PyUnicode_GET_SIZE(res)) {
|
if (respos<PyUnicode_GET_SIZE(res)) {
|
||||||
if (_PyUnicode_Resize(&res, respos) < 0)
|
if (PyUnicode_Resize(&res, respos) < 0)
|
||||||
goto onError;
|
goto onError;
|
||||||
}
|
}
|
||||||
Py_XDECREF(exc);
|
Py_XDECREF(exc);
|
||||||
|
|
|
@ -1601,7 +1601,7 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IS_END_OF_FORMAT(*format)) {
|
if (!IS_END_OF_FORMAT(*format) && *format != '|') {
|
||||||
PyErr_Format(PyExc_RuntimeError,
|
PyErr_Format(PyExc_RuntimeError,
|
||||||
"more argument specifiers than keyword list entries "
|
"more argument specifiers than keyword list entries "
|
||||||
"(remaining format:'%s')", format);
|
"(remaining format:'%s')", format);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue