diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst index 8ee2795a9eb..9eb315fdf53 100644 --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -136,6 +136,18 @@ The module defines the following variables and functions: Convert samples between 1-, 2- and 4-byte formats. + .. note:: + + In some audio formats, such as .WAV files, 16 and 32 bit samples are + signed, but 8 bit samples are unsigned. So when converting to 8 bit wide + samples for these formats, you need to also add 128 to the result:: + + new_frames = audioop.lin2lin(frames, old_width, 1) + new_frames = audioop.bias(new_frames, 1, 128) + + The same, in reverse, has to be applied when converting from 8 to 16 or 32 + bit width samples. + .. function:: lin2ulaw(fragment, width) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 0b82bf47bb6..86a9a9549a1 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -155,13 +155,13 @@ be found in any statistics text. .. function:: triangular(low, high, mode) - Return a random floating point number *N* such that ``low <= N < high`` - and with the specified *mode* between those bounds. + Return a random floating point number *N* such that ``low <= N < high`` and + with the specified *mode* between those bounds. The *low* and *high* bounds + default to zero and one. The *mode* argument defaults to the midpoint + between the bounds, giving a symmetric distribution. - If *mode* is not specified or is ``None``, it defaults to the midpoint - between the upper and lower bounds, producing a symmetric distribution. + .. versionadded:: 2.6 - The default values for *low* and *high* are zero and one. .. function:: betavariate(alpha, beta) diff --git a/Lib/copy.py b/Lib/copy.py index 1a14f0ed7fe..ec108b71335 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -101,7 +101,7 @@ def _copy_immutable(x): return x for t in (type(None), int, float, bool, str, tuple, frozenset, type, range, - types.BuiltinFunctionType, + types.BuiltinFunctionType, type(Ellipsis), types.FunctionType): d[t] = _copy_immutable t = getattr(types, "CodeType", None) @@ -180,6 +180,7 @@ _deepcopy_dispatch = d = {} def _deepcopy_atomic(x, memo): return x d[type(None)] = _deepcopy_atomic +d[type(Ellipsis)] = _deepcopy_atomic d[int] = _deepcopy_atomic d[float] = _deepcopy_atomic d[bool] = _deepcopy_atomic diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py index 12f77a97a1c..c8d0c7ec2a0 100644 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -64,8 +64,27 @@ class TestBasic(unittest.TestCase): self.assertEqual(list(d), [7, 8, 9]) d = deque(range(200), maxlen=10) d.append(d) + fo = open(test_support.TESTFN, "w") + try: + fo.write(str(d)) + fo.close() + fo = open(test_support.TESTFN, "r") + self.assertEqual(fo.read(), repr(d)) + finally: + fo.close() + test_support.unlink(test_support.TESTFN) + d = deque(range(10), maxlen=None) self.assertEqual(repr(d), 'deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])') + fo = open(test_support.TESTFN, "w") + try: + fo.write(str(d)) + fo.close() + fo = open(test_support.TESTFN, "r") + self.assertEqual(fo.read(), repr(d)) + finally: + fo.close() + test_support.unlink(test_support.TESTFN) def test_comparisons(self): d = deque('xabc'); d.popleft() @@ -265,13 +284,13 @@ class TestBasic(unittest.TestCase): d.append(d) try: fo = open(test_support.TESTFN, "w") - fo.write(str(d)) + print(d, file=fo, end='') fo.close() fo = open(test_support.TESTFN, "r") self.assertEqual(fo.read(), repr(d)) finally: fo.close() - os.remove(test_support.TESTFN) + test_support.unlink(test_support.TESTFN) def test_init(self): self.assertRaises(TypeError, deque, 'abc', 2, 3); diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index ca3c02e383e..44a45afa60a 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -295,7 +295,7 @@ class TestJointOps(unittest.TestCase): self.assertEqual(fo.read(), repr(s)) finally: fo.close() - os.remove(test_support.TESTFN) + test_support.unlink(test_support.TESTFN) def test_do_not_rehash_dict_keys(self): n = 10 @@ -679,7 +679,7 @@ class TestBasicOps(unittest.TestCase): self.assertEqual(fo.read(), repr(self.set)) finally: fo.close() - os.remove(test_support.TESTFN) + test_support.unlink(test_support.TESTFN) def test_length(self): self.assertEqual(len(self.set), self.length) diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 2cee626e91f..3c039a14e5d 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -1,6 +1,7 @@ import unittest from test import test_support from contextlib import closing, nested +import gc import pickle import select import signal @@ -30,6 +31,14 @@ def exit_subprocess(): class InterProcessSignalTests(unittest.TestCase): MAX_DURATION = 20 # Entire test should last at most 20 sec. + def setUp(self): + self.using_gc = gc.isenabled() + gc.disable() + + def tearDown(self): + if self.using_gc: + gc.enable() + def handlerA(self, *args): self.a_called = True if test_support.verbose: @@ -263,8 +272,10 @@ class ItimerTest(unittest.TestCase): self.hndl_called = False self.hndl_count = 0 self.itimer = None + self.old_alarm = signal.signal(signal.SIGALRM, self.sig_alrm) def tearDown(self): + signal.signal(signal.SIGALRM, self.old_alarm) if self.itimer is not None: # test_itimer_exc doesn't change this attr # just ensure that itimer is stopped signal.setitimer(self.itimer, 0) @@ -303,13 +314,13 @@ class ItimerTest(unittest.TestCase): # XXX I'm assuming -1 is an invalid itimer, but maybe some platform # defines it ? self.assertRaises(signal.ItimerError, signal.setitimer, -1, 0) - # negative time - self.assertRaises(signal.ItimerError, signal.setitimer, - signal.ITIMER_REAL, -1) + # Negative times are treated as zero on some platforms. + if 0: + self.assertRaises(signal.ItimerError, + signal.setitimer, signal.ITIMER_REAL, -1) def test_itimer_real(self): self.itimer = signal.ITIMER_REAL - signal.signal(signal.SIGALRM, self.sig_alrm) signal.setitimer(self.itimer, 1.0) if test_support.verbose: print("\ncall pause()...") diff --git a/Modules/binascii.c b/Modules/binascii.c index b90905f4134..b65bdab786c 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -784,13 +784,15 @@ PyDoc_STRVAR(doc_crc32, static PyObject * binascii_crc32(PyObject *self, PyObject *args) { - uLong crc32val = 0; /* crc32(0L, Z_NULL, 0) */ + unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */ Byte *buf; Py_ssize_t len; + int signed_val; + if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val)) return NULL; - crc32val = crc32(crc32val, buf, len); - return PyLong_FromUnsignedLong(crc32val & 0xffffffffU); + signed_val = crc32(crc32val, buf, len); + return PyLong_FromUnsignedLong(signed_val & 0xffffffffU); } #else /* USE_ZLIB_CRC32 */ /* Crc - 32 BIT ANSI X3.66 CRC checksum files diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index cecb9cf38bb..24efb00b988 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -915,7 +915,7 @@ PyDoc_STRVAR(adler32__doc__, static PyObject * PyZlib_adler32(PyObject *self, PyObject *args) { - uLong adler32val = 1; /* adler32(0L, Z_NULL, 0) */ + unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */ Byte *buf; int len; @@ -934,13 +934,14 @@ PyDoc_STRVAR(crc32__doc__, static PyObject * PyZlib_crc32(PyObject *self, PyObject *args) { - uLong crc32val = 0; /* crc32(0L, Z_NULL, 0) */ + unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */ Byte *buf; - int len; + int len, signed_val; + if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val)) return NULL; - crc32val = crc32(crc32val, buf, len); - return PyLong_FromUnsignedLong(crc32val & 0xffffffffU); + signed_val = crc32(crc32val, buf, len); + return PyLong_FromUnsignedLong(signed_val & 0xffffffffU); } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index bbcb7dcadf8..60cbffa59f4 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3204,7 +3204,7 @@ PyObject *PyUnicode_DecodeRawUnicodeEscape(const char *s, /* UCS-4 character. Either store directly, or as surrogate pair. */ #ifdef Py_UNICODE_WIDE - *p++ = (Py_UNIC0DE) x; + *p++ = (Py_UNICODE) x; #else x -= 0x10000L; *p++ = 0xD800 + (Py_UNICODE) (x >> 10); @@ -7384,7 +7384,7 @@ unicode_repeat(PyUnicodeObject *str, Py_ssize_t len) done = str->length; } while (done < nchars) { - int n = (done <= nchars-done) ? done : nchars-done; + Py_ssize_t n = (done <= nchars-done) ? done : nchars-done; Py_UNICODE_COPY(p+done, p, n); done += n; } diff --git a/PC/_winreg.c b/PC/_winreg.c index 0dcade8b345..5c5023d8497 100644 --- a/PC/_winreg.c +++ b/PC/_winreg.c @@ -703,6 +703,7 @@ countStrings(wchar_t *data, int len) static BOOL Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize) { + Py_ssize_t i,j; switch (typ) { case REG_DWORD: if (value != Py_None && !PyLong_Check(value)) diff --git a/PC/w9xpopen.c b/PC/w9xpopen.c index f8439f218cc..b3978dd42d9 100644 --- a/PC/w9xpopen.c +++ b/PC/w9xpopen.c @@ -30,7 +30,7 @@ int main(int argc, char *argv[]) STARTUPINFO si; PROCESS_INFORMATION pi; DWORD exit_code=0; - int cmdlen = 0; + size_t cmdlen = 0; int i; char *cmdline, *cmdlinefill; diff --git a/Python/peephole.c b/Python/peephole.c index a37abf93397..db5ca33fbf9 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -29,7 +29,7 @@ Also works for BUILD_LIST when followed by an "in" or "not in" test. */ static int -tuple_of_constants(unsigned char *codestr, int n, PyObject *consts) +tuple_of_constants(unsigned char *codestr, Py_ssize_t n, PyObject *consts) { PyObject *newconst, *constant; Py_ssize_t i, arg, len_consts; @@ -220,7 +220,7 @@ fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts) } static unsigned int * -markblocks(unsigned char *code, int len) +markblocks(unsigned char *code, Py_ssize_t len) { unsigned int *blocks = (unsigned int *)PyMem_Malloc(len*sizeof(int)); int i,j, opcode, blockcnt = 0;