Merged revisions 69129-69131,69139-69140,69143,69154-69159,69169,69288-69289,69293,69297-69301,69348 via svnmerge from

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

........
  r69129 | benjamin.peterson | 2009-01-30 19:42:55 -0600 (Fri, 30 Jan 2009) | 1 line

  check the errno in bad fd cases
........
  r69130 | andrew.kuchling | 2009-01-30 20:50:09 -0600 (Fri, 30 Jan 2009) | 1 line

  Add a section
........
  r69131 | andrew.kuchling | 2009-01-30 21:26:02 -0600 (Fri, 30 Jan 2009) | 1 line

  Text edits and markup fixes
........
  r69139 | mark.dickinson | 2009-01-31 10:44:04 -0600 (Sat, 31 Jan 2009) | 2 lines

  Add an extra test for long <-> float hash equivalence.
........
  r69140 | benjamin.peterson | 2009-01-31 10:52:03 -0600 (Sat, 31 Jan 2009) | 1 line

  PyErr_BadInternalCall() raises a SystemError, not TypeError #5112
........
  r69143 | benjamin.peterson | 2009-01-31 15:00:10 -0600 (Sat, 31 Jan 2009) | 1 line

  I believe the intention here was to avoid a global lookup
........
  r69154 | benjamin.peterson | 2009-01-31 16:33:02 -0600 (Sat, 31 Jan 2009) | 1 line

  fix indentation in comment
........
  r69155 | david.goodger | 2009-01-31 16:53:46 -0600 (Sat, 31 Jan 2009) | 1 line

  markup fix
........
  r69156 | gregory.p.smith | 2009-01-31 16:57:30 -0600 (Sat, 31 Jan 2009) | 4 lines

  - Issue #5104: The socket module now raises OverflowError when 16-bit port and
    protocol numbers are supplied outside the allowed 0-65536 range on bind()
    and getservbyport().
........
  r69157 | benjamin.peterson | 2009-01-31 17:43:25 -0600 (Sat, 31 Jan 2009) | 1 line

  add explanatory comment
........
  r69158 | benjamin.peterson | 2009-01-31 17:54:38 -0600 (Sat, 31 Jan 2009) | 1 line

  more flags which only work for function blocks
........
  r69159 | gregory.p.smith | 2009-01-31 18:16:01 -0600 (Sat, 31 Jan 2009) | 2 lines

  Update doc wording as suggested in issue4903.
........
  r69169 | guilherme.polo | 2009-01-31 20:56:16 -0600 (Sat, 31 Jan 2009) | 3 lines

  Restore Tkinter.Tk._loadtk so this test doesn't fail for problems
  related to ttk.
........
  r69288 | georg.brandl | 2009-02-05 04:30:57 -0600 (Thu, 05 Feb 2009) | 1 line

  #5153: fix typo in example.
........
  r69289 | georg.brandl | 2009-02-05 04:37:07 -0600 (Thu, 05 Feb 2009) | 1 line

  #5144: document that PySys_SetArgv prepends the script directory (or the empty string) to sys.path.
........
  r69293 | georg.brandl | 2009-02-05 04:59:28 -0600 (Thu, 05 Feb 2009) | 1 line

  #5059: fix example.
........
  r69297 | georg.brandl | 2009-02-05 05:32:18 -0600 (Thu, 05 Feb 2009) | 1 line

  #5015: document PythonHome API functions.
........
  r69298 | georg.brandl | 2009-02-05 05:33:21 -0600 (Thu, 05 Feb 2009) | 1 line

  #4827: fix callback example.
........
  r69299 | georg.brandl | 2009-02-05 05:35:28 -0600 (Thu, 05 Feb 2009) | 1 line

  #4820: use correct module for ctypes.util.
........
  r69300 | georg.brandl | 2009-02-05 05:38:23 -0600 (Thu, 05 Feb 2009) | 1 line

  #4563: disable alpha and roman lists, fixes wrong formatting of contributor list.
........
  r69301 | georg.brandl | 2009-02-05 05:40:35 -0600 (Thu, 05 Feb 2009) | 1 line

  #5031: fix Thread.daemon property docs.
........
  r69348 | benjamin.peterson | 2009-02-05 19:47:31 -0600 (Thu, 05 Feb 2009) | 1 line

  fix download link
........
This commit is contained in:
Benjamin Peterson 2009-02-06 02:40:07 +00:00
parent 407c75735f
commit 5c6d7877c5
17 changed files with 151 additions and 40 deletions

View File

