diff options
author | Christian Heimes <christian@cheimes.de> | 2008-01-04 03:06:10 (GMT) |
---|---|---|
committer | Christian Heimes <christian@cheimes.de> | 2008-01-04 03:06:10 (GMT) |
commit | a34706f101a16eef8e36054d1f405f794d53ac79 (patch) | |
tree | c644a54978563e860c623f96c087a761e6a5776a | |
parent | bccd63c389d72d22882264b8e9cf6e8e5911106c (diff) | |
download | cpython-a34706f101a16eef8e36054d1f405f794d53ac79.zip cpython-a34706f101a16eef8e36054d1f405f794d53ac79.tar.gz cpython-a34706f101a16eef8e36054d1f405f794d53ac79.tar.bz2 |
Merged revisions 59680-59695 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r59686 | guido.van.rossum | 2008-01-04 00:54:04 +0100 (Fri, 04 Jan 2008) | 2 lines
Bug #1301: fixed a bad assert in _tkinter.
........
r59687 | raymond.hettinger | 2008-01-04 01:01:15 +0100 (Fri, 04 Jan 2008) | 3 lines
Finish-up the struct module optimizations started at the Iceland NFS sprint.
........
r59688 | christian.heimes | 2008-01-04 01:04:52 +0100 (Fri, 04 Jan 2008) | 1 line
Fixed #1687: plistlib.py restricts <integer> to Python int when writing
........
r59689 | christian.heimes | 2008-01-04 01:37:34 +0100 (Fri, 04 Jan 2008) | 1 line
Bug #1481296: Fixed long(float('nan'))!=0L.
........
r59691 | andrew.kuchling | 2008-01-04 02:15:50 +0100 (Fri, 04 Jan 2008) | 1 line
Markup fixes; grammar tweaks
........
r59692 | andrew.kuchling | 2008-01-04 02:16:12 +0100 (Fri, 04 Jan 2008) | 1 line
Add items
........
r59694 | christian.heimes | 2008-01-04 02:48:50 +0100 (Fri, 04 Jan 2008) | 1 line
Fixed math.copysign() on Windows
........
r59695 | christian.heimes | 2008-01-04 03:03:25 +0100 (Fri, 04 Jan 2008) | 1 line
Filled in some XXX comments
........
-rw-r--r-- | Doc/library/msvcrt.rst | 16 | ||||
-rw-r--r-- | Doc/whatsnew/2.6.rst | 41 | ||||
-rw-r--r-- | Lib/plat-mac/plistlib.py | 4 | ||||
-rwxr-xr-x | Lib/test/regrtest.py | 2 | ||||
-rw-r--r-- | Lib/test/test_long.py | 4 | ||||
-rw-r--r-- | Modules/_struct.c | 239 | ||||
-rw-r--r-- | Modules/_tkinter.c | 8 | ||||
-rw-r--r-- | Modules/mathmodule.c | 14 | ||||
-rw-r--r-- | Objects/longobject.c | 3 |
9 files changed, 305 insertions, 26 deletions
diff --git a/Doc/library/msvcrt.rst b/Doc/library/msvcrt.rst index 9fa49da..a305788 100644 --- a/Doc/library/msvcrt.rst +++ b/Doc/library/msvcrt.rst @@ -101,9 +101,9 @@ Console I/O .. function:: getwch() - Wide char variant of `func:getch`, returns unicode. + Wide char variant of :func:`getch`, returning a Unicode value. - ..versionadded:: 2.6 + .. versionadded:: 2.6 .. function:: getche() @@ -114,9 +114,9 @@ Console I/O .. function:: getwche() - Wide char variant of `func:getche`, returns unicode. + Wide char variant of :func:`getche`, returning a Unicode value. - ..versionadded:: 2.6 + .. versionadded:: 2.6 .. function:: putch(char) @@ -126,9 +126,9 @@ Console I/O .. function:: putwch(unicode_char) - Wide char variant of `func:putch`, accepts unicode. + Wide char variant of :func:`putch`, accepting a Unicode value. - ..versionadded:: 2.6 + .. versionadded:: 2.6 .. function:: ungetch(char) @@ -139,9 +139,9 @@ Console I/O .. function:: ungetwch(unicode_char) - Wide char variant of `func:ungetch`, accepts unicode. + Wide char variant of :func:`ungetch`, accepting a Unicode value. - ..versionadded:: 2.6 + .. versionadded:: 2.6 .. _msvcrt-other: diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index 4a8eb76..7bd9cbd 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -552,6 +552,14 @@ Here are all of the changes that Python 2.6 makes to the core Python language. .. Patch 1507 +* More floating-point features were also added. The :func:`float` function + will now turn the strings ``+nan`` and ``-nan`` into the corresponding + IEEE 754 Not a Number values, and ``+inf`` and ``-inf`` into + positive or negative infinity. This works on any platform with + IEEE 754 semantics. (Contributed by Christian Heimes.) + + .. Patch 1635. + * Changes to the :class:`Exception` interface as dictated by :pep:`352` continue to be made. For 2.6, the :attr:`message` attribute is being deprecated in favor of the @@ -1055,14 +1063,35 @@ Changes to Python's build process and to the C API include: ``"mant_dig"`` (number of digits in the mantissa), ``"epsilon"`` (smallest difference between 1.0 and the next largest value representable), and several others. + (Contributed by Christian Heimes.) .. Issue 1534 +* Python's C API now includes two functions for case-insensitive string + comparisions, ``PyOS_stricmp(char*, char*)`` + and ``PyOS_strnicmp(char*, char*, Py_ssize_t)``. + (Contributed by Christian Heimes.) + + .. Issue 1635 + +* Some macros were renamed. :cmacro:`Py_Size()` became :cmacro:`Py_SIZE()`, + :cmacro:`Py_Type()` became :cmacro:`Py_TYPE()`, and + :cmacro:`Py_Refcnt()` became :cmacro:`Py_REFCNT()`. Macros for backward + compatibility are still available for Python 2.6. + + .. Issue 1629: XXX why was this done? + .. ====================================================================== -Port-Specific Changes ---------------------- +Port-Specific Changes: Windows +----------------------------------- + +* The :mod:`msvcrt` module now supports + both the normal and wide char variants of the console I/O + API. The :func:`getwch` function reads a keypress and returns a Unicode + value, as does the :func:`getwche` function. The :func:`putwch` function + takes a Unicode character and writes it to the console. Platform-specific changes go here. @@ -1089,9 +1118,15 @@ Some of the more notable changes are: Porting to Python 2.6 ===================== -This section lists previously described changes that may require changes to your +This section lists previously described changes, and a few +esoteric bugfixes, that may require changes to your code: +* The :method:`__init__` method of :class:`collections.deque` + now clears any existing contents of the deque + before adding elements from the iterable. This change makes the + behavior match that of ``list.__init__()``. + * The :mod:`socket` module exception :exc:`socket.error` now inherits from :exc:`IOError`. Previously it wasn't a subclass of :exc:`StandardError` but now it is, through :exc:`IOError`. diff --git a/Lib/plat-mac/plistlib.py b/Lib/plat-mac/plistlib.py index 72dfa2e..2a80e84 100644 --- a/Lib/plat-mac/plistlib.py +++ b/Lib/plat-mac/plistlib.py @@ -242,8 +242,8 @@ class PlistWriter(DumbXMLWriter): self.simpleElement("true") else: self.simpleElement("false") - elif isinstance(value, int): - self.simpleElement("integer", str(value)) + elif isinstance(value, (int, long)): + self.simpleElement("integer", "%d" % value) elif isinstance(value, float): self.simpleElement("real", repr(value)) elif isinstance(value, dict): diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index bd79c97..790d769 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -771,8 +771,8 @@ def dash_R_cleanup(fs, ps, pic, abcs): dircache.reset() linecache.clearcache() mimetypes._default_mime_types() - struct._cache.clear() filecmp._cache.clear() + struct._clearcache() doctest.master = None # Collect cyclic trash. diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index 8be8bff..223ef7c 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -537,6 +537,10 @@ class LongTest(unittest.TestCase): # conversion to string should fail self.assertRaises(ValueError, format, 3, "s") + def test_nan_inf(self): + self.assertRaises(OverflowError, long, float('inf')) + self.assertEqual(long(float('nan')), 0L) + def test_main(): test_support.run_unittest(LongTest) diff --git a/Modules/_struct.c b/Modules/_struct.c index 3c02bc9..278b035 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -1464,11 +1464,28 @@ s_init(PyObject *self, PyObject *args, PyObject *kwds) assert(PyStruct_Check(self)); - if (!PyArg_ParseTupleAndKeywords(args, kwds, "S:Struct", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:Struct", kwlist, &o_format)) return -1; - Py_INCREF(o_format); + if (PyUnicode_Check(o_format)) { + o_format = PyUnicode_AsASCIIString(o_format); + if (o_format == NULL) + return -1; + } + /* XXX support buffer interface, too */ + else { + Py_INCREF(o_format); + } + + if (!PyString_Check(o_format)) { + Py_DECREF(o_format); + PyErr_Format(PyExc_TypeError, + "Struct() argument 1 must be bytes, not %.200s", + Py_TYPE(o_format)->tp_name); + return -1; + } + Py_XDECREF(soself->s_format); soself->s_format = o_format; @@ -1861,12 +1878,226 @@ PyTypeObject PyStructType = { PyObject_Del, /* tp_free */ }; + +/* ---- Standalone functions ---- */ + +#define MAXCACHE 100 +static PyObject *cache = NULL; + +static PyObject * +cache_struct(PyObject *fmt) +{ + PyObject * s_object; + + if (cache == NULL) { + cache = PyDict_New(); + if (cache == NULL) + return NULL; + } + + s_object = PyDict_GetItem(cache, fmt); + if (s_object != NULL) { + Py_INCREF(s_object); + return s_object; + } + + s_object = PyObject_CallFunctionObjArgs((PyObject *)(&PyStructType), fmt, NULL); + if (s_object != NULL) { + if (PyDict_Size(cache) >= MAXCACHE) + PyDict_Clear(cache); + /* Attempt to cache the result */ + if (PyDict_SetItem(cache, fmt, s_object) == -1) + PyErr_Clear(); + } + return s_object; +} + +PyDoc_STRVAR(clearcache_doc, +"Clear the internal cache."); + +static PyObject * +clearcache(PyObject *self) +{ + if (cache != NULL) + PyDict_Clear(cache); + Py_RETURN_NONE; +} + +PyDoc_STRVAR(calcsize_doc, +"Return size of C struct described by format string fmt."); + +static PyObject * +calcsize(PyObject *self, PyObject *fmt) +{ + Py_ssize_t n; + PyObject *s_object = cache_struct(fmt); + if (s_object == NULL) + return NULL; + n = ((PyStructObject *)s_object)->s_size; + Py_DECREF(s_object); + return PyLong_FromSsize_t(n); +} + +PyDoc_STRVAR(pack_doc, +"Return string containing values v1, v2, ... packed according to fmt."); + +static PyObject * +pack(PyObject *self, PyObject *args) +{ + PyObject *s_object, *fmt, *newargs, *result; + Py_ssize_t n = PyTuple_GET_SIZE(args); + + if (n == 0) { + PyErr_SetString(PyExc_TypeError, "missing format argument"); + return NULL; + } + fmt = PyTuple_GET_ITEM(args, 0); + newargs = PyTuple_GetSlice(args, 1, n); + if (newargs == NULL) + return NULL; + + s_object = cache_struct(fmt); + if (s_object == NULL) { + Py_DECREF(newargs); + return NULL; + } + result = s_pack(s_object, newargs); + Py_DECREF(newargs); + Py_DECREF(s_object); + return result; +} + +PyDoc_STRVAR(pack_into_doc, +"Pack the values v1, v2, ... according to fmt.\n\ +Write the packed bytes into the writable buffer buf starting at offset."); + +static PyObject * +pack_into(PyObject *self, PyObject *args) +{ + PyObject *s_object, *fmt, *newargs, *result; + Py_ssize_t n = PyTuple_GET_SIZE(args); + + if (n == 0) { + PyErr_SetString(PyExc_TypeError, "missing format argument"); + return NULL; + } + fmt = PyTuple_GET_ITEM(args, 0); + newargs = PyTuple_GetSlice(args, 1, n); + if (newargs == NULL) + return NULL; + + s_object = cache_struct(fmt); + if (s_object == NULL) { + Py_DECREF(newargs); + return NULL; + } + result = s_pack_into(s_object, newargs); + Py_DECREF(newargs); + Py_DECREF(s_object); + return result; +} + +PyDoc_STRVAR(unpack_doc, +"Unpack the string containing packed C structure data, according to fmt.\n\ +Requires len(string) == calcsize(fmt)."); + +static PyObject * +unpack(PyObject *self, PyObject *args) +{ + PyObject *s_object, *fmt, *inputstr, *result; + + if (!PyArg_UnpackTuple(args, "unpack", 2, 2, &fmt, &inputstr)) + return NULL; + + s_object = cache_struct(fmt); + if (s_object == NULL) + return NULL; + result = s_unpack(s_object, inputstr); + Py_DECREF(s_object); + return result; +} + +PyDoc_STRVAR(unpack_from_doc, +"Unpack the buffer, containing packed C structure data, according to\n\ +fmt, starting at offset. Requires len(buffer[offset:]) >= calcsize(fmt)."); + +static PyObject * +unpack_from(PyObject *self, PyObject *args, PyObject *kwds) +{ + PyObject *s_object, *fmt, *newargs, *result; + Py_ssize_t n = PyTuple_GET_SIZE(args); + + if (n == 0) { + PyErr_SetString(PyExc_TypeError, "missing format argument"); + return NULL; + } + fmt = PyTuple_GET_ITEM(args, 0); + newargs = PyTuple_GetSlice(args, 1, n); + if (newargs == NULL) + return NULL; + + s_object = cache_struct(fmt); + if (s_object == NULL) { + Py_DECREF(newargs); + return NULL; + } + result = s_unpack_from(s_object, newargs, kwds); + Py_DECREF(newargs); + Py_DECREF(s_object); + return result; +} + +static struct PyMethodDef module_functions[] = { + {"_clearcache", (PyCFunction)clearcache, METH_NOARGS, clearcache_doc}, + {"calcsize", calcsize, METH_O, calcsize_doc}, + {"pack", pack, METH_VARARGS, pack_doc}, + {"pack_into", pack_into, METH_VARARGS, pack_into_doc}, + {"unpack", unpack, METH_VARARGS, unpack_doc}, + {"unpack_from", (PyCFunction)unpack_from, + METH_VARARGS|METH_KEYWORDS, unpack_from_doc}, + {NULL, NULL} /* sentinel */ +}; + + /* Module initialization */ +PyDoc_STRVAR(module_doc, +"Functions to convert between Python values and C structs.\n\ +Python strings are used to hold the data representing the C struct\n\ +and also as format strings to describe the layout of data in the C struct.\n\ +\n\ +The optional first format char indicates byte order, size and alignment:\n\ + @: native order, size & alignment (default)\n\ + =: native order, std. size & alignment\n\ + <: little-endian, std. size & alignment\n\ + >: big-endian, std. size & alignment\n\ + !: same as >\n\ +\n\ +The remaining chars indicate types of args and must match exactly;\n\ +these can be preceded by a decimal repeat count:\n\ + x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;\n\ + h:short; H:unsigned short; i:int; I:unsigned int;\n\ + l:long; L:unsigned long; f:float; d:double.\n\ +Special cases (preceding decimal count indicates length):\n\ + s:string (array of char); p: pascal string (with count byte).\n\ +Special case (only available in native format):\n\ + P:an integer type that is wide enough to hold a pointer.\n\ +Special case (not in native mode unless 'long long' in platform C):\n\ + q:long long; Q:unsigned long long\n\ +Whitespace between formats is ignored.\n\ +\n\ +The variable struct.error is an exception raised on errors.\n"); + PyMODINIT_FUNC init_struct(void) { - PyObject *m = Py_InitModule("_struct", NULL); + PyObject *ver, *m; + + ver = PyString_FromString("0.2"); + if (ver == NULL) + return; + + m = Py_InitModule3("_struct", module_functions, module_doc); if (m == NULL) return; @@ -1947,6 +2178,8 @@ init_struct(void) Py_INCREF((PyObject*)&PyStructType); PyModule_AddObject(m, "Struct", (PyObject*)&PyStructType); + PyModule_AddObject(m, "__version__", ver); + PyModule_AddIntConstant(m, "_PY_STRUCT_RANGE_CHECKING", 1); #ifdef PY_STRUCT_OVERFLOW_MASKING PyModule_AddIntConstant(m, "_PY_STRUCT_OVERFLOW_MASKING", 1); diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 0e93904..97f85f9 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -898,10 +898,12 @@ AsObj(PyObject *value) /* This #ifdef assumes that Tcl uses UCS-2. See TCL_UTF_MAX test above. */ #if defined(Py_UNICODE_WIDE) && TCL_UTF_MAX == 3 - Tcl_UniChar *outbuf; + Tcl_UniChar *outbuf = NULL; Py_ssize_t i; - assert(size < size * sizeof(Tcl_UniChar)); - outbuf = (Tcl_UniChar*)ckalloc(size * sizeof(Tcl_UniChar)); + size_t allocsize = ((size_t)size) * sizeof(Tcl_UniChar); + if (allocsize >= size) + outbuf = (Tcl_UniChar*)ckalloc(allocsize); + /* Else overflow occurred, and we take the next exit */ if (!outbuf) { PyErr_NoMemory(); return NULL; diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 8992bae..62f9f0b 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -133,14 +133,16 @@ FUNC1(cos, cos, "cos(x)\n\nReturn the cosine of x (measured in radians).") FUNC1(cosh, cosh, "cosh(x)\n\nReturn the hyperbolic cosine of x.") -#if defined(MS_WINDOWS) || defined(HAVE_COPYSIGN) + #ifdef MS_WINDOWS -FUNC2(copysign, _copysign, -#else -FUNC2(copysign, copysign, +# define copysign _copysign +# define HAVE_COPYSIGN 1 #endif - "copysign(x,y)\n\nReturn x with the sign of y."); +#ifdef HAVE_COPYSIGN +FUNC2(copysign, copysign, + "copysign(x,y)\n\nReturn x with the sign of y."); #endif + FUNC1(exp, exp, "exp(x)\n\nReturn e raised to the power of x.") FUNC1(fabs, fabs, @@ -383,7 +385,7 @@ static PyMethodDef math_methods[] = { {"atan", math_atan, METH_O, math_atan_doc}, {"atan2", math_atan2, METH_VARARGS, math_atan2_doc}, {"ceil", math_ceil, METH_O, math_ceil_doc}, -#if defined(MS_WINDOWS) || defined(HAVE_COPYSIGN) +#ifdef HAVE_COPYSIGN {"copysign", math_copysign, METH_VARARGS, math_copysign_doc}, #endif {"cos", math_cos, METH_O, math_cos_doc}, diff --git a/Objects/longobject.c b/Objects/longobject.c index dc459fd..40aaba1 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -254,6 +254,9 @@ PyLong_FromDouble(double dval) "cannot convert float infinity to int"); return NULL; } + if (Py_IS_NAN(dval)) { + return PyLong_FromLong(0L); + } if (dval < 0.0) { neg = 1; dval = -dval; |