@ -280,9 +280,10 @@ in various ways. There is a separate error indicator for each thread.
.. cfunction:: void PyErr_BadInternalCall() .. cfunction:: void PyErr_BadInternalCall()
This is a shorthand for ``PyErr_SetString(PyExc_TypeError, message)``, where This is a shorthand for ``PyErr_SetString(PyExc_SystemError, message)``,
*message* indicates that an internal operation (e.g. a Python/C API function) where *message* indicates that an internal operation (e.g. a Python/C API
was invoked with an illegal argument. It is mostly for internal use. function) was invoked with an illegal argument. It is mostly for internal
use.
.. cfunction:: int PyErr_WarnEx(PyObject *category, char *message, int stacklevel) .. cfunction:: int PyErr_WarnEx(PyObject *category, char *message, int stacklevel)

View File

@ -350,18 +350,36 @@ Initialization, Finalization, and Threads
single: Py_FatalError() single: Py_FatalError()
single: argv (in module sys) single: argv (in module sys)
Set ``sys.argv`` based on *argc* and *argv*. These parameters are similar to Set :data:`sys.argv` based on *argc* and *argv*. These parameters are
those passed to the program's :cfunc:`main` function with the difference that similar to those passed to the program's :cfunc:`main` function with the
the first entry should refer to the script file to be executed rather than the difference that the first entry should refer to the script file to be
executable hosting the Python interpreter. If there isn't a script that will be executed rather than the executable hosting the Python interpreter. If there
run, the first entry in *argv* can be an empty string. If this function fails isn't a script that will be run, the first entry in *argv* can be an empty
to initialize ``sys.argv``, a fatal condition is signalled using string. If this function fails to initialize :data:`sys.argv`, a fatal
:cfunc:`Py_FatalError`. condition is signalled using :cfunc:`Py_FatalError`.
This function also prepends the executed script's path to :data:`sys.path`.
If no script is executed (in the case of calling ``python -c`` or just the
interactive interpreter), the empty string is used instead.
.. XXX impl. doesn't seem consistent in allowing 0/NULL for the params; .. XXX impl. doesn't seem consistent in allowing 0/NULL for the params;
check w/ Guido. check w/ Guido.
.. cfunction:: void Py_SetPythonHome(char *home)
Set the default "home" directory, that is, the location of the standard
Python libraries. The libraries are searched in
:file:`{home}/lib/python{version}` and :file:`{home}/lib/python{version}`.
.. cfunction:: char* Py_GetPythonHome()
Return the default "home", that is, the value set by a previous call to
:cfunc:`Py_SetPythonHome`, or the value of the :envvar:`PYTHONHOME`
environment variable if it is set.
.. _threads: .. _threads:
Thread State and the Global Interpreter Lock Thread State and the Global Interpreter Lock

View File

@ -1272,6 +1272,7 @@ library to load.
.. data:: find_library(name) .. data:: find_library(name)
:module: ctypes.util
:noindex: :noindex:
Try to find a library and return a pathname. *name* is the library name without Try to find a library and return a pathname. *name* is the library name without

View File

@ -1506,7 +1506,7 @@ Here's an example of a callback option that takes no arguments, and simply
records that the option was seen:: records that the option was seen::
def record_foo_seen(option, opt_str, value, parser): def record_foo_seen(option, opt_str, value, parser):
parser.saw_foo = True parser.values.saw_foo = True
parser.add_option("--foo", action="callback", callback=record_foo_seen) parser.add_option("--foo", action="callback", callback=record_foo_seen)
@ -1646,7 +1646,7 @@ arguments::
value.append(arg) value.append(arg)
del parser.rargs[:len(value)] del parser.rargs[:len(value)]
setattr(parser.values, option.dest, value)) setattr(parser.values, option.dest, value)
[...] [...]
parser.add_option("-c", "--callback", dest="vararg_attr", parser.add_option("-c", "--callback", dest="vararg_attr",

View File

@ -198,7 +198,7 @@ changed through the :attr:`name` attribute.
A thread can be flagged as a "daemon thread". The significance of this flag is A thread can be flagged as a "daemon thread". The significance of this flag is
that the entire Python program exits when only daemon threads are left. The that the entire Python program exits when only daemon threads are left. The
initial value is inherited from the creating thread. The flag can be set initial value is inherited from the creating thread. The flag can be set
through the :attr:`daemon` attribute. through the :attr:`daemon` property.
There is a "main thread" object; this corresponds to the initial thread of There is a "main thread" object; this corresponds to the initial thread of
control in the Python program. It is not a daemon thread. control in the Python program. It is not a daemon thread.
@ -312,10 +312,11 @@ impossible to detect the termination of alien threads.
.. attribute:: Thread.daemon .. attribute:: Thread.daemon
The thread's daemon flag. This must be set before :meth:`start` is called, A boolean value indicating whether this thread is a daemon thread (True) or
otherwise :exc:`RuntimeError` is raised. not (False). This must be set before :meth:`start` is called, otherwise
:exc:`RuntimeError` is raised. Its initial value is inherited from the
The initial value is inherited from the creating thread. creating thread; the main thread is not a daemon thread and therefore all
threads created in the main thread default to :attr:`daemon` = ``False``.
The entire Python program exits when no alive non-daemon threads are left. The entire Python program exits when no alive non-daemon threads are left.

View File

@ -31,7 +31,7 @@ in the table are the size of the download files in megabytes.</p>
<td><a href="{{ dlbase }}/python-{{ release }}-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-{{ release }}-text.zip">Download</a> (ca. 2 MB)</td> <td><a href="{{ dlbase }}/python-{{ release }}-docs-text.zip">Download</a> (ca. 2 MB)</td>
<td><a href="{{ dlbase }}/python-{{ release }}-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>

View File

@ -13,6 +13,14 @@ ISSUE_URI = 'http://bugs.python.org/issue%s'
from docutils import nodes, utils from docutils import nodes, utils
# monkey-patch reST parser to disable alphabetic and roman enumerated lists
from docutils.parsers.rst.states import Body
Body.enum.converters['loweralpha'] = \
Body.enum.converters['upperalpha'] = \
Body.enum.converters['lowerroman'] = \
Body.enum.converters['upperroman'] = lambda x: None
def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
issue = utils.unescape(text) issue = utils.unescape(text)
text = 'issue ' + issue text = 'issue ' + issue

View File

@ -200,7 +200,7 @@ Why is that? 1/10 is not exactly representable as a binary fraction. Almost all
machines today (November 2000) use IEEE-754 floating point arithmetic, and machines today (November 2000) use IEEE-754 floating point arithmetic, and
almost all platforms map Python floats to IEEE-754 "double precision". 754 almost all platforms map Python floats to IEEE-754 "double precision". 754
doubles contain 53 bits of precision, so on input the computer strives to doubles contain 53 bits of precision, so on input the computer strives to
convert 0.1 to the closest fraction it can of the form *J*/2\*\**N* where *J* is convert 0.1 to the closest fraction it can of the form *J*/2**\ *N* where *J* is
an integer containing exactly 53 bits. Rewriting :: an integer containing exactly 53 bits. Rewriting ::
1 / 10 ~= J / (2**N) 1 / 10 ~= J / (2**N)

View File

@ -197,6 +197,23 @@ changes, or look through the Subversion logs for all the details.
.. ====================================================================== .. ======================================================================
.. whole new modules get described in subsections here .. whole new modules get described in subsections here
ttk: Themed Widgets for Tk
--------------------------
Tcl/Tk 8.5 includes a set of themed widgets that re-implement basic Tk
widgets but have a more customizable appearance and can therefore more
closely resemble the native platform's widgets. This widget
set was originally called Tile, but was renamed to Ttk (for "themed Tk")
on being added to Tcl/Tck release 8.5.
XXX write a brief discussion and an example here.
The :mod:`ttk` module was written by Guilherme Polo and added in
:issue:`2983`. An alternate version called ``Tile.py``, written by
Martin Franklin and maintained by Kevin Walzer, was proposed for
inclusion in :issue:`2618`, but the authors argued that Guilherme
Polo's work was more comprehensive.
.. ====================================================================== .. ======================================================================

View File

@ -195,7 +195,7 @@ def nlargest(n, iterable):
heapify(result) heapify(result)
_heappushpop = heappushpop _heappushpop = heappushpop
for elem in it: for elem in it:
heappushpop(result, elem) _heappushpop(result, elem)
result.sort(reverse=True) result.sort(reverse=True)
return result return result

View File

@ -33,6 +33,7 @@ class HashEqualityTestCase(unittest.TestCase):
# for 64-bit platforms # for 64-bit platforms
self.same_hash(int(2**31), float(2**31)) self.same_hash(int(2**31), float(2**31))
self.same_hash(int(-2**63), float(-2**63)) self.same_hash(int(-2**63), float(-2**63))
self.same_hash(long(2**63), float(2**63))
def test_coerced_floats(self): def test_coerced_floats(self):
self.same_hash(int(1.23e300), float(1.23e300)) self.same_hash(int(1.23e300), float(1.23e300))

View File

@ -3,6 +3,7 @@
# portable than they had been thought to be. # portable than they had been thought to be.
import os import os
import errno
import unittest import unittest
import warnings import warnings
import sys import sys
@ -277,7 +278,6 @@ class StatAttributeTests(unittest.TestCase):
result = os.statvfs(self.fname) result = os.statvfs(self.fname)
except OSError as e: except OSError as e:
# On AtheOS, glibc always returns ENOSYS # On AtheOS, glibc always returns ENOSYS
import errno
if e.errno == errno.ENOSYS: if e.errno == errno.ENOSYS:
return return
@ -601,7 +601,13 @@ class TestInvalidFD(unittest.TestCase):
locals()["test_"+f] = get_single(f) locals()["test_"+f] = get_single(f)
def check(self, f, *args): def check(self, f, *args):
self.assertRaises(OSError, f, support.make_bad_fd(), *args) try:
f(support.make_bad_fd(), *args)
except OSError as e:
self.assertEqual(e.errno, errno.EBADF)
else:
self.fail("%r didn't raise a OSError with a bad file descriptor"
% f)
def test_isatty(self): def test_isatty(self):
if hasattr(os, "isatty"): if hasattr(os, "isatty"):

View File

@ -366,6 +366,9 @@ class GeneralModuleTests(unittest.TestCase):
eq(socket.getservbyport(port, 'tcp'), service) eq(socket.getservbyport(port, 'tcp'), service)
if udpport is not None: if udpport is not None:
eq(socket.getservbyport(udpport, 'udp'), service) eq(socket.getservbyport(udpport, 'udp'), service)
# Make sure getservbyport does not accept out of range ports.
self.assertRaises(OverflowError, socket.getservbyport, -1)
self.assertRaises(OverflowError, socket.getservbyport, 65536)
def testDefaultTimeout(self): def testDefaultTimeout(self):
# Testing default timeout # Testing default timeout
@ -466,15 +469,23 @@ class GeneralModuleTests(unittest.TestCase):
# XXX The following don't test module-level functionality... # XXX The following don't test module-level functionality...
def testSockName(self): def _get_unused_port(self, bind_address='0.0.0.0'):
# Testing getsockname(). Use a temporary socket to elicit an unused """Use a temporary socket to elicit an unused ephemeral port.
# ephemeral port that we can use later in the test.
tempsock = socket.socket()
tempsock.bind(("0.0.0.0", 0))
(host, port) = tempsock.getsockname()
tempsock.close()
del tempsock
Args:
bind_address: Hostname or IP address to search for a port on.
Returns: A most likely to be unused port.
"""
tempsock = socket.socket()
tempsock.bind((bind_address, 0))
host, port = tempsock.getsockname()
tempsock.close()
return port
def testSockName(self):
# Testing getsockname()
port = self._get_unused_port()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("0.0.0.0", port)) sock.bind(("0.0.0.0", port))
name = sock.getsockname() name = sock.getsockname()
@ -514,6 +525,19 @@ class GeneralModuleTests(unittest.TestCase):
self.assertEqual(sock.proto, 0) self.assertEqual(sock.proto, 0)
sock.close() sock.close()
def test_getsockaddrarg(self):
host = '0.0.0.0'
port = self._get_unused_port(bind_address=host)
big_port = port + 65536
neg_port = port - 65536
sock = socket.socket()
try:
self.assertRaises(OverflowError, sock.bind, (host, big_port))
self.assertRaises(OverflowError, sock.bind, (host, neg_port))
sock.bind((host, port))
finally:
sock.close()
def test_sock_ioctl(self): def test_sock_ioctl(self):
if os.name != "nt": if os.name != "nt":
return return

View File

@ -4,9 +4,15 @@ import unittest
import os import os
import _tkinter import _tkinter
from test import support from test import support
from tkinter import Tcl from tkinter import Tk, Tcl
from _tkinter import TclError from _tkinter import TclError
# Restore Tkinter.Tk._loadtk that may have been overridden by ttk.
# If this is not done then this test may fail for reasons related
# to ttk only (like failing to load the tile package).
from ttk import __loadtk__
Tk._loadtk = __loadtk__
class TkinterTest(unittest.TestCase): class TkinterTest(unittest.TestCase):

View File

@ -382,6 +382,10 @@ Library
- Issue #4861: ctypes.util.find_library(): Robustify. Fix library detection on - Issue #4861: ctypes.util.find_library(): Robustify. Fix library detection on
biarch systems. Try to rely on ldconfig only, without using objdump and gcc. biarch systems. Try to rely on ldconfig only, without using objdump and gcc.
- Issue #5104: The socket module now raises OverflowError when 16-bit port and
protocol numbers are supplied outside the allowed 0-65536 range on bind()
and getservbyport().
Tools/Demos Tools/Demos
----------- -----------

View File

@ -1223,6 +1223,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
PyMem_Free(host); PyMem_Free(host);
if (result < 0) if (result < 0)
return 0; return 0;
if (port < 0 || port > 0xffff) {
PyErr_SetString(
PyExc_OverflowError,
"getsockaddrarg: port must be 0-65535.");
return 0;
}
addr->sin_family = AF_INET; addr->sin_family = AF_INET;
addr->sin_port = htons((short)port); addr->sin_port = htons((short)port);
*len_ret = sizeof *addr; *len_ret = sizeof *addr;
@ -1255,6 +1261,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
PyMem_Free(host); PyMem_Free(host);
if (result < 0) if (result < 0)
return 0; return 0;
if (port < 0 || port > 0xffff) {
PyErr_SetString(
PyExc_OverflowError,
"getsockaddrarg: port must be 0-65535.");
return 0;
}
addr->sin6_family = s->sock_family; addr->sin6_family = s->sock_family;
addr->sin6_port = htons((short)port); addr->sin6_port = htons((short)port);
addr->sin6_flowinfo = flowinfo; addr->sin6_flowinfo = flowinfo;
@ -1381,6 +1393,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
"Hardware address must be 8 bytes or less"); "Hardware address must be 8 bytes or less");
return 0; return 0;
} }
if (protoNumber < 0 || protoNumber > 0xffff) {
PyErr_SetString(
PyExc_OverflowError,
"getsockaddrarg: protoNumber must be 0-65535.");
return 0;
}
addr = (struct sockaddr_ll*)addr_ret; addr = (struct sockaddr_ll*)addr_ret;
addr->sll_family = AF_PACKET; addr->sll_family = AF_PACKET;
addr->sll_protocol = htons((short)protoNumber); addr->sll_protocol = htons((short)protoNumber);
@ -3271,13 +3289,19 @@ otherwise any protocol will match.");
static PyObject * static PyObject *
socket_getservbyport(PyObject *self, PyObject *args) socket_getservbyport(PyObject *self, PyObject *args)
{ {
unsigned short port; int port;
char *proto=NULL; char *proto=NULL;
struct servent *sp; struct servent *sp;
if (!PyArg_ParseTuple(args, "H|s:getservbyport", &port, &proto)) if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
return NULL; return NULL;
if (port < 0 || port > 0xffff) {
PyErr_SetString(
PyExc_OverflowError,
"getservbyport: port must be 0-65535.");
return NULL;
}
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
sp = getservbyport(htons(port), proto); sp = getservbyport(htons((short)port), proto);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (sp == NULL) { if (sp == NULL) {
PyErr_SetString(socket_error, "port/proto not found"); PyErr_SetString(socket_error, "port/proto not found");

View File

@ -4006,6 +4006,8 @@ dict_keys_inorder(PyObject *dict, int offset)
return NULL; return NULL;
while (PyDict_Next(dict, &pos, &k, &v)) { while (PyDict_Next(dict, &pos, &k, &v)) {
i = PyLong_AS_LONG(v); i = PyLong_AS_LONG(v);
/* The keys of the dictionary are tuples. (see compiler_add_o)
The object we want is always first, though. */
k = PyTuple_GET_ITEM(k, 0); k = PyTuple_GET_ITEM(k, 0);
Py_INCREF(k); Py_INCREF(k);
assert((i - offset) < size); assert((i - offset) < size);
@ -4029,13 +4031,11 @@ compute_code_flags(struct compiler *c)
flags |= CO_NESTED; flags |= CO_NESTED;
if (ste->ste_generator) if (ste->ste_generator)
flags |= CO_GENERATOR; flags |= CO_GENERATOR;
if (ste->ste_varargs)
flags |= CO_VARARGS;
if (ste->ste_varkeywords)
flags |= CO_VARKEYWORDS;
} }
if (ste->ste_varargs)
flags |= CO_VARARGS;
if (ste->ste_varkeywords)
flags |= CO_VARKEYWORDS;
if (ste->ste_generator)
flags |= CO_GENERATOR;
/* (Only) inherit compilerflags in PyCF_MASK */ /* (Only) inherit compilerflags in PyCF_MASK */
flags |= (c->c_flags->cf_flags & PyCF_MASK); flags |= (c->c_flags->cf_flags & PyCF_MASK